Emacs宏生成一个序列?

时间:2009-10-02 13:59:29

标签: emacs

我正在阅读有关如何创建vi宏的文章: vi sequence macro我看到了一个有用的宏来在缓冲区中创建一个序列。

1。
2.
...
100.

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

10 个答案:

答案 0 :(得分:60)

如果您使用的是Emacs 23(可能是22?),请使用默认情况下绑定到kmacro-insert-counter的{​​{1}}。所以对于你的例子,你会这样做:

C-x C-k TAB

所以启动宏,插入计数器后跟'。',换行符,结束宏。然后C-x ( C-x C-k TAB . RET C-x )等或C-x e e e e e e e获得100个。

编辑:

忘记提及你也可以将计数器设置为初始值。例如,从1开始而不是0开始M-1 0 0 C-x e

如果您不希望计数器在特定点递增,请在其前面添加M-1 C-x C-k C-c。当然,此时击键变得有点荒谬,所以我通常将一个键绑定到插入但不增加。

答案 1 :(得分:54)

那些觉得有太多难以记住的技巧的人可能会发现获得一些elisp更有利可图:

M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i))))

答案 2 :(得分:18)

Emacs 23在replace-regexp的替换文本中支持elisp片段。

我经常定义遵循这种模式的键盘宏:

  • 复制一段文字
  • 使用isearch
  • 导航到我要在复制的文本块中递增的数字
  • 激活标记并移动该点以定义包含数字的区域
  • M-x replace-regexp
  • 在“替换正则表达式”提示下,输入\([0-9]+\)以捕获一组一个或多个数字
  • 在“将正则表达式([0-9] +)替换为:”提示符下,输入\,(1+ \#1),其中,表示要替换的elisp表单如下,1+是增量函数,\#1是第一个捕获的匹配文本,解释为数字。

在花了一分钟来定义键盘宏之后,这使我几乎可以方便地剪切和粘贴以生成大量几乎完全相同的代码块,例如case语句。

注意,这种技术可以很容易地适用于例如双数(\,(* 2 \#1))或其他。您甚至可以使用'position'nth的组合来替换任意序列中的下一个元素,但我现在不会介绍它:)。

答案 3 :(得分:10)

自Emacs 24.3发布以来(我实际上自24.0版本起),键击序列已经简化:

<F3> <F3> . <ENTER> <F4>

然后重复<F4>键将重复该宏。

诀窍在于,在使用<F3>启动宏之后,按下第二个<F3>键会将键盘宏计数器的当前值插入缓冲区,并递增反击1。

其他技巧:

  • <F3> C-u 2 <F3> . <ENTER> <F4>将以+2(而非+1)
  • 递增
  • C-u 100 <F3> <F3> . <ENTER> C-u 50 <F4>将从100开始并以149
  • 结束
  • C-x C-k C-f %03d <ENTER> <F3> <F3> . <ENTER> <F4>将填充0,如&#34; 000&#34;

来自:Emacs手册中的Keyboard Macro Counter部分。

答案 4 :(得分:7)

除了scottfrazer's answer之外,还有另一种方法可以使用CUA mode创建一系列数字,这在编辑现有内容时可能对您有很大帮助。请参阅位置2:30的Mark Mansour's screencast on Emacs Column Editing

答案 5 :(得分:3)

如果您打开CUA次要模式(cua-mode),则可以选择一列文字,然后使用cua-sequence-rectangle(通过M-n绑定一系列数字填充它默认值)。

这与TörökGábor关联的视频中提到的相同,但是现在它写在这里,所以除非你想要,否则你不必观看整个视频。这是一个很好的视频。

答案 6 :(得分:1)

以下是extension可能有所帮助。

答案 7 :(得分:1)

还有:

C-u M-! jot -s '.C-q C-j' 10

这不是纯粹的elisp,但具有相同的效果。您可以编写一个命名宏来为您运行它。

答案 8 :(得分:1)

您可以使用shell-command-on-region

C-u M-! seq 1 100|xargs -I{} echo {}"."

答案 9 :(得分:0)

这是一个简单的解决方法:

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