Jak wstawić podział wiersza w miejscu kursora bez wchodzenia w tryb wstawiania w Vimie?


88

Czy jest możliwe wstawienie końca linii, gdy kursor jest w Vimie bez wchodzenia w tryb wstawiania? Oto przykład ( [x]oznacza, że ​​kursor jest włączony x):

if (some_condition) {[ ]return; }

Czasami mogę chcieć wprowadzić więcej kodu. Więc naciskałem, iaby przejść do trybu wstawiania, naciśnij, Enteraby wstawić podział wiersza, a następnie usuwałbym dodatkową spację. Następnie wchodzę w tryb normalny i umieszczam kursor przed nawiasem zamykającym, a następnie robię to samo, aby umieścić go we własnym wierszu.

Robię to od jakiegoś czasu, ale na pewno jest na to lepszy sposób?


Chcesz coś wstawić bez przechodzenia do trybu INSERT?
Jeremy Cantrell

26
@ jeremy-cantrell Tak, tak jak "J" łączy się z następną linią i wstawia spację bez przechodzenia do trybu INSERT!
wendt

Odpowiedzi:


107

W podanym przykładzie możesz użyć rEnterdo zastąpienia pojedynczego znaku (spacji) klawiszem Enter. Następnie,fspace. aby przejść do następnego miejsca i powtórzyć ostatnie polecenie.

W zależności od ustawień automatycznego wcięcia powyższe może, ale nie musi, powodować wcięcie instrukcji return. Jeśli nie, użyj sEnterTabEsczamiast tego, aby zastąpić spację nowym wierszem, wciąć wiersz i wyjść z trybu wstawiania. Musiałbyś zastąpić drugą spację innym poleceniem, więc nie możesz użyć znaku „.” w tym przypadku.


1
Myślę, że to najłatwiejsze rozwiązanie. Dzięki Greg.
Mark A. Nicolosi

4
„f [spacja]” powinno być odpowiednikiem „W” (tj. przejść do następnego odstępu)
Nathan Fellman

4
„W” przesuwa się o jeden znak za daleko, przenosi się do następnego znaku po następnej spacji.
Greg Hewgill

1
Możesz także użyć >>i, <<aby pomóc w tworzeniu wcięć, jeśli nie chcesz przejść do trybu wstawiania z s.
Conner,

12

Oto jak utworzyć makro, które wstawia nową linię w miejscu kursora, gdy naciśniesz „g”, gdy nie w trybie wstawiania:

Z poziomu Vima wpisz:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Gdzie:

  • [Ctrl + V] oznacza przytrzymanie klawisza Ctrl i naciśnięcie „v”
  • [Enter] oznacza naciśnięcie klawisza Enter
  • [Esc] oznacza naciśnięcie klawisza Esc

U dołu okna vim zobaczysz następujące informacje, dopóki nie naciśniesz ostatniego Enter:

:map g i^M^[

Wyjaśnienie:

[Ctrl + V] oznacza „zacytować następujący znak” - pozwala na osadzenie nowej linii i znaków ucieczki w poleceniu.

Więc mapujesz klawisz „g” do sekwencji:

i [Enter] [Escape]

To jest vim do wstawiania nowej linii przed kursorem, a następnie wychodzenia z trybu wstawiania .

Poprawki:

  • Możesz zamienić „g” na dowolny znak, który nie jest jeszcze powiązany z poleceniem, którego używasz.
  • Dodaj więcej do polecenia, na przykład f}i^M^[O - to będzie f ind } a ja nsert kolejny przełamane, a następnie uciec z trybu wstawiania i O pióro pusty wiersz, aby wprowadzić więcej kodu.
  • Możesz dodać polecenie do pliku .vimrc lub .exrc, aby było trwałe. Po prostu pomiń dwukropek od początku, aby polecenie zaczynało się od „map”

Cieszyć się!


Odpowiedziałeś na źle sformułowane pytanie w temacie, zamiast tego w poście. Chce wiedzieć, jak łatwo pozbyć się białych znaków, które znajdowały się w miejscu, w którym linia została przerwana, ale nie służy już żadnemu celowi.
Arystoteles Pagaltzis

Dzięki. Zaktualizowano sekcję „Poprawki”, aby osiągnąć to, o co (jak sądzę) zażądał autor. Kiedy to przetestowałem, vi automatycznie usunęło dla mnie dodatkowe spacje; użyj „x”, aby je usunąć, jeśli nie masz. I dlaczego polecenia vi wyglądają jak szum linii modemu? :-)
Adam Liss

11

Proste mapowanie do przerwania linii przy kursorze przez naciśnięcie Ctrl + Enter:

:nmap <c-cr> i<cr><Esc>

zasadniczo wchodzi w tryb „wstawiania”, wstawia podział wiersza i wraca do trybu normalnego.

umieść go w swoim pliku .vimrc do wykorzystania w przyszłości.


5

Jeśli zwykle rozbudowujesz blok z jednej linii do trzech, spróbuj podstawić. Zmień nawias otwierający na powrót / powrót, a nawias zamykający na powrót / nawias.

Polecenie zastępowania nawiasu / powrotu nawiasem wygląda następująco:

