2016-08-03 2 views
1

Я установил следующие сочетания клавиш в моем файле .emacs:Emacs KeyBinding не работает в терминале

(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 и открываю клиент для vs в терминале. Если это имеет значение, я на Linux-машине.

ответ

3

Проблема не в emacs, проблема в комбинациях клавиш-модификаторов (Control, Shift и Alt) ведет себя довольно плохо в большинстве программ терминалов. Подобные вопросы продолжают возникать здесь и во многих других местах, включая суперпользователя, например: emacs - [control shift up] doesn't work и https://superuser.com/q/230852. Вы должны проверить его в вашем конкретном терминале - но проверка Gnome терминала к примеру, показывает, что C-S- неотличим от всего C-, поэтому большинство креплений даже не делает его EMACS правильно

Если вам нужно убедить себя использовать C-h k, а затем комбинации, которые вам не хватает. Вы увидите, что при запуске в терминале эти комбинации лишены некоторых модификаторов.

Я прошел через аналогичный опыт и пришел к выводу, что борьба с терминалами не стоит усилий. Я предлагаю вам переназначить комбинации клавиш, которые нуждаются в более чем одном модификаторе к чему-то еще, когда вы находитесь в терминале. (Например, я перегруппировал команды windmove на F-ключи.) Альтернативно, я могу порекомендовать либо использовать ключ evil leader (если вы используете зло), либо God mode в противном случае. Это резко уменьшает потребность в нескольких модификаторах.

0

Первый шаг заключается в том, чтобы заставить ваш терминал отправлять эвакуационные коды, которые позднее можно присвоить значению в emacs. Отредактируйте файл .Xdefaults, чтобы добавить столько, сколько вам нужно. Вот пример использования Xterm (возможно опечаток, так как я не могу вырезать и вставить из моей работы компьютера):

*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 
) 

В ..., увеличивают последний номер перед ~ по одному, так А = 65, B = 66, ..., Z = 90.

+0

Что-то в этом роде. Но он работает только для xterm, и OP, вероятно, считает, что «терминал» - это другая программа. –

+0

@ThomasDickey Как вы упомянули в своем ответе, многие эмуляторы терминала копируют поведение xterm в некоторой степени, хотя они часто захватывают комбинации клавиш для своих целей. Вероятно, OP не понимает ограничений терминала и может захотеть попробовать другие терминалы (например, xterm), чтобы убедиться, что они лучше подходят. – Teajay

+0

Вот почему я ответил (лучше, чем комментировать). –

1

xterm можно сделать для этого; другие терминалы не могут.

Если изменить цель использовать функциональные клавиши, вы можете получить в дальнейшем, так как без изменения конфигурации, Xterm посылает различные управляющие последовательности для различных комбинаций модификаторов сдвига, управления, альт и meta при применении к функциональным клавишам и курсорам.

Вероятным подозрением на «терминал» является один из эмуляторов терминала на базе VTE, таких как гном-терминал.Это копирует фрагмент из этой части поведения xterm, и вы можете поэкспериментировать с вашей конфигурацией для функциональных клавиш , решить, что имеет смысл и использовать эти настройки.

Поведение VTE недокументировано. Но вы можете прочитать оригинал в XTerm Control Sequences.

Смежные вопросы