在 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 &lt;up&gt; (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 未定义第二个:错误:键序列 ^ [ [ 1 ; 3 A 以非前缀键开头 ^ @liam:执行 (format-kbd-macro (read-key-sequence "Key? " nil t)) 并键入 。输出是什么?【参考方案2】:

我总是使用 Ch k (key)(即describe-key)来找出 Emacs 是如何引用(key)的,然后使用 (kbd) 和相同的字符串来使用它。

在这种情况下,describe-key 返回&lt;M-up&gt;,所以我会使用(global-set-key (kbd "&lt;M-up&gt;") 'transpose-line-up)(就像 J.F. Sebastian 所做的那样)。

编辑:

运行emacs -nw(但不是通过屏幕),describe-key报告ESC &lt;up&gt; (translated from ESC M-[ A)(kbd "ESC &lt;up&gt;")绑定成功。

运行screen emacs -nw,describe-key 报告ESC &lt;up&gt; (translated from ESC M-O A),这似乎与您看到的相符,并且(kbd "ESC &lt;up&gt;") 的绑定对我仍然有效。

(n.b. 在 Cygwin 下使用屏幕 4.00.03 和 Emacs 23.2.1 测试。)

【讨论】:

&lt;M-up&gt; 在“屏幕”模式下对我不起作用(我认为它也不适用于 OP 的情况)。 与上面 J.F. Sebastian 的回答相同,我得到了与原始问题中报告的相同的错误。 啊,我还没有注册这部分问题。 “丑陋的解决方法”现在更有意义:) 经过进一步测试,我添加了一些额外的注释。总结是,我最初的方法在所有情况下都对我有用:使用describe-key 找出与(kbd) 一起使用的内容。如果你能确认你是否这样做会很好? 是的,我已经做到了。 (kbd "M-") -> [M-up] 。 describe-key 返回:ESC (从 ESC M-O A 翻译而来)未定义。使用该序列也不起作用。【参考方案3】:
(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)

在我的 OSX 中,我有这个定义来执行 Alt-up/down 以跳转到缓冲区的顶部/底部。

【讨论】:

[M-up] 在“屏幕”模式下对我不起作用(我认为它也不适用于 OP 的情况)。 对我不起作用。仍然得到“ESC is undefined”错误。 是的,我还是遇到了和@liam一样的问题。【参考方案4】:

假设您已经定义了函数 transpose-line-uptranspose-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 "&lt;M-up&gt;")(kbd "&lt;M-down&gt;") 代替[(meta up)][(meta down)],只要您完成了告诉Emacs(通过input-decode-map)关于转义序列的步骤您的终端用于对这些组合键进行编码。

【讨论】:

我有一个:符号的函数定义是无效的:transpose-line-up message @nsvir 我遵循了问题中的函数名称。这不是标准命令,大概是 liam 从某个包中得到的,或者是自己编写的。请注意,标准命令 transpose-lines (C-x C-t) 非常接近。【参考方案6】:

以下几行适用于 ma​​cOS 10.11.6GNU 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>的主要内容,如果未能解决你的问题,请参考以下文章

在 emacs 中定义键绑定

emacs简单入门

如何定义键绑定以在 emacs 中的次要模式之间切换?

如何使用Emacs更改文件的读/写模式?

是否有某种“包搜索”功能可用于Emacs?

emacs上的IPython会阻止键绑定