Emacs:将单独行上的项目转换为以逗号分隔的列表

Slo*_*ner 6 emacs

我经常将换行符或换行符分隔的项目粘贴到Emacs缓冲区中,导致每个项目驻留在不同的行上,如下所示:

one
two
three
four
Run Code Online (Sandbox Code Playgroud)

我经常想要一个逗号分隔值列表,如下所示:

"one", "two", "three", "four"
Run Code Online (Sandbox Code Playgroud)

能够从一行到另一行进行一键式转换会很棒.我想我可以使用正则表达式转换它,但它似乎是可能已经具有内置Emacs函数的常用操作.任何人都可以推荐一个吗?

Hen*_*ndy 6

编辑:看你正在寻找一个功能......但自从唯一的答案很简单,就是写自己的(即没有内置的话),我想我会附和什么正则表达式,因为其他人可能偶然发现这一点,并欣赏另一种写作功能并将其放入其中的方法.emacs.


这是两个步骤,但仅仅是因为您希望引用您的文字:

粘贴在Emacs *scratch*缓冲区中(添加five six以显示它每行使用多个单词,如果感兴趣):

one
two
three
four
five six
Run Code Online (Sandbox Code Playgroud)

首先,将个人替换word"word":

M-x replace-regexp RET \(.*\) RET "\1" RET 生产:

"one"
"two"
"three"
"four"
"five six"
Run Code Online (Sandbox Code Playgroud)

现在,将每个回车符(在Emacs中C-q C-j)替换为,:

M-x replace-regexp RET C-q C-j RET , RET 生产:

"one", "two", "three", "four", "five six"
Run Code Online (Sandbox Code Playgroud)


小智 5

M-q会用空格替换换行符(在短短的单词列表中),但不会添加引号和逗号.或者,也许M-^很多次,直到你把它们都放在同一条线上.除此之外 - 没有任何内置的想法.

显然,键盘宏是一个很好的选择.

但更快的方法是,不会创建许多撤消步骤,这些都是这样的:

(defun lines-to-cslist (start end &optional arg)
  (interactive "r\nP")
  (let ((insertion
         (mapconcat 
          (lambda (x) (format "\"%s\"" x))
          (split-string (buffer-substring start end)) ", ")))
    (delete-region start end)
    (insert insertion)
    (when arg (forward-char (length insertion)))))
Run Code Online (Sandbox Code Playgroud)


Dan*_*eel 5

我今天在工作中为此写了一个解决方案。下面是将行转换为 csv 以及从 csv 转换为行的函数,带有用户指定的分隔符。此功能对当前突出显示的区域进行操作。

(defun lines-to-csv (separator)
  "Converts the current region lines to a single line, CSV value, separated by the provided separator string."
  (interactive "sEnter separator character: ")
  (setq current-region-string (buffer-substring-no-properties (region-beginning) (region-end)))
  (insert
   (mapconcat 'identity
              (split-string current-region-string "\n")
              separator)))

(defun csv-to-lines (separator)
  "Converts the current region line, as a csv string, to a set of independent lines, splitting the string based on the provided separator."
  (interactive "sEnter separator character: ")
  (setq current-region-string (buffer-substring-no-properties (region-beginning) (region-end)))
  (insert
   (mapconcat 'identity
              (split-string current-region-string separator)
              "\n")))
Run Code Online (Sandbox Code Playgroud)

要使用它,请突出显示要编辑的区域,然后执行 Mx 并指定要使用的分隔符。