5

Я пытаюсь сопоставить два разных действия, например, Ctrl Shift a и Ctrl a:

map <C-S-a>    :echo "ctrl-shift-a received"<CR>
map <C-a>      :echo "ctrl-a received"<CR>

Но все, что я когда-либо получаю, нажимая любой из двух, это вывод "ctrl-a полученный" в строке состояния. Очевидно, vi не видит разницы между заглавными и строчными буквами.

Есть ли способ изменить это?

Я использую vi (v7.4) в xterm (X.Org 6.8.99).

1 ответ1

5

Это терминальное ограничение, потому что vi видит коды клавиш одинаковыми. Это можно проверить, войдя в режим вставки i, затем нажав Ctrl v, чтобы перевести vi в режим ожидания буквального ввода специального символа, а затем, например, нажать Ctrl Shift a. ^A выход появится. Теперь выполните последовательность Ctrl v, Ctrl a, и снова появится ^A : обе входные последовательности приводят к тому, что vi кодирует один и тот же код клавиши.

Для таких терминалов, как xterm вы можете это изменить. Для gnome-terminal который игнорирует настройки ресурсов X, я не знаю, как сделать следующее:

Этот вопрос SO охватывает ту же тему, и этот пример показывает, как он используется для сопоставления нескольких ключей в .Xresources . Например:

XTerm*vt100.translations: #override \
  Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n\
  Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n\ 
  Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")  

Теперь у нас есть различные последовательности клавиш, поступающие в vi для Ctrl a против Ctrl Shift a, Ctrl b против Ctrl Shift b, Ctrl f против Ctrl Shift f.

Теперь мы можем отобразить их по-другому в ~/.vimrc:

map <ESC>[65;5u   :echo "ctrl-shift-a received"<CR>
map <C-a>         :echo "ctrl-a received"<CR>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .