Déplacement de texte en mode Insertion


322

En mode Insertion dans Vim, existe-t-il un moyen de parcourir le texte en déplaçant certains caractères vers l'avant et vers l'arrière autrement qu'en utilisant les touches fléchées?

Si je presse h, j, ket len mode insertion, les caractères réels sont imprimés sur l' écran au lieu de se déplacer dans le texte.

La façon dont je le fais en ce moment est d'avoir recours à Ctrl+ [( Esc) et de parcourir le texte ensuite; mais évidemment ce n'est pas productif.


Comme conseil: il est également utile si vous mappez escape à une combinaison de touches plus proche (c.-à-d. imap jk <Esc>) Afin de ne pas avoir à interrompre votre élan et à atteindre votre clavier pour appuyer sur la touche.
tsujin

3
Je l'aime ( <ESC>) mappé à la kjplace de jk; mon collègue Dijkstra est à blâmer!
Dr Beco

7
J'ai jket kj, donc j'appuie juste comme un gros bouton avec deux doigts et peu importe l'ordre dans lequel je suis revenu à la normale.
Edu Ruiz

Réponses:


649

Vous semblez abuser de vim, mais cela est probablement dû au fait que vous ne le connaissez pas très bien.

La bonne façon est d'appuyer Esc, d'aller où vous voulez faire une petite correction, de la corriger, de revenir en arrière et de continuer à éditer. Il est efficace parce que Vim a beaucoup plus de mouvements que le personnage habituel en avant / en arrière / en haut / en bas. Une fois que vous en aurez appris davantage, cela sera plus productif.

Voici quelques cas d'utilisation:

  • Vous avez accidentellement tapé "accidentellement". Pas de problème, la séquence EscFfrdAcorrigera l'erreur et vous ramènera à l'endroit où vous éditiez. Le Ffmouvement déplacera votre curseur vers l'arrière jusqu'au premier caractère "f" rencontré. Comparez cela avec Ctrl+ DeldEnd, qui fait pratiquement la même chose dans un éditeur occasionnel, mais prend plus de touches et vous fait déplacer votre main hors de la zone alphanumérique du clavier.
  • Vous avez accidentellement tapé "vous avez accidentellement tapé", mais vous voulez le corriger en "vous avez tapé intentionnellement". Ensuite Esc2bcw, effacera le mot que vous souhaitez corriger et vous amènera en mode insertion, afin que vous puissiez le retaper immédiatement. Pour revenir à l'édition, appuyez simplement sur Aau lieu de End, afin de ne pas avoir à déplacer votre main pour atteindre la Endtouche.
  • Vous avez accidentellement tapé "souris" au lieu de "souris". Pas de problème - le bon vieux Ctrl+ wsupprimera le mot précédent sans quitter le mode insertion. Et il se trouve qu'il est beaucoup plus rapide d'effacer un petit mot que d'y corriger des erreurs. J'y suis tellement habitué que j'avais fermé la page du navigateur lorsque je tapais ce message ...!
  • Le nombre de répétitions est largement sous-utilisé. Avant de faire un mouvement, vous pouvez taper un nombre; et le mouvement sera répété ce nombre de fois. Par exemple, 15hramènera votre curseur de 15 caractères et 4j déplacera votre curseur de 4 lignes vers le bas. Commencez à les utiliser et vous vous y habituerez bientôt. Si vous avez fait une erreur à dix caractères en arrière de votre curseur, vous découvrirez que presser la touche 10 fois est beaucoup plus lent que l'approche itérative pour déplacer le curseur. Ainsi, vous pouvez plutôt taper rapidement les touches 12h(pour deviner le nombre de caractères dont vous avez besoin pour déplacer votre curseur) et avancer immédiatement deux fois avec llpour corriger rapidement l'erreur.

Mais, si vous voulez toujours faire de petites traversées de texte sans quitter le mode insertion, suivez les conseils de rson et utilisez + . En prenant le premier exemple que j'ai mentionné ci-dessus, + vous amènera au caractère "f" précédent et vous laissera en mode insertion.CtrlOCtrlOFf


33
+1 Excellente réponse et merci pour tous les exemples que vous avez donnés!
Andreas Grech

79
Il convient également de noter que vous pouvez utiliser Ctrl+opour émettre une seule commande en mode normal. Cela peut parfois vous amener où vous voulez être, surtout lorsqu'il est combiné avec les commandes de mouvement t / T et f / F.
Randy Morris

6
"Vous semblez abuser de vim, mais il est probable que vous ne le connaissiez pas très bien." est un peu condescendant. Non?
David Rivers,

