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

我试图把一个function,我错过了Eclipse,在那里Alt + [ / ]转换线路的上或下,但不能为我的生活弄清楚如何正确地分配给这些键。 我在-nw模式下使用它(只是在shell窗口中),并且通常在屏幕会话中运行。

使用全局键绑定,我可以使用字母组合(如(kbd "Mm") ,但是我尝试过的每个组合都只是给了我一个没有意义的消息,我总是得到:

 "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 \MO A] 'transpose-line-up) 

Ch c只是返回:

 ESC <up> (translated from ESC MO A) is undefined 

这些都没有工作,无论是使用ESCAlt

任何想法如何我可以使这项工作? 我宁愿把这些作为Alt + [ Up / Down ],因为这是我习惯的。

编辑

来自评论:

  • Cq Up打印^[OA

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

  • Ch kAlt + Up )打印ESC <up> (translated from ESC MO A) is undefined

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

Emacs有一个复杂的机制来处理各种terminaltypes的function键和修饰符编码的变迁。 在任何情况下,它都不能起作用。 以下设置应该在您的terminal上运行:

 (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)] ,只要您(通过input-decode-map )告诉Emacs有关您的terminal用来对这些组合键进行编码的转义序列。

我总是使用Chk(key) (即describe-key )来找出Emacs如何引用(key),然后使用(kbd)来使用它。

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

编辑:

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

运行screen emacs -nwscreen emacs -nw ,describe-key报告ESC <up> (translated from ESC MO A) ,看起来与您所看到的相符,绑定(kbd "ESC <up>")仍然适用于我。

(nb在Cygwin下使用屏幕4.00.03和Emacs 23.2.1进行testing)

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

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

丑陋的解决方法:

我input了Cq <M-up>它在emacs里面的terminal里面生成了^[[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)所以键绑定工作。

注意: Cq运行quoted-insert命令。

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

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

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