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

时间:2013-07-29 10:55:39

标签: emacs

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

one
two
three
four

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

"one", "two", "three", "four"

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

4 个答案:

答案 0 :(得分:6)

编辑:看到你正在寻找一个功能...但是因为唯一的答案就是自己编写(即没有内置 - 在一个存在的情况下,我认为我正在使用正则表达式,因为其他人可能偶然发现并欣赏编写函数并将其放入{{1}的替代方法。 }。


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

粘贴在Emacs .emacs缓冲区中(添加*scratch*以显示每行有多个单词,如果感兴趣的话):

five six

首先,将个人one two three four five six 替换为word

"word"产生:

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

现在,用"one" "two" "three" "four" "five six" 替换每个回车符(在Emacs,C-q C-j中):

,产生:

M-x replace-regexp RET C-q C-j RET , RET

答案 1 :(得分: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)))))

答案 2 :(得分:4)

我今天在工作中为此写了一个解决方案。下面是使用用户指定的分隔符从行转换为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")))

要使用此功能,请突出显示要编辑的区域,然后执行M-x并指定要使用的分隔符。

答案 3 :(得分:0)

我通常使用宏来完成这些任务。 M-X kmacro-start-macroM-x kmacro-end-or-call-macro,然后您可以重复执行此操作。