Подтвердить что ты не робот

Клавиши Alt не работают на терминале gnome с Vim

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

:imap <A-i> <Esc>

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

Спасибо

РЕДАКТИРОВАТЬ: У меня установлена ​​Windows 7 на том же компьютере, и с Windows-терминалом это тоже отлично.

4b9b3361

Ответ 1

Проблема

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

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

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

Решение

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

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

set ttimeout ttimeoutlen=50

Ответ 2

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

imap ^[i <Esc>

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

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

EDIT Вот пример, который делает 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

Ответ 3

Try

<m-i>

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

:inoremap ˆ <esc>

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

Ответ 4

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

Итак, возможно, вы можете попробовать следующее:

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

Ответ 5

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

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

Ответ 6

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

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