17
C'est un bon aperçu de la façon d'utiliser correctement Vim. Cependant, je trouve que le fait d'appuyer sur "Esc" est pénible, et je pense donc qu'il vaut la peine de souligner que vous pouvez mapper une touche plus accessible à cette fonction, par exemple "imap jj <esc>".
2012 symétrique

25
Pour corriger une faute de frappe, vous ne devez pas quitter le mode insertion. Vim est puissant parce que vous créez des actions atomiques et répétables. L'insertion et la correction d'une faute de frappe créent deux actions distinctes. La bonne façon de corriger une faute de frappe pour le faire sans quitter le mode insertion. Si cela signifie utiliser les touches fléchées pour s'y rendre, c'est très bien. Vim possède quelques raccourcis clavier pour naviguer en mode insertion. Vérifiez :h ins-special-keys. ctrl-h: retour arrière,: ctrl-wsupprimer le mot,: ctrl-usupprimer jusqu'au début de la ligne alt-b,: revenir en arrière d'un mot.
everett1992

152

En mode insertion , utilisez CtrlOpour passer en mode normal pour une seule commande:

CTRL-O h  move cursor left 
CTRL-O l  move cursor right
CTRL-O j  move cursor down
CTRL-O k  move cursor up

qui est probablement le moyen le plus simple de faire ce que vous voulez et qui est facile à retenir.

Autres touches de contrôle très utiles en mode insertion:

CTRL-W    delete word to the left of cursor
CTRL-O D  delete everything to the right of cursor
CTRL-U    delete everything to the left of cursor
CTRL-H    backspace/delete
CTRL-J    insert newline (easier than reaching for the return key)
CTRL-T    indent current line
CTRL-D    un-indent current line

ceux-ci élimineront de nombreux commutateurs inutiles en mode normal.


13
Je vous remercie. Cela devrait être considéré comme la bonne réponse. C'est vraiment utile.
Atcold

1
Sur mon mac, c'est en minuscule o pas en majuscule O. Est-ce différent de "vim standard"? Je vois beaucoup d'endroits où ils semblent dire des majuscules (sauf si c'est juste une écriture bâclée). Pouvez-vous confirmer?
Floris

Ok très utile. Cependant, une combinaison intéressante que j'ai du mal à trouver et c'est supprimer la ligne. Chose très sous-estimée à faire en cas d'insertion d'une ligne de façon expansive.
patrik

5
@Floris Vim ne fait pas de distinction entre les majuscules et les minuscules pour les combinaisons ctrl. C'est pourquoi il n'est pas possible de mapper ctrl + shift + quelque chose.
Mahmoud Al-Qudsi,

92

Mode d'insertion

Mouvement

hjkl

Malgré ce que Pavel Shved a dit - qu'il est probablement plus conseillé de s'habituer au Escmode Insertion - voici un exemple d'ensemble de mappages pour une navigation rapide en mode Insertion:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

Cela fera Alt+ hen mode Insertion aller d'un caractère à gauche, Alt+ jbas et ainsi de suite, de manière analogue à hjklen mode Normal.

Vous devez copier ce code dans votre fichier vimrc pour le charger à chaque démarrage de vim (vous pouvez l'ouvrir en tapant start :new $myvimrcen mode Normal).


Tout mouvement en mode normal

Étant donné que la Alttouche de modification n'est pas mappée (à quelque chose d'important) par défaut, vous pouvez de la même manière extraire d'autres (ou toutes) les fonctionnalités du mode Normal au mode Insertion. Par exemple:
Passer au début du mot actuel avec Alt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(Autres utilisations de Alten mode Insertion)

Il convient de mentionner qu'il peut y avoir de meilleures utilisations de la Altclé que de répliquer le comportement du mode normal: par exemple, voici des mappages pour copier à partir d'une ligne adjacente la partie de la colonne actuelle jusqu'à la fin de la ligne:

" Insert the rest of the line below the cursor.
" Mnemonic: Elevate characters from below line
inoremap <A-e> 
    \<Esc>
    \jl
        \y$
    \hk
        \p
        \a
" Insert the rest of the line above the cursor.
" Mnemonic:  Y depicts a funnel, through which the above line's characters pour onto the current line.
inoremap <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(J'ai utilisé la \ continuation de ligne et l'indentation pour augmenter la clarté - les commandes sont interprétées comme si elles étaient écrites sur une seule ligne.)


Raccourcis clavier intégrés pour l'édition

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
CTRL-W   delete the word       in front of the cursor
CTRL-U   delete all characters in front of the cursor (influenced by the 'backspace' option)

(Il n'y a pas de raccourcis clavier notables intégrés pour le mouvement en mode Insertion.)

Référence: :help insert-index


Mode ligne de commande

Cet ensemble de mappages rend les mouvements supérieurs Alt+ disponibles dans la ligne de commande:hjkl

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

Alternativement, ces mappages ajoutent les mouvements à la fois au mode Insertion et au mode Ligne de commande en une seule fois:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


Les commandes de mappage pour tirer les commandes du mode Normal vers le mode Ligne de commande sont un peu différentes des commandes de mappage du mode Insertion (car le mode Ligne de commande manque le Ctrl+ du mode Insertion O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


Raccourcis clavier intégrés pour le mouvement et l'édition

CTRL-B       cursor to beginning of command-line
CTRL-E       cursor to end       of command-line

CTRL-F       opens the command-line window (unless a different key is specified in 'cedit')

CTRL-H       delete the character  in front of the cursor (same as <Backspace>)
CTRL-W       delete the word       in front of the cursor
CTRL-U       delete all characters in front of the cursor

CTRL-P       recall previous command-line from history (that matches pattern in front of the cursor)
CTRL-N       recall next     command-line from history (that matches pattern in front of the cursor)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

Référence: :help ex-edit-index


@YugalJindle: Merci! :) J'ai maintenant ajouté des informations sur la modification du mode de ligne de commande. (L'approche est un peu différente du mode Insertion.)
Aaron Thoma

@Zen: Qu'entendez-vous par "winkey"? Je n'ai pas référencé la clé Windows dans ma réponse. Tu veux dire la Altclé?
Aaron Thoma

Maj - gauche / droite pour déplacer un mot entier !! Comment ne le savais-je pas? Je vous remercie.
Floris

en fait en mode terminal alt envoie automatiquement esc avant vos commandes ........
Fuseteam

26

Si vous êtes un puriste Vim, ne lisez pas cette réponse. OTOH, si vous êtes nouveau sur vim et que vous cherchez quelques conseils utiles que vous ne trouverez pas dans les centaines de tutoriels et blogs vim, lisez la suite ... :-)

