Jak wstawić nowy wiersz bez wychodzenia z trybu normalnego

24

Zastanawiam się, czy mogę wstawić nową linię bez wychodzenia z trybu normalnego. Na przykład mam dwie linie:

this is line one
this is line two

Kursor znajduje się na pierwszej linii. Teraz chcę nową linię między linią pierwszą a linią drugą, jak poniżej:

this is line one

this is line two

Wiem, że kiedy jestem w trybie normalnym, mogę po prostu nacisnąć o. Ale to wejdzie w tryb wstawiania.

Jak mogę wstawić nową linię i pozostać w trybie normalnym?

Alex
źródło

Odpowiedzi:

10

Używam do tego mapowania:

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

W ten sposób możesz wstawić linię pod kursorem za pomocą <Leader>oi jedną w poprzedniej linii za pomocą <Leader>O.

Uwaga: Można argumentować, że wymaga to tyle samo naciśnięć klawiszy, ile, o<Esc>ale mam nadzieję, że wybrałeś swojego lidera, aby ułatwić tego rodzaju mapowanie. Nie jestem też pewien, czy istnieje wbudowany sposób na wykonanie tego.

statox
źródło
8

Rozwiązanie, które nie przechodzi przez tryb wstawiania, nie porusza kursorem i pozwala na użycie licznika do dodania kilku linii jednocześnie ( 3\oitp.):

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
źródło
6

Jeśli nie chcesz dodawać mapowań, możesz pociągnąć yypustą linię, a następnie wkleić pdla kursora poniżej i Ppowyżej kursora.

Gilbert
źródło
To prawdopodobnie najlepsza odpowiedź bez mapowania.
Willem van Ketwich,
Lub zapisz go w orejestrze za pomocą "oyyi wklej stamtąd, gdy zajdzie taka potrzeba "op.
mike23
5

Osobiście polecam korzystanie z wtyczki Tima Pope'a Unimpaired . Zapewnia wiele mapowań, ale są to te, których szukasz, [<space>i ]<space>które tworzą puste linie odpowiednio powyżej i poniżej bieżącej linii. Unimpaired zapewnia również ładne mapowania do poruszania się po liście poprawek, liście buforów, przełączaniu opcji i wielu innych. Zobacz :h unimpairedwięcej.

Jeśli nie chcesz używać nieuszkodzonej wtyczki, ale podobnie jak poniższe mapowania, w ~/.vimrcpliku możesz umieścić kilka szybkich mapowań :

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
źródło
4

Moje mapowanie wykorzystuje Shift-Enter. Różni się od innych tym, że kursor powraca do tej samej linii i kolumny za pomocą znaku 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
źródło
5
Zauważ, że mapowanie <S-Enter>nie działa w emulatorach terminali (działa tylko w gVim). Musisz więc wybrać inną kombinację klawiszy, aby ją
przypisać
2

Ta odpowiedź Maxima Kim odmieniła życie:

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

i mój riff na ten temat:

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

Umieść te linie w swoim vimrc. Następnie przejdź na początek drugiej linii pliku i uderzyć Space, Enterlub udać się do końca pierwszej linii i nacisnąć Shift+Space, Enter. Albo doda pustą linię między pierwszą a drugą linią i pozostawi cię w trybie normalnym.

Możesz ich również użyć do dowolnego innego pojedynczego klawisza - naciśnij klawisz Spacelub kliknij Shift+Spaceodpowiedni klawisz, który odpowiednio go wstawi lub doda.

cxw
źródło
2

Te mapowania zrobią dokładnie to, czego szukasz.

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

Wprowadzają one n nowych znaków przed lub za kursorem; utrzymywanie kursora dokładnie tam, gdzie jest, bez zmiany listy skoków.

Innym rozwiązaniem jest po prostu utworzenie skrótu, który wypełnia bezimienny rejestr nową linią. Następnie możesz po prostu użyć poleceń put, p lub P, aby wstawić znaki nowej linii. Na przykład:

nnoremap "<cr> :let @@="\n"<cr>
Eric
źródło
1

Moje mapowanie tego

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

Różni się od statox, ponieważ utrzymuje kursor w tym samym miejscu.

Kevin
źródło
co <silent>znaczy
Alex
Zapobiega odbijaniu echa na linii statusu. Jestem pewien, że nie robi nic w tym konkretnym przypadku, był tam, skąd go pierwotnie skopiowałem, dawno temu. Zobaczyć :h map-silent.
Kevin
-1

Moje osobiste rozwiązanie wstawia znak nowej linii do rejestru wyrażeń i wkleja go po bieżącej linii, a następnie przeskakuje z powrotem do pierwotnej pozycji:

nnoremap K m`"="\n"<CR>p``
alxndr
źródło