Dans un terminal, on ne peut pas distinguer Ctrl+ Aet Ctrl+ Shift+ Acar ils émettent tous les deux le même code clé, donc je peux voir pourquoi Vim ne peut pas le faire. Mais gVim, étant une application X, peut différencier Ctrl+ Aet Ctrl+ Shift+ A. Est-il possible de cartographier ces deux choses différemment?
Pour commencer, j'aimerais faire quelque chose comme ceci: Faire fonctionner le "coller à partir du presse-papiers" comme le terminal Gnome, tout en gardant Ctrl+ Vle mode visuel.
:nmap <C-S-V> "+gP
vim
key-bindings
Kohsuke Kawaguchi
la source
la source
Réponses:
Gvim ne le fait pas parce que vim ne peut pas le faire (dans des circonstances normales). Désolé, mais c'est comme ça.
Toutefois...
Certains terminaux (par exemple, xterm et iterm2) peuvent être configurés pour envoyer une séquence d'échappement arbitraire pour toute combinaison de touches.
Par exemple, ajouter ce qui suit à
.Xresources
xterm à envoyer<Esc>[65;5u
pour CtrlShiftA. Vous pouvez ensuite mapper cela dans Vim à<C-S-a>
. (65 est la valeur décimale Unicode pour shift-a et 5 est le bit du modificateur ctrl. Dans ce cas, u signifie "unicode".)iTerm et [u] rxvt peuvent également être configurés pour cela (exemples non fournis).
Plus d'infos: http://www.leonerd.org.uk/hacks/fixterms/
la source
\n
. Utilisez une barre oblique inverse pour diviser les lignes. Par exemple, pour mapper également <kbd> CSB </kbd> et <kbd> CSF </kbd> utilisez ceci: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>
mapper ctrl-shift-b pour imprimer un message dans la ligne d'état. Sur AskUbuntu, il y avait un Q similaire et je l'ai résumé .xterm-256color
(les plus récents) souffrent de tant de limitations.xterm-256color
.Comme déjà souligné, il n'y a aucun moyen de cartographier
<C-S-A>
différemment de<C-A>
.Cependant, en utilisant des outils comme
autokey
(pour Linux et Windows) ouautohotkey
(pour Windows), vous pouvez remapper<C-S-A>
pour envoyer un ou plusieurs touches différentes pour des applications spécifiques.Par exemple, sur mon système, j'ai ce paramètre dans
autokey
:Attribuez-lui ces propriétés:
ctrl+shift+a
gnome-terminal-server.Gnome-terminal
Ensuite, vous
~/.vimrc
pouvez créer un mappage pour<S-F1>a
faire ce que vous voulez.Remarques:
<S-F1>
comme une sorte de clé leader pour la détection<C-S>
. C'était parce que mon terminal n'acceptait pas les clés<F13>
-<F37>
etc. Si votre application le prend en charge, (gvim
je pense que) l'utilisation de ces clés est recommandée.vim
dansgnome-terminal
. J'ai donc utiliséwindow class = gnome-terminal-server.Gnome-terminal
comme filtre. Modifiez-le pour l'utilisergvim
si vous le souhaitez.autokey
prend en charge un bouton pour capturer les propriétés de toute autre fenêtre comme la classe / le titre.la source
apt install autokey-gtk
?bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h
qui appuie,wmh
lorsque j'appuie<C-S-h>
, puis vim sait comment gérer,wmh
<C-S-H>
lorsque j'appuie sur cela.Si ce qui vous dérange est de perdre la fonctionnalité CV existante, vous pouvez utiliser CQ à la place. Voir,: help CTRL-V-alternative.
la source
NeoVim propose désormais cette fonctionnalité à la fois pour ses clients terminaux et gui. Voir : h nvim-features-new
la source
<m-s-...>
variantes) ne fonctionnent la plupart du temps complètement hors de la boîte.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.
y a un saut de ligne avant la partie "sensible à la casse:", ce qui rend cela ambigu. Merci pour la correction, @ JustinM.Keyes. De plus, vim 8.1 semble également faire la différence entre<M-a>
et<M-A>
.<c-s-l>
est parfaitement distinguer<c-l>
enKonsole
sans aucun tracas supplémentaireEn raison de la manière dont la saisie au clavier est gérée en interne, ce n'est malheureusement généralement pas possible aujourd'hui, même dans GVIM. Certaines combinaisons de touches, comme Ctrl+ non alphabétique, ne peuvent pas être mappées et Ctrl+ lettre contre Ctrl+ Shift+ lettre ne peuvent pas être distinguées. (À moins que votre terminal n'envoie un code termcap distinct , ce que la plupart ne font pas.) En mode insertion ou ligne de commande, essayez de taper la combinaison de touches. Si rien ne se passe / n'est inséré, vous ne pouvez pas utiliser cette combinaison de touches. Ceci s'applique également à
<Tab>
/<C-I>
,<CR>
/<C-M>
/<Esc>
/<C-[>
etc. (La seule exception est<BS>
/<C-H>
.) C'est un problème connu, et le sujet de diverses discussions sur vim_dev et le canal IRC #vim.Certaines personnes (avant tout Paul LeoNerd Evans) veulent résoudre ce problème (même pour la console Vim dans les terminaux qui le supportent), et ont lancé diverses propositions, cp. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Mais à ce jour, aucun correctif ou bénévole ne s'est encore manifesté, bien que beaucoup aient exprimé le désir de l'avoir dans une future version de Vim.
la source
Comme vous l'avez noté, vous obtenez le même code clé. La seule façon de les distinguer est donc de vérifier l'état de la Shiftclé dans votre fonction de gestion d'événements. Bien sûr, si vous avez plus de 0,5 seconde de délai entre la pression de la touche et le traitement, vous manquerez certains résultats.
la source