Quelques moyens non orthodoxes (vim)

Nous vimsommes en 2014, et en tant que personne qui est récemment retournée, je peux offrir quelques points de vue et conseils potentiellement contrariants.

Utilisez Maj + gauche ou Maj + droite pour parcourir les mots

Bien que la répétition soit un concept puissant dans vim, je trouve (personnellement) étrange que son utilisation m'oblige à compter (lignes, caractères, mots, etc.) ou à faire des suppositions. Mon cerveau fonctionne généralement comme "Je veux le curseur là-bas " et pas comme "Je veux le curseur _5_words_to_the_left_". Pouvoir rapidement déplacer le curseur et observer visuellement où le point d'insertion de cette façon me permet de garder mon esprit sur ce que je modifie au lieu d'avoir à compter le nombre de sauts que je dois faire pour arriver là où je dois le modifier.

Activez le mode souris, utilisez la molette de la souris et cliquez

... pour parcourir de grands corps de texte.

La plupart (tous) les ordinateurs modernes ont un pavé tactile qui est étroitement intégré au clavier (par exemple, les MacBook). Les concepteurs industriels ont passé de nombreuses années-homme à optimiser ces conceptions afin que le vieux problème d'avoir à éloigner la main du clavier ne soit plus un vrai problème. D'accord, c'est si vous êtes habitué à une souris et que vous n'aimez pas changer, mais pour toute personne nouvelle à vim (comme celles qui pourraient trouver ce message via une recherche), cela ne devrait pas être un gros problème.

En bonus, cliquer + glisser vous met en mode visuel

Lorsque la souris est activée, cliquer et faire glisser a pour effet de basculer en mode visuel et de marquer une région à tirer.

Et utilisez la molette de défilement

Utiliser la souris (molette) pour faire défiler et cliquer pour positionner le curseur (duh) fonctionne. Voir http://usevim.com/2012/05/16/mouse/ pour plus d'informations à ce sujet.

Et donc...

Ce sont ce que j'appellerais des façons plus modernes (à l'aide de la souris, de la molette de défilement, etc.) de naviguer dans vim, tout aussi efficaces selon votre préférence d'entrée.

HTH


