emacs 键绑定在终端中不起作用
emacs keybinding doesn't work in terminal
我在我的 .emacs 文件中设置了以下键绑定:
(global-set-key (kbd "C-S-M-w") 'windmove-up)
(global-set-key (kbd "C-S-M-s") 'windmove-down)
(global-set-key (kbd "C-S-M-d") 'windmove-right)
(global-set-key (kbd "C-S-M-a") 'windmove-left)
(global-set-key (kbd "C-S-a") 'shrink-window-horizontally)
(global-set-key (kbd "C-S-d") 'enlarge-window-horizontally)
(global-set-key (kbd "C-S-s") 'shrink-window)
(global-set-key (kbd "C-S-w") 'enlarge-window)
他们在自己的 window 中工作得很好。但是,如果我 运行 它在终端 (emacs -nw) 中,则不会加载键绑定。即使在加载 .emacs 文件后,我仍然没有键绑定。
当我使用 emacs 守护程序并在客户端和终端中打开时,情况是一样的。如果重要的话,我在 linux 机器上。
问题不在于 emacs,问题在于修饰键组合(Control、Shift 和 Alt)在大多数终端程序中的表现很差。类似的问题不断出现在这里和许多其他地方,包括超级用户,例如:emacs - [control shift up] doesn't work, and https://superuser.com/q/230852。您需要在您的特定终端中对其进行测试 - 但例如检查 Gnome 终端表明 C-S-
与 C-
无法区分,因此您的大部分绑定甚至无法正确地进入 emacs
如果您需要说服自己,请使用 C-h k
,然后使用您缺少的组合。您会看到,当您在终端中 运行 时,这些组合会去除一些修饰符。
我有过类似的经历,得出的结论是,与终端斗争是不值得的。当您在终端中时,我建议您将需要多个修饰符的组合键重新映射到其他东西。 (例如,我最终将 windmove 命令重新映射到 F 键。)或者,我可以建议使用 evil leader key (if you use evil), or God mode 否则。这大大减少了对多个修饰符的需求。
第一步是让您的终端发送转义码,稍后您可以在 emacs 中为其指定含义。编辑您的 .Xdefaults 文件以根据需要添加任意数量的这些。这是一个使用 xterm 的例子(可能有错别字,因为我不能从我的工作电脑上剪切和粘贴):
*VT100*translations: #override \n\
~Ctrl ~Shift <KeyPress> BackSpace: string(0x7F)\n\
Ctrl ~Shift <KeyPress> BackSpace: string("3[27;5;8~")\n\
Ctrl Shift <KeyPress> BackSpace: string("3[27;6;8~")\n
Ctrl Shift ~Meta <KeyPress> A: string("3[27;6;65~")\n\
...
Ctrl Shift ~Meta <KeyPress> Z: string("3[27;6;90~")\n\
Ctrl Shift Meta <KeyPress> A: string("3[27;8;65~")\n\
...
Ctrl Shift Meta <KeyPress> Z: string("3[27;8;90~")\n\
XTerm*vt100.modifyOtherKeys: 1
XTerm*vt100.formatOtherKeys: 0
键序列可以是任何东西(我见过很多未记录的键序列),但最接近 "standard" 的东西可以在这里找到:http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
第二步是让 emacs 将这些新的转义序列分配给它理解的键序列:
; xterm-specific options
(unless window-system
(define-key key-translation-map "\C-[[27;6;65~" (kbd "C-S-a"))
...
(define-key key-translation-map "\C-[[27;6;90~" (kbd "C-S-z"))
(define-key key-translation-map "\C-[[27;8;65~" (kbd "C-M-S-a"))
...
(define-key key-translation-map "\C-[[27;8;90~" (kbd "C-M-S-z"))
; other xterm-specific options here
)
在 ...
中,将 ~
之前的最后一个数字加一,因此 A=65,B=66,...,Z=90。
xterm
可以做到这一点;其他终端不能。
如果您将目标更改为使用 功能键 ,您可以更进一步,因为在不更改配置的情况下,xterm 会为修饰符的各种组合发送不同的转义序列 shift、control、alt 和 meta 应用于函数时-和光标键。
"Terminal" 的嫌疑人可能是基于 VTE 的终端仿真器之一,例如 gnome-terminal。这复制了 xterm 这部分行为的相当大的块,因此您可以试验 function-keys 的配置,决定什么是有意义的并使用这些设置。
VTE 的行为没有记录在案。但是你可以在XTerm Control Sequences.
中阅读原文
我在我的 .emacs 文件中设置了以下键绑定:
(global-set-key (kbd "C-S-M-w") 'windmove-up)
(global-set-key (kbd "C-S-M-s") 'windmove-down)
(global-set-key (kbd "C-S-M-d") 'windmove-right)
(global-set-key (kbd "C-S-M-a") 'windmove-left)
(global-set-key (kbd "C-S-a") 'shrink-window-horizontally)
(global-set-key (kbd "C-S-d") 'enlarge-window-horizontally)
(global-set-key (kbd "C-S-s") 'shrink-window)
(global-set-key (kbd "C-S-w") 'enlarge-window)
他们在自己的 window 中工作得很好。但是,如果我 运行 它在终端 (emacs -nw) 中,则不会加载键绑定。即使在加载 .emacs 文件后,我仍然没有键绑定。
当我使用 emacs 守护程序并在客户端和终端中打开时,情况是一样的。如果重要的话,我在 linux 机器上。
问题不在于 emacs,问题在于修饰键组合(Control、Shift 和 Alt)在大多数终端程序中的表现很差。类似的问题不断出现在这里和许多其他地方,包括超级用户,例如:emacs - [control shift up] doesn't work, and https://superuser.com/q/230852。您需要在您的特定终端中对其进行测试 - 但例如检查 Gnome 终端表明 C-S-
与 C-
无法区分,因此您的大部分绑定甚至无法正确地进入 emacs
如果您需要说服自己,请使用 C-h k
,然后使用您缺少的组合。您会看到,当您在终端中 运行 时,这些组合会去除一些修饰符。
我有过类似的经历,得出的结论是,与终端斗争是不值得的。当您在终端中时,我建议您将需要多个修饰符的组合键重新映射到其他东西。 (例如,我最终将 windmove 命令重新映射到 F 键。)或者,我可以建议使用 evil leader key (if you use evil), or God mode 否则。这大大减少了对多个修饰符的需求。
第一步是让您的终端发送转义码,稍后您可以在 emacs 中为其指定含义。编辑您的 .Xdefaults 文件以根据需要添加任意数量的这些。这是一个使用 xterm 的例子(可能有错别字,因为我不能从我的工作电脑上剪切和粘贴):
*VT100*translations: #override \n\
~Ctrl ~Shift <KeyPress> BackSpace: string(0x7F)\n\
Ctrl ~Shift <KeyPress> BackSpace: string("3[27;5;8~")\n\
Ctrl Shift <KeyPress> BackSpace: string("3[27;6;8~")\n
Ctrl Shift ~Meta <KeyPress> A: string("3[27;6;65~")\n\
...
Ctrl Shift ~Meta <KeyPress> Z: string("3[27;6;90~")\n\
Ctrl Shift Meta <KeyPress> A: string("3[27;8;65~")\n\
...
Ctrl Shift Meta <KeyPress> Z: string("3[27;8;90~")\n\
XTerm*vt100.modifyOtherKeys: 1
XTerm*vt100.formatOtherKeys: 0
键序列可以是任何东西(我见过很多未记录的键序列),但最接近 "standard" 的东西可以在这里找到:http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.
第二步是让 emacs 将这些新的转义序列分配给它理解的键序列:
; xterm-specific options
(unless window-system
(define-key key-translation-map "\C-[[27;6;65~" (kbd "C-S-a"))
...
(define-key key-translation-map "\C-[[27;6;90~" (kbd "C-S-z"))
(define-key key-translation-map "\C-[[27;8;65~" (kbd "C-M-S-a"))
...
(define-key key-translation-map "\C-[[27;8;90~" (kbd "C-M-S-z"))
; other xterm-specific options here
)
在 ...
中,将 ~
之前的最后一个数字加一,因此 A=65,B=66,...,Z=90。
xterm
可以做到这一点;其他终端不能。
如果您将目标更改为使用 功能键 ,您可以更进一步,因为在不更改配置的情况下,xterm 会为修饰符的各种组合发送不同的转义序列 shift、control、alt 和 meta 应用于函数时-和光标键。
"Terminal" 的嫌疑人可能是基于 VTE 的终端仿真器之一,例如 gnome-terminal。这复制了 xterm 这部分行为的相当大的块,因此您可以试验 function-keys 的配置,决定什么是有意义的并使用这些设置。
VTE 的行为没有记录在案。但是你可以在XTerm Control Sequences.
中阅读原文