如何让Emacs取消代码块的换行?

4

假设我有一个在emacs缓冲区中的行,看起来像这样:

foo -option1 value1 -option2 value2 -option3 value3 \
    -option4 value4 ...

我希望它看起来像这样:

foo -option1 value1 \
    -option2 value2 \
    -option3 value3 \
    -option4 value4 \
    ...

我希望每个选项/值对都在单独的一行上。我还希望这些后续行根据模式适当缩进,而不是添加固定数量的空格。我更喜欢代码在当前块上运行,停止于第一个非空行或不包含选项/值对的行,虽然我可以接受它在选定区域上工作。
有人知道一个elisp函数可以做到这一点吗?
4个回答

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
在这种情况下,我会使用宏。您可以使用 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 跳过一些匹配项。
注意:由于您的示例是“临时”的,因此此解决方案也将是如此。通常,当需要临时解决方案时使用宏。使宏更加一致的一种方法是将原始语句全部放在一行上(也可以通过宏或手动完成)。
编辑:感谢您关于(与C-(的评论,您是正确的,我犯了错误!

0

就我个人而言,我经常做这样的事情。

但是除非我会每天都这样做一年,否则我不会写一个函数来做它。

您可以使用query-replace轻松完成此操作,如下所示:

m-x(query-replace“-option”“^Q^J -option”)

我说^Q^J,因为这是您键入以引用换行符并将其放入字符串中的内容。

然后只需按'y'替换字符串,按'n'跳过您可能遇到的奇怪情况即可。

另一个实用的函数是query-replace-regexp,它可以进行正则表达式替换。

还有grep-query-replace,它将通过解析grep命令的输出来执行query-replace。这很有用,因为您可以在100个文件中搜索“foo”,然后对每个出现跳过从文件到文件的查询替换。


0

你的模式可能已经支持这个功能了。在 C 模式和 Makefile 模式下,至少 M-q(填充段落)会在填充列中插入行继续符并换行。

你正在哪个模式下编辑这个文件?


tcl-mode。fill-paragraph 不是我想要的,因为我不想要填充段落,我想要将其拆分成行,每行一个选项/值对。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接