Jak mogę odwrócić kolejność linii, aby pierwsza linia pojawiła się na końcu, a ostatnia linia była pierwsza? (Mogą to być wszystkie wiersze w buforze, zakres adresów lub wybór trybu wizualnego linii).
Chciałbym się przekształcić
rat
ox
tiger
⋮
dog
pig
w
pig
dog
⋮
tiger
ox
rat
bez uciekania się do zewnętrznego polecenia, takiego jak tac
.
rearrangement
200_sukces
źródło
źródło
Odpowiedzi:
Siła globalna będzie działać tutaj:
Lub prościej (dzięki @tommcdo)
Pierwszy dopasuje każdą linię i dla każdej linii usunie ją i wklei na górze pliku. Gdy przesuwa się po pliku, odwraca tekst.
Drugi podobnie pasuje do każdej linii i przenosi ją na początek pliku.
Uwaga: Oba działają na całym pliku i nie będą poprawnie stosowane do odwracania podzbioru linii. Zobacz odpowiedź Ingo Karkat na rozwiązanie, które działa w określonym zakresie.
Opis:
g
polecenie globalne/^/
pasuje do dowolnego wiersza, który ma początek (tj. wszystkie wiersze)exe
wykonaj następujący ciąg"normal
wykonaj polecenia w trybie normalnymdd
usuńgg
przejście do góry plikuP
wklej powyżej aktualnej pozycjimove 0
przenosi bieżącą linię poniżej linii 0 (co umieszcza ją w pozycji 1 lub pierwszej linii pliku)źródło
:normal
polecenia możemy użyć polecenia Ex:move 0
, które przenosi linię na początek bufora.:execute
Jest to również konieczne tylko wtedy, gdy polecenie musi być budowane dynamicznie, np:execute 'normal' g:user_command
.:execute
ponieważ często kończę na dodawaniu innych poleceń Ex po istniejącym później, a wygodniej jest dla mnie mieć je:exe
tam, niż wracać i wstawiać je później. Niestety, nawyk ten wyciekł do tej odpowiedzi, gdzie nie dotyczy tak wiele.:execute
: ponieważ zajmuje ciąg, zapewnia jasne określenie, gdzie kończą się polecenia trybu normalnego, mimo że nie buduję łańcucha, łatwiej jest mi znaleźć zrównoważone znaki cudzysłowu niż szukać<esc>
lub cokolwiek, aby zakończyć tryb. Ponownie jest to osobiste preferencje i nawyk. :-):9,11g/^/move 8
... Ostatnią liczbą musi być początek zakresu minus 1 (na podstawie odpowiedzi Ingo).Ta linijka (dla ciebie
~/.vimrc
) definiuje:Reverse
polecenie; możesz również użyć tej:global
części bezpośrednio, ale składnia:move
(która iteracyjnie przesuwa linie do początku zakresu, a tym samym odwraca go) nie jest łatwa do zapamiętania:źródło
<line1>
&<line2>
są zobowiązane do tego, aby działało w pewnym zakresie, tj .::7,9Reverse
(są to cechycommand
, nieglobal
lubmove
). Prostsze:command! -bar -range=% Reverse :global/^/m 0
będzie również działać, ale tylko dla całego bufora ...Pure Vim:
Wyjaśnienie:
Źródło: Odwróć wszystkie linie i Moc g na vim wikia.
Kilka przykładów użycia zewnętrznych poleceń:
tac
(część GNU coreutils -cat
odwrócona):tail
na BSD / OSX (niezgodny z POSIX):Aby uzyskać więcej pomysłów, zobacz:
źródło
:g/^/m0
to samo:g/^/move 0
, co odpowiada John?tac
). Ale podejrzewam, że głosowanie było spowodowane powtórzeniem odpowiedzi.tac
zostało to wspomniane przez OP, ale wszystkie inne podobne pytania i tak byłyby takie same, więc warto o tym wspomnieć jeszcze raz. John wziął ten cmd z komentarza @tommcdo, początkowo wziąłem go z DerMike , ale myślę, że wziął go po prostu z Wikii, więc dałem kredyt vim Wikii, więc nie jest całkowicie duplikowany, ponieważ wyjaśnienie jest zupełnie inne.W duchu funkcjonalnego VimL:
getline(1, line('$'))
zwraca listę wszystkich linii w buforze.'$'
jest specjalnym argumentem, dlaline()
którego wskazuje ostatni wiersz w buforze.reverse(...)
odwraca listę wejściową w miejscu. Trzeba by użyć,reverse(copy(...))
jeśli lista wejściowa nie powinna być modyfikowana.setline(1, ...)
zastępuje określoną linię drugim argumentem. Gdy drugim argumentem jest lista, ta sama liczba wierszy co długość listy zostaje zastąpiona zawartością listy.Jeśli chcesz, możesz także zdefiniować polecenie, które ma zakres (domyślny
%
cały bufor)źródło
hlsearch
jest włączone), takich jak:g/
polecenie z innych odpowiedzi ... Może wydajność jest jednak gorsza? Ponieważgetline(1, line('$'))
pobiera cały bufor do pamięci.reverse()
wydaje się być na miejscu, więc powinno to zająć bardzo mało pamięci jako takiej ...Dokumentacja Vima usr_12.txt - Sprytne sztuczki
źródło
Używanie liczb względnych. Akapit zaczyna się od linii 13 i wysyła więcej 4 linii
źródło