在Emacs中将字符添加到每行末尾

61
假设我有一个文本文件,其中包含以下内容:
1
123
12
12345

如果我想在每行开头添加一个'a',我可以使用string-rectangle(C-x r t),但是如果我想在每行末尾添加一个'a',该怎么办?此后文件应变为:
1a
123a
12a
12345a

谢谢。

伴随问题,如何从每行末尾删除字符?:http://unix.stackexchange.com/q/108459/4671 - Faheem Mitha
请参见 https://dev59.com/yHRA5IYBdhLWcg3w_C4w#774953。 - gdelfino
3个回答

76
您可以使用 replace-regexp 命令来实现这个目的,该命令使用正则表达式元字符 $ 匹配行尾。移动光标到缓冲区的起始位置,然后执行 M-x replace-regexp 命令,输入 $ 和 (您的文本) 以响应两个提示。
或者,在 Emacs 中针对您具体的示例添加 a 的操作如下: M-< M-x replace-regexp RET $ RET a RET

说实话,“键盘宏”也是我的第一反应,但我停下来想了想,“肯定有更简单的方法”。 - nelhage
4
使用“query-replace-regexp”更加精确地执行替换操作,您可以使用“C-M-% $ RET a RET”进行相同的操作。 - phils
2
@phils 你的建议出了些问题,显然那是一种方法,但并不起作用。你可以自己试试看。 - Angus Comber
1
它完全正常运作,我自己在许多场合使用过。我怀疑你可能打错了键盘组合键 C-M-%,在美国键盘上应该是 Ctrl + Alt + Shift + 5(或者使用 M-x query-replace-regexp)。 - phils
不要忘记,在每行开头添加任何内容本质上是相同的,只需使用^而不是$,像这样:M-< M-x replace-regexp RET ^ RET Z RET - Ben
显示剩余3条评论

25

Emacs键盘宏是你的好朋友。

C-x ( C-e a C-n C-x )

这将通过以下步骤设置键盘宏:开始录制键盘宏(C-x (),到达该行末尾(C-e),插入一个 a,到达下一行(C-n),然后结束宏记录(C-x ))。

现在你可以使用 C-x e 执行它,并按下 e 来运行每一行,或者使用 C-x C-k r 在区域上运行它。

如果你经常这样做,你可以保存宏,或者编写一个函数。下面是一个这样的函数:

(defun add-string-to-end-of-lines-in-region (str b e)
  "prompt for string, add it to end of lines in the region"
  (interactive "sWhat shall we append? \nr")
  (goto-char e)
  (forward-line -1)
  (while (> (point) b)
    (end-of-line)
    (insert str)
    (forward-line -1)))

4
我通常通过输入 F3 End a Down F4,然后跟着一系列的 F4 来创建这样的宏。相比于 Emacs 的快捷键,我更倾向于使用普通的箭头键和 Home/End 键。 - Rene Saarsoo
1
另外一个有用的信息是,当然你可以通过多次按下 e 键来结合 C-u 来重复执行任务:使用 C-u 20 C-x e 来获得宏的 20 次重复。 - mogsie

0

另一个选项是安装multiple-cursors包:https://github.com/magnars/multiple-cursors.el

然后你可以标记(选择)所有这些行,并运行mc/edit-ends-of-lines命令,它将在每个被标记行的末尾创建一个光标。接下来输入你的文本,它将会在每个光标处添加。


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