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

StackOverflow https://stackoverflow.com/questions/237383

  •  04-07-2019
  •  | 
  •  

Question

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; }

Parfois, il se peut que je veuille entrer plus de code. J'appuyais donc sur i pour passer en mode insertion, puis sur Entrée pour insérer le saut de ligne, puis supprimez l'espace supplémentaire. Ensuite, je passais en mode normal, je plaçais le curseur avant l’accolade fermante, puis je faisais 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?

Était-ce utile?

La solution

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

En fonction de vos paramètres d'indentation automatique, ce qui précède peut ou non indenter correctement l'instruction return. Sinon, utilisez s Entrez Tab Échap à la place de remplacer 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.

Autres conseils

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 pas 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
  • [Echap] signifie appuyer sur la touche Echap

Les informations suivantes s'affichent 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 &"; - cela vous permet d’incorporer les caractères de nouvelle ligne et d’échappement dans la commande.

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

i [Enter] [Escape]

Il s'agit de vim pour insérer une nouvelle ligne avant le curseur, puis quitter le mode d'insertion .

Réglages:

  • Vous pouvez remplacer le "g" par n'importe quel caractère qui n'est pas déjà lié à une commande que vous utilisez.
  • Ajoutez d'autres éléments à la commande, par exemple f}i^M^[O - f , ce qui signifie } et i Insérez une autre nouvelle ligne, puis sortez du mode insertion et O écrivez une ligne vide pour que vous puissiez entrer davantage de code.
  • Vous pouvez ajouter la commande à votre fichier .vimrc ou .exrc pour la rendre permanente. Il suffit d'omettre les deux points depuis le début pour que la commande commence par & "Map &";

Profitez!

Un mappage simple permettant de 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.

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

La commande permettant de remplacer crochet / return par crochet ressemble à ceci:

:s/{/{\r/

Etant donné que 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

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

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

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

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

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

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

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

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

Définissez cette correspondance 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.

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

nmap gs i<CR><ESC>

Dans Vrapper , vous pouvez utiliser gql qui scinde une ligne sans passer en mode insertion, mais ne peut pas maintenez toujours l'indentation.

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 carte de clé. En le décomposant, <expr> signifie que la sortie de la carte-clé 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 habituel ? : 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 associée à la J commande.

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

  1. Appuyez sur v pour passer en mode visuel
  2. Sélectionnez la ligne que vous souhaitez fractionner
  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 souhaitez générer

aaa
bbb
ccc
ddd

Vous pouvez utiliser la commande

f r<ENTER>;.;.

J'ai trouvé qu'il s'agissait de la mise en œuvre la plus fidèle de ce que j'attendais du comportement opposé à 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 s’il y en a un, 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 de fin

^ mw - commencez la nouvelle ligne et créez une marque sous w

gk - monte d'une ligne

: silencieux! s / \ v + $ // < cr > - regex remplace tout espace blanc à la fin de la ligne

: noh < cr > - Efface toutes les recherches soulignant que la regex aurait pu être activée

`w - renvoie la marque sous <=>

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

Remarque: ce lien est lié à S , qui remplace potentiellement une clé utile, mais il est synonyme de cc et, comme je ne l'utilise pas aussi souvent est-ce que je suis d'accord pour l'écraser?

Ce mappage divisera votre fonction sur une ligne. 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 avez un espace après l'accolade d'ouverture et un espace avant l'accolade de fermeture. Voyez si cela fonctionne pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top