В терминале нельзя различать Ctrl+ Aи Ctrl+ Shift+, Aпоскольку они оба излучают один и тот же ключевой код, поэтому я могу понять, почему Vim не может этого сделать. Но gVim, будучи приложением X, может различать Ctrl+ Aи Ctrl+ Shift+ A. Есть ли способ сопоставить эти две вещи по-разному?
Для начала, я хотел бы сделать что-то вроде следующего: заставить «вставить из буфера обмена» работать как терминал Gnome, сохраняя Ctrl+ Vв визуальном режиме.
:nmap <C-S-V> "+gP
vim
key-bindings
Косуке Кавагути
источник
источник
Ответы:
Gvim этого не делает, потому что vim не может этого сделать (при нормальных обстоятельствах). Извините, но так оно и есть.
Однако...
Некоторые терминалы (например, xterm и iterm2) можно настроить для отправки произвольной escape-последовательности для любой комбинации клавиш.
Например, добавьте следующее, чтобы
.Xresources
xterm отправлял<Esc>[65;5u
для CtrlShiftA. Затем вы можете сопоставить это в Vim с<C-S-a>
. (65 - это десятичное значение Unicode для shift-a, а 5 - бит для модификатора ctrl. U в данном случае означает «unicode».)Для этого также можно настроить iTerm и [u] rxvt (примеры не приводятся).
Подробнее: http://www.leonerd.org.uk/hacks/fixterms/
источник
\n
. Используйте обратную косую черту для разделения строк. Например, чтобы также сопоставить <kbd> CSB </kbd> и <kbd> CSF </kbd>, используйте это: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")
map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>
чтобы отобразить ctrl-shift-b для печати сообщения в строке состояния. На AskUbuntu был аналогичный вопрос, и я резюмировал это.xterm-256color
(самые последние) страдают от множества ограничений.xterm-256color
.Как уже указывалось, нет способов сопоставить
<C-S-A>
иначе, чем<C-A>
.Однако с помощью таких инструментов, как
autokey
(для Linux и Windows) илиautohotkey
(для Windows), вы можете переназначить,<C-S-A>
чтобы отправить другое нажатие клавиши для определенных приложений.например, в моей системе у меня есть этот параметр в
autokey
:Присвойте ему следующие свойства:
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
поддерживает кнопку для захвата любых других свойств окна, таких как класс / заголовок.источник
apt install autokey-gtk
?bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h
который нажимает,,wmh
когда я нажимаю<C-S-h>
, а затем vim знает, как обрабатывать,wmh
<C-S-H>
когда я нажимаю это.Если вас беспокоит потеря существующей функциональности CV, вы можете вместо этого использовать CQ. См.: Help Альтернатива CTRL-V.
источник
NeoVim теперь предлагает эту функцию как для своего терминала, так и для клиентов с графическим интерфейсом. См . : h nvim-features-new
источник
<m-s-...>
варианты) , действительно в основном работают полностью из коробки.ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.
, что перед частью «С учетом регистра:» есть разрыв строки, что делает это неоднозначным. Спасибо за исправление, @ JustinM.Keyes. Кроме того, vim 8.1, похоже, также различает<M-a>
и<M-A>
.<c-s-l>
отлично отличается от<c-l>
inKonsole
без лишних хлопотИз-за того, что ввод с клавиатуры обрабатывается внутри, это, к сожалению, сегодня невозможно, даже в GVIM. Некоторые комбинации клавиш, такие как Ctrl+ неалфавитный, не могут быть отображены, а Ctrl+ буква против Ctrl+ Shift+ буквы не могут быть различены. (Если только ваш терминал не отправляет для него отдельный код termcap , а в большинстве случаев этого не происходит.) В режиме вставки или командной строки попробуйте ввести комбинацию клавиш. Если ничего не происходит / не вставляется, вы не можете использовать эту комбинацию клавиш. Это также относится к
<Tab>
/<C-I>
,<CR>
/<C-M>
/<Esc>
/<C-[>
и т. Д. (Единственное исключение -<BS>
/<C-H>
.) Это известная проблема, которая является предметом различных обсуждений на vim_dev и IRC-канале #vim.Некоторые люди (в первую очередь Пол ЛеоНерд Эванс) хотят исправить это (даже для консольного Vim в терминалах, которые поддерживают это) и выдвинули различные предложения, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Но на сегодняшний день никаких патчей или добровольцев еще не появилось, хотя многие выразили желание иметь это в будущем выпуске Vim.
источник
Как вы заметили, вы получаете тот же ключевой код. Таким образом, единственный способ отличить их - это проверить состояние Shiftключа в вашей функции обработки событий. Конечно, если у вас есть задержка более 0,5 секунды между нажатием клавиши и обработкой, вы пропустите некоторые совпадения.
источник