终端中的Emacs无法识别Shift + Up


15

我经常使用Shift+ Up/Down在Emacs中选择一个区域。它在GUI模式下可以正常工作,但是当emacs通过-nw选项调用时,我只能使用Shift+ 选择行Down。该Shift+ Up不工作,我得到的小缓冲区此错误信息:

<select> is undefined

我该如何解决这个问题?

Answers:


13

文本终端仅发送字符(更准确地说是字节),而不发送键。键和琴弦(带有修饰符的键)被编码为字符序列。插入可打印字符的键将自己发送;功能键作为转义序列发送。大多数转义序列由字符Escape(?\e用Emacs语法)组成,后跟两个或多个可打印字符。请参阅供emacs使用的终端中的Control和上/下键,以及键盘输入和文本输出如何工作?了解更多信息。

Emacs具有一种机制,可以将转义序列转换为它自己的密钥概念。input-decode-map当Emacs启动时(或更准确地说,当打开新框架时,将初始化转换表:此变量在每个终端上具有不同的值)。有时Emacs并不知道终端发送的所有转义序列。

在您的情况下,似乎Emacs对Shift+ 发送的转义序列有错误的解释Up。您需要告诉它将其解释为S-up而不是select。首先,弄清楚转义序列是什么。在*scratch*缓冲区中,按Ctrl+ Q然后按Shift+ Up。该命令C-q将直接插入下一个字符(即转义字符),然后是其余的转义序列。假设Shift+ 在我们的系统上Up发送\e[1;2A,那么您需要在中重新定义相应的条目input-mode-map

(define-key input-decode-map "\e[1;2A" [S-up])

原则上,input-decode-map应为每个终端设置。实际上,很少有两个终端使用相同的转义序列编码不同的密钥,因此全局设置可以正常工作。


您的回答似乎在这里回答了我的问题-emacs.stackexchange.com/questions/33988Are the (define-key ...)命令应该进入init.el吗?我可以在某个地方查看详细的示例吗?
vfclists

@vfclists define-key命令进入您的init文件。可以是~/.emacs.d/init.el其他两个位置。define-key通过搜索define-key,您会发现很多使用示例,但是找到要绑定的地图是另一回事。几个地图都参与:global-mapinput-decode-mapfunction-key-mapkeyboard-translate-map。我不知道如何回答您的问题,因为我不知道Spacemacs。我不建议使用混乱地重新定义标准接口的程序包(例如Spacemacs)。
吉尔(Gilles)'所以

我已改用常规emacs来学习组织模式,并input-decode-map在找到一些示例后设法开始工作。input-decode-map当用户在缓冲区中输入文本时,可以使用它吗?
vfclists

@vfclists input-decode-map是适用的按键映射之一。有关详细信息,请参见手册
吉尔斯(Gillles)“所以-别再作恶了”

5

在emacs中,该区域由点(光标)和标记(光标的某个先前位置,已被“标记”)界定。

因此,要“选择一个区域”,您需要放置该标记,然后四处移动。

放置标记的最简单方法是按C-SPC。然后,只需四处移动光标,您就会看到“区域”在扩展。

要“取消选择区域”,可以C-SPC再次按。

由于“ Shift + Moving”是其他软件中的常见按键绑定,因此默认情况下,它会模仿此“选择区域”行为。但是,它在终端中不起作用,因为shift不能作为修饰键发送到emacs。

请注意,一般来说,该C-SPC方法比其他选择区域的方法功能强大:您不仅限于上/下/左/右移动(例如,可以使用搜索...),并且不需要您长时间保持不舒服的组合键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.