在Linux中的emacs -nw中使用Super


15

我一直在努力寻找答案的简单而直接的问题,因此我决定在这里提问。

问:有什么方法可以在Linux终端中启动的Emacs中使用Super?

PS:我阅读了很多有关的信息,xmodmap但我认为关键是终端仿真器无法表示超级键。但是,(kbd "s-SPC")返回了一些内容,因此我想使用的翻译工具.Xdefaults/X。我在正确的道路上吗?给定的结果kbd,我需要将什么作为XTerm.VT100.translations放置?

Answers:


21

使用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-qC-h c之后在Emacs的组合键。

Xterm允许您通过X资源配置每个键的转义序列。大多数设置从~/.XresourcesX启动时开始读取资源,您可以使用手动加载文件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表示该功能键(1524F5F12-由于历史原因,F1到F4有不同的转义序列),并number2表示修改(2Shift5Ctrl3Meta8Ctrl+ 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-maplocal-function-key-map(或function-key-map在Emacs 23之前)将转义序列转换为其内部键表示形式。

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

这篇文章是由80%的可回收材料制成的。有没有可以处理所有按键组合的linux终端?


这是一个很好的答案,涵盖了我发现的所有知识。只是一个问题:您在哪里找到/如何选择32; 16〜,为什么它与下面的emacs绑定不匹配?我知道数字的来源,但我想问你是否可以链接到number1number2的映射表。
Andrea Richiardi 2014年

@AndreaRichiardi我选择32,因为它是空格字符的ASCII / Unicode值,而选择16是因为标准绑定对Ctrl,Meta和Shift使用的值最多为8。下面的33是一个错字。您可以选择任何与其他键不冲突的东西。
吉尔斯(Gillles)“所以-别再作恶了”

我不得不将序列绑定到一个函数,所以我暂时用来解决(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”)会很好,这样我就可以绑定密钥序列,并且可以将其重新分配给其他命令。
Andrea Richiardi 2014年

C-h l现在按s-SPC返回以下内容: ESC [ 3 2 ; 1 6 ~但是emacs仍然抱怨M-[ 32 is undefined
Andrea Richiardi 2014年

@AndreaRichiardi在xterm部分修复了更多的错字(由于Emacs收到了预期的字符序列,您似乎已经修复了错字)后,它对我有用。如果您使用它会工作吗function-key-map代替local-function-key-map吗?设置时间可能是一个问题local-function-key-map,因为它取决于终端。
吉尔斯(Gilles)“所以,别再邪恶了”

0

如果您愿意安装Emacs软件包并配置终端,我写了一个Emacs软件包,可以教Emacs和终端如何正确识别所有PC键盘键和修饰键组合:

https://github.com/Cyber​​Shadow/term-keys

默认情况下,不启用对Super修饰符的编码,但是该包是可自定义的,并允许配置对哪些修饰键组合进行编码。要启用包括Super修饰符的编码键组合,请将其设置term-keys/want-key-p-func为一个函数,该函数将t在when (elt mods 3)为非null 时返回(有关说明,请参见默认实现)。


0

我的初始化文件中包含以下内容:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

这使我可以使用功能键发送超级键和超级键。


-1

简短答案:使用Konsole

说明:

  • Emacs的local-function-key-map具有条目映射C-x @ sevent-apply-super-modifier
  • Konsole映射Super(Windows徽标键)到转义序列^X@s(似乎没有记录在任何地方,我是偶然发现的)。您可以通过打开Konsole并按例如来尝试此操作Ctrl-v Win-o

感谢您的回答,但更改术语不是我想要的解决方案。
安德烈亚·里贾迪
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.