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

Est-il possible d’insérer un saut de ligne lorsque 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; } 

De temps en temps, je pourrais vouloir entrer plus de code. Donc, j’appuie sur i pour entrer en mode insertion, appuyez sur Entrée pour insérer le saut de ligne, puis supprimez l’espace supplémentaire. Ensuite, j’entrerais en mode normal et positionnerais le curseur avant l’accolade de fermeture, 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?

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

Selon vos parameters d’auto-index, ce qui précède peut ou non indenter la déclaration de retour correctement. Si ce n’est pas le cas, utilisez alors la touche Entrée , puis appuyez sur Echap 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 afin de ne pas pouvoir utiliser “.” dans ce cas.

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

De l’intérieur de vim, tapez:

 :map gi[Ctrl+V][Enter][Ctrl+V][Esc][Enter] 

Où:

  • [Ctrl + V] signifie que vous devez maintenir la touche Ctrl enfoncée et appuyer sur ‘v’
  • [Enter] signifie appuyer sur la touche Enter
  • [Esc] signifie appuyer sur la touche Esc

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

 :map gi^M^[ 

Explication:

[Ctrl + V] signifie “citer le caractère suivant” – il vous permet d’intégrer les caractères newline et escape dans la commande.

Donc, vous mappez la clé ‘g’ à la séquence:

  i [Enter] [Escape] 

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.
  • Ajoutez-en plus à la commande, par exemple f}i^M^[O – Cela va induire } et j’insère une autre nouvelle ligne, puis échappe au mode insertion et affiche une ligne vide pour entrer plus de code.
  • Vous pouvez append la commande à votre fichier .vimrc ou .exrc pour le rendre permanent. Il suffit d’omettre les deux points depuis le début, donc la commande commence par “map”

Prendre plaisir!

Un simple mapping pour casser la ligne au curseur en appuyant sur Ctrl + Enter:

:nmap i

entre essentiellement en mode “insert”, insère un saut de ligne et revient au mode normal.

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

Si vous développez habituellement un bloc d’une ligne à trois lignes, essayez la substitution. Changez le support d’ouverture dans le support / retour et le support de fermeture dans le retour / support.

La commande de substitution entre parenthèses / retours ressemble à ceci:

 :s/{/{\r/ 

Puisque vous voulez l’utiliser souvent, vous pouvez mapper la séquence complète sur une séquence de touches inutilisée comme ceci:

 :map  :s/{/{\r/ ^M :s/}/\r}/ ^M 

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 exemple de ligne, appuyez sur la touche mappée et les retours de chariot sont ajoutés.

Vérifiez les éléments suivants :help map-which-keys pour obtenir des conseils sur la sélection des frappes de touches inutilisées sur la carte.

Vim tuera automatiquement tous les espaces à droite du curseur si vous cassez une ligne pendant que l’ autoindent (ou tout autre aide à l’indentation) est activée.

Si vous ne souhaitez utiliser aucun de ces parameters, utilisez s au lieu de i pour remplacer votre texte par le blanc plutôt que par l’insertion. (S’il y a plusieurs blancs, placez le curseur à l’ cw gauche et utilisez plutôt cw ).

En supposant que vous êtes d’accord avec la mise en correspondance de quelque chose d’autre avec K (choisissez une autre clé de votre choix) et que vous utilisez un marqueur comme marqueur temporaire, alors pourquoi ne pas le faire?

 :nmap K m'a`' 

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 se trouvait.

Définissez ce mappage de clé dans votre vimrc

 :map  ih 

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

À mon humble avis, 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 

Dans Vrapper, vous pouvez utiliser gql qui divisera une ligne sans entrer dans le mode d’insertion, mais ne maintiendra pas toujours l’indentation.

Fondamentalement, lorsque vous divisez une ligne, vous souhaitez simplement insérer un retour chariot ou, si vous vous trouvez sur un espace, le remplacer par un retour chariot. Eh bien, pourquoi se contenter de l’un ou de l’autre? Voici mon mapping pour K:

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

J’utilise l’opérateur ternaire pour condenser les deux actions en une seule carte clé. En le décomposant, signifie que la sortie de la carte clé peut être dynamic et, dans ce cas, dépend de la condition getline('.')[col('.')-1]==' ' vim si le caractère sous le curseur est un espace. Enfin, l’opérateur ternaire familier ? : ? : remplace l’espace par un retour à la ligne ( r ) ou en insère un nouveau ( i )

Maintenant, vous avez une belle carte-clé de soeur à la commande J

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

  1. Appuyez sur v pour accéder au 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é

Si vous avez l’entrée:

 aaa bbb ccc ddd 

et que vous voulez sortir

 aaa bbb ccc ddd 

Vous pouvez utiliser la commande

 f r;.;. 

Ce mappage va briser toute fonction d’une ligne que vous avez. Placez simplement votre curseur sur la ligne et appuyez sur «g» en mode normal:

 :map g ^f{malr`a%hr`a 

Cela suppose que vous avez un espace après l’accolade d’ouverture et un espace avant l’accolade de fermeture. Voyez si cela fonctionne pour vous.