我经常将换行符或换行符分隔的项目粘贴到Emacs缓冲区中,导致每个项目驻留在不同的行上,如下所示:
one
two
three
four
Run Code Online (Sandbox Code Playgroud)
我经常想要一个逗号分隔值列表,如下所示:
"one", "two", "three", "four"
Run Code Online (Sandbox Code Playgroud)
能够从一行到另一行进行一键式转换会很棒.我想我可以使用正则表达式转换它,但它似乎是可能已经具有内置Emacs函数的常用操作.任何人都可以推荐一个吗?
编辑:我做看你正在寻找一个功能......但自从唯一的答案很简单,就是写自己的(即没有内置的话),我想我会附和什么正则表达式会,因为其他人可能偶然发现这一点,并欣赏另一种写作功能并将其放入其中的方法.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)
我今天在工作中为此写了一个解决方案。下面是将行转换为 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 并指定要使用的分隔符。