web-dev-qa-db-fra.com

Comment insérer un saut de ligne à l'emplacement du curseur sans entrer en mode insertion dans Vim?

Est-il possible d'insérer un saut de ligne où le curseur est dans Vim sans entrer en mode insertion? Voici un exemple ([x] signifie que le curseur est sur x):

if (some_condition) {[ ]return; }

Il se peut que je veuille parfois entrer un peu plus de code. Alors je presse i pour entrer en mode insertion, appuyez sur Enter insérer le saut de ligne puis supprimer l’espace supplémentaire. Ensuite, je passais en mode normal et plaçais le curseur avant l'accolade fermante, puis je faisais la même chose pour le placer sur sa propre ligne.

Je fais ça depuis un moment, mais il y a sûrement une meilleure façon de le faire?

75
Mark A. Nicolosi

Pour l'exemple que vous avez donné, vous pouvez utiliser rEnter pour remplacer un seul caractère (l'espace) par Entrée. Ensuite, fspace. pour avancer à l'espace suivant et répéter la dernière commande.

Selon vos paramètres d'indentation automatique, ce qui précède peut ou non indenter correctement l'instruction de retour. Si non, alors utilisez sEnterTabEsc à la place, remplacez l'espace par une nouvelle ligne, indentez la ligne et quittez le mode insertion. Vous devrez remplacer le deuxième espace par une commande différente afin que vous ne puissiez pas utiliser "." dans ce cas.

96
Greg Hewgill

Voici comment créer une macro qui insère une nouvelle ligne au curseur chaque fois que vous appuyez sur 'g' alors que not en mode insertion:

Dans vim, tapez:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Où: 

  • [Ctrl + V] signifie que maintenez la touche Ctrl enfoncée et appuyez sur 'v'
  • [Entrée] signifie appuyez sur la touche Entrée
  • [Esc] signifie appuyez sur la touche Esc

Vous verrez ce qui suit au bas de la fenêtre de vim jusqu'à ce que vous appuyiez sur la touche Entrée finale:

:map g i^M^[

Explication:

[Ctrl + V] signifie "citer le caractère suivant" - il vous permet d'intégrer les caractères de nouvelle ligne et d'échappement à la commande.

Donc, vous associez la touche 'g' à la séquence: 

i [Enter] [Escape]

Ceci est vim pour insérer une nouvelle ligne avant le curseur, puis quitte le mode d’insertion.

Tweaks:

  • Vous pouvez remplacer le "g" par n'importe quel caractère qui n'est pas déjà lié à une commande que vous utilisez.
  • Ajoutez plus à la commande, p. Ex.f}i^M^[O - Ceci f indique le } et i nsert une nouvelle ligne, puis quitte le mode insertion et O affiche une ligne vide à saisir plus de code.
  • Vous pouvez ajouter la commande à votre fichier .vimrc ou .exrc pour la rendre permanente. Oubliez les deux points depuis le début, la commande commence par "map"

Prendre plaisir!

11
Adam Liss

Un mappage simple pour casser la ligne au niveau du curseur en appuyant sur Ctrl + Entrée:

:nmap <c-cr> i<cr><Esc>

passe essentiellement en mode "insertion", insère un saut de ligne et revient en mode normal.

mettez-le dans votre fichier .vimrc pour une utilisation ultérieure.

8
Yariv

Si vous étendez généralement un bloc d'une ligne à trois, essayez la substitution. Changer le support d’ouverture en support/retour et le support de fermeture en retour/support.

La commande pour remplacer crochet/return par crochet ressemble à ceci:

