Czy mogę usunąć całą linię, z wyjątkiem podziału linii?

33

Dość powszechną operacją dla mnie w vimie, ponieważ jestem kompulsywno-obsesyjny i lubię utrzymywać moje pliki wolne od białych znaków, jest usuwanie zawartości całej linii, ale nie samej linii (tj. Nie łamanie linii).

Czy istnieje wbudowany sposób, aby to zrobić? Być może d<movement command>operacja?

Jak dotąd najlepsze, jakie mam (na linii, o której mowa) 0d$. Czy jest szybszy sposób?

Andrew Ferrier
źródło
2
Alternatywą dla ręcznego przycinania białych znaków jest użycie wtyczki, takiej jak vim-better-whiteespace , która wyróżnia końcowe białe znaki, udostępnia polecenie ich usunięcia na raz, a nawet może to zrobić automatycznie po zapisaniu.
deltab
3
Nawet bez wtyczki możesz globalnie usunąć końcowe białe znaki za pomocą funkcji wyszukiwania i zamiany, np.:%s/\s*$//
Kyle Strand

Odpowiedzi:

34

Możesz użyć 0Dtego, przejdzie do pierwszego znaku w linii i usunie do końca linii. Pamiętaj, że możesz użyć, ^Djeśli chcesz pozostawić dowolne poprzednie białe znaki w spokoju. Nie można również powtórzyć tych operacji przy użyciu .. Jeśli chcesz operacji, którą można powtórzyć za pomocą .polecenia, zapoznaj się z odpowiedzią Dawida Pana.

Tematy pomocy:

  • :help 0
  • :help D
  • :help ^
Wiecznie zielone drzewo
źródło
4
Chociaż jest to bezpośrednie, do rzeczy i (prawdopodobnie) najmniejszej liczby naciśnięć klawiszy, nie można go powtórzyć za pomocą .polecenia. Z tego powodu uważam cc<Esc>lub S<Esc>jest bardziej atrakcyjny, jeśli zależy ci na powtarzaniu.
tommcdo
To prawda. Możesz jednak zapisać go jako makro i powtórzyć za pomocą ..
EvergreenTree
Zasadniczo makr nie można powtarzać za pomocą .. Działają tak, jakby te naciśnięcia klawiszy były wprowadzane interaktywnie, więc poszczególne polecenia są traktowane osobno. Użycie .spowoduje powtórzenie tylko ostatniego polecenia w makrze.
tommcdo
Przetestowałem to i nie tak to dla mnie działa. Jeśli zapisz makro, użyj go za pomocą @{reg}, możesz .później powtórzyć .
EvergreenTree
1
Powtarzasz tylko ostatnie polecenie makra, czyli D. Po 0Doperacji kursor pozostanie w kolumnie 0. Jeśli kursor znajduje się już na początku linii (po przejściu do innej), będzie wyglądać, jakby makro zostało poprawnie powtórzone. Spróbuj przesunąć kursor do przodu w linii i pisać .- zobaczysz, że tylko się powtarza D.
tommcdo
20

cc <Esc>zrobi, jak prosisz, ale jest więcej naciśnięć klawiszy niż 0D. Jeśli chcesz później umieścić coś w tej linii, ccbyć może najlepiej.

David Lord
źródło
2
Jeśli dodasz Shift, będzie to samo i być może łatwiejsze.
Holloway,
4
Chociaż nie jest to „najczystsze” rozwiązanie, ma jedną zaletę: jest to dokładnie jedna akcja, a więc można ją powtarzać za pomocą .polecenia. Natomiast 0D(jak sugeruje wybrana odpowiedź) są dwie akcje: 0ruch i Dpolecenie.
tommcdo
@Trengot jest prawdopodobnie łatwiejsze niż 0Ddla mnie, ponieważ mam jkmapowane <Esc>w moim vimrc, więc moje ręce nawet nie musiałyby wychodzić z rzędu.
EvergreenTree
1
Zobacz odpowiedź @Nobilis: Sjest udokumentowane jako „Synonim dla cc
Volker Siegel,
14

Sa następnie Ctrl+Club Escwydaje się spełniać dokładnie tę samą funkcję.

Można to następnie powtórzyć, .ponieważ stanowi pojedyncze działanie.

Nobilis
źródło
2
Właśnie myślałem o dodaniu tego jako odpowiedzi, a potem zobaczyłem twój
zadzwoniłem
7

0Djest prawdopodobnie tym, czego chcesz. Usunie się z kursora na koniec linii, pozostawiając linię (i wszelkie znaki przed kursorem) na miejscu.

SupBrah
źródło
Mimo że ta odpowiedź jest 0D
almos roczek
4

Zwykle używam ddO. ddaby usunąć bieżącą linię i O(to duże o), aby dodać nową linię.

Są to również 3 naciśnięcia klawiszy, ale ddliczą się tylko jako 1 i pół, i uważam, że Ołatwiej jest pisać niż $.

Różni się od 0Drozwiązania tym, że wykonuje automatyczne wcięcie, na przykład z tym kodem (gdzie !···jest tabulator i █ kursor:

def asd():
!···if foo:
!···!···foo()█
!···!···foobar()

0D zostawi cię z:

def asd():
!···if foo:
█
!···!···foobar()

I ddOzostawi cię z:

def asd():
!···if foo:
!···!···█
!···!···foobar()

A jeśli naciśniesz <Esc>natychmiast po tym, Vim powinien usunąć automatyczne wcięcie, więc masz to samo co z 0D.

Nie ma „poprawnego” sposobu, zależy to od tego, co dokładnie chcesz zrobić. Wolę, ddOponieważ jest bardziej elastyczny i ponieważ jest „w moich palcach” :-)

Martin Tournoij
źródło
2
^Dpozostawi białe znaki w spokoju.
EvergreenTree
Ponieważ Opozostawia cię w trybie wstawiania, jest to równoważne cc, z wyjątkiem bez automatycznego wcięcia .... chyba że twoja linia była już automatycznie wcięta.
Kyle Strand
Będzie to zachowywać się inaczej w ostatnim wierszu pliku.
tommcdo
0

I aby zapisać ten jeden cenny klawisz, którego możesz użyć, 0Cktóry usunie wszystkie znaki w bieżącym wierszu i przejdzie w tryb wstawiania.

Vlatko Šurlan
źródło