我一直在努力寻找答案的简单而直接的问题,因此我决定在这里提问。
问:有什么方法可以在Linux终端中启动的Emacs中使用Super?
PS:我阅读了很多有关的信息,xmodmap
但我认为关键是终端仿真器无法表示超级键。但是,(kbd "s-SPC")
返回了一些内容,因此我想使用的翻译工具.Xdefaults/X
。我在正确的道路上吗?给定的结果kbd
,我需要将什么作为XTerm.VT100.translations放置?
我一直在努力寻找答案的简单而直接的问题,因此我决定在这里提问。
问:有什么方法可以在Linux终端中启动的Emacs中使用Super?
PS:我阅读了很多有关的信息,xmodmap
但我认为关键是终端仿真器无法表示超级键。但是,(kbd "s-SPC")
返回了一些内容,因此我想使用的翻译工具.Xdefaults/X
。我在正确的道路上吗?给定的结果kbd
,我需要将什么作为XTerm.VT100.translations放置?
Answers:
使用X11 Emacs会让您更加舒适,它可以接收键盘输入并显示文本,而无需为终端进行编码和解码。使用文本模式编辑器的主要原因是在远程计算机上的屏幕或tmux中运行它,但是由于有了Tramp,通常更容易在本地Emacs中编辑远程文件。话虽如此,只要您的终端仿真器可以配合,您就可以做您想做的事情(Xterm就是这种情况)。
当您在终端中按某个键或组合键时,它会以一个或多个字符的顺序传输到在终端中运行的应用程序。例如,当您按时a,应用程序会收到a
。当您按时Enter,应用程序将接收字符CR
(又名^M
(发音为“ control-emm”),又称字符号13,又名\r
或\015
)。所涉及的键组合Alt通常以字符ESC
(^[
也称为aka \e
或\033
)的形式传输,后跟键的顺序或不带的键组合Alt。功能键和其他键组合作为以\e[
或开头的转义序列进行传输\eO
。
转义序列尚未完全标准化,终端通常会忽略某些键的某些属性。例如,hyper和super修饰符通常被忽略。你可以看到通过按组合键终端发送的内容Ctrl+ V其次是组合键,在shell提示下,或C-q
或C-h c
之后在Emacs的组合键。
Xterm允许您通过X资源配置每个键的转义序列。大多数设置从~/.Xresources
X启动时开始读取资源,您可以使用手动加载文件xrdb -merge ~/.Xresources
。
XTerm.VT100.translations: #override \n\
Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")
常见的约定ESC [ number1 ; number2 ~
对带有修饰符的功能键使用形式的转义序列。number1
表示该功能键(15
以24
对F5到F12-由于历史原因,F1到F4有不同的转义序列),并number2
表示修改(2
对Shift,5
对Ctrl,3
对Meta,8
对Ctrl+ Meta,并添加1 + Shift-不,这不是很一致)。
你必须通过自己的号码来指定超和超级改性剂,如Mod1
通过Mod5
。运行xmodmap -pm
以查看keyyms到修饰符的映射。例如,如果Super_L
绑定到Mod5,则以下行(使用这种精确的情况)为Super+ 定义了绑定Space:
~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\
Emacs通过input-decode-map
或local-function-key-map
(或function-key-map
在Emacs 23之前)将转义序列转换为其内部键表示形式。
(define-key local-function-key-map "\033[32;16~" [(super ?\ )])
这篇文章是由80%的可回收材料制成的。有没有可以处理所有按键组合的linux终端?
(global-set-key "\033[32;16~" 'set-rectangular-region-anchor)
。但总而言之,我尝试了您的define-key
上述操作,但随后无法触发(global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor)
。它只是在缓冲区中打印; 16〜。将该序列绑定到(kbd“ s-SPC”)会很好,这样我就可以绑定密钥序列,并且可以将其重新分配给其他命令。
C-h l
现在按s-SPC返回以下内容: ESC [ 3 2 ; 1 6 ~
但是emacs仍然抱怨M-[ 32 is undefined
function-key-map
代替local-function-key-map
吗?设置时间可能是一个问题local-function-key-map
,因为它取决于终端。
如果您愿意安装Emacs软件包并配置终端,我写了一个Emacs软件包,可以教Emacs和终端如何正确识别所有PC键盘键和修饰键组合:
https://github.com/CyberShadow/term-keys
默认情况下,不启用对Super修饰符的编码,但是该包是可自定义的,并允许配置对哪些修饰键组合进行编码。要启用包括Super修饰符的编码键组合,请将其设置term-keys/want-key-p-func
为一个函数,该函数将t
在when (elt mods 3)
为非null 时返回(有关说明,请参见默认实现)。