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