web-dev-qa-db-fra.com

Traverser du texte en mode Insertion

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

Si je presse hjk et l En mode Insertion, les caractères réels sont imprimés à 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 traversant le texte ensuite; mais évidemment ce n'est pas productif.

302
Andreas Grech

Vous semblez mal utiliser vim, mais c'est probablement parce que vous ne le connaissez pas très bien.

La bonne façon est d'appuyer sur Esc, allez où vous voulez faire une petite correction, corrigez-la, revenez en arrière et continuez à éditer C'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 apprendrez plus, cela sera plus productif.

Voici quelques cas d'utilisation:

  • Vous avez accidentellement tapé "accidentellement". Pas de problème, la séquence EscFfrdA corrigera l'erreur et vous ramènera à l'endroit où vous avez été édité. le Ff le mouvement déplacera votre curseur en 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 frappes au clavier et vous oblige à déplacer votre main hors de la zone alphanumérique du clavier.
  • Vous avez accidentellement tapé "vous avez tapé accidentellement", mais vous voulez le corriger pour "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 A au lieu de Endafin que vous n'ayez pas à bouger votre main pour atteindre le End clé.
  • Vous avez accidentellement tapé "souris" au lieu de "souris". Pas de problème - le bon vieux Ctrl+w supprime le mot précédent sans quitter le mode insertion. Et il est beaucoup plus rapide d'effacer un petit mot que de corriger des erreurs. Je suis tellement habitué à cela 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, 15h apportera votre curseur 15 caractères en arrière et 4j déplacera votre curseur de 4 lignes vers le bas. Commencez à les utiliser et vous vous y habituerez bientôt. Si vous faites une erreur de dix caractères en arrière de votre curseur, vous découvrirez qu’en appuyant sur la touche  10 fois est beaucoup plus lent que l'approche itérative pour déplacer le curseur. Vous pouvez donc taper rapidement les touches à la place 12h (pour deviner combien de caractères il vous faut pour déplacer votre curseur), et avancez immédiatement deux fois avec ll pour corriger rapidement l'erreur.

Mais, si vous continuez toujours à faire de petits passages de texte sans quitter le mode insertion, suivez les instructions de rsonconseil et utiliser Ctrl+O. Prenant le premier exemple que j'ai mentionné ci-dessus, Ctrl+OFf vous amène à un caractère "f" précédent et vous laisse en mode insertion.

607
P Shved

En mode mode insertion, utilisez CtrlO aller à 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

ce qui est probablement le moyen le plus simple de faire ce que vous voulez et 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.

125
felix

Mode d'insertion

Mouvement

hjkl

Malgré ce que Pavel Shved dit - qu'il est probablement plus conseillé de s'habituer à Escutilisation du mode Insertion - Voici un exemple d’ensemble de mappages pour une navigation rapide dans le 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+h en mode insertion, il ne reste qu'un caractère, Alt+j et ainsi de suite, de manière analogue à hjkl en 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 :new $myvimrc à partir du mode normal).


Tout mouvement en mode normal

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

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


(Autres utilisations de Alt en mode insertion)

Il est à noter qu’il pourrait y avoir de meilleurs usages pour le Alt clé que de reproduire le comportement du mode Normal: par ex. Voici les mappages permettant de copier depuis une ligne adjacente la partie de la colonne courante 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é \continuation de la ligne et l'indentation pour améliorer la clarté - les commandes sont interprétées comme si elles étaient écrites sur une seule ligne.)


Touches de raccourci intégrées 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’existe pas de touches de raccourci intégrées remarquables pour les mouvements en mode Insertion.)

Référence: :help insert-index


Mode ligne de commande

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

" 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 au mode Insertion et au mode Ligne de commande en une 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 permettant de extraire les commandes du mode normal en mode ligne de commande sont légèrement différentes des commandes de mappage du mode Insertion (car le mode ligne manque le mode insertion Ctrl+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>'


Touches de raccourci intégrées 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

89
Aaron Thoma

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

Quelques manières peu orthodoxes (vim)

Nous sommes en 2014, et comme quelqu'un qui est récemment retourné à vim, je peux offrir quelques points de vue et conseils potentiellement contrariants.