:s/{/{\r/

Puisque vous voulez utiliser cela souvent, vous pouvez mapper la séquence complète sur une frappe inutilisée comme ceci:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Où vous voyez ^ M dans la séquence, tapez [Ctrl-V] , puis appuyez sur enter .

Maintenant, avec votre curseur n'importe où sur votre ligne d'échantillon, appuyez sur la touche mappée et les retours à la ligne sont ajoutés.

Consultez :help map-which-keys pour obtenir des conseils sur la sélection des frappes inutilisées à mapper.

4
slothbear

En supposant que vous soyez en mesure de mapper K vers quelque chose d'autre (choisissez une clé différente de votre choix), et d'utiliser le marqueur ' comme marqueur temporaire, c'est bien, pourquoi ne pas le faire?

:nmap K m'a<CR><Esc>`'

maintenant en appuyant sur K en mode normal au-dessus du caractère après lequel vous souhaitez que le saut de ligne se produise, la ligne sera scindée et le curseur laissé tel quel.

2
mondaugen

Vim supprimera automatiquement tout espace à droite du curseur si vous cassez une ligne en deux alors que autoindent (ou tout autre aide à l'indentation) est activé.

Si vous ne souhaitez utiliser aucun de ces paramètres, utilisez s au lieu de i afin de sremplacez votre nouveau texte par du blanc plutôt que par une simple insertion. (S'il y a plusieurs blancs, placez le curseur le plus à gauche et utilisez cw à la place.)

1

J'ai trouvé qu'il s'agissait de la mise en œuvre la plus fidèle de ce que j'attendrais du comportement inverse de J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Il crée la nouvelle ligne simpliste au niveau du curseur, s’occupe de tout espace blanc de fin sur la ligne précédente, le cas échéant, puis ramène le curseur à la position correcte.

i<cr><esc> - c’est l’une des solutions les plus courantes suggérées, elle ne supprime pas les caractères non-blancs sous votre curseur, mais vous laisse également des espaces à la fin.

^mw - allez au début de la nouvelle ligne et créez une marque sous w

gk - monte d'une ligne

:silent! s/\v +$//<cr> - regex remplace tout espace en fin de ligne

:noh<cr> - Effacer toute recherche mettant en évidence que la regex pourrait avoir activé

`w - retourne la marque sous w

Combine essentiellement le meilleur des deux r<esc><cr> et i<cr><esc>

Note: je suis lié à S qui remplace potentiellement une clé utile, mais il est synonyme de cc et comme je ne l'utilise pas aussi souvent que je me sépare, je suis prêt à l'écraser.

0
JaredMcAteer

Définissez cette correspondance de clé dans votre vimrc

:map <C-m> i<CR><Esc>h

Appuyez ensuite sur Ctrl + m si vous voulez l’utiliser dans votre vim.

0
Kiddo

Si vous avez l'entrée:

aaa bbb ccc ddd

et veulent sortir

aaa
bbb
ccc
ddd

Vous pouvez utiliser la commande

f r<ENTER>;.;.
0
Yarden Akin

IMHO, le mappage intégré gs n'est pas un mappage utile (mettre vim en veille), on pourrait l'utiliser pour le fractionnement

nmap gs i<CR><ESC>
0
Hotschke

Dans Vrapper vous pouvez utiliser gql qui divisera une ligne sans passer en mode insertion, mais ne conservera pas toujours l’indentation. 

0
Janac Meena

En gros, lorsque vous coupez une ligne, vous souhaitez simplement insérer un retour chariot ou, dans le cas où vous êtes sur une espace, le remplacer par un retour chariot. Pourquoi se contenter de l’un ou de l’autre? Voici ma cartographie pour K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

J'utilise l'opérateur ternaire pour condenser les deux actions en une seule carte clé. En décomposant cela, <expr> signifie que la sortie de la carte de clés peut être dynamique et repose dans ce cas sur la condition getline('.')[col('.')-1]==' ', qui est le moyen le plus lent de demander à vim si le caractère sous le curseur est un espace. Enfin, l'opérateur ternaire bien connu ? : remplace l'espace par un saut de ligne (r<CR>) ou en insère un nouveau (i<CR><Esc>)

Vous avez maintenant une belle carte de soeur qui correspond à la commande J.

0
ctrl

En fait, vous avez besoin des opérations combinées suivantes:

  1. Presse v entrer en mode visuel
  2. Sélectionnez la ligne que vous souhaitez diviser
  3. Appuyez sur : pour entrer en mode commande.
  4. s/\s/\r/g
  5. Terminé
0
Nathan