6
@MilesRout oui, j'avais un avertissement. Mais sérieusement, je pense qu'il y a une bonne proportion d'utilisateurs de Vim dont le cerveau fonctionne de la même manière que le mien. C'est-à-dire que mon cerveau fonctionne généralement comme "Je veux le curseur là-bas" et pas comme "Je veux le curseur 5_words_to_the_left ". Et la méthode conventionnelle de vim ne fonctionne pas très bien pour ces personnes. J'adore Vim car a) il est disponible partout et b) possède des fonctionnalités puissantes. Je ne ressens cependant pas le besoin de se conformer à tous ses mécanismes par défaut.
Shyam Habarakada

4
@MilesRout Il y a beaucoup de religion autour de ce genre de choses à Vim, donc je ne discuterai pas avec vous à ce sujet. La méthode du nombre de répétitions ne m'aide pas, et la réponse acceptée l'appelle également comme quelque chose de fortement sous-utilisé. Je ne peux que deviner pourquoi c'est le cas. Utiliser w, b, etc. pour naviguer vers des endroits proches est génial, mais pour aller plus loin, la molette de la souris fonctionne beaucoup mieux pour moi. À votre santé.
Shyam Habarakada

4
+1. Je ne le comprends pas. Il y a un avertissement. Prenez-le si vous l'aimez et sautez-le si vous ne l'aimez pas.
fangmobile.com

Ceci est une réponse très utile
Slava

1
En tant que personne qui a récemment migré vers VIM, je trouve que la prémisse de cette réponse est absolument précise.La possibilité de dire instantanément le nombre de répétitions nécessaires pour positionner le curseur à un endroit donné peut ou non être fournie avec expérience. En ce moment, tout comme @ShyamHabarakada, mon cerveau ne fonctionne tout simplement pas comme ça. Peu importe à quel point cela peut être peu orthodoxe, j'ai personnellement remappé fn + hjkl aux touches fléchées pour de très petits mouvements. Pour les grands mouvements, j'approximativement un certain nombre de répétitions, puis je les ajuste avec précision. Pour moi, c'est aussi rapide que possible.
Jacoscaz

14

Beaucoup de gens dans la communauté Vim soutiennent que vous ne devez pas naviguer en mode Insertion, que ce n'est pas la manière Vim. Je pense que c'est un sentiment incorrect appris lors de la transition des éditeurs standard à Vim.

Vim est plus puissant lorsque vous utilisez ses outils pour créer des actions ou des trouvailles atomiques et répétables.

Vous pouvez naviguer en mode Insertion si vous corrigez une erreur que vous avez commise lors de la même session d'insertion. Vous ne devez pas naviguer en dehors de la plage de texte que vous avez modifiée.

Si vous faites une erreur lors de la saisie de texte et sortez du mode Insertion pour le corriger, vous ne pourrez pas répéter l'action prévue, .répéterez la correction.

Vim prend en charge de nombreuses touches de navigation en mode Insertion. Évidemment, il y a les touches fléchées, Accueil et Fin, mais il existe également de nombreux autres raccourcis. Tu vois :h ins-special-keys.


4

Dans GVim, vous pouvez utiliser la souris. Mais honnêtement, qu'est-ce qui ne va pas avec les touches fléchées? Il y a une raison pour laquelle ils sont sur un clavier.


9
mais cette raison n'est pas adaptée aux utilisateurs de vim. L'un des points forts de vim est que vous pouvez faire toutes sortes de choses sans perdre votre temps à retirer la main du clavier. En particulier, les mouvements hjkl.
Aaron Thoma

1
Je suis d'accord avec @ammoQ. Rien de mal à utiliser les touches fléchées. Si l'utilisation des touches fléchées vous donne plus de productivité, allez-y.
Eunwoo Song

accolade: J'utilise hjkl plus souvent que les touches fléchées lors de l'utilisation de vi, mais basculer entre les modes est devenu une action subconsciente pour moi.
Erich Kitzmueller

4

Pour avoir une navigation un peu meilleure en mode insertion, pourquoi ne pas mapper certaines touches?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

Si vous pouvez contourner le problème pour que la clé Meta fonctionne dans votre terminal, vous pouvez encore mieux vous moquer du mode emacs. La navigation en mode normal est bien meilleure, mais pour les mouvements plus courts, elle permet de rester en mode insertion.

Pour les sauts plus longs, je préfère la traduction par défaut suivante:

<Meta-b>    maps to     <Esc><C-left>

Cela passe en mode normal et remonte un mot


2

Je crois que Homeet End(et PageUp/ PageDn) fonctionnent également normalement en mode insertion, mais à part cela, je ne crois pas qu'il existe d'autres clés standard définies pour la traversée de texte.


