题
假设我的 emacs 缓冲区中有一行如下所示:
foo -option1 value1 -option2 value2 -option3 value3 \
-option4 value4 ...
我希望它看起来像这样:
foo -option1 value1 \
-option2 value2 \
-option3 value3 \
-option4 value4 \
...
我希望每个选项/值对都在单独的行上。我还希望这些后续行根据模式适当缩进,而不是添加固定数量的空格。我希望代码在当前块上工作,在第一个非空白行或不包含选项/值对的行处停止,尽管我可以满足它在选定区域上工作的情况。
有人知道 elisp 函数可以做到这一点吗?
解决方案
没有人拥有我想要的东西,所以我决定掸掉我的 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)))
其他提示
在这种情况下我会使用宏。您可以使用 C-x 开始录制宏(并使用 C-x 停止录制)。当您想要重播宏时,请键入 C-x e。
在这种情况下,我会输入 C-a C-x ( C-s value a l u e C-f C-f \ RET SPC SPC SPC SPC C-x )
这将记录一个搜索“值”的宏,向前移动 2,插入斜杠和换行符,最后将新行隔开以对齐。然后你可以重复这个宏几次。
编辑:我刚刚意识到,您的文字文本可能不像“value1”那么容易搜索。您还可以搜索空格并循环浏览命中内容。例如,在第一场比赛后按几次 C-s 可跳过某些比赛。
笔记:由于您的示例是“临时”的,因此该解决方案也是如此。当您需要临时解决方案时,通常会使用宏。使宏应用更加一致的一种方法是将原始语句全部放在一行上(也可以通过宏或手动完成)。
编辑:感谢您对 ( 与 C-( 的评论,你是对的,我的错误!
就我个人而言,我一直在做这样的事情。
但是,除非我每天都会在一年中每天这样做,否则我不会写一个功能。
您可以使用查询替换轻松完成此操作,如下所示:
m-x(查询替换“-选项”“^Q^J -选项”)
我说 ^q ^j,因为那是您要输入的引用newline并将其放入字符串中的内容。
然后按“ y”以替换字符串,然后“ n”跳过您会发现的零角盒。
另一个主力功能是查询重定位regexp,可以替换正则表达式。
以及Grep-Query-Replace,它将通过解析GREP命令的输出来执行查询重复位置。这很有用,因为您可以在100个文件中搜索“ foo”,然后在每次文件中跳过文件上进行查询重新定位。
您的模式可能已经支持这一点。至少在 C 模式和 Makefile 模式下,M-q(填充段落)将在填充列中插入行延续并换行。
你在什么模式下编辑这个?