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?
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.
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ù:
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:
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.Prendre plaisir!
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.
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.
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.
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.)
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.
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.
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>;.;.
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>
Dans Vrapper vous pouvez utiliser gql qui divisera une ligne sans passer en mode insertion, mais ne conservera pas 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 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
.
En fait, vous avez besoin des opérations combinées suivantes:
:
pour entrer en mode commande.s/\s/\r/g