mais peut-être n'y a-t-il aucun moyen de parcourir le texte en utilisant uniquement les touches alphabétiques?
Andreas Grech

5
Certes, il y en a, si vous ne voulez pas pouvoir taper certaines lettres ...;)
hobbs

@hobbs Que diriez-vous de ctrl + hjkl? Cela devrait avoir du sens
user4052054

1

Désolé mais vim ne fonctionne pas de cette façon.

Vous devez passer en mode "normal", naviguer et revenir en arrière pour réinsérer.


1

Vous pouvez créer des mappages qui fonctionnent en mode insertion. La façon de le faire est via inoremap. Notez le «i» au début de la commande (noremap est utile pour éviter les collisions de cartes clés). Le corollaire est «n» pour le mode «normal». Vous pouvez deviner ce que Vim pense être «normal»;)

CEPENDANT, vous voulez vraiment naviguer dans le texte en utilisant le mode «normal». Vim est super dans ce genre de chose et toute cette puissance est disponible en mode normal. Vim fournit déjà des moyens faciles de passer du mode normal au mode d'insertion (par exemple, i, I, a, A, o, O). L'astuce consiste à faciliter le passage en mode normal. La façon de le faire est de remapper escape à une touche plus pratique. Mais vous en avez besoin d'un qui n'entrera pas en conflit avec votre frappe habituelle. J'utilise:

inoremap jj <Esc>

Depuis jj (c'est 2 j tapé l'un après l'autre rapidement) ne semble pas apparaître dans mon vocabulaire. Les autres réorganiseront l'endroit où ils sont à l'aise.

L'autre changement essentiel que je fais est de changer les touches CAPSLOCK et CONTROL de mon clavier (en utilisant la configuration du clavier de l'ordinateur hôte) car je n'utilise presque jamais CAPSLOCK et il a ce gros et beau bouton là où je le veux. (Ceci est courant pour les utilisateurs d'Emacs. L'inconvénient est que vous vous retrouvez sur un clavier «non fixé»! Aaarggh!)

Une fois que vous avez remappé CAPSLOCK, vous pouvez facilement utiliser les remappages du mode d'insertion suivants:

En gardant à l'esprit que certaines touches sont déjà mappées en mode insertion (back-kill-word est Cw (Control-w) par défaut, vous pourriez déjà avoir les liaisons que vous voulez. Cela dit, je préfère Ch donc dans mon .vimrc j'ai :

inoremap <C-h> <C-w>

MAIS, vous voulez probablement le même spasme de mémoire musculaire en mode normal, donc je mappe aussi Ch comme:

nnoremap <C-h> db

(d) elete (b) ackwards accomplit la même chose avec le même accord de touche. Ce type d'édition rapide est celui que je trouve utile dans la pratique pour les fautes de frappe. Mais restez en mode normal pour vous déplacer dans le texte et rien de plus que de tuer le mot précédent. Une fois que vous aurez l'habitude de changer de mode (en utilisant un remappage bien sûr), ce sera beaucoup plus efficace que le remappage du mode d'insertion.


remappage sympa pour l'évasion - je pense que cela fonctionnera pour à peu près tout sauf l'arabe translittéré!
JJT

0

Vous pouvez utiliser imappour mapper n'importe quelle touche en mode insertion sur l'une des touches de curseur. Ainsi:

imap h <Left>

Maintenant, h fonctionne comme en mode normal, en déplaçant le curseur. (Mapper h de cette manière est évidemment un mauvais choix)

Cela dit, je ne pense pas que la manière standard de se déplacer dans le texte à l'aide de VIM ne soit "pas productive". Il existe de nombreuses façons très puissantes de parcourir le texte en mode normal (comme utiliser w et b, ou / et?, Ou f et F, etc.)


1
Je n'ai pas dit que la façon standard de parcourir le texte dans vim n'est pas productive; ce que j'ai dit, c'est que c'était un peu "ennuyeux" de devoir sortir du mode d'insertion pour reculer de quelques caractères, puis de revenir en arrière pour réinsérer; mais là encore, c'est peut-être parce que je n'ai pas encore assez l'habitude de vim :)
Andreas Grech

C'est la solution que je cherchais. J'utilise imap <Ch> <Left> (je sais qu'il supprime un caractère, mais j'ai un retour arrière), c'est tout ce dont j'ai besoin, merci.
user4052054

0

Pour certains mouvements et actions fréquemment utilisés, j'ai défini les mappages suivants. Cela permet d'économiser une touche par rapport à la combinaison CTRL + O et comme j'en ai besoin fréquemment, ils sont payants à long terme.

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
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.