:s/{/{\r/

Ponieważ chcesz tego często używać, możesz odwzorować pełną sekwencję na nieużywane naciśnięcie klawisza w następujący sposób:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Tam, gdzie zobaczysz ^ M w sekwencji, wpisz [Ctrl-V] , a następnie naciśnij enter .

Teraz, gdy kursor znajduje się w dowolnym miejscu linii próbnej, naciśnij klawisz mapowania, a znaki powrotu karetki zostaną dodane.

Sprawdź :help map-which-keysporady dotyczące wybierania nieużywanych skrótów klawiszowych do mapowania.


BTW: gnie jest mapowany, ponieważ jest używany jako klucz 'przestrzeni nazw' dla wielu mapowań vima składający się z dwóch naciśnięć klawiszy (zobacz :h g). Więc to mapowanie nie jest możliwe.
Hotschke

Czy istnieje dobre polecenie, które zgłasza, że gjest już używany jako klucz „przestrzeni nazw”?
lenistwo

Nie w szczególności. Jak powiedziałem, :help gjest jednym ze sposobów wyświetlenia listy domyślnych g+ mapowań. z, [ ]to kolejne klucze „przestrzeni nazw”, patrz np :help index. Możesz wywołać, :verbose map gaby zobaczyć wszystkie aktualnie zdefiniowane mapowania zaczynające się od g. Pomocne zasoby internetowe to viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (slajdy: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke

3

Zakładając, że nie przeszkadza ci mapowanie Kna coś innego (wybierz inny klucz, który ci się podoba) i użycie markera 'jako tymczasowego znacznika jest w porządku, dlaczego tego nie zrobić?

:nmap K m'a<CR><Esc>`'

teraz naciśnięcie K w trybie normalnym nad znakiem, po którym ma nastąpić podział wiersza, spowoduje podzielenie wiersza i pozostawienie kursora w miejscu, w którym się znajdował.


1

Vim automatycznie zabije każdą białą spację na prawo od kursora, jeśli złamiesz linię na pół, gdy autoindent(lub jakakolwiek inna pomoc przy wcięciach) jest włączona.

Jeśli nie chcesz korzystać z żadnej z tych ustawień, użyj szamiast iw celu s ubstitute nowy tekst do wykroju, a nie tylko włożenie. (Jeśli jest wiele spacji, umieść kursor na skrajnej lewej stronie i użyj cwzamiast tego).


1

Zasadniczo, kiedy dzielisz wiersz, chcesz po prostu wstawić powrót karetki lub w przypadku, gdy jesteś w spacji, zamień go na powrót karetki. Cóż, po co zadowalać się jednym lub drugim? Oto moje mapowanie dla K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Używam operatora trójargumentowego, aby skondensować te dwie akcje w jedną kluczową mapę. Rozbicie go <expr>oznacza, że ​​wyjście mapy klawiszy może być dynamiczne iw tym przypadku zależy od warunku, getline('.')[col('.')-1]==' 'który jest długim sposobem zapytania vima, czy znak pod kursorem jest spacją. Wreszcie, znany operator trójskładnikowy ? :zastępuje spację r<CR>znakiem przełamania wiersza ( ) lub wstawia nowy ( i<CR><Esc>)

Teraz masz piękną siostrzaną mapę klawiszy do Jpolecenia.


To jest całkiem sprytne. Nie jestem pewien, czy kiedykolwiek celowo użyłem K, ale może to sprawić, że warto się go pozbyć lub zmienić w innym miejscu.
dragon788

0

Ustaw to mapowanie kluczy w swoim vimrc

:map <C-m> i<CR><Esc>h

Następnie naciśnij Ctrl + m, jeśli chcesz go użyć w swoim vimie.


0

IMHO, wbudowane mapowanie gsnie jest użytecznym mapowaniem (uśpij vima), można by użyć tego do rozdzielenia:

nmap gs i<CR><ESC>

0

W Vrapper możesz użyć gql, który podzieli linię bez wchodzenia w tryb wstawiania, ale może nie zawsze zachować wcięcia.


0

W rzeczywistości potrzebujesz następujących połączonych operacji:

  1. Naciśnij, vaby przejść do trybu wizualnego
  2. Wybierz linię, którą chcesz podzielić
  3. Naciśnij, :aby wejść w tryb poleceń
  4. s/\s/\r/g
  5. Gotowe

0

Jeśli masz dane wejściowe:

aaa bbb ccc ddd

i chcesz drukować

aaa
bbb
ccc
ddd

Możesz użyć polecenia

f r<ENTER>;.;.

0

Okazało się, że jest to najwierniejsza realizacja tego, czego oczekiwałbym od przeciwnego zachowania J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Wykonuje uproszczoną nową linię w miejscu kursora, zajmuje się wszelkimi końcowymi spacjami w poprzedniej linii, jeśli są jakieś, a następnie przywraca kursor do właściwej pozycji.

i <cr> <esc> - jest to jedno z najczęściej sugerowanych rozwiązań, nie usuwa znaków niebędących spacjami pod kursorem, ale pozostawia również końcowe spacje

^mw - idź do początku nowej linii i stwórz znak pod w

gk - przejdź o jedną linię w górę

:silent! s/\v +$//<cr> - regex zamień wszystkie białe znaki na końcu linii

:noh<cr> - Usuń zaznaczenie wyszukiwania, które mogło być włączone przez wyrażenie regularne

`w - zwróć znak pod w

Zasadniczo łączy w sobie to, co najlepsze z obu r<esc><cr>ii<cr><esc>

Uwaga: mam to powiązanie, Sktóre potencjalnie zastępuje przydatny klucz, ale jest to synonim, cca ponieważ nie używam go tak często, jak dzielę, mogę go zastąpić.



-1

To mapowanie rozbije każdą posiadaną funkcję jednowierszową. Po prostu umieść kursor na linii i naciśnij „g” w trybie normalnym:

:map g ^f{malr<CR>`a%hr<CR>`a

Zakłada się, że masz spację po nawiasie otwierającym i spację przed nawiasem zamykającym. Sprawdź, czy to działa dla Ciebie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.