Это терминальное ограничение, потому что 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>