假设我在emacs缓冲区中有一行如下所示:
foo -option1 value1 -option2 value2 -option3 value3 \
-option4 value4 ...
我希望它看起来像这样:
foo -option1 value1 \
-option2 value2 \
-option3 value3 \
-option4 value4 \
...
我希望每个选项/值对都在一个单独的行上。我还希望那些后续行根据模式适当缩进,而不是添加固定数量的空格。我希望代码在当前块上工作,在第一个非空行或不包含选项/值对的行停止,但我可以解决它在选定区域上工作。
有人知道elisp功能吗?
答案 0 :(得分:2)
没有人有我想要的东西,所以我决定把我的elisp手册除掉,自己做。这似乎工作得很好,虽然输出不是我要求的。在这个版本中,第一个选项单独出现,而不是像我原来的问题那样停留在第一行。
(defun tcl-multiline-options ()
"spread option/value pairs across multiple lines with continuation characters"
(interactive)
(save-excursion
(tcl-join-continuations)
(beginning-of-line)
(while (re-search-forward " -[^ ]+ +" (line-end-position) t)
(goto-char (match-beginning 0))
(insert " \\\n")
(goto-char (+(match-end 0) 3))
(indent-according-to-mode)
(forward-sexp))))
(defun tcl-join-continuations ()
"join multiple continuation lines into a single physical line"
(interactive)
(while (progn (end-of-line) (char-equal (char-before) ?\\))
(forward-line 1))
(while (save-excursion (end-of-line 0) (char-equal (char-before) ?\\))
(end-of-line 0)
(delete-char -1)
(delete-char 1)
(fixup-whitespace)))
答案 1 :(得分:1)
在这种情况下,我会使用一个宏。您可以开始使用C-x录制宏(并使用C-x停止录制)。如果要重播宏类型C-x e。
在这种情况下,我会键入,C-a C-x(C-s v a l u e C-f C-f \ RET SPC SPC SPC SPC C-x)
这将记录一个搜索“value”的宏,向前移动2,插入斜线和换行符,最后将新行换成对齐。然后你可以重复几次这个宏。
编辑:我刚刚意识到,你的文字文字可能不像“value1”那样容易搜索。您还可以搜索空格并循环浏览。例如,在第一场比赛后几次击中C-s以跳过一些比赛。
注意:由于您的示例是“ad-hoc”,因此该解决方案也是如此。通常在需要临时解决方案时使用宏。使宏应用更加一致的一种方法是将原始语句全部放在一行上(也可以通过宏或手动完成)。
编辑:感谢您的评论(与C-对比,(你错了!)
答案 2 :(得分:0)
就个人而言,我一直这样做。
但我不会写一个函数去做,除非我会这样做 一年一天。
您可以使用query-replace轻松完成此操作,如下所示:
m-x(query-replace“-option”“^ Q ^ J -option”)
我说^ Q ^ J因为这是你打算引用换行符并输入的内容 字符串。
然后按'y'表示要替换的字符串,然后按'n'跳过wierd 你找到的角落案例。
另一个主力函数是query-replace-regexp,它可以做到 替换正则表达式。
以及grep-query-replace,它将通过解析执行查询替换 grep命令的输出。这很有用,因为您可以搜索 对于100个文件中的“foo”,然后在每次出现时执行查询替换 从文件跳转到文件。
答案 3 :(得分:0)
您的模式可能已经支持此功能。在C模式和Makefile模式下,至少M-q(fill-paragraph)会在填充列中插入行连续并包裹你的行。
您在哪种模式下编辑?