Emacsmacros来产生一个序列?
我正在阅读这篇关于如何创buildvimacros的文章: vi序列macros ,我看到一个有用的macros在缓冲区中创build一个序列。
  1。 
  2。 
  … 
  100。 
在vi中,诀窍是可以在一个数字上点击ctrl-a并添加一个,所以这使macros变得简单。 我希望能够在emacs中做同样的事情。
如果您使用的是Emacs 23(也可能是22),则默认使用绑定到Cx Ck TAB的kmacro-insert-counter 。 所以对于你的例子,你会这样做: 
 Cx ( Cx Ck TAB . RET Cx ) 
 因此,启动macros,插入计数器,然后按'。',换行符,结束macros。 然后Cx eeeeeee等或者M-1 0 0 Cx e得到100个。 
编辑:
 忘了提及你可以设置计数器的初始值也。 例如,从1开始而不是0开始M-1 Cx Ck Cc 。 
 如果您不希望计数器在某个特定点上增加,请在Cu加上。 当然,在这一点上,击键有点荒谬,所以我通常绑定一个键来插入但不增加。 
那些觉得有太多窍门的人可能会发现获得一些更有利可图的elisp:
M- :( dotimes(i 20)(插入(格式“%2d。\ n”(1 + i))))
Emacs 23在replace-regexp的replace文本中支持elisp片段。
我经常定义遵循这种模式的键盘macros:
- 复制一段文字
- 使用isearch导航到想要在复制的文本块中增加的数字
- 激活标记并移动该点以定义包含该数字的区域
- Mx replace-regexp
-  在“replace正则expression式”提示下,input\([0-9]+\)来捕获一个或多个数字
-  在“Replace regexp([0-9] +)with:”提示符下,input\,(1+ \#1),其中,表示要replace的elisp表单,1+表示增量函数,\#1是第一个捕获的匹配文本,解释为一个数字。
 花了一分钟的时间来定义键盘macros,这使我几乎有切割和粘贴的便利,以生成大量几乎相同的代码块,例如case语句。 
 请注意,这种技术可以很容易地适应例如双数( \,(* 2 \#1) )或其他。 你甚至可以用'position 'nth和'nth 'position的组合来replace下一个元素,但是我现在不会进入这个:)。 
自从Emacs 24.3(我相信从版本24.0开始)以来,键盘序列已经被简化了:
 <F3> <F3> . <ENTER> <F4> 
 然后重复<F4>键将重复该macros。 
 诀窍是,用<F3>开始一个macros之后,第二个<F3>按键将键盘macros计数器的当前值插入到缓冲区中,并将计数器加1。 
其他技巧:
-  <F3> Cu 2 <F3> . <ENTER> <F4><F3> Cu 2 <F3> . <ENTER> <F4>将以+2(而非+1)递增,
-  Cu 100 <F3> <F3> . <ENTER> Cu 50 <F4>Cu 100 <F3> <F3> . <ENTER> Cu 50 <F4>将从100开始并在149结束
-  Cx Ck Cf %03d <ENTER> <F3> <F3> . <ENTER> <F4>Cx Ck Cf %03d <ENTER> <F3> <F3> . <ENTER> <F4>将填充零,如“000”
来源:Emacs手册中的键盘macros计数器部分。
除了scottfrazer的答案 ,还有另一种方法来创buildCUA模式的数字序列,这可能会帮助你很多编辑现有的内容。 请参阅Mark Mansour在位置2:30从Emacs列编辑的屏幕录像 。
 如果打开CUA次要模式( cua-mode ),则可以select一列文本,然后使用cua-sequence-rectangle (默认绑定到Mn )填充一系列数字。 
这与TörökGábor的video中提到的是相同的东西,但是现在在这里写下来,所以除非你愿意,否则不需要观看整个video。 这是一个很好的video。
这是一个可能有所帮助的扩展 。
还有:
 Cu M-! jot -s '. Cq Cj ' 10 
这不是纯粹的elisp,但具有相同的效果。 你可以写一个命名的macros为你运行它。
 否则,您可以使用shell-command-on-region : 
 Cu M-! seq 1 100|xargs -I{} echo {}"." 
这是一个简单的defun:
 (defun insert-range (START END &optional STEP FORMAT) "Inserts a range of integers from START to END with STEP (default to 1) in a given format (default to \"\\n%d\")" (interactive (list (read-number "Start: " 1) (read-number "End: " 10) (read-number "Step: " 1) (read-string "Format (default to \"\\n%d\"): " nil nil "\n%d") )) (dotimes (i (1+ (/ (- END START) STEP))) (insert (format FORMAT (+ START (* i STEP)))) ) )