我经常将换行符或换行符分隔的项目粘贴到Emacs缓冲区中,导致每个项目驻留在不同的行上,如下所示:
one
two
three
four
我经常想要一个逗号分隔值列表,如下所示:
"one", "two", "three", "four"
能够从一行到另一行进行一键式转换会很棒。我想我可以使用正则表达式转换它,但它似乎是可能已经具有内置Emacs函数的常用操作。任何人都可以推荐一个吗?
答案 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-macro
和M-x kmacro-end-or-call-macro
,然后您可以重复执行此操作。