Как по-разному сопоставить Ctrl + A и Ctrl + Shift + A? - PullRequest
75 голосов
/ 02 октября 2009

В терминале нельзя различить Ctrl + A и Ctrl + Shift + A как они оба выдают один и тот же код ключа, поэтому я понимаю, почему Vim не может этого сделать. Но gVim, будучи приложением X, может различать Ctrl + A и Ctrl + Shift + A . Есть ли способ по-разному сопоставить эти две вещи?

Для начала я бы хотел сделать что-то вроде следующего: сделать так, чтобы «вставка из буфера обмена» работала как терминал Gnome, сохраняя Ctrl + V в визуальном режиме.

:nmap <C-S-V> "+gP

Ответы [ 6 ]

36 голосов
/ 01 февраля 2010

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/

7 голосов
/ 18 октября 2016

Как уже указывалось, нет способов сопоставить <C-S-A> в отличие от <C-A>.

Однако, используя такие инструменты, как autokey (для Linux и Windows) или autohotkey (для Windows), вы можете переназначить <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.

Присвойте ему следующие свойства:

  1. сочетание клавиш как ctrl+shift+a
  2. класс окон: gnome-terminal-server.Gnome-terminal

Тогда ваш ~/.vimrc может создать отображение для <S-F1>a, чтобы делать все, что вы хотите.


Примечания:

  1. Я использовал <S-F1> в качестве ключа-лидера для обнаружения <C-S>. Это произошло потому, что мой терминал не принимал ключи <F13> - <F37> и т. Д. Если ваше приложение поддерживает это, (gvim я думаю) рекомендуется использовать эти клавиши.
  2. Я в основном vim в gnome-terminal. Поэтому я использовал window class = gnome-terminal-server.Gnome-terminal в качестве фильтра. Измените его, чтобы использовать gvim, если хотите. autokey поддерживает кнопку для захвата любых других свойств окна, таких как class / title.
5 голосов
/ 07 апреля 2011

Если вас беспокоит потеря функциональности C-V, вы можете использовать C-Q. См.: Помощь CTRL-V-альтернатива.

1 голос
/ 05 декабря 2017

Из-за того, что ввод с клавиатуры обрабатывается внутри, это, к сожалению, сегодня вообще невозможно, даже в GVIM. Некоторые комбинации клавиш, такие как Ctrl + не алфавитно, не могут быть сопоставлены, и Ctrl + буква против Ctrl + Shift + буква не может отличаться (Если ваш терминал не отправляет отдельный код termcap для него, чего большинство не делает.) В режиме вставки или командной строки попробуйте ввести комбинацию клавиш. Если ничего не происходит / вставлено, вы не можете использовать эту комбинацию клавиш. Это также относится к <Tab> / <C-I>, <CR> / <C-M> / <Esc> / <C-[> и т. Д. (Единственное исключение - <BS> / <C-H>.) Это известная болевая точка, и тема различных дискуссий на vim_dev и IRC-канале #vim.

Некоторые люди (прежде всего Пол Леонерд Эванс) хотят это исправить (даже для консоли Vim в терминалах, которые поддерживают это), и выдвинули различные предложения, ср. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Но на сегодняшний день никаких патчей или добровольцев еще не появилось, хотя многие выразили желание иметь это в будущем выпуске Vim.

1 голос
/ 02 октября 2009

Как вы уже заметили, вы получаете тот же код ключа. Поэтому единственный способ их различить - это проверить состояние клавиши Shift в вашей функции обработки событий. Конечно, если между нажатием клавиши и обработкой у вас задержка больше 0,5 секунды, вы пропустите некоторые нажатия.

0 голосов
/ 09 апреля 2015

NeoVim теперь предлагает эту функцию для своих терминальных и графических клиентов. См. : h nvim-features-new

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...