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

Ébe*_*aac 2 emacs emacs24

Emacs手册仅提供了为单个命令设置绑定的示例.如何对一系列命令执行此操作.具体如下.

  • [M-down]到[Cu 1 Cv]
  • [M-up]至[Cu 1 Mv]

这实际上是单行滚动.

ele*_*kil 7

您可以使用键盘宏执行该任务.该链接几乎解释了如何做到这一点,为了完整性,这里是做什么的:

  1. 点击C-x (开始录制键盘宏.
  2. 执行命令应该做什么(即执行命令,按键,......)
  3. 点击C-x )停止录制键盘宏.
  4. 执行M-x name-last-kbd-macro以命名最后定义的键盘宏(即您定义的键盘宏).
  5. 执行M-x insert-kbd-macro以在点处插入最后定义的宏的代码,将其复制到init文件中.
  6. 放入(global-set-key (kbd "M-n") 'my-macro)你的init文件(假设你命名了宏my-macro).
  7. 利润!


Ébe*_*aac 0

下面提供了一种用于定义命令序列的键绑定的解决方案。总结如下:

  • 创建指定名称的键盘宏

    • 向上滚动步骤:Cu 1 优先
    • 向上滚动步骤:Cu 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)
Run Code Online (Sandbox Code Playgroud)

详细步骤:

开始宏定义

<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
Run Code Online (Sandbox Code Playgroud)

笔记:

先验 = PgUp / fn+up (Macbook)

下一个 = 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
Run Code Online (Sandbox Code Playgroud)

将自定义命令的键绑定附加到 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)
Run Code Online (Sandbox Code Playgroud)

您会注意到,我为单个绑定包含了两次键绑定定义。这是因为绑定与 Meta 键相关。元键在 GUI 模式下被描述为 M,但终端仍将其视为 ESC(即使按下 alt/option 键)。因此我定义了它两次,以便它可以在 Emacs 的 GUI 和终端模式下工作。

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