Как скопировать Ctrl + A и Ctrl + Shift + по-другому?
В терминале нельзя отличить Ctrl + A и Ctrl + Shift + A, поскольку оба они испускают один и тот же key code, поэтому я могу понять, почему Vim не может этого сделать, Но gVim, являясь X-приложением, может отличать Ctrl + A и Ctrl + Shift + A. Есть ли способ сопоставить эти две вещи по-другому?
Для начала я хотел бы сделать что-то вроде следующего: Сделать "вставку из буфера обмена" работать как терминал Gnome, сохраняя Ctrl + V в визуальном режиме.
:nmap <C-S-V> "+gP
Ответы
Ответ 1
Gvim не делает этого, потому что vim не может этого сделать (при нормальных обстоятельствах). Извините, но это так.
Однако...
Некоторые терминалы (например, xterm и iterm2) могут быть настроены для отправки произвольной escape-последовательности для любой комбинации клавиш.
Например, добавьте следующее в .Xresources
для xterm для отправки <Esc>[65;5u
для Ctrl Shift A. Затем вы можете сопоставить это в Vim с <C-S-a>
. (65 - десятичное значение Unicode для shift-a, а 5 - бит для модификатора ctrl. В этом случае u означает "unicode".)
! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")
iTerm и [u] rxvt также могут быть настроены для этого (примеры не указаны).
Дополнительная информация: http://www.leonerd.org.uk/hacks/fixterms/
Ответ 2
Если вы беспокоитесь, что теряете существующие функции C-V, вы можете использовать C-Q. См.,: Help CTRL-V-альтернатива.
Ответ 3
Как вы уже отметили, вы получаете тот же самый ключ. Таким образом, единственный способ отличить их - проверить состояние клавиши Shift в вашей функции обработки событий. Конечно, если у вас более 0,5 секундной задержки между нажатием и обработкой, вы пропустите некоторые хиты.
Ответ 4
Как уже указывалось, нет способов сопоставления <C-S-A>
по-разному от <C-A>
.
Однако, используя такие инструменты, как autokey
(для linux и windows) или autohotkey
(для окон) вы можете переназначить <C-S-A>
, чтобы отправить различные ключевые штрихи для определенных приложений.
например. В моей системе у меня есть эта настройка в autokey
:
$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.
Назначьте следующие свойства:
- клавиатура-ярлык как
ctrl+shift+a
- класс окна:
gnome-terminal-server.Gnome-terminal
Затем ваш ~/.vimrc
может создать сопоставление для <S-F1>a
, чтобы сделать все, что вам нужно.
Примечания:
- Я использовал
<S-F1>
как лидирующий ключ для обнаружения <C-S>
. Это объясняется тем, что мой терминал не принимал ключи <F13>
- <F37>
и т.д. Если ваше приложение поддерживает его, рекомендуется (gvim
) использовать эти ключи.
- В основном
vim
в gnome-terminal
. Поэтому я использовал window class = gnome-terminal-server.Gnome-terminal
в качестве фильтра. Измените его, чтобы использовать gvim
, если хотите. autokey
поддерживает кнопку для захвата любых других свойств окна, таких как класс/заголовок.
Ответ 5
NeoVim теперь предлагает эту функциональность как для своих терминальных, так и для GUI-клиентов. См. : h nvim-features-new
Ответ 6
Из-за того, что ввод с клавиатуры осуществляется внутренне, к сожалению, сегодня это вообще невозможно, даже в GVIM. Некоторые комбинации клавиш, такие как Ctrl + не-алфавит, не могут быть отображены, а Ctrl + letter vs. Ctrl + Shift + буква не может быть выделена. (Если ваш терминал не отправляет отдельный код termcap для него, чего больше всего нет.) В режиме ввода или командной строки попробуйте ввести комбинацию клавиш. Если ничего не происходит/не вставлено, вы не можете использовать эту комбинацию клавиш. Это также относится к <Tab>
/<C-I>
, <CR>
/<C-M>
/<Esc>
/<C-[>
и т.д. (Только исключение составляет <BS>
/<C-H>
.) Это известная точка боли и тема различных обсуждений vim_dev и канала #vim IRC.
Некоторые люди (прежде всего Пол Лев Норд Эванс) хотят исправить это (даже для консоли Vim в терминалах, которые поддерживают это), и выпустили различные предложения, ср. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Но на сегодняшний день никаких патчей или добровольцев еще не вышли, хотя многие выразили желание иметь это в будущем выпуске Vim.