проблема
Для эмулятора терминала существует два способа отправки ключа 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