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

5

Emacs 手册仅提供了设置单个命令绑定的示例。如何为一系列命令设置绑定,特别是以下内容:

  • [M-down] 绑定到 [C-u 1 C-v]
  • [M-up] 绑定到 [C-u 1 M-v]

这实际上是单行滚动。

3个回答

13
你可以使用键盘宏来完成这项任务。链接已经很清楚地解释了如何操作,为了完整起见,以下是具体步骤:
  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. 完成!

3
  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,并传递一个值为 1 的 ARG 参数: (scroll-up-command 1)
  1. How do you define your own command that does that?

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

    See the Elisp manual, node Defining Commands.

  2. And bind it to M-n?

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

    See the Emacs manual, node Rebinding.


0
下面提供了一种定义命令序列的按键绑定解决方案。以下是摘要:
  • 创建带有名称的键盘宏

    • scroll-up-step: C-u 1 prior
    • scroll-up-step: C-u 1 next
  • 将宏绑定到键组合

    • M- <- scroll-up-step
    • M- <- scroll-down-step

您可以将此代码包含到您的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)

详细步骤:
开始宏定义 开始 KBD 宏定义
C-u 1 prior 绑定您希望绑定的命令序列 结束 KBD 宏定义
为最近的宏命名(无冲突!)
C-x C-k n scroll-up-step 对其他自定义命令执行相同操作
<F3>
C-u 1 next
<F4>
C-x C-k n scroll-down-step

注意: prior = 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)

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

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


1
(global-set-key (kbd "M-<up>") (kbd "C-u 1 <prior>")) 可能会更简单,但不一定更 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接