Jak skutecznie podzielić linię na wiele linii?

11

Otrzymywałem zarejestrowane dane w pliku tekstowym, który jest tylko jedną długą linią z każdą wartością oddzieloną spacją. Czy istnieje polecenie lub zestaw poleceń, które podzielą jedną linię na wiele linii?

Dom
źródło

Odpowiedzi:

21

Możesz po prostu zastąpić dowolną kolejną spacją w wierszu nową linią, używając polecenia :s/\s\+/\r/g. \s\+oznacza jeden lub więcej białych znaków i \rjest znakiem nowej linii, zobacz :help :substitutei :help regexpdla szczegółów. Jeśli uruchomisz polecenie w wierszu takim jak:

foo bar baz

Dostajesz:

foo
bar
baz

Jeśli masz hlsearchwłączoną opcję i nie chcesz zaśmiecać ekranu podświetlonymi spacjami, możesz napisać następującą funkcję, aby tego uniknąć:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
źródło
„Jeśli nie chcesz zaśmiecać ekranu podświetlonymi spacjami wszędzie”, to zbytnio zakłada konfigurację OP.
romainl
@romainl Better?
toro2k
1
Tak, lepiej IMO.
romainl
2
To jest \r, zobaczyć :help s/\r. Można go zastąpić literalnym pisaniem nowej linii <c-v><cr>. W tym kontekście \njest znakiem zerowym, patrz :help s/\n.
toro2k
1
replaces the content of the register- który rejestr?
stillanoob
5

Korzystanie vimz podstawienia jest prawdopodobnie jednym z lepszych sposobów wykonania zadania, ale możesz również użyć makra. Załóżmy, że mamy następujące dane z kursorem gdzieś w linii 1:

1 a b c d e f
~

Zaczynając w trybie normalnym, uderzenie qqrozpocznie nagrywanie makra na żądanie @q. Wszystko, co qqzostanie wpisane po, będzie powtarzalne za pośrednictwem wyżej wspomnianego połączenia. Naszym celem jest zapisanie normalnych poleceń, które będą na tyle ogólne, aby umożliwić płynne powtarzanie.

Możemy więc wpisać 0kursor na początek linii, a następnie fspaceprzesunąć kursor na pierwszą spację. To pozwala nam następnie pisać renter, w wyniku czego:

1 a
2 b c d e f
~

Trafienie qteraz jest dobrym pomysłem, ponieważ nasze makro wielokrotnego użytku jest gotowe do powtórzenia. Nieco arbitralnie zauważamy, że zostały 4 spacje do zastąpienia znakiem nowej linii. W ten sposób, uderzając, 4@qpowtarzamy qmakro 4 razy, co powoduje:

1 a
2 b
3 c
4 d
5 e
6 f
~

Należy pamiętać, że ze względu na sposób skonfigurować makro, to byłby bezpieczny, aby powtórzyć polecenie ponad 9000 razy, gdyż dotyczą tylko bieżącej linii, a ponieważ nie było miejsca na prawo od ostatniego wpisu danych fspacebędzie „ładnie” kończy się niepowodzeniem, uniemożliwiając zastąpienie danych nowymi liniami.

Powtarzam od początku:

qq0fspacerenterq9001@q

zapewnia nasz wynik.

HAL 9001
źródło
1
Uwielbiam to, że masz 9001klawisz na klawiaturze do szybkiego wpisywania nazwy użytkownika.
Bogaty
5

Najłatwiejszym sposobem podziału linii w Vimie jest polecenie trybu normalnego gq(wpisz obie litery szybko w trybie normalnym lub wizualnym).

W trybie wizualnym podzieli wszystko, co zostanie wybrane, w trybie normalnym wykonasz gqruch.

Na przykład gqlpodzieli jedną linię na aktualnie ustawioną szerokość. Aby ustawić szerokość linii podziału tak, aby różniła się od bieżącego ustawienia, możesz użyć :set textwidth=n, gdzie njest liczba znaków, którą chcesz w linii, np. 10I powrócić do normalnej szerokości po zakończeniu.

Mam te informacje z filmu na Youtube autorstwa Kholidfu, który pokazuje, jak łączyć i rozdzielać linie w trybie normalnym za pomocą ruchu.

Vdicarlo
źródło