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?
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?
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 \r
jest znakiem nowej linii, zobacz :help :substitute
i :help regexp
dla szczegółów. Jeśli uruchomisz polecenie w wierszu takim jak:
foo bar baz
Dostajesz:
foo
bar
baz
Jeśli masz hlsearch
włą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
\r
, zobaczyć:help s/\r
. Można go zastąpić literalnym pisaniem nowej linii<c-v><cr>
. W tym kontekście\n
jest znakiem zerowym, patrz:help s/\n
.replaces the content of the register
- który rejestr?Korzystanie
vim
z 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: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:
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
q
makro 4 razy, co powoduje: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.
źródło
9001
klawisz na klawiaturze do szybkiego wpisywania nazwy użytkownika.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
gq
ruch.Na przykład
gql
podzieli 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
, gdzien
jest liczba znaków, którą chcesz w linii, np.10
I 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.
źródło