So fügen Sie eine neue Zeile ein, ohne den normalen Modus zu verlassen

23

Ich frage mich, ob ich eine neue Zeile einfügen kann, ohne den normalen Modus zu verlassen. Zum Beispiel habe ich zwei Zeilen:

this is line one
this is line two

Und der Cursor befindet sich in Zeile eins. Jetzt möchte ich eine neue Zeile zwischen Zeile eins und Zeile zwei, wie folgt:

this is line one

this is line two

Ich weiß, dass ich im normalen Modus einfach drücken kann o. Dies würde jedoch in den Einfügemodus wechseln.

Wie kann ich eine neue Zeile einfügen und im normalen Modus bleiben?

Alex
quelle
1
Schauen Sie sich Folgendes
cuonglm

Antworten:

10

Ich benutze dafür ein Mapping:

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

Auf diese Weise können Sie mit eine Zeile unter Ihrem Cursor <Leader>ound mit eine Zeile in der vorherigen Zeile einfügen <Leader>O.

Hinweis: Man könnte argumentieren, dass so viele Tastenanschläge erforderlich sind, o<Esc>aber Sie haben hoffentlich Ihren Anführer ausgewählt, um diese Art der Zuordnung zu vereinfachen. Ich bin mir auch nicht sicher, ob es einen eingebauten Weg gibt, dies zu tun.

statox
quelle
8

Eine Lösung, die den Einfügemodus nicht durchläuft, den Cursor nicht bewegt und es Ihnen ermöglicht, mithilfe eines Zählers mehrere Zeilen gleichzeitig anzufügen ( 3\ousw.):

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
quelle
5

Ich persönlich empfehle die Verwendung des Unimpaired-Plugins von Tim Pope . Es gibt viele Zuordnungen, aber die, nach denen Sie suchen, sind [<space>und ]<space>die jeweils leere Linien über und unter der aktuellen Linie erzeugen. Unimpaired bietet außerdem nützliche Zuordnungen zum Durchlaufen der Quickfix-Liste, der Pufferliste, des Optionswechsels und vieler anderer Elemente. Sehen Sie :h unimpairedfür mehr.

Wenn Sie kein unbeeinträchtigtes Plugin verwenden möchten, aber die folgenden Zuordnungen mögen, sind einige schnelle Zuordnungen, die Sie in Ihre ~/.vimrcDatei einfügen können:

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
quelle
5

Wenn Sie keine Zuordnungen hinzufügen möchten, können Sie yyeine leere Zeile ziehen und dann pfür unterhalb des Cursors und Pfür oberhalb des Cursors einfügen .

Gilbert
quelle
Dies ist wahrscheinlich die beste Antwort ohne Zuordnung.
Willem van Ketwich
Oder speichern Sie es im oRegister mit "oyyund fügen Sie es bei Bedarf mit von dort aus ein "op.
mike23
4

Mein Mapping verwendet Shift-Enter. Sie unterscheidet sich von den anderen dadurch, dass der Cursor mit der Markierung o in dieselbe Zeile und Spalte zurückgesetzt wird.

" 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
quelle
5
Beachten Sie, dass das Mapping <S-Enter>in Terminalemulatoren nicht funktioniert (es funktioniert nur in gVim). Sie müssen also eine andere Tastenkombination auswählen, um sie
zuzuordnen ;-)
2

Diese Antwort von Maxim Kim war lebensverändernd:

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

und mein Riff drauf:

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

Setzen Sie diese Zeilen in Ihre vimrc. Dann gehen Sie zu Beginn der zweiten Zeile der Datei und Hits Space, Enteroder gehen Sie bis zum Ende der ersten Zeile und Hits Shift+Space, Enter. Entweder wird die leere Zeile zwischen der ersten und der zweiten Zeile eingefügt und Sie bleiben im normalen Modus.

Sie können diese auch für jede andere einzelne Taste verwenden - drücken Sie Spaceoder Shift+Spacefolgen Sie der gewünschten Taste, um sie einzufügen oder anzufügen.

cxw
quelle
2

Diese Zuordnungen werden genau das tun, was Sie suchen.

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

Diese fügen n Zeilenumbrüche vor oder nach dem Cursor ein. Halten Sie den Cursor genau dort, wo er ist, ohne die Sprungliste zu ändern.

Eine andere Lösung besteht darin, einfach eine Verknüpfung zu erstellen, die das unbenannte Register mit einer neuen Zeile füllt. Dann können Sie einfach die Befehle put, p oder P verwenden, um Zeilenumbrüche einzufügen. Beispielsweise:

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

Mein Mapping dafür

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

Anders als bei statox, da sich der Cursor an derselben Stelle befindet.

Kevin
quelle
was tut <silent>bedeuten?
Alex
Es verhindert, dass etwas in die Statuszeile zurückgesendet wird. Ich bin mir ziemlich sicher, dass es in diesem speziellen Fall nichts bringt, es war einfach da, wo ich es ursprünglich kopiert habe, vor langer Zeit. Sehen :h map-silent.
Kevin
-1

Meine persönliche Lösung fügt ein Zeilenumbruchzeichen in das Ausdrucksregister ein, fügt es nach der aktuellen Zeile ein und springt dann an die ursprüngliche Position zurück:

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