Сочетания клавиш Alt не работают на терминале gnome с Vim

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

:imap <A-i> <Esc>

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

спасибо

EDIT: у меня Windows 7 установлен на той же машине, и с окна терминала он тоже отлично работает.

6 ответов


проблема

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

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

в более раннем использовании терминала, набрав Escj еще один способ отправить мета на клавиатуре без мета ключ, но это не подходит хорошо с использованием vi Esc, чтобы оставить вставить режим.

решение

можно обойти это, настроив 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-буква теперь будет распознана vi в терминале, а также gvim. The timeout настройки используются для работы вокруг неопределенности с escape-последовательностями. Esc и j отправлено в течение 50 мс будет отображаться на <A-j>, больше чем 50ms будет считаться отдельными ключами. Этого должно быть достаточно, чтобы отличить мета-кодирование от нажатия двух клавиш.

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

set ttimeout ttimeoutlen=50

на 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

попробовать

<m-i>

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

:inoremap ˆ <esc>

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


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

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

Edit > Keyboard Shortcuts, and uncheck "Enable menu access keys"

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

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


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

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