Comment mapper Ctrl + A et Ctrl + Maj + A différemment?

92

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
Kohsuke Kawaguchi
la source
3
@vivoconunxino Ce lien ne fait aucune mention de l'ajout d'un modificateur de décalage à ctrl-a.
graywh

Réponses:

46

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 à .Xresourcesxterm à envoyer <Esc>[65;5upour 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".)

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

iTerm et [u] rxvt peuvent également être configurés pour cela (exemples non fournis).

Plus d'infos: http://www.leonerd.org.uk/hacks/fixterms/

Graywh
la source
Pour remapper plusieurs clés, consultez ce document : Séparez les entrées de clé avec \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")
cfi
Par souci d'exhaustivité, peut-être ajouter à la réponse comment cartographier cela en vi? Par exemple, 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é .
cfi
Ce dont nous avons besoin, c'est d'une nouvelle spécification de terminal! xterm-256color(les plus récents) souffrent de tant de limitations.
Jérôme Pouiller
@Jezz Les limitations sont avec termcap lui-même, pas le fichier termcap pour xterm-256color.
graywh
@graywh Bien sûr, de nouvelles fonctionnalités pour termcap seraient nécessaires
Jérôme Pouiller
9

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) ou autohotkey(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:

$ 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.

Attribuez-lui ces propriétés:

  1. raccourci clavier comme ctrl+shift+a
  2. classe de fenêtre: gnome-terminal-server.Gnome-terminal

Ensuite, vous ~/.vimrcpouvez créer un mappage pour <S-F1>afaire ce que vous voulez.


Remarques:

  1. J'ai utilisé <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, ( gvimje pense que) l'utilisation de ces clés est recommandée.
  2. J'ai principalement vimdans gnome-terminal. J'ai donc utilisé window class = gnome-terminal-server.Gnome-terminalcomme filtre. Modifiez-le pour l'utiliser gvimsi vous le souhaitez. autokeyprend en charge un bouton pour capturer les propriétés de toute autre fenêtre comme la classe / le titre.
anishsane
la source
Merci beaucoup. Il y a beaucoup de choses sur l'utilisation d'Autokey pour le remappage de clés, mais pas d'instructions réelles sur la façon de le faire. Enfin votre réponse fait cela. Je ne peux pas croire que personne d'autre ne vous ait voté pour.
pickle323
1
Bon sang autokey! J'ai fait tout ce que j'ai pu mais je n'ai pas pu l'installer sur mon ubuntu 16.04.
yukashima huksay
apt install autokey-gtk?
anishsane
1
Avant d'installer un logiciel supplémentaire, vous pouvez vérifier si votre gestionnaire de fenêtres gère cela directement. Par exemple, dans i3, mon .config a ceci:, bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m hqui appuie ,wmhlorsque j'appuie <C-S-h>, puis vim sait comment gérer,wmh
MatrixManAtYrService
^^ C'est bien aussi. Cependant, je voulais limiter la traduction des clés uniquement à gnome-terminal ou gvim. Pas d'autres applications. D'autres applications devraient continuer à recevoir <C-S-H>lorsque j'appuie sur cela.
anishsane
5

Si ce qui vous dérange est de perdre la fonctionnalité CV existante, vous pouvez utiliser CQ à la place. Voir,: help CTRL-V-alternative.

Anurag Priyam
la source
3

NeoVim propose désormais cette fonctionnalité à la fois pour ses clients terminaux et gui. Voir : h nvim-features-new

OliverUv
la source
3
Pas tout à fait, sauf si vous activez les codes CSI dans votre terminal. Les variantes CTRL-SHIFT que Neovim prend en charge par défaut sont pour la plupart des caractères non imprimables (exemples répertoriés sur neovim.org/doc/user/vim_diff.html#nvim-features-new ). Cependant, les méta accords (y compris les <m-s-...>variantes) ne fonctionnent la plupart du temps complètement hors de la boîte.
Justin M. Keyes
Ce document dit qu'il 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>.
Adam Katz
@ justin-m-keyes <c-s-l>est parfaitement distinguer <c-l>en Konsolesans aucun tracas supplémentaire
Slava
3

En 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.

Ingo Karkat
la source
1

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.

Javier
la source
1
Je suppose que le point de ma question était que, étant donné que gvim est capable de faire une telle distinction (même si vim simple ne le peut pas), y a-t-il une extension spécifique à gvim sur laquelle je pourrais compter pour différencier Ctrl + Shift + V vs Ctrl + V .
Kohsuke Kawaguchi
9
comment vérifier l'état de la clé de merde? J'ai cherché, mais je n'ai rien trouvé d'utile, même à distance.
bolov