在Emacs 23.1.1 </down> </up>中绑定M- <up> / M- <down>

时间:2010-12-04 00:05:52

标签: emacs gnu-screen key-bindings emacs23

我正试图在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 ],因为这是我习惯的。

修改

来自评论:

  • C-q Up 打印^[OA

  • C-q M-Up 打印^[并将光标向上移动一行。

  • C-h k Alt + Up )打印ESC <up> (translated from ESC M-O A) is undefined

感谢您的建议,但他们都是一样的。

7 个答案:

答案 0 :(得分:20)

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)

只要您完成告诉Emacs的步骤(通过{{},您就可以使用(kbd "<M-up>")(kbd "<M-down>")代替[(meta up)][(meta down)] {1}})关于终端用来编码这些密钥组合的转义序列。

答案 1 :(得分:7)

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

在这种情况下,describe-key会返回<M-up>,因此我会使用(global-set-key (kbd "<M-up>") 'transpose-line-up)(正如J.F. Sebastian所做的那样)。

编辑:

运行emacs -nw(但不是通过屏幕),描述密钥报告ESC <up> (translated from ESC M-[ A)(kbd "ESC <up>")成功绑定它。

运行screen emacs -nw,描述密钥报告ESC <up> (translated from ESC M-O A),它似乎与您看到的一致,(kbd "ESC <up>")的绑定对我来说仍然有用。

(n.b。在Cygwin下测试,屏幕为4.00.03,Emacs为23.2.1。)

答案 2 :(得分:5)

(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)

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

答案 3 :(得分:4)

丑陋的解决方法:

我输入了 C-q&lt; M-up&gt; ,它在^[[1;3A内的screen内的终端上生成emacs

(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

答案 4 :(得分:1)

以下几行适用于 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)

答案 5 :(得分:0)

假设您已经定义了transpose-line-uptranspose-line-down函数(因为它似乎来自原始问题中的示例代码):

(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)

答案 6 :(得分:0)

可在OSX终端上运行:

(global-set-key (kbd "ESC <up>") 'transpose-line-up)
(global-set-key (kbd "ESC <down>") 'transpose-line-down)