键盘宏循环遍历条目列表并插入

Keyboard macro cycling over a list of entries and inserting

我正在学习很棒的键盘宏和计数器。例如,您可以使用 C-x C-k C-i.

在键盘宏中递增计数器

是否可以循环遍历列表?例如,假设我有这个列表:("oranges" "apples" "bananas") 如何编辑以下文字

Monday, I eat
Tuesday, I eat
Wednesday, I eat

要变成这样?

Monday, I eat oranges
Tuesday, I eat apples
Wednesday, I eat bananas

到达列表末尾,下一次执行键盘宏将循环回到开头。我怎样才能用键盘宏来做到这一点?键盘宏是最好的方法吗?

假设我们有一个包含以下内容的缓冲区:

Monday, I eat
Tuesday, I eat
Wednesday, I eat
Thursday, I eat
Friday, I eat
Saturday, I eat
Sunday, I eat

还假设我们在列表中有我们的选择,我们称之为 my-snacks:

(setq my-snacks '("oranges" "apples" "bananas"))

要使用计数器在 my-snacks 列表上重复迭代,我们可以使用由键盘宏计数器的值除以列表长度的余数形成的索引值:

(nth (% MACRO-COUNTER-VALUE (length my-snacks)) my-snacks)

我们的键盘宏可以使用eval-expression插入列表索引操作的值

我们从缓冲区开头的点开始。键盘宏执行以下步骤:

  1. 转到行尾:C-e
  2. 插入一个space:SPC
  3. 求值表达式:M-:
  4. 在插入键盘计数器值之前插入上述 elisp 表达式的部分:(insert (nth (%
  5. 插入键盘宏计数器值:F3
  6. 插入 elisp 表达式的其余部分: (length my-snacks)) my-snacks))
  7. 回车:RET
  8. 转到行首:C-a
  9. 转到下一行:C-n

keyboard macro counter documentation所示,键盘宏使用F3键插入键盘宏计数器的当前值。

这是键盘宏形式的相同宏:

C-e                 ;; move-end-of-line
SPC                 ;; self-insert-command
M-:                 ;; eval-expression
(insert             ;; self-insert-command * 7
SPC                 ;; self-insert-command
(nth                ;; self-insert-command * 4
SPC                 ;; self-insert-command
(%                  ;; self-insert-command * 2
SPC                 ;; self-insert-command
<f3>                ;; kmacro-start-macro-or-insert-counter
SPC                 ;; self-insert-command
(length             ;; self-insert-command * 7
SPC                 ;; self-insert-command
my-snacks))         ;; self-insert-command * 11
SPC                 ;; self-insert-command
my-snacks))         ;; self-insert-command * 11
RET                 ;; newline
C-a                 ;; move-beginning-of-line
C-n                 ;; next-line