Hoe Ctrl+A en Ctrl+Shift+A anders toewijzen?

In een terminal kan men geen onderscheid maken tussen Ctrl+Aen Ctrl+Shift+A omdat ze allebei dezelfde sleutelcode uitzenden, dus ik kan zien waarom Vim het niet kan doen. Maar gVim, dat een X-toepassing is, kan onderscheid maken tussen Ctrl+Aen Ctrl+Shift+A . Is er een manier om die twee dingen anders in kaart te brengen?

Om te beginnen zou ik zoiets als het volgende willen doen: “plakken van klembord” laten werken als Gnome-terminal, terwijl Ctrl+Vvoor de visuele modus.

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

Antwoord 1, autoriteit 100%

Gvim doet het niet omdat vim het niet kan (onder normale omstandigheden). Sorry, maar zo is het nu eenmaal.


Echter…

Sommige terminals (bijv. xterm en iterm2) kunnen worden geconfigureerd om een ​​willekeurige escape-reeks te verzenden voor elke combinatie van toetsen.

Voeg bijvoorbeeld het volgende toe aan .Xresourceszodat xterm <Esc>[65;5uvoor Ctrlverzendt ShiftA. Je kunt dat dan in Vim toewijzen aan <C-S-A>. (65 is de decimale Unicode-waarde voor shift-a en 5 is de bit voor de ctrl-modifier. De u staat in dit geval voor “unicode”.)

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm en [u]rxvt kunnen ook worden geconfigureerd om dit te doen (voorbeelden niet gegeven).

Meer info: http://www.leonerd.org.uk/hacks/fixterms/


Antwoord 2, autoriteit 18%

Zoals al aangegeven, zijn er geen manieren om <C-S-A>anders in kaart te brengen dan <C-A>.

Met tools zoals autokey(voor linux & windows) of autohotkey(voor Windows), kunt u <C-S-A>om een ​​andere toetsaanslag(en) te verzenden voor specifieke toepassingen.

bijv. Op mijn systeem heb ik deze instelling in 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.

Wijs deze eigenschappen toe:

  1. sneltoets als ctrl+shift+a
  2. window class: gnome-terminal-server.Gnome-terminal

Vervolgens kan uw ~/.vimrcmapping maken voor <S-F1>aom te doen wat u maar wilt.


Opmerkingen:

  1. Ik heb <S-F1>gebruikt als een soort leader-sleutel voor het detecteren van <C-S>. Dit kwam omdat mijn terminal geen <F13><F37>etc-sleutels accepteerde. Als uw toepassing dit ondersteunt, (gvimdenk ik) wordt het gebruik van die sleutels aanbevolen.
  2. Ik vimvoornamelijk in gnome-terminal. Dus ik gebruikte window class = gnome-terminal-server.Gnome-terminalals filter. Pas het aan om gvimte gebruiken als je wilt. autokeyondersteunt een knop voor het vastleggen van de eigenschappen van andere vensters, zoals klasse/titel.

Antwoord 3, autoriteit 12%

Vanwege de manier waarop de toetsenbordinvoer intern wordt afgehandeld, is dit tegenwoordig helaas niet mogelijk, zelfs niet in GVIM. Sommige toetscombinaties, zoals Ctrl+ niet-alfabetisch kunnen niet worden toegewezen, en Ctrl+ letter vs. Ctrl+ Shift+ letter is niet te onderscheiden. (Tenzij uw terminal er een duidelijke termcap-code voor verzendt, wat de meeste niet doen.) Probeer in de invoeg- of opdrachtregelmodus de toetsencombinatie te typen. Als er niets gebeurt / wordt ingevoegd, kunt u die toetsencombinatie niet gebruiken. Dit geldt ook voor <Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>enz. (Enige uitzondering is <BS>/ <C-H>.) Dit is een bekend pijnpunt en het onderwerp van verschillende discussies op vim_dev en het #vim IRC-kanaal.

Sommige mensen (vooral Paul LeoNerd Evans) willen dat oplossen (zelfs voor console Vim in terminals die dit ondersteunen), en hebben verschillende voorstellen gedaan, cp. http://groups.google.com/group/vim_dev/browse_thread/thread /626e83fa4588b32a/bfbcb22f37a8a1f8

Maar vanaf vandaag zijn er nog geen patches of vrijwilligers naar voren gekomen, hoewel velen de wens hebben uitgesproken om dit in een toekomstige Vim-release te hebben.


Antwoord 4, autoriteit 10%

Als u zich zorgen maakt over het verlies van bestaande C-V-functionaliteit, kunt u in plaats daarvan C-Q gebruiken. Zie, :help CTRL-V-alternatief.


Antwoord 5, autoriteit 6%

NeoVim biedt deze functionaliteit nu voor zowel zijn terminal- als gui-clients. Zie :h nvim-features-new


Antwoord 6, autoriteit 2%

Zoals je hebt opgemerkt, krijg je dezelfde sleutelcode. Dus de enige manier om ze te onderscheiden is door de status van de Shift-toets in je gebeurtenisafhandelingsfunctie te controleren. Als je meer dan 0,5 seconde vertraging hebt tussen het indrukken van de toets en de verwerking, mis je natuurlijk een aantal hits.


Antwoord 7

De meeste terminalemulators behandelen controle plus shift standaard gewoon als controle. In plaats daarvan koppelt u die toetscombinaties gewoonlijk aan een escape-reeks en luistert u ernaar in de terminaltoepassing.

Stap 1:Configureer uw terminalemulator om Ctrl+Shift+Ate binden aan de reeks Esc,A.

Uw terminalemulator is het programma dat het daadwerkelijke venster van de terminal toont. Bij toegang tot een server via SSH, is de terminalemulator een programma op uw lokale computer. Bindingssleutels werken anders in verschillende terminalemulators. Bijvoorbeeld:

  • Voeg voor urxvt URxvt.keysym.Control-Shift-A: \033Atoe aan het ~/.Xresourcesconfiguratiebestand en laad het opnieuw met xrdb ~/.Xresources.
  • Voor iTerm2 open je Voorkeuren -> Toetsen, voeg een item toe en bind Ctrl+Shift+Aaan de actie “Send Escape Sequence” en typ Ain het onderstaande veld.

Stap 2:Bind Esc,Aaan een commando in Vim.

Voeg de sleuteltoewijzing toe aan uw ~/.vimrc-configuratie en laad deze opnieuw met :source ~/.vimrc:

nnoremap <esc>a your command here

Other episodes