emacs keybinding在终端中不起作用

时间:2016-08-03 00:16:18

标签: emacs terminal key-bindings

我在.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)

当他们进入自己的窗口时,他们工作得很好。但是,如果我在终端(emacs -nw)中运行它,则不会加载键绑定。即使在加载.emacs文件后,我仍然没有键绑定。

当我使用emacs守护进程并在客户端和终端中打开时,情况相同。如果重要的话,我就在Linux机器上。

3 个答案:

答案 0 :(得分:5)

问题不在于emacs,问题是修饰键的组合(Control,Shift和Alt)在大多数终端程序中表现得很差。类似的问题不断出现在这里以及许多其他地方,包括超级用户,例如:emacs - [control shift up] doesn't workhttps://superuser.com/q/230852。您需要在特定终端中对其进行测试 - 但是,例如,检查Gnome终端会显示C-S-C-无法区分,因此您的大部分绑定甚至无法正确地将其设置为emacs < / p>

如果您需要说服自己使用C-h k,然后使用您缺少的组合。您将看到,当您在终端中运行时,这些组合将被剥离一些修饰符。

我经历过类似的经历,并得出结论,与终端的斗争并不值得付出努力。当你在终端时,我建议你将需要多个修改器的键组合重新映射到其他东西。 (例如,我最终将windmove命令重新映射到F键。)或者,我可以建议使用evil leader键(如果你使用邪恶),或者God mode。这大大减少了对多个修饰符的需求。

答案 1 :(得分:1)

xterm可以做到这一点;其他终端不能。

如果你改变目标使用功能键,你可以进一步,因为不改变配置,xterm为修饰符的各种组合发送不同的转义序列 shift control alt meta

“终端”的可能嫌疑人将是基于VTE的终端模拟器之一,例如gnome-terminal。这复制了xterm行为的这一部分的一个相当大的部分,因此您可以试验功能键的配置,确定有意义并使用这些设置。

VTE的行为没有记录。但您可以在XTerm Control Sequences中阅读原文。

答案 2 :(得分:0)

第一步是让您的终端发送转义码,稍后您可以在emacs中指定含义。编辑.Xdefaults文件以根据需要添加任意数量的文件。这是一个使用xterm的例子(可能的拼写错误,因为我无法从我的工作PC上剪切和粘贴):

*VT100*translations: #override \n\
    ~Ctrl ~Shift <KeyPress> BackSpace: string(0x7F)\n\
    Ctrl ~Shift <KeyPress> BackSpace: string("\033[27;5;8~")\n\
    Ctrl Shift <KeyPress> BackSpace: string("\033[27;6;8~")\n

    Ctrl Shift ~Meta <KeyPress> A: string("\033[27;6;65~")\n\
    ...
    Ctrl Shift ~Meta <KeyPress> Z: string("\033[27;6;90~")\n\

    Ctrl Shift Meta <KeyPress> A: string("\033[27;8;65~")\n\
    ...
    Ctrl Shift Meta <KeyPress> Z: string("\033[27;8;90~")\n\

XTerm*vt100.modifyOtherKeys: 1
XTerm*vt100.formatOtherKeys: 0

关键序列可以是任何东西(我已经看过很多未记录的密钥序列),但最接近“标准”的东西可以在这里找到: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
)

...内,将~之前的最后一个数字加1,所以A = 65,B = 66,...,Z = 90。