Utilisez les touches 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 qu’il m’oblige à compter (lignes, caractères, mots, etc.) ou à deviner. Mon cerveau fonctionne généralement comme "je veux le curseur there" et non 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 à l’esprit ce que je suis en train d’éditer au lieu de devoir compter le nombre de sauts que j’ai besoin de faire pour arriver où j’ai besoin d’être édité. 

Activez le mode souris et utilisez la molette de la souris en cliquant sur

... pour naviguer dans de grands corps de texte.

La plupart des ordinateurs modernes disposent d’un pavé tactile étroitement intégré au clavier (MacBook, par exemple). Les designers industriels ont passé de nombreuses années à optimiser ces conceptions afin que le vieux problème de devoir éloigner la main du clavier ne soit plus un problème réel. D'accord, c'est le cas si vous êtes habitué à une souris et que vous n'aimez pas permuter, mais pour tous les nouveaux utilisateurs de vim (comme ceux qui pourraient trouver ce message via une recherche), cela ne devrait pas poser trop de problèmes.

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 pour yanking.

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.

Et donc...

Ce sont ce que j'appellerais des moyens plus modernes (utilisation de la souris, de la molette de défilement, etc.) de naviguer dans vim, tout aussi efficaces en fonction de votre préférence en matière de saisie.

HTH

22
Shyam Habarakada

De nombreux membres de la communauté Vim soutiennent qu'il ne faut pas naviguer en mode Insertion, ce n'est pas la méthode Vim. Je pense que c'est un sentiment incorrect acquis lors de la transition d'éditeurs standard vers Vim.

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

Il est correct de naviguer en mode insertion si vous corrigez une erreur que vous avez commise au cours 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 vous trompez lors de la saisie de texte et que vous sortez du mode Insertion pour y remédier, vous ne pourrez pas répéter l'action souhaitée. . répétera 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. Voir :h ins-special-keys.

14
everett1992

Pour avoir une meilleure navigation en mode insertion, pourquoi ne pas cartographier 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 vous débrouiller pour que la clé Meta fonctionne dans votre terminal, vous pouvez encore mieux simuler le mode emacs. La navigation en mode normal est bien meilleure, mais pour les mouvements plus courts, il est préférable 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>

Ceci passe à mode normal et revient à un mot

4
Alex

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.

4
Erich Kitzmueller

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

2
Amber

Vous pouvez créer des mappages qui fonctionnent en mode insertion. Le moyen 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 supposer que ce que vim pense être 'normal';)

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

inoremap jj <Esc>

Depuis jj (ça fait 2 j rapidement tapé l'un après l'autre) ne semble pas apparaître dans mon vocabulaire. Les autres vont remapper là où il est confortable.

L’autre changement essentiel que j’apporte consiste à permuter les touches CAPSLOCK et CONTROL de mon clavier (à l’aide de la configuration du clavier de l’ordinateur hôte), car je n’utilise presque jamais CAPSLOCK. (Ceci est courant pour les utilisateurs d'Emacs. L'inconvénient est que vous vous trouvez sur un clavier 'non fixé'! Aaarggh!)

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

En gardant à l'esprit que certaines clés sont déjà mappées en mode insertion (backwards-kill-Word est Cw (Control-w) par défaut, vous avez peut-être déjà les liaisons que vous souhaitez. Cela dit, je préfère Ch alors 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 C-h comme:

nnoremap <C-h> db

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

1
pfries

Pour certains mouvements et actions fréquemment utilisés, j'ai défini les mappages suivants. Cela évite une frappe au clavier par rapport à la combinaison CTRL + O et, comme j'en ai souvent besoin, ils rapportent. 

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

Désolé mais Vim ne fonctionne pas comme ça.

Vous devez basculer en mode "normal", naviguer puis revenir pour insérer à nouveau.

0
Johan

Vous pouvez utiliser imap pour mapper n’importe quelle touche en mode insertion à l’une des touches du curseur. Ainsi:

imap h <Left>

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

Cela dit, je ne pense pas que la manière habituelle de se déplacer dans un texte en utilisant VIM ne soit "pas productive". Il y a beaucoup de façons très puissantes de parcourir le texte en mode normal (comme utiliser w et b, ou/et?, Ou f et F, etc.)

0