我正在阅读这篇关于如何创建vi宏的文章: vi序列宏,我看到了一个有用的宏来在缓冲区中创建一个序列.
1.
2.
...
100.
在vi中,诀窍是可以在一个数字上点击ctrl-a并且它会添加一个,所以这使得宏变得容易.我希望能够在emacs中做同样的事情.
如果您使用的是Emacs 23(可能是22?),请使用默认情况下kmacro-insert-counter
绑定的Emacs C-x C-k TAB
.所以对于你的例子,你会这样做:
C-x ( C-x C-k TAB . RET C-x )
所以启动宏,插入计数器后跟'.',换行符,结束宏.然后C-x e e e e e e e
等等或者M-1 0 0 C-x e
得到100个.
编辑:
忘了提你也可以将计数器设置为初始值.例如从1开始而不是0开始M-1 C-x C-k C-c
.
如果您不希望计数器在特定点递增,请在其前面加上C-u
.当然,键击在这一点上变得有点荒谬,所以我通常将一个键绑定到插入但不增加.
那些觉得有太多难以记住的技巧的人可能会发现获得一些更有利可图的elisp:
M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i))))
Emacs 23在replace-regexp的替换文本中支持elisp片段.
我经常定义遵循这种模式的键盘宏:
复制一段文字
使用isearch导航到我想要在复制的文本块中递增的数字
激活标记并移动该点以定义包含该数字的区域
Mx replace-regexp
在"替换正则表达式"提示下,输入\([0-9]+\)
以捕获一组一个或多个数字
在"替换正则表达式([0-9] +)与:"提示符下,输入\,(1+ \#1)
,其中,
表示要替换的elisp表单如下,1+
是增量函数,并且\#1
是第一个捕获的匹配文本,被解释为数字.
在花了一分钟来定义键盘宏之后,这使我几乎可以方便地剪切和粘贴以生成大量几乎完全相同的代码块,例如case
语句.
请注意,此技术可以很容易地适应例如双数(\,(* 2 \#1)
)或其他.你甚至可以用它使用的组合来替代下一个元素以任意顺序'position
和'nth
,但我不会去,现在:).
自从Emacs发布24.3版(我实际上从版本24.0开始就相信)以来,按键序列已经简化:
然后重复
键将重复宏.
诀窍在于,在启动宏之后
,第二次
按键会将键盘宏计数器的当前值插入缓冲区,并将计数器递增1.
其他技巧:
将以+2(而不是+1)递增
C-u 100
将从100开始并在149完成
C-x C-k C-f %03d
将填充零像"000"
来源:Emacs手册中的键盘宏计数器部分.
除了scottfrazer的答案之外,还有另一种使用CUA模式创建数字序列的方法,在编辑现有内容时可以帮助您.从2:30位置看马克曼苏尔关于Emacs专栏编辑的截屏视频.