如何在 Emacs 中为一系列命令设置单个键绑定

How to set a single key binding for a sequence of commands in Emacs

Emacs 手册只有一个为单个命令设置绑定的示例。如何为一系列命令执行此操作。具体如下。

这实际上是单行滚动。

您可以使用 keyboard macros 完成该任务。 link 几乎解释了如何去做,为了完整起见,这里是要做的事情:

  1. 点击 C-x ( 开始录制键盘宏。
  2. 执行命令应该执行的操作(即执行命令、击键...)
  3. 点击 C-x ) 停止录制键盘宏。
  4. 执行M-x name-last-kbd-macro命名最后定义的键盘宏(即你定义的那个)。
  5. 执行M-x insert-kbd-macro插入最后定义宏的代码,复制到你的init file.
  6. (global-set-key (kbd "M-n") 'my-macro) 放入您的 init file(假设您将宏命名为 my-macro)。
  7. 盈利!
  1. 找出 C-v 绑定到的命令(函数):C-h k C-v。答案:
    C-v runs the command scroll-up-command, which is an interactive
    compiled Lisp function in `window.el'.

    It is bound to C-v, <next>.

    (scroll-up-command &optional ARG)

    Scroll text of selected window upward ARG lines

C-u 1 在这里做什么?告诉 C-v 向上滚动 1 行。

所以你想调用 scroll-up-command,传递给它一个 ARG of 1: (scroll-up-command 1).

  1. 你如何定义你自己的命令?

    (defun my-scroll-up-1-line ()
      "Scroll up one line."
      (interactive)
      (scroll-up-command 1))
    

    参见Elisp手册,节点Defining Commands

  2. 并绑定到M-n?

    (global-set-key (kbd "M-n") 'my-scroll-up-1-line)
    

    参见 Emacs 手册,节点 Rebinding

为一系列命令定义键绑定的解决方案是 下面提供。摘要如下:

  • 创建键盘宏并指定名称

    • 向上滚动步骤:C-u 1 先验
    • 向上滚动步长:C-u 1 下一个
  • 将宏绑定到组合键

    • M- <- 向上滚动步长
    • M- <- 向下滚动步长

您可以将此代码包含到您的 init.el 文件中

(fset 'scroll-up-step
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 49 prior] 0 "%d")) arg)))
(fset 'scroll-down-step
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([21 49 next] 0 "%d")) arg)))
(global-set-key (kbd "M-<up>") 'scroll-up-step)
(global-set-key (kbd "M-<down>") 'scroll-down-step)
(global-set-key (kbd "\e <up>") 'scroll-up-step)
(global-set-key (kbd "\e <down>") 'scroll-down-step)

详细步骤:

开始宏定义

<F3> 开始 KBD 宏定义

C-u 1 prior 您希望绑定的命令序列

<F4> 结束 KBD 宏定义

给最近的宏一个自定义名称(不要冲突!)

C-x C-k n scroll-up-step

对其他自定义命令执行相同的操作

<F3>
C-u 1 next
<F4>
C-x C-k n scroll-down-step

注:

先验 = PgUp / fn+up (Macbook)

next = PgDown / fn+down (Macbook)

在 Emacs

中打开 init.el

C-x C-f </path/to/init.el>(通常是“~/.emacs.d/init.el”)

将宏 lisp 定义附加到 init.el 文件

M-x insert-kbd-macro RET scroll-up-step RET
M-x insert-kbd-macro RET scroll-down-step RET

将自定义命令的键绑定附加到 init.el 文件

(global-set-key (kbd "M-<up>") 'scroll-up-step)
(global-set-key (kbd "M-<down>") 'scroll-down-step)
(global-set-key (kbd "\e <up>") 'scroll-up-step)
(global-set-key (kbd "\e <down>") 'scroll-down-step)

您会注意到我已经包含了键绑定定义 一次绑定两次。这是因为绑定与 元键。元键在 GUI 模式中被描述为 M,但是 终端仍然认为它是 ESC(即使 alt/option 键是 按下)。因此我定义了两次,这样它就可以在两个 GUI 中工作 和 Emacs 的终端模式。

这可能不是定义键绑定的最快方法 命令序列。但它确实有效。我想知道是否有人有 更简单的解决方案(如果有的话)。