Come inserire una nuova riga senza uscire dalla modalità normale


24

Mi chiedo se posso inserire una nuova riga senza uscire dalla modalità normale. Ad esempio, ho due righe:

this is line one
this is line two

E il cursore è sulla prima riga. Ora voglio una nuova linea tra la prima e la seconda, in questo modo:

this is line one

this is line two

So che quando sono in modalità normale, posso semplicemente premere o. Ma questo entrerebbe in modalità inserimento.

Come posso inserire una nuova riga come e rimanere in modalità normale?


Risposte:


10

Uso una mappatura per questo:

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

In questo modo è possibile inserire una riga sotto il cursore con <Leader>oe una sulla riga precedente con <Leader>O.

Nota: si potrebbe sostenere che richiede tanti tasti come o<Esc>ma spero che tu abbia scelto il tuo leader per rendere facile questo tipo di mappatura. Inoltre, non sono davvero sicuro che ci sia un modo integrato per farlo.


8

Una soluzione che non passa attraverso la modalità di inserimento, non sposta il cursore e consente di utilizzare un contatore per aggiungere più righe contemporaneamente ( 3\oecc.):

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>

6

Se non si desidera aggiungere mappature, è possibile strappare yyuna linea vuota e quindi incollare pper il cursore in basso e Pper il cursore in alto.


Questa è probabilmente la risposta migliore senza mappatura.
Willem van Ketwich,

Oppure salvalo nel oregistro con "oyye incollalo da lì ogni volta che è necessario con "op.
mike23,

5

Consiglio vivamente di usare il plugin Unimpaired di Tim Pope . Fornisce molti mapping ma quelli che stai cercando sono [<space>e ]<space>che creano rispettivamente righe vuote sopra e sotto la riga corrente. Unimpaired fornisce anche delle belle mappature per spostarsi attraverso l'elenco delle correzioni rapide, l'elenco dei buffer, la commutazione delle opzioni e molti altri. Vedi :h unimpaireddi più.

Se non si desidera utilizzare un plug-in non compromesso, ma come le mappature seguenti sono alcune mappature rapide da inserire nel ~/.vimrcfile:

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

4

La mia mappatura utilizza Shift-Enter. Si differenzia dagli altri per il fatto che il cursore viene riportato sulla stessa riga e colonna usando il segno 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

5
Nota che la mappatura <S-Enter>non funziona negli emulatori di terminale (funziona solo in gVim). Quindi dovrai scegliere una combinazione di tasti diversa per mapparla ;-)
Martin Tournoij

2

Questa risposta di Maxim Kim ha cambiato la vita:

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

e il mio riff su di esso:

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

Metti quelle linee nel tuo vimrc. Poi andare all'inizio della seconda riga del file e colpito Space, Entero andare alla fine della prima linea e ha colpito Shift+Space, Enter. O aggiungerà la riga vuota tra la prima e la seconda riga e ti lascerà in modalità normale.

Puoi anche usarli per qualsiasi altro tasto singolo: premi Spaceo Shift+Spacesegui il tasto desiderato e lo inserirà o lo aggiungerà, rispettivamente.


2

Queste mappature faranno esattamente quello che stai cercando.

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

Inseriscono n numero di newline prima o dopo il cursore; mantenendo il cursore esattamente dove si trova, senza modificare l'elenco di salto.

Un'altra soluzione è semplicemente creare una scorciatoia che riempia il registro senza nome con una nuova riga. Quindi puoi semplicemente usare i comandi put, p o P per inserire nuove righe. Per esempio:

nnoremap "<cr> :let @@="\n"<cr>

1

La mia mappatura per questo

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

Diverso da quello di statox in quanto mantiene il cursore nella stessa posizione.


cosa <silent>significa?
Alex,

Impedisce l'eco di qualsiasi cosa nella riga di stato. Sono abbastanza sicuro che non fa nulla in questo caso specifico, era lì ovunque da dove l'ho copiato, molto tempo fa. Vedere :h map-silent.
Kevin,

-1

La mia soluzione personale inserisce un carattere di nuova riga nel registro delle espressioni e lo incolla dopo la riga corrente, quindi torna alla posizione originale:

nnoremap K m`"="\n"<CR>p``
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.