Wyobraź sobie, że mam następujący tekst:
some random stuff
* asdf
* foo
* bar
some other random stuff
Chcę zastąpić gwiazdki gwiazdkami liczbami, tak jak poniżej:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Jak można to zrobić w vimie?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
źródło
źródło
1.
? Więc:%s/^* /1. /
byłoby to zrobić. To wydaje się znacznie mniej pracy.Odpowiedzi:
Możesz spróbować wykonać następujące polecenie:
Najpierw inicjuje zmienną
c
(let c=0
), a następnie wykonuje polecenie globalne,g
które szuka wzorca^*
(początek linii, a następnie gwiazdka i spacja).Za każdym razem, gdy zostanie znaleziona linia zawierająca ten wzorzec, polecenie globalne wykonuje polecenie:
let c+=1 | s//\=c.'. '
zwiększa zmienną
c
(let c+=1
), a następnie (|
) zastępuje (s
) poprzednio wyszukiwany wzorzec (//
) oceną wyrażenia (\=
):zawartość zmiennej
c
połączonej (.
) z ciągiem'. '
Jeśli nie chcesz modyfikować wszystkich linii z bufora, ale tylko określony akapit, możesz przekazać zakres do polecenia globalnego. Na przykład, aby zmodyfikować tylko linie, których liczba wynosi od 5 do 10:
Jeśli masz plik zawierający kilka podobnych list, które chcesz przekonwertować, na przykład coś takiego:
Możesz to zrobić za pomocą następującego polecenia:
Jest to tylko wariant poprzedniego polecenia, które resetuje zmienną
c
po przełączeniu na inną listę. Aby wykryć, czy znajdujesz się na innej liście, zmiennad
służy do przechowywania numeru ostatniego wiersza, w którym dokonano podstawienia.Komenda globalna porównuje bieżący numer linii (
line('.')
) zd+1
. Jeśli są takie same, oznacza to, że znajdujemy się na tej samej liście, co poprzednio, więcc
jest zwiększana (c+1
), w przeciwnym razie oznacza to, że znajdujemy się na innej liście, więcc
jest resetowana (1
).Wewnątrz funkcji polecenie
let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
można przepisać w następujący sposób:Lub tak:
Aby zapisać niektóre naciśnięcia klawiszy, możesz również zdefiniować niestandardowe polecenie
:NumberedLists
, które akceptuje zakres, którego wartością domyślną jest1,$
(-range=%
):Kiedy
:NumberedLists
zostanie wykonany<line1>
i<line2>
zostanie automatycznie zastąpiony użytym zakresem.Aby przekonwertować wszystkie listy w buforze, wpisz:
:NumberedLists
Tylko listy między wierszem 10 a 20:
:10,20NumberedLists
Tylko wybór wizualny:
:'<,'>NumberedLists
Aby uzyskać więcej informacji, zobacz:
źródło
Działa to tylko z najnowszą wersją Vima (która ma
:h v_g_CTRL-A
):*
) i zastąpić je0
(kursor znajduje się na pierwszej*
)Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... i to wszystko :)
(Jeśli chcesz mieć kropkę po każdym numerze, zmień 1. krok do:
Ctrl-v
j
j
s
0
.
Esc
)źródło
Wybierz wizualnie linie i wykonaj następujące polecenie podstawiania:
Zobacz
:help sub-replace-expression
,:help line()
oraz:help '<
.Aby uniknąć konieczności wybierania linii, można użyć wyszukiwania wstecz i do przodu z przesunięciem w celu określenia zakresu podstawienia w następujący sposób:
Widzieć
:help cmdline-ranges
źródło
Inny sposób:
źródło
Możesz także zdefiniować niestandardowe operatory
Możesz zmapować je do kluczowych sekwencji
'*
i'#
. Znaki*
i#
nie istnieją, więc nie zastąpisz żadnej domyślnej funkcjonalności. Powodem wyboru'
jako prefiksu jest uzyskanie pewnego rodzaju mnemoników. Dodajesz znak / znak przed niektórymi liniami. I zwykle, aby przejść do znaku, używasz prefiksu'
.Działa również z trybu wizualnego.
Polecenia ex są dobre do pisania skryptów, ale do użytku interaktywnego normalny operator jest prawdopodobnie lepszy, ponieważ można go połączyć z dowolnym ruchem lub obiektem tekstowym.
Na przykład możesz przełączyć listę z gwiazdką lub znakiem minus w bieżącym akapicie, naciskając
'*ip
. Tutaj'*
jest operatorem iip
obiektem tekstowym, na którym działa.I rób to samo dla listy z liczbami w kolejnych 10 wierszach, naciskając
'#10j
. Tutaj'#
jest inny operator i10j
jest to ruch obejmujący linie, na których operator pracuje.Inną zaletą korzystania z niestandardowego operatora jest to, że możesz powtórzyć swoje ostatnie wydanie za pomocą polecenia kropki.
źródło