Сочетания клавиш Alt не работают на терминале gnome с Vim - PullRequest
44 голосов
/ 21 июля 2011

Я использую Vim на терминале гномов.Но сопоставления клавиш Alt не работают.
Например (это только пример):

:imap <A-i> <Esc>

Отлично работает в GVim.Но когда я запускаю ту же команду с Vim в терминале gnome, она просто не работает.
Так что я думаю, что проблема с терминалом, верно?
Как я могу это исправить?

Спасибо

РЕДАКТИРОВАТЬ: У меня установлена ​​Windows 7 на той же машине, и с терминалом Windows она тоже отлично работает.

Ответы [ 6 ]

83 голосов
/ 18 апреля 2012

проблема

Для эмулятора терминала существует два способа отправки ключа Alt (обычно называемого мета-ключом, поскольку на реальных терминалах не было Alt). Он может либо отправлять 8-битные символы и устанавливать старший бит при использовании Alt, либо он может использовать escape-последовательности, отправляя Alt-a как <Esc>a. Vim ожидает увидеть 8-битную кодировку, а не escape-последовательность.

Некоторые эмуляторы терминала, такие как xterm , могут быть настроены на использование любого из режимов, но Терминал Gnome не предлагает никаких таких настроек. Честно говоря, в наши дни редактирования Unicode 8-битная кодировка не очень хорошая идея. Но escape-последовательности также не свободны от проблем; они не предлагают никакого способа провести различие между <Esc>j, то есть Alt-j и нажатием Esc , за которым следует j .

При более раннем использовании терминала ввод Esc j был другим способом отправки мета на клавиатуре без клавиши Meta , но это не подходит хорошо, когда vi использует Esc для выхода из режима insert .

Решение

Это можно обойти, настроив vim для сопоставления escape-последовательностей с их комбинациями Alt.

Добавьте это к вашему .vimrc:

let c='a'
while c <= 'z'
  exec "set <A-".c.">=\e".c
  exec "imap \e".c." <A-".c.">"
  let c = nr2char(1+char2nr(c))
endw

set timeout ttimeoutlen=50

Alt-письмо теперь будет распознаваться как в терминале, так и в gvim. Настройки timeout используются для обхода неоднозначности с escape-последовательностями. Esc и j , отправленные в течение 50 мс, будут сопоставлены с <A-j>, более 50 мс будут считаться отдельными ключами. Этого должно быть достаточно, чтобы разграничить мета-кодирование и нажатие двух клавиш.

Если вам не нравится установка тайм-аута, который истекает для других назначенных последовательностей клавиш (по умолчанию через секунду), тогда вы можете использовать ttimeout вместо этого. Время ожидания применяется только к кодам клавиш, а не к другим сопоставлениям.

set ttimeout ttimeoutlen=50
6 голосов
/ 17 мая 2012

Для Gnome-terminal используйте вместо этого:

imap ^[i <Esc>

^[i следует набрать, нажав Ctrl-v Alt-i

Внимание : Вам нужно yank и put в Vim, если вы хотите скопировать его в другое место. Если вы просто скопируете сопоставление в редакторе, например gedit, сопоставление, вероятно, будет нарушено.

РЕДАКТИРОВАТЬ вот пример, который заставляет Alt-k добавить пустую строку над курсором, а Alt-j добавить пустую строку после текущей строки.

" Alt-j/k to add a blank line
if has('gui_running')
    " the following two lines do not work in vim, but work in Gvim
    nnoremap <silent><A-j> :set paste<CR>m`o<Esc>``:set nopaste<CR>
    nnoremap <silent><A-k> :set paste<CR>m`O<Esc>``:set nopaste<CR>
else
    " these two work in vim
    " shrtcut with alt key: press Ctrl-v then Alt-k
    " ATTENTION: the following two lines should not be 
    " edited under other editors like gedit. ^[k and ^[j will be broken!
    nnoremap ^[k :set paste<CR>m`O<Esc>``:set nopaste<CR>
    nnoremap ^[j :set paste<CR>m`o<Esc>``:set nopaste<CR>
endif
2 голосов
/ 23 июня 2012

То же самое происходит со мной.Я искал в Google «gt терминал терминала alt key» и обнаружил, что кто-то задал почти тот же вопрос: « Как отключить поведение alt-hotkey на терминале gnome? » в первой найденной ссылке.(Вторая ссылка как раз на этот вопрос)

Итак, может быть, вы можете попробовать это:

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"
2 голосов
/ 21 июля 2011

Попробуйте

<m-i>

Или, если набрать alt i вставляет символ (как в моем случае, он вставляет символ: ˆ), просто сопоставьте с этим символом:

:inoremap ˆ <esc>

Будьте осторожны, потому что это не сработает (по крайней мере, в моей системе MacOS 10.6). Каретка ждет письма, потому что это не совсем каретка, это круговое сгиб .

1 голос
/ 23 января 2012

Взгляните на раздел 1.10 из http://vimdoc.sourceforge.net/htmldoc/map.html. Кажется, это указывает на то, что gnome-терминал автоматически экранирует модификатор Alt, так что он не переключает байт, отправленный так, как ожидает Vim.Документ, кажется, указывает, что на самом деле нет никакого способа обойти это, кроме как использовать другой терминал (такой как xterm).

Это, конечно, расстраивает, потому что, насколько я могу судить, машины Linux также не способныиспользуя привязки D (Mac's Command или Linux Super), поэтому, по крайней мере, в отношении терминала мы ограничены модификаторами Shift и Ctrl, что разочаровывает, если мы хотим гарантировать, что мы можем использовать все команды, которые мы используем в Gvimна терминале Vim (по крайней мере, без переключения терминалов, к которым я, возможно, чрезмерно упрям ​​- терминал-гном просто намного красивее).Я искал способ обойти это, но не смог ничего найти.

1 голос
/ 21 июля 2011

Возможно, ярлыки на самом деле находятся на рабочем столе Gnome.Попробуйте взглянуть на инструмент Gnome Keyboard Shortcuts (Системное меню, Настройки, Сочетания клавиш), который позволяет просматривать и изменять сочетания клавиш, определенные на Gnome Desktop.Если комбинация клавиш назначена функции в Gnome Desktop, удалите ее, а затем эта комбинация клавиш должна правильно отфильтроваться до Vim.

Или, возможно, вы правы, что это проблема терминала.Не все терминалы поддерживают все комбинации клавиш.Возможно, ваша проблема описана в справочных документах Vim по адресу :h map-alt-keys.Документы предоставляют обходной путь, но не очень хороший.

...