约束M-<;up>;/M-<;向下>;在Emacs 23.1.1中

约束M-<;up>;/M-<;向下>;在Emacs 23.1.1中,emacs,gnu-screen,key-bindings,emacs23,Emacs,Gnu Screen,Key Bindings,Emacs23,我试图加入一个我从Eclipse中错过的特性,其中Alt+[Up/Down]将行向上或向下转换,但在我的一生中,我无法找到如何正确分配这些键。我在-nw模式下使用它(所以只是在shell窗口中),通常在屏幕会话中运行 使用全局键绑定,我可以让它与字母组合一起工作,如(kbd“M-M”),但我尝试的每个箭头键组合都会给我一条没有意义的消息,我总是得到: "ESC <up> is undefined" “ESC未定义” 我所尝试的: (global-set-key (kbd "M-&

我试图加入一个我从Eclipse中错过的特性,其中Alt+[Up/Down]将行向上或向下转换,但在我的一生中,我无法找到如何正确分配这些键。我在
-nw
模式下使用它(所以只是在shell窗口中),通常在屏幕会话中运行

使用全局键绑定,我可以让它与字母组合一起工作,如
(kbd“M-M”)
,但我尝试的每个箭头键组合都会给我一条没有意义的消息,我总是得到:

"ESC <up> is undefined"
“ESC未定义”
我所尝试的:

(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)
(全局设置键(kbd“M-”)转置排列)
(全局设置键(kbd“-”号转置排列)
(全局设置键[M-up]‘转置对齐’)
(全局设置键[\e\M-O A]'换位对齐)
而C-h C只是返回:

ESC <up> (translated from ESC M-O A) is undefined
ESC(翻译自ESC M-O A)未定义
无论是使用ESC还是Alt,这些都不起作用

你知道我该怎么做吗?我更喜欢将这些设置为Alt+[Up/Down],因为我已经习惯了

编辑

从评论中:

  • C-q Up打印
    ^[OA

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

  • C-h k(Alt+Up)打印
    ESC(从ESC M-O A翻译而来)未定义

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

难看的解决方法: 我在
屏幕内的终端上键入了它产生的C-q
^[[1;3A

(global-set-key (kbd "<M-up>") 'transpose-line-up)
(global-set-key (kbd "^[[1;3A") 'transpose-line-up)
(全局设置键(kbd“)”转置排列)
(全局设置键(kbd“^[1;3A”)'转置排列)
我得到了
Lisp错误:(void函数转置队列)
因此键绑定可以工作

注意:C-q运行命令
quoted insert

我总是使用C-HK(键)(即
描述键
)来找出Emacs是如何引用(键)的,然后使用
(kbd)
和相同的字符串来使用它

在本例中,
descripe key
返回
,因此我将使用
(全局设置键(kbd“”)“转置行)
(与J.F.Sebastian所做的完全相同)

编辑:

运行
emacs-nw
(但不通过屏幕),描述关键报告
ESC(翻译自ESC M-[A)
,并且
(kbd“ESC”)
成功绑定它

运行
screen emacs-nw
,描述关键报告
ESC(从ESC M-O A翻译过来)
,它似乎与您看到的内容相匹配,
(kbd“ESC”)
的绑定仍然适用于我

(注意:在Cygwin和屏幕4.00.03以及Emacs 23.2.1下进行测试。)


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

假设您已经定义了函数
transpose line up
transpose line down
(正如您最初问题中的示例代码所示):

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”“)
(kbd”“)
来代替
[(meta-up)]
[(meta-down)]
,只要您已经完成了告诉Emacs的步骤(通过
输入解码映射
)关于终端用于对这些组合键进行编码的转义序列。

以下几行在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)
(全局设置键(kbd“ESC”)'缓冲区结束)
(全局设置键(kbd“ESC”)'缓冲区的开始)
在OSX终端上工作:

(global-set-key (kbd "ESC <up>") 'transpose-line-up)
(global-set-key (kbd "ESC <down>") 'transpose-line-down)
(全局设置键(kbd“ESC”)“转置对齐)
(全局设置键(kbd“ESC”)‘换位线向下)

[M-up]
在“屏幕”模式下对我不起作用(我认为它对OP的情况也不起作用)。对我不起作用。仍然会出现“ESC未定义”错误。是的,我仍然有与@liam相同的问题。
在“屏幕”模式下对我不起作用(我认为它对OP的情况也不起作用).与J.F.Sebastian的回答相同,我得到的错误与原始问题中报告的相同。啊,我没有记录问题的这一部分。“丑陋的变通方法”现在更有意义了:)在进一步测试之后,我添加了一些额外的注释。总结是,我最初的方法在所有情况下都适用:使用
descripe key
找出
(kbd)
的用法。如果您能确认您是否已经这样做了,那就太好了。是的,我已经这样做了。(kbd“M-”)->[M-up]。描述键返回:ESC(从ESC M-O A翻译而来)未定义。使用该序列也不起作用。第一:ESC未定义第二:错误:键序列^[[1;3 A以非前缀键^@liam:Execute
(格式化kbd宏(读取键序列“key?”nil t))
然后键入或。输出是什么?在注释中包含有趣的提示我有一个:Symbol的函数定义为void:transpose-line-upmessage@nsvir我遵循了问题中的函数名。这不是一个标准命令,可能是liam从某个包中获得的或自己编写的ose行
(C-x C-t)非常接近。
(global-set-key (kbd "ESC <down>") 'end-of-buffer)
(global-set-key (kbd "ESC <up>") 'beginning-of-buffer)
(global-set-key (kbd "ESC <up>") 'transpose-line-up)
(global-set-key (kbd "ESC <down>") 'transpose-line-down)