在 Emacs 23.1.1 中绑定 M-<up> / M-<down>
Posted
技术标签:
【中文标题】在 Emacs 23.1.1 中绑定 M-<up> / M-<down>【英文标题】:Binding M-<up> / M-<down> in Emacs 23.1.1 【发布时间】:2011-05-20 01:25:32 【问题描述】:我正在尝试添加一个我在 Eclipse 中错过的功能,其中 Alt+[Up/Down] 转置了这些行向上或向下,但我一生无法弄清楚如何正确分配这些键。我在-nw
模式下使用它(所以只是在shell 窗口中),并且通常在屏幕会话中运行。
使用全局键绑定,我可以让它与字母组合一起使用,例如(kbd "M-m")
,但是我为箭头键尝试的每个组合都只会给我一个没有意义的消息,我总是得到:
"ESC <up> is undefined"
我尝试过的:
(global-set-key (kbd "M-<up>") 'transpose-line-up)
(global-set-key (kbd "<escape>-<up>") 'transpose-line-up)
(global-set-key [M-up] 'transpose-line-up)
(global-set-key [\e \M-O A] 'transpose-line-up)
而 C-h c 只是返回:
ESC <up> (translated from ESC M-O A) is undefined
这些都不起作用,无论是使用 ESC 还是 Alt。
知道我怎样才能完成这项工作吗?我更喜欢将这些设置为 Alt+[Up/Down] 只是因为这是我的习惯。
编辑
来自cmets:
C-q Up 打印^[OA
。
C-q M-Up 打印^[
并将光标向上移动一行。
C-h k (Alt+Up) 打印ESC <up> (translated from ESC M-O A) is undefined
。
感谢您的建议,但结果都一样。
【问题讨论】:
nex-3.com/posts/45-efficient-window-switching-in-emacs#comments 包含 cmets 中的有趣提示 【参考方案1】:丑陋的解决方法:
我在screen
内部emacs
内部的终端上输入了 C-q ^[[1;3A
。
(global-set-key (kbd "<M-up>") 'transpose-line-up)
(global-set-key (kbd "^[[1;3A") 'transpose-line-up)
我有Lisp error: (void-function transpose-line-up)
,所以键绑定工作。
注意:C-q 运行命令quoted-insert
。
【讨论】:
第一个:ESC(format-kbd-macro (read-key-sequence "Key? " nil t))
并键入 我总是使用 Ch k (key)(即describe-key
)来找出 Emacs 是如何引用(key)的,然后使用 (kbd)
和相同的字符串来使用它。
在这种情况下,describe-key
返回<M-up>
,所以我会使用(global-set-key (kbd "<M-up>") 'transpose-line-up)
(就像 J.F. Sebastian 所做的那样)。
编辑:
运行emacs -nw
(但不是通过屏幕),describe-key报告ESC <up> (translated from ESC M-[ A)
,(kbd "ESC <up>")
绑定成功。
运行screen emacs -nw
,describe-key 报告ESC <up> (translated from ESC M-O A)
,这似乎与您看到的相符,并且(kbd "ESC <up>")
的绑定对我仍然有效。
(n.b. 在 Cygwin 下使用屏幕 4.00.03 和 Emacs 23.2.1 测试。)
【讨论】:
<M-up>
在“屏幕”模式下对我不起作用(我认为它也不适用于 OP 的情况)。
与上面 J.F. Sebastian 的回答相同,我得到了与原始问题中报告的相同的错误。
啊,我还没有注册这部分问题。 “丑陋的解决方法”现在更有意义:)
经过进一步测试,我添加了一些额外的注释。总结是,我最初的方法在所有情况下都对我有用:使用describe-key
找出与(kbd)
一起使用的内容。如果你能确认你是否这样做会很好?
是的,我已经做到了。 (kbd "M-(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)
在我的 OSX 中,我有这个定义来执行 Alt-up/down 以跳转到缓冲区的顶部/底部。
【讨论】:
[M-up]
在“屏幕”模式下对我不起作用(我认为它也不适用于 OP 的情况)。
对我不起作用。仍然得到“ESC 假设您已经定义了函数 transpose-line-up
和 transpose-line-down
(因为它似乎来自您原始问题中的示例代码):
(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)
【讨论】:
【参考方案5】:Emacs 有一个complex mechanism 来处理各种终端类型上功能键和修饰符编码的变迁。它并非在所有情况下都可以开箱即用。以下设置应在您的终端上运行:
(define-key input-decode-map "\e\eOA" [(meta up)])
(define-key input-decode-map "\e\eOB" [(meta down)])
(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)
您应该能够使用(kbd "<M-up>")
和(kbd "<M-down>")
代替[(meta up)]
和[(meta down)]
,只要您完成了告诉Emacs(通过input-decode-map
)关于转义序列的步骤您的终端用于对这些组合键进行编码。
【讨论】:
我有一个:符号的函数定义是无效的:transpose-line-up message @nsvir 我遵循了问题中的函数名称。这不是标准命令,大概是 liam 从某个包中得到的,或者是自己编写的。请注意,标准命令transpose-lines
(C-x C-t) 非常接近。【参考方案6】:
以下几行适用于 macOS 10.11.6 和 GNU Emacs 25.2.1:
(global-set-key (kbd "ESC <down>") 'end-of-buffer)
(global-set-key (kbd "ESC <up>") 'beginning-of-buffer)
【讨论】:
【参考方案7】:适用于 OSX 终端:
(global-set-key (kbd "ESC <up>") 'transpose-line-up)
(global-set-key (kbd "ESC <down>") 'transpose-line-down)
【讨论】:
以上是关于在 Emacs 23.1.1 中绑定 M-<up> / M-<down>的主要内容,如果未能解决你的问题,请参考以下文章