Comment insérer un saut de ligne à l'endroit où se trouve le curseur sans entrer en mode insertion dans Vim?


88

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

if (some_condition) {[ ]return; }

Parfois, je pourrais vouloir entrer du code supplémentaire. J'appuie donc ipour passer en mode insertion, j'appuie Enterpour insérer le saut de ligne, puis je supprime l'espace supplémentaire. Ensuite, je passerais en mode normal et positionnerais le curseur avant l'accolade fermante, puis ferais la même chose pour l'obtenir sur sa propre ligne.

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


Vous souhaitez insérer quelque chose sans passer en mode INSERT?
Jeremy Cantrell

26
@ jeremy-cantrell Ouais, tout comme "J" rejoint la ligne suivante et insère un espace sans passer en mode INSERT!
awendt

Réponses:


107

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

En fonction de vos paramètres d'autoindentification, les éléments ci-dessus peuvent ou non indenter correctement l'instruction de retour. Sinon, utilisez à la sEnterTabEscplace pour remplacer l'espace par une nouvelle ligne, indenter la ligne et quitter le mode d'insertion. Vous devrez remplacer le deuxième espace par une commande différente pour ne pas pouvoir utiliser «.» dans ce cas.


1
Je pense que c'est la solution la plus simple. Merci Greg.
Mark A. Nicolosi

4
«f [espace]» devrait être équivalent à «W» (c'est-à-dire passer au prochain espace blanc)
Nathan Fellman

4
«W» déplace un caractère trop loin, il passe au caractère suivant après l'espace blanc suivant.
Greg Hewgill

1
Vous pouvez également utiliser >>et <<pour aider à l'indentation si vous ne souhaitez pas passer en mode insertion avec s.
Conner

12

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

À partir de vim, saisissez:

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

Où:

  • [Ctrl + V] signifie maintenir la touche Ctrl et appuyer sur «v»
  • [Entrée] signifie appuyer sur la touche Entrée
  • [Esc] signifie appuyer sur la touche Échap

Vous verrez ce qui suit au bas de votre fenêtre vim jusqu'à ce que vous appuyiez sur la dernière entrée:

:map g i^M^[

Explication:

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

Vous mappez donc la touche 'g' à la séquence:

i [Entrée] [Échap]

Ceci est vim pour insérer une nouvelle ligne avant le curseur, puis quitter le mode 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.
  • Ajouter plus à la commande, par exemple f}i^M^[O - Cela f ind l' } et i nsert un autre saut de ligne, puis échapper du mode d'insertion et O stylo une ligne vide de vous d'entrer plus de code.
  • Vous pouvez ajouter la commande à votre fichier .vimrc ou .exrc pour le rendre permanent. Omettez simplement les deux points du début, la commande commence par "map"

Prendre plaisir!


Vous avez répondu à la question mal formulée dans le sujet, au lieu de celle du message. Ce qu'il veut savoir, c'est comment se débarrasser facilement de l'espace blanc qui était au point où la ligne a été rompue mais qui ne sert plus à rien.
Aristote Pagaltzis

Merci. Mise à jour de la section "Tweaks" pour accomplir ce que (je pense) l'auteur a demandé. Quand je l'ai testé, vi a automatiquement supprimé les espaces supplémentaires pour moi; utilisez 'x' pour les supprimer si le vôtre ne le fait pas. Et pourquoi les commandes vi ressemblent-elles au bruit de la ligne du modem? :-)
Adam Liss

11

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

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

entre essentiellement en mode «insertion», insère un saut de ligne et retourne en mode normal.

placez-le dans votre fichier .vimrc pour une utilisation future.


5

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

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

:s/{/{\r/

Puisque vous souhaitez l'utiliser souvent, vous pouvez mapper la séquence complète à une frappe inutilisée comme ceci:

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

Là où vous voyez ^ M dans la séquence, tapez [Ctrl-V] , puis appuyez sur Entrée .

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

Recherchez :help map-which-keysdes conseils sur la sélection des frappes inutilisées à mapper.


BTW: gn'est pas mappé car il est utilisé comme clé 'namespace' pour de nombreux mappages vim consistant en deux frappes (voir :h g). Donc, cette cartographie est en fait interdite.
Hotschke

Existe-t-il une bonne commande qui signale gdéjà utilisée comme clé «d'espace de noms»?
paresseux

Pas en particulier. Comme je l'ai dit, :help gc'est une façon de voir une liste de gmappages par défaut + quelque chose. z, [ ]sont d'autres clés «d'espace de noms», voir par exemple :help index. Vous pouvez appeler :verbose map gpour voir tous les mappages définis en cours commençant par g. Les ressources Web utiles sont viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (diapositives: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke

3

En supposant que vous êtes d'accord avec le mappage Kvers autre chose (choisissez une clé différente de votre goût) et que l'utilisation du marqueur 'comme marqueur temporaire est acceptable, pourquoi ne pas faire cela?

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

maintenant appuyer sur K en mode normal sur le caractère après lequel vous voulez que le saut de ligne se produise divisera la ligne et laissera le curseur là où il était.


1

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

Si vous ne souhaitez pas utiliser l' un de ces paramètres, utilisez au slieu de ipour s ubstitute votre nouveau texte pour le blanc plutôt que d' insérer. (S'il y a plusieurs espaces, placez le curseur à l'extrême gauche et utilisez à la cwplace.)


1

Fondamentalement, lorsque vous divisez une ligne, vous voulez simplement insérer un retour chariot, ou dans le cas où vous êtes sur un espace, remplacez-le par un retour chariot. Eh bien, 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 clé. Le décomposer, <expr>signifie que la sortie de la carte des touches peut être dynamique et dans ce cas dépend de la condition getline('.')[col('.')-1]==' 'qui est la longue façon de demander à vim si le caractère sous le curseur est un espace. Enfin, l'opérateur ternaire familier ? :remplace l'espace par un saut de ligne ( r<CR>) ou en insère un nouveau ( i<CR><Esc>)

Vous avez maintenant une jolie carte de touches soeur pour la Jcommande.


C'est assez lisse. Je ne sais pas si j'ai déjà utilisé intentionnellement K, mais cela pourrait valoir la peine de se débarrasser ou de remapper ailleurs.
dragon788

0

Définissez ce mappage de clé dans votre vimrc

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

Appuyez ensuite sur Ctrl + m si vous souhaitez l'utiliser dans votre vim.


0

À mon humble avis, le mappage intégré gsn'est pas un mappage utile (mettre vim en veille), on pourrait l'utiliser pour le fractionnement:

nmap gs i<CR><ESC>

0

Dans Vrapper, vous pouvez utiliser gql qui divisera une ligne sans entrer en mode insertion, mais ne maintiendra pas toujours l'indentation.


0

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

  1. Appuyez vpour accéder au mode visuel
  2. Sélectionnez la ligne que vous souhaitez fractionner
  3. Appuyez :pour entrer en mode commande
  4. s/\s/\r/g
  5. Terminé

0

Si vous avez l'entrée:

aaa bbb ccc ddd

et veux sortir

aaa
bbb
ccc
ddd

Vous pouvez utiliser la commande

f r<ENTER>;.;.

0

J'ai trouvé que c'était la mise en œuvre la plus fidèle de ce à quoi j'attendrais le comportement opposé J

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

Il fait la nouvelle ligne simpliste au curseur, s'occupe de tout espace blanc de fin sur la ligne précédente s'il y en a, puis ramène le curseur à la bonne position.

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

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

gk - monter d'une ligne

:silent! s/\v +$//<cr> - regex remplace tous les espaces à la fin de la ligne

:noh<cr> - Effacez toute recherche mettant en évidence que l'expression régulière aurait pu être activée

`w - renvoyer la marque sous w

Combine essentiellement le meilleur des deux r<esc><cr>eti<cr><esc>

Remarque: j'ai cette borne Squi écrase potentiellement une clé utile, mais c'est un synonyme de ccet comme je ne l'utilise pas aussi souvent que je le fais, je suis d'accord pour l'écraser.



-1

Ce mappage interrompra toute fonction sur une ligne que vous avez. Placez simplement votre curseur sur la ligne et appuyez sur 'g' en mode normal:

:map g ^f{malr<CR>`a%hr<CR>`a

Cela suppose que vous ayez un espace après l'accolade ouvrante et un espace avant l'accolade fermante. Voyez si cela fonctionne pour vous.

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.