The Emacs's Keyboard Macro Counter
Emacs的键盘宏在执行过程中, 维护了一个计数器, 按照执行次数累加, 还可以插入缓冲区. 这使宏在每次执行时, 可以产生变化, 为诸如生成一列递增数字之类的任务, 变得轻松.
下面是Emacs 手册 17.3 The keyboard Macro Counter 译文.
17.3 键盘宏计数器
每个键盘宏都有一个关联的计数器. 当您开始定义宏时, 计数器初始化为0. 当前计数器 允许您在缓冲区中插入一个数字, 该数字取决于此宏被调用的次数. 通常情况下, 计数器 的数字在每次插入缓冲区后, 其值也会递增.
除了当前计数器之外, 键盘宏还保留上一个计数器, 该计数器记录当前计数器上次递增或设
置时的值. 请注意, 将当前计数器递增0, 例如, 使用C-u 0 C-x C-k C-i
, 也会将当前计
数器的值存入上一个计数器值.
F3
在键盘宏定义的时候, 在缓冲区中插入键盘宏计数器值(kmacro-start-macro-or-insert-counter).
C-x C-k C-i
在缓冲区中插入键盘宏计数器值(kmacro-insert-counter). (译注: 每次插入都增加1或前缀参数大小)
C-x C-k C-C
设置键盘宏计数器的值(kmacro-set-counter), 提示输入或前缀参数大小.
C-x C-k C-a
将前缀参数加到键盘宏计数器的值上(kmacro-add-counter).
C-x C-k C-f
指定插入键盘宏计数器的格式(kmacro-set-format).
定义键盘宏时, 命令F3
(kmacro-start-macro-or-insert-counter)将键盘宏计数器的当
前值插入缓冲区, 并将计数器递增1. (如果未定义宏, 则F3
将开始宏定义. 请参阅基本
键盘宏.) 您可以使用数字前缀参数指定不同的增量. 如果您只指定一个C-u
前缀, 它将
插入上一个计数器值, 而不会更改当前值.
作为一个例子, 让我们展示如何使用键盘宏计数器来构建一个带编号的列表. 考虑以下按 键顺序:
1 | F3 C-a F3 . SPC F4 |
作为此键盘宏定义的一部分, 字符串”0. “插入到当前行的开头. 如果现在移动到缓冲区 的其他位置并键入F4以调用宏, 则字符串”1. “插入到该行的开头. 后续调用插入 “2. “ 和”3. “等等.
命令 C-x C-k C-i
(kmacro-insert-counter)的作用与 F3
相同, 但即使没有键盘宏
被定义时, 它也可以使用. 当没有键盘宏被定义或执行时, 这个命令就把当前宏环
(keyboard macro ring)中第一个宏的计数器值插入缓冲区, 然后递增.1
命令 C-x C-k C-C
(kmacro-set-counter)将当前宏计数器设置为数值参数的值. 如果
在宏定义时使用这个命令, 它会在宏的每次重复执行时, 进行同样操作. 如果在执行宏时,
只指定 C-u
作为C-x C-k C-C
的前缀, 则会将计数器重置为当前宏重复开始时的值
(撤消此重复中迄今为止的任何增量).2
命令 C-x C-k C-a
(kmacro-add-counter)将前缀参数添加到当前宏计数器. 如果只使
用C-u
为参数, 将计数器重置为任何键盘宏插入的最后一个值. (通常, 当您使用此命
令时, 最后一个插入值是在同一个宏中, 并且是同一个计数器. )
命令 C-x C-k C-f
(kmacro-set-format)提示输入插入宏计数器时要使用的格式. 默
认格式为‘%d’, 这意味着插入十进制数字, 而不使用任何填充. C-x C-k C-f
后直接回
车退出, 格式会重置为此默认值. 您可以指定format函数接受的任何格式字符串, 只要是
有意义的一个的整数参数(请参阅emacslisp参考手册中的 Formatting
Strings
). 在minibuffer中输入格式字符串时, 不要将它放在双引号内.
如果在未定义或执行键盘宏时使用此命令, 则新格式会影响所有后续宏定义. 现有宏继续 使用定义时有效的格式. 如果在定义键盘宏时设置格式, 则这会影响从那时起定义的宏, 但不会影响后续宏. 在每个步骤中, 宏的执行都将使用定义期间该步骤中有效的格式. 在 执行宏期间对宏格式所做的更改与在宏定义期间所做的相应更改一样, 不会对后续宏产生任 何影响.
C-x C-k C-f
设置的格式不影响寄存器中存储的数字的插入.
如果使用寄存器作为计数器, 在宏的每次重复时递增寄存器, 则可以实现与键盘宏计数器相 同的功能. 参见 Number Registers. 大多数情况下, 使用键盘宏计数器比较简单.
Emacs 的宏定义和执行, 相比vim宏来说, 默认键绑定更方便!
F3 开始宏定义, 或插入宏计数器值. F4 结束宏定义, 或调用最后一个宏定义.
- 1.译注: Emacs
WiKi 解释的更清楚
C-x C-k C-i
插入键盘宏计数器的当前值,并将计数器递增1。可以使用数字前缀参数来 指定不同的增量。如果仅指定C-u
前缀,则重复最后插入的计数器值,而不增加计数器值。 ↩ - 2.译注: 也就是说一个宏, 重复执行了几次后, 想重置计数器为重复执行前的初始值, 可以按
C-u C-x C-k C-c
. ↩