Comment insérer une nouvelle ligne sans quitter le mode normal

24

Je me demande si je peux insérer une nouvelle ligne sans quitter le mode normal. Par exemple, j'ai deux lignes:

this is line one
this is line two

Et le curseur est sur la première ligne. Maintenant, je veux une nouvelle ligne entre la ligne un et la ligne deux, comme ceci:

this is line one

this is line two

Je sais que lorsque je suis en mode normal, je peux simplement appuyer sur o. Mais cela entrerait en mode d'insertion.

Comment puis-je insérer une nouvelle ligne comme et rester en mode normal?

Alex
la source

Réponses:

10

J'utilise une cartographie pour cela:

" Quickly insert an empty new line without entering insert mode
    nnoremap <Leader>o o<Esc>
    nnoremap <Leader>O O<Esc>

De cette façon, vous pouvez insérer une ligne sous votre curseur avec <Leader>oet une sur la ligne précédente avec <Leader>O.

Remarque: on pourrait faire valoir qu'il nécessite autant de frappes que, o<Esc>mais j'espère que vous avez choisi votre leader pour rendre ce type de mappage facile. De plus, je ne suis vraiment pas sûr qu'il existe un moyen intégré de le faire.

statox
la source
8

Une solution qui ne passe pas en mode insertion, ne déplace pas le curseur et vous permet d'utiliser un compteur pour ajouter plusieurs lignes à la fois ( 3\oetc.):

nnoremap <silent> <leader>o :<C-u>call append(line("."),   repeat([""], v:count1))<CR>
nnoremap <silent> <leader>O :<C-u>call append(line(".")-1, repeat([""], v:count1))<CR>
lcd047
la source
6

Si vous ne souhaitez pas ajouter de mappages, vous pouvez extraire yyune ligne vide, puis la coller ppour le curseur inférieur et Ppour le curseur supérieur.

Gilbert
la source
C'est probablement la meilleure réponse sans mappage.
Willem van Ketwich
Ou enregistrez-le dans le oregistre avec "oyyet collez-le à partir de là chaque fois que nécessaire avec "op.
mike23
5

Je recommande personnellement d'utiliser le plugin Unimpaired de Tim Pope . Il offre de nombreuses applications , mais ceux que vous rechercher sont [<space>et ]<space>qui créent des lignes vides au- dessus et au- dessous de la ligne courante respectivement. Unimpaired fournit également de jolis mappages pour parcourir la liste des correctifs rapides, la liste des tampons, le basculement des options et bien d'autres. Voir :h unimpairedpour en savoir plus.

Si vous ne souhaitez pas utiliser un plugin intact, mais comme les mappages ci-dessous, voici quelques mappages rapides à mettre dans votre ~/.vimrcfichier:

nnoremap <silent> [<space>  :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space>  :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>
Peter Rincker
la source
4

Ma cartographie utilise Shift-Enter. Il diffère des autres en ce que le curseur est renvoyé à la même ligne et colonne en utilisant la marque o.

" Insert new line above without going into insert mode
" (uses mark o to return to the previous cursor column)
nnoremap <S-Enter> moO<Esc>`o
stefrobb
la source
5
Notez que le mappage <S-Enter>ne fonctionne pas dans les émulateurs de terminaux (il ne fonctionne que dans gVim). Vous devrez donc choisir une combinaison de touches différente pour la mapper ;-)
Martin Tournoij
2

Cette réponse de Maxim Kim a changé la vie:

noremap <silent> <space> :exe "normal i".nr2char(getchar())<CR>

et mon riff dessus:

noremap <silent> <s-space> :exe "normal a".nr2char(getchar())<CR>

Mettez ces lignes dans votre vimrc. Ensuite , allez au début de la deuxième ligne de votre fichier et frappé Space, Enterou aller à la fin de la première ligne et a frappé Shift+Space, Enter. L'un ou l'autre ajoutera la ligne vide entre les première et deuxième lignes et vous laissera en mode normal.

Vous pouvez également les utiliser pour n'importe quelle autre touche unique - appuyez sur Spaceou Shift+Spacesuivie de la touche que vous souhaitez et il l'insérera ou l'ajoutera, respectivement.

cxw
la source
2

Ces mappages feront exactement ce que vous recherchez.

nnoremap <c-n> @="m`o\eg``"<cr>
nnoremap <c-p> @="m`O\eg``"<cr>   

Ceux-ci insèrent n nombre de sauts de ligne avant ou après le curseur; garder le curseur exactement là où il se trouve, sans changer la liste de sauts.

Une autre solution consiste simplement à créer un raccourci qui remplit le registre sans nom avec une nouvelle ligne. Ensuite, vous pouvez simplement utiliser les commandes put, p ou P pour insérer des retours à la ligne. Par exemple:

nnoremap "<cr> :let @@="\n"<cr>
Eric
la source
1

Ma cartographie pour cela

 " Create Blank Newlines and stay in Normal mode
nnoremap <silent> zj o<Esc>k
nnoremap <silent> zk O<Esc>j

Différent de statox car cela maintient le curseur au même endroit.

Kevin
la source
qu'est-ce que cela <silent>signifie?
Alex
Il empêche tout écho sur la ligne d'état. Je suis presque sûr qu'il ne fait rien dans ce cas spécifique, il était juste là où je l'avais copié il y a longtemps. Tu vois :h map-silent.
Kevin
-1

Ma solution personnelle insère un caractère de nouvelle ligne dans le registre d'expression et le colle après la ligne actuelle, puis revient à la position d'origine:

nnoremap K m`"="\n"<CR>p``
alxndr
la source