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)))) ) )