Emacsmacros来产生一个序列?

我正在阅读这篇关于如何创buildvimacros的文章: vi序列macros ,我看到一个有用的macros在缓冲区中创build一个序列。

1。
2。

100。

在vi中,诀窍是可以在一个数字上点击ctrl-a并添加一个,所以这使macros变得简单。 我希望能够在emacs中做同样的事情。

如果您使用的是Emacs 23(也可能是22),则默认使用绑定到Cx Ck TABkmacro-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)))) ) )