25

我正在尝试添加一个我从 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

感谢您的建议,但结果都一样。

4

7 回答 7

24

Emacs 有一个复杂的机制来处理各种终端类型上功能键和修饰符编码的变迁。它并非在所有情况下都可以开箱即用。以下设置应在您的终端上运行:

(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>")and(kbd "<M-down>")代替[(meta up)]and [(meta down)],只要你完成了告诉 Emacs(通过input-decode-map)你的终端用来编码这些组合键的转义序列的步骤。

于 2010-12-05T19:19:20.990 回答
9

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

在这种情况下,describe-key返回<M-up>,所以我会使用(global-set-key (kbd "<M-up>") 'transpose-line-up)(就像 JF Sebastian 所做的那样)。

编辑:

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

Running screen emacs -nw, describe-key reports ESC <up> (translated from ESC M-O A),这似乎与您看到的相符,并且绑定 for(kbd "ESC <up>")仍然适用于我。

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

于 2010-12-04T02:19:23.280 回答
5
(global-set-key [M-up] 'beginning-of-buffer)
(global-set-key [M-down] 'end-of-buffer)

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

于 2010-12-04T02:22:07.510 回答
4

丑陋的解决方法:

我已经在里面的终端上输入C-q <M-up>了它。^[[1;3Ascreenemacs

(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.

于 2010-12-04T01:03:17.923 回答
2

以下几行适用于macOS 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)
于 2017-07-08T00:49:07.437 回答
0

假设您具有功能transpose-line-up并且transpose-line-down已经定义(因为它似乎来自原始问题中的示例代码):

(global-set-key [(meta up)] 'transpose-line-up)
(global-set-key [(meta down)] 'transpose-line-down)
于 2010-12-05T17:24:55.533 回答
0

适用于 OSX 终端:

(global-set-key (kbd "ESC <up>") 'transpose-line-up)
(global-set-key (kbd "ESC <down>") 'transpose-line-down)
于 2020-05-02T17:06:07.930 回答