在Emacs中运行宏直到文本文件结束

时间:2011-09-24 16:23:04

标签: emacs macros text-processing

我有一个文本文件,其中包含一些示例内容,如下所示:

Sno = 1p
Sno = 2p
Sno = 3p

我想要的是从每个列中删除p。 有了这个意图,我写了一个宏:

M-x //go to buffer
C-x (//start the macro
C-s = // search for equalto sign
RET C-f C-f // reach to te alphabet 'p'
DEL // Delete
C-n  C-x )//go to new line and Close the macro definition 
C-x e

e两次将删除p,但如果我想在文件末尾执行相同的操作,我该怎么办?我无法按e如果我有20000这样的线。该怎么办??

请不要建议正则表达式,因为这是一个示例,而不是实际情况。 请不要建议任何elisp,我很乐意记住emacs的shortcutf。

4 个答案:

答案 0 :(得分:65)

M-0 C-x e重复上一个宏直到发生错误(在最后一行之后,C-s =C-n将会出错。)

你可能听到一声恼人的哔哔声。

答案 1 :(得分:15)

您可以使用“apply-macro-to-region-lines”功能将最后定义的键盘宏应用于区域中的所有行。因此,您遵循的步骤是:

  1. 定义你的键盘宏(你已经完成但我已经在第3行添加了另一个 C-f ):

    C-x( C-s = RET C-f C-f C-f DEL C-n C-x)

  2. 使用“mark-whole-buffer”命令选择整个缓冲区(默认情况下,它绑定到 C-x h )。或者,如果您只想更改一定数量的行,只需选择要更改的行。

  3. 运行“apply-macro-to-region-lines”功能(默认情况下,它绑定到 C-x C-k r )。

  4. 所有的p都将被移除。

答案 2 :(得分:1)

我通常在用M-x name-last-kbd-macro定义宏之后为宏命名,所以我可以方便地用M-x调用它。然后我用数字前缀称它。 E.g。

M-1000 M-x macroname

我工作的文件通常没有1000个宏可以操作的地方,所以1000足够大,它会在文件末尾自动停止。如果你有更大的文件,你可以使用1000000作为前缀,如果它仍然不够,那么你可以用1000000作为前缀再次调用它。

答案 3 :(得分:-3)

您可以尝试:M-20000 C-x e以便在定义宏之后执行20000次这些操作。