4

假设我在 emacs 缓冲区中有一行,如下所示:

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

我希望它看起来像这样:

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

我希望每个选项/值对在单独的行上。我还希望那些后续行根据模式适当缩进,而不是添加固定数量的空白。我希望代码在当前块上工作,在第一个非空行或不包含选项/值对的行处停止,尽管我可以满足于它在选定区域上工作。

有人知道 elisp 函数可以做到这一点吗?

4

4 回答 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)))
于 2008-09-16T20:48:20.800 回答
1

在这种情况下,我会使用宏。您可以使用 Cx ( 开始录制宏,并使用 Cx 停止录制)。当你想重播宏类型 Cx e.

在这种情况下,我会输入 Ca Cx ( Cs value Cf Cf \ RET SPC SPC SPC SPC Cx )

这将记录一个搜索“值”的宏,向前移动 2,插入斜杠和换行符,最后将新行隔开以对齐。然后你可以重复这个宏几次。

编辑:我刚刚意识到,您的文字可能不像“value1”那样容易搜索。您还可以搜索空格并循环点击。例如,在第一场比赛后击中 Cs 几次以跳过一些比赛。

注意:由于您的示例是“临时”的,因此该解决方案也是如此。当您需要临时解决方案时,通常会使用宏。使宏应用更一致的一种方法是将原始语句全部放在一行上(也可以通过宏或手动完成)。

编辑:感谢您对 ( 与 C-( 的评论,您是对的,我的错误!

于 2008-09-16T02:54:04.160 回答
0

就个人而言,我一直在做这样的事情。

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

您可以使用查询替换轻松完成,如下所示:

mx(查询替换“-option”“^Q^J -option”)

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

然后只需按“y”替换要替换的字符串,然后按“n”跳过你会发现的奇怪的角落案例。

另一个主力函数是 query-replace-regexp,它可以替换正则表达式。

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

于 2008-09-16T03:26:28.247 回答
0

您的模式可能已经支持这一点。至少在 C 模式和 Makefile 模式下,Mq(填充段落)将在填充列中插入续行并换行。

你在什么模式下编辑这个?

于 2008-09-16T03:55:29.580 回答