Як по-різному зіставити Ctrl + A і Ctrl + Shift + A?


92

У терміналі неможливо розрізнити Ctrl+ Aі Ctrl+ Shift+, Aоскільки вони обидва видають однаковий код ключа, тому я розумію, чому Vim не може цього зробити. Але gVim, будучи додатком X, може розрізняти Ctrl+ Aта Ctrl+ Shift+ A. Чи є спосіб по-різному відобразити ці дві речі?

Для початку я хотів би зробити щось на зразок наступного: Змусити "вставити з буфера обміну" працювати як термінал Gnome, зберігаючи Ctrl+ Vдо візуального режиму.

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


3
@vivoconunxino У цьому посиланні не згадується про додавання модифікатора зсуву до ctrl-a.
greywh

Відповіді:


46

Gvim цього не робить, оскільки vim не може цього зробити (за звичайних обставин). Вибачте, але це саме так.


Однак ...

Деякі термінали (наприклад, xterm та iterm2) можуть бути налаштовані на передачу довільної послідовності екранування для будь-якої комбінації ключів.

Наприклад, додайте наступний рядок .Xresourcesдля Xterm , щоб відправити <Esc>[65;5uна CtrlShiftA. Потім ви можете відобразити це у Vim до <C-S-a>. (65 - це десяткове значення Unicode для shift-a, а 5 - біт для модифікатора ctrl. Значення u в цьому випадку означає "юнікод".)

! .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/


Щоб переназначити кілька ключів, перегляньте цей документ : Розділіть записи ключів за допомогою \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")
cfi

Для повноти, можливо, додайте до відповіді також, як відобразити це in vi? Наприклад, map <ESC>[66;5u :echo "ctrl-shift-b received"<CR>відобразити ctrl-shift-b, щоб надрукувати повідомлення в рядку стану. У AskUbuntu було подібне запитання Q, і я підсумував це.
cfi

Нам потрібна нова специфікація терміналу! xterm-256color(найновіші) страждають від стільки обмежень.
Jérôme Pouiller

@Jezz Обмеження стосуються самого termcap, а не файлу termcap для xterm-256color.
greywh

@graywh Звичайно, будуть потрібні нові функції для termcap
Jérôme Pouiller

9

Як уже зазначалося, немає способів скласти карту, яка <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підтримує кнопку для фіксації будь-яких інших властивостей вікна, таких як клас / заголовок.

Спасибі купи. Є багато речей щодо використання Autokey для перепризначення ключів, але немає фактичних вказівок про те, як це зробити. Нарешті, ваша відповідь робить це. Я не можу повірити, що ніхто інший не підтримав вас.
pickle323

1
Проклятий автоключ! Я зробив усе, що міг, але не зміг встановити його на своєму ubuntu 16.04.
yukashima huksay

apt install autokey-gtk?
anishsane

1
Перш ніж встановлювати додаткове програмне забезпечення, ви можете перевірити, чи обробляє це безпосередньо ваш менеджер вікон. Наприклад, у i3 у моєму .config є такий:, bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m hякий натискає, ,wmhколи я натискаю <C-S-h>, а потім vim знає, як обробляти,wmh
MatrixManAtYrService

^^ Це теж добре. Однак я хотів обмежити переклад ключів лише gnome-terminal або gvim. Не інші програми. Інші програми повинні продовжувати отримувати, <C-S-H>коли я натискаю це.
anishsane

5

Якщо те, що вас турбує, це втрата існуючих функцій резюме, замість цього ви можете використовувати CQ. Див.,: Довідка CTRL-V-альтернатива.


3

Тепер NeoVim пропонує цю функцію як для своїх терміналів, так і для клієнтів GUI. Дивіться : h nvim-features-new


3
Не зовсім, якщо ви не ввімкнете коди CSI у своєму терміналі. CTRL-SHIFT варіантів , що Neovim дійсно підтримує з коробки, в основному недруковані символи (приклади , наведені в neovim.org/doc/user/vim_diff.html#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>також.
Адам Кац,

@ Justin-м-Кіз <c-s-l>прекрасно відрізняється від <c-l>в Konsoleбез будь - яких додаткових клопотів
Slava

3

Через те, що введення з клавіатури обробляється внутрішньо, це, на жаль, сьогодні неможливо навіть у GVIM. Деякі комбінації клавіш, наприклад Ctrl+ не алфавітні, не можна зіставити, а Ctrl+ буква проти Ctrl+ Shift+ буква неможливо розрізнити. (Якщо ваш термінал не надсилає для нього окремий код capcap , який більшість не надсилає .) У режимі вставки або командного рядка спробуйте ввести комбінацію клавіш. Якщо нічого не відбувається / вставляється, ви не можете використовувати цю комбінацію клавіш. Це також стосується <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>тощо. (Виняток становить лише <BS>/ <C-H>.) Це відома проблема і є предметом різноманітних дискусій на vim_dev та IRIM-каналі #vim.

Деякі люди (передусім Пол Леонерд Еванс) хочуть це виправити (навіть для консолі Vim у терміналах, які це підтримують), і запропонували різні пропозиції, ср. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

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


1

Як ви вже зазначали, ви отримуєте той самий код ключа. Тож єдиний спосіб їх відрізнити - перевірити стан Shiftключа у вашій функції обробки подій. Звичайно, якщо у вас більше 0,5 секунди затримки між натисканням клавіші та обробкою, ви пропустите деякі звернення.


1
Думаю, сенс мого запитання полягав у тому, що зважаючи на те, що gvim здатний зробити таку різницю (навіть незважаючи на те, що звичайний vim не може), чи існує якесь конкретне розширення gvim, на яке я міг би розраховувати, щоб диференціювати Ctrl + Shift + V від Ctrl + V .
Kohsuke Kawaguchi

9
як перевірити стан ключа Shit? Я шукав, але не знайшов нічого навіть віддалено корисного.
bolov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.