Autres moyens de quitter le mode Insertion, en dehors de Escape


74

La principale raison pour laquelle j'aime vim over emacs est que ma distance de déplacement de la main par rapport à la ligne d'arrivée est très faible (même en tant que programmeur). Cependant, la seule fois où je fais cela quitte le mode insertion en appuyant sur Echap.

J'ai récemment appris que je pouvais aussi utiliser Ctrl + C pour quitter le mode insertion. Cependant, ce n'est pas vraiment une amélioration.

Comment puis-je quitter le mode insertion sans que mes mains quittent la ligne d'arrivée et sans avoir un impact important sur ce que j'ai la capacité de taper? Remarque: j’utilise un vim essentiellement vanille avec une disposition de clavier dvorak, bien que j'aimerais aussi entendre les solutions pour une disposition qwerty.


1
Vous pouvez mapper n'importe quelle combinaison de touches n'importe où, et vous ne pouvez rien faire d'autre. Est-ce ce que vous voulez dire?
Yo '

3
Appris le raccourci Ctrl + C THX!
Philippe Gachoud

Que diriez-vous de mapper les majuscules comme Esc?
Kolob Canyon

@PhillippeGachaud: N'utilisez pas Ctrl-C pour remplacer Esc. Ctrl-C n'est pas identique à Escape, c'est une Escape forcée et peut se comporter différemment dans certaines circonstances.
Lie Ryan le

Réponses:


60

La liaison courante que vous verrez est jj , car elle fonctionne bien pour les dispositions QWERTY si vous utilisez le positionnement de la ligne de base.

inoremap jj <ESC>

Dans ce cas, pour taper un littéral jj, vous devez attendre 1 seconde (par défaut) avant de taper le deuxième caractère. (voir :help 'timeout'pour plus de détails)

Il y a aussi c-oqui vous fera sortir de l'insertion, vous permettant de faire une commande normale, puis vous remet aussitôt en insertion.

http://vim.wikia.com/wiki/Avoid_the_escape_key


1
En dvorak, jest la cclé. Donc, ce ne serait pas trop mal (taper cc). Je pourrais aussi lier hh(qwerty jkey = dvorak h), ce qui ne me lancerait que si je tapais shhhhhhhou quelque chose du genre.
durron597

7
cc est une combinaison de deux lettres beaucoup plus courante, du moins en anglais. Donc, ce n'est peut-être pas le meilleur choix
Nick J Adams

4
Que diriez-vous d'imiter jk? Trouvez deux clés adjacentes dans Dvorak, mais pas les combinaisons courantes dans votre langue préférée. tn, par exemple, est l’équivalent positionnel de jk.
David Lord

1
J'aime bien avoir jk/ kjquitter le mode normal même dans Dvorak; ce sont les touches "c" et "v" d'un clavier QWERTY, elles sont donc faciles à utiliser pour le pointeur gauche et le majeur.
Alxndr

2
Je pense que nous pouvons faire encore mieux - utilisez iiplutôt. Oui, vous devez déplacer vos doigts hors de la ligne d'arrivée, mais cela reste confortable. Et plus important encore, vous pouvez passer d'un mode à l'autre sans bouger votre doigt.
Sridhar Sarnobat

38

En plus des alternatives intégrées <C-[>et <C-c>de la <Esc>clé citée par d'autres, une autre solution populaire consiste à reconfigurer <CapsLock>en une évasion supplémentaire. Ceci à la fois sur un clavier Qwerty et Dvorak.

De cette façon, vous pouvez appuyer très facilement sur Esc avec le petit doigt de gauche, sans retirer vos mains de HomeRow (d'ailleurs, CapsLock est le lieu où Escape était auparavant sur les claviers lorsque vi a été inventé).

Le remappage peut être fait:

  • sous Windows avec l’ utilitaire AutoHotKey ;
  • sur Mac à l'aide de l' utilitaire KeyRemap4MacBook et d'autres outils ;
  • sous Linux, varie en fonction de l’environnement de bureau. Par exemple, sur Linux Mint / Cinnamon, il suffit de sélectionner l’option appropriée dans le menu Menu-> Clavier-> Dispositions du clavier-> Verrouillage Maj. Alternativement, mais moins facilement, il peut être remappé au niveau Xorg en utilisant le programme xmodmap et en l'exécutant sous le .Xmodmapfichier suivant :

    clear Lock
    keycode 0x42 = Escape
    

    Le système peut être configuré pour l'exécuter automatiquement à chaque connexion en plaçant de manière stratégique les lignes de script de shell suivantes (en supposant que celles-ci .Xmodmapse trouvent sur votre ~répertoire personnel) dans la chaîne de fichiers provenant de sources auto-connectées:

    if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
    fi
    

    C'est toutefois délicat, car les fichiers réellement obtenus varient en fonction de l'environnement (de bureau) utilisé. Par exemple, xmodmap est appelé comme une entrée dans les "Applications de démarrage" de Cinnamon (ce qui me permet de faire plus que la personnalisation du remappage de clé de l'interface graphique).

Certaines personnes vont encore plus loin et programment la clé CapsLock comme suit:

  • comme une Ctrlclé en appuyant et en maintenant,
  • comme une Esctouche en appuyant dessus et en le relâchant rapidement.

Cela peut être fait sous Windows et Mac en configurant / programmant correctement l'utilitaire de remappage correspondant (des astuces AutoHotkey sont disponibles ici et une vérification de KeyRemap4MacBook ici ). Sous Linux, en utilisant le programme xcape .


2
Entièrement d'accord. Avoir la touche ctrl sur la ligne de départ améliore beaucoup la convivialité (défilement des finitions avec ctrl + n, défilement du fichier avec ctrl + f / ctrl + b, échappement avec ctrl +], etc. Toutes ces combinaisons sont plus faciles à réaliser. de cette façon
John O'M.

1
A propos d’appuyer sur la Ctrltouche (à la position normale) sans tordre le petit doigt: vous pouvez appuyer dessus avec la paume externe de la main, comme il est bien décrit ici (j’ai trouvé ce joli tour astucieux sur le Net, le temps de le donner retour :) et bravo à l'inventeur)
Giovanni Maggiorani

FWIW KeyRemap4MacBook a été renommé Karabiner: pqrs.org/osx/karabiner/index.html.en
alxndr

J’ai essayé cette solution, mais j’ai heurté Majuscule par accident en appuyant quelques fois sur Shift, ce qui était agaçant. Votre kilométrage peut donc varier en fonction de l’agilité de votre petit doigt gauche. :)
Godsmith

2
Si vous remappez Ctrlsur Alt( Cmd) et inversement, alors <C-[> brille vraiment. Pinky est faible, le pouce est fort. Sur QWERTY, vous n’avez même pas besoin de quitter la ligne d'arrivée pour cela, sur Dvorak, ce n’est pas si bon, mais acceptable.
Nash Bridges

28

Les mappages que j'utilise sont:

inoremap jk <esc>
inoremap kj <esc>

De cette façon, vous pouvez simplement frapper jet ken même temps, sans avoir à vous soucier de celui sur lequel vous appuyez en premier.


70
Mais j'écris un livre sur Edsgar Dijkstra qui joue au blackjack à Reykjavik! ;)
durron597

Les deux sont horribles si vous voulez écrire un néerlandais.
Hielke Walinga

12

<C-[>et <C-c>sont deux alternatives natives à <Esc>.

Voir :help i_<esc>et :help i_ctrl-cqui explique la différence entre <C-c>et <Esc>.


Encore une fois, ce ne sont pas des améliorations, car Ctrl est aussi éloigné de la ligne d'accueil que Escape.
durron597

4
@ durron597 Sur un clavier QWERTY, Ctrl peut être tout aussi éloigné de la ligne de base, mais il y a une différence importante: il est en dessous de la ligne de base. Il vous suffit de bouger votre doigt pour l'appuyer, alors qu'avec Esc vous devez faire pivoter votre main entière un peu. En outre, la <C-[>symétrie est bonne (les deux petits doigts se déplacent dans des directions opposées).
wchargin


2
D'accord. L'utilisation habituelle de <C-c>peut casser subtilement les plugins et les autocmds.
David Lord

Sur ma machine, <C - [> fonctionne, mais il faut une demi-seconde de plus pour s'enregistrer que <Cc>
Alexander Mills.

4

Vous pouvez mapper Caps Locksur Control sans utiliser de programme externe :

  • Sous Mac OS X, visitez Préférences Système> Clavier -> Touches de modification
  • Sous Linux, exécutez:setxkbmap -option caps:ctrl_modifier
  • Sous Windows, éditez votre registre.

Ceci s’ajoute Controlà la ligne de départ, ce qui permet d’appuyer plus facilement sur tous les traits de contrôle modifiés, y compris Ctrl-[et Ctrl-Cqui sortent tous deux du mode Insertion dans Vim.

Alternativement, au bas de sa réponse, Giovanni suggère de mapper Caps Lockpour effectuer les deux Control et en Escape fonction de la longueur de la presse, mais cela nécessite l'installation d'un logiciel supplémentaire.

Ctrl-[est l' alternative privilégiée , car cela fonctionne toujours comme Escape.

Une différence notable avec Ctrl-Cest que lorsque vous quittez une édition en mode visuel séquencée , Ctrl-Cgardera les modifications apportées sur la ligne courante, mais ne répétera pas les changements sur les autres lignes dans le bloc, qui est le point de ce mode.

Cela ne vérifiera pas non plus les abréviations, ni ne déclenchera l'événement InsertLeave. Voir:help i_CTRL-C


4

Je suggérerais d'utiliser mon plugin vim-easyescape .

Plug "zhou13/vim-easyescape"
let g:easyescape_chars = { "j": 1, "k": 1 }
let g:easyescape_timeout = 100
cnoremap jk <ESC>
cnoremap kj <ESC>

Le problème avec une simple séquence de mappage inoremap jj <ESC>est que Vim mettra en pause chaque fois que vous tapez jou ken mode insertion (il attend la clé suivante pour déterminer s'il convient d'appliquer le mappage). La pause provoque une distraction visuelle que vous ne remarquerez peut-être pas. vim-easyescape ne rencontre pas ce problème et prend en charge le délai d'expiration personnalisé.


3

Dans les terminaux vi et Vim, alt+ single-normal-mode-keyfonctionnera pour des éditions rapides dans la plupart des terminaux.

Cela fonctionne car la plupart des terminaux envoient le modificateur alt en tant que caractère d'échappement. Par exemple, lorsque vous tapez, alt+kl'émulateur de terminal envoie deux caractères au programme en cours d'exécution: esc, k. Vi et Vim interprètent cela comme on peut s'y attendre. il quitte le mode insertion (à cause de l'échappement) et exécute la commande de mode normal (dans l'exemple, déplacer le curseur d'une ligne vers le haut).

Cela peut être un moyen pratique de quitter le mode insertion si votre clavier a la touche Alt adjacente à la barre d'espacement (pour pouvoir appuyer dessus avec le pouce, laissant ainsi vos doigts sur la rangée de base), tant que vous utilisez un émulateur de terminal. avec ce comportement et ne vous dérange pas d'exécuter une commande en mode normal.


2
Pouvez-vous préciser ce qui est single-normal-mode-key? Vous voulez dire échapper?
Kenorb

Une simple pression sur une touche que vous utiliseriez en mode normal peut être utilisée en mode insertion avec la touche Alt. Par exemple, Alt + x pour supprimer un caractère.
ewatt

2
Je ne comprends pas très bien cette réponse non plus; Alt + x semble en réalité faire quelque chose de différent de Alt en mode normal? Et d'autres clés ne semblent pas fonctionner? Mais peut-être que je l'utilise mal ..? Peut-être que vous pourriez développer un peu votre réponse pour expliquer comment cela fonctionne, et un lien vers une documentation Vim serait également utile :-) Merci! :-)
Martin Tournoij le

cela dépend en fait de la configuration de votre terminal et n'est généralement pas configuré comme vous semblez le suggérer.
Christian Brabandt

1
J'ai voté pour cela, puis j'ai vérifié l'historique et constaté que, pour une raison quelconque, un modérateur l'avait édité pour ajouter 99% du texte à partir de rien, plutôt que de simplement laisser un commentaire comme on s'attend à ce que le reste d'entre nous le fasse. Je devais donc inverser mon vote. Ce qui s’est passé ici dépasse sûrement le cadre des modifications raisonnables. J'ai eu beaucoup moins de modifications perturbatrices rejetées. Le nouveau contenu est génial, certes, mais n'appartient pas à cette réponse. Cela aurait dû être le sien.
underscore_d

3

FWIW j'utilise:

:map! ;l ^[
:vmap ;l ^[

Cela ressemble à frapper Retour. J'utilise ;également le leader pour d'autres mappages en mode insertion.

La seule fois où j'ai eu besoin de taper ';' + lettre est quand code de golf; Je n'ai pas eu de conflits autrement.


peut-être mieux de le mapper pour s'échapper que de le mapper à ^ [non? :)
Alexander Mills

2

J'utilise Ctrl+ 3depuis un certain temps, je trouve qu'il est plus facile de taper que la plupart des alternatives et semble bien fonctionner (du moins sous Linux). Mon Caps Lockest mappé sur Ctrl, il est donc très confortable de le taper.

J'ai essayé d'utiliser Ctrl+ cpendant un certain temps, mais j'avais des problèmes dont je ne me souviens pas exactement, mais je n'éprouvais pas exactement le même comportement que Esc, comme je le fais maintenant avec Ctrl+ 3.


2
Qu'est-ce que Ctrl-3 est censé faire exactement?
Christian Brabandt

Je ne sais pas comment ça marche, mais ça marche comme Escdans la vanille Vim. Je l'ai trouvé empiriquement en testant des combinaisons, je ne connais pas les détails du fonctionnement des composants internes.
Elias

1
Ce n'est pas une chose vi, travaille aussi sur la coquille. Très utile si le mode vi est activé sur votre shell avec bindkey -v
golfadas le

1

Si vous avez un clavier anglais américain, appuyer sur Ctrl- [équivaut à appuyer sur Esc. Cela fournit un moyen facile de quitter le mode insertion. Vous pouvez également utiliser Ctrl- c.

Si vim est en mode facile ( -y), vous devez appuyer sur Ctrl- l(Ctrl + L) pour quitter le mode insertion.

Il y a aussi Ctrl+ oqui ne mode d'insertion de sortie temporaire juste pour exécuter une commande et revenir en mode insertion (voir: :help i_CTRL-O)

Ou Ctrl+ r, mais il est seulement pour insérer le contenu du registre ou d' expression, par exemple Ctrl+ r, =5*5(voir: :help i_CTRL-R, :help c_CTRL-Ret après stackoverflow ).

Lire la suite sur: Évitez la touche d'échappement à vim wikia


3
FYI: Ctrl+rsert à insérer des registres (y compris l'expression =reg). Si vous souhaitez exécuter temporairement une commande unique, utilisez Ctrl+o.
Sukima

1

Je me suis installé <A-e>pour l'évasion:

noremap  <A-e> <Esc>
snoremap <A-e> <Esc>
inoremap <A-e> <Esc>
tnoremap <A-e> <Esc>

" For some reason in command line mode '\e' is interpreted as Enter.
cnoremap <A-e> <C-c>

Edit: Je viens de trouver <C-\><C\n>ce qui vous envoie en mode normal depuis n’importe quel autre mode. Il a également un meilleur comportement global. Les mappages deviennent:

noremap <A-e> <C-\><C-n>
noremap! <A-e> <C-\><C-n>

0
nnoremap <C-I> <C-I>
vnoremap <Tab> <Esc>gV
onoremap <Tab> <Esc>
inoremap <Tab> <Esc>`^

Je remappe l'onglet pour sortir. Je pense que, historiquement, c’est là que se trouvait la touche Échap. Je l’ai donc utilisée et je n’ai jamais regardé en arrière. Je n’ai pratiquement jamais besoin de mettre un onglet dans un document, et lorsque je le fais, je n’appuie que sur Maj + Tab. Je n'ai jamais manqué la reliure d'onglet d'origine.


Le paragraphe sur vim et emacs est complètement inutile ...
D. Ben Knoble
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.