我经常使用Shift+ Up/Down在Emacs中选择一个区域。它在GUI模式下可以正常工作,但是当emacs
通过-nw
选项调用时,我只能使用Shift+ 选择行Down。该Shift+ Up不工作,我得到的小缓冲区此错误信息:
<select> is undefined
我该如何解决这个问题?
我经常使用Shift+ Up/Down在Emacs中选择一个区域。它在GUI模式下可以正常工作,但是当emacs
通过-nw
选项调用时,我只能使用Shift+ 选择行Down。该Shift+ Up不工作,我得到的小缓冲区此错误信息:
<select> is undefined
我该如何解决这个问题?
Answers:
文本终端仅发送字符(更准确地说是字节),而不发送键。键和琴弦(带有修饰符的键)被编码为字符序列。插入可打印字符的键将自己发送;功能键作为转义序列发送。大多数转义序列由字符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
应为每个终端设置。实际上,很少有两个终端使用相同的转义序列编码不同的密钥,因此全局设置可以正常工作。
define-key
命令进入您的init文件。可以是~/.emacs.d/init.el
其他两个位置。define-key
通过搜索define-key
,您会发现很多使用示例,但是找到要绑定的地图是另一回事。几个地图都参与:global-map
,input-decode-map
,function-key-map
,keyboard-translate-map
。我不知道如何回答您的问题,因为我不知道Spacemacs。我不建议使用混乱地重新定义标准接口的程序包(例如Spacemacs)。
input-decode-map
在找到一些示例后设法开始工作。input-decode-map
当用户在缓冲区中输入文本时,可以使用它吗?
input-decode-map
是适用的按键映射之一。有关详细信息,请参见手册。
在emacs中,该区域由点(光标)和标记(光标的某个先前位置,已被“标记”)界定。
因此,要“选择一个区域”,您需要放置该标记,然后四处移动。
放置标记的最简单方法是按C-SPC
。然后,只需四处移动光标,您就会看到“区域”在扩展。
要“取消选择区域”,可以C-SPC
再次按。
由于“ Shift + Moving”是其他软件中的常见按键绑定,因此默认情况下,它会模仿此“选择区域”行为。但是,它在终端中不起作用,因为shift不能作为修饰键发送到emacs。
请注意,一般来说,该C-SPC
方法比其他选择区域的方法功能强大:您不仅限于上/下/左/右移动(例如,可以使用搜索...),并且不需要您长时间保持不舒服的组合键。
Are the (define-key ...)
命令应该进入init.el吗?我可以在某个地方查看详细的示例吗?