Chcę wstawić tekst w ten sposób:
similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...
Wiem, że mogę wkleić tekst wiele razy, a następnie użyć podstawienia, aby zmienić pojedyncze słowo dla każdej linii, jednak nadal uważam tę metodę za bardzo niewygodną.
Czy istnieje sposób, aby zapisać słowo lub listę słów w „zmiennej”, a następnie użyć tej zmiennej do wygenerowania podobnego tekstu?
EDYCJA Zrobiłem coś niejasnego w pierwotnym pytaniu, w rzeczywistości staram się stworzyć bardzo podobne definicje funkcji, więc wordA
wordB
... może pojawić się wiele razy w każdym klonie tekstu, a tekst może zawierać wiele wierszy. wzór jest dokładnie taki:
similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...
(tekst może zawierać nowe wiersze, a słowo A, słowo B ... może istnieć wiele razy)
2. EDYCJA Części „podobnego_tekstu” mogą być inne za każdym razem, gdy wykonuję taką pracę, więc rozwiązaniem dla tej pracy jest lepsze wykorzystanie. Ponieważ próbuję stworzyć bardzo podobne definicje funkcji lub ciąg znaków do tabeli mapowania funkcji.
Po przeczytaniu odpowiedzi i pewnej praktyce uznaję, że wygodniej jest myśleć o tym zadaniu jako pewnego rodzaju zamianie, ponieważ oddzielne „część 1”, „część 2” ... „część N”, która może zawierać znaki nowej linii, jest trudne do napisania, więc napisz najpierw szablon:
similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )
Następnie próba umieszczenia klonów tekstu, ale zamiana $ WORD na listę słów jest bardziej prosta.
Wygląda więc na to, że mój problem zmienił się na „jak sklonować blok tekstowy wiele razy, ale za każdym razem, zastępując w nim słowo kluczowe słowem z listy?”
źródło
Odpowiedzi:
Możesz użyć następującej funkcji:
W zmiennych
firstpart
isecondpart
wstaw tekst do powtórzenia przed słowami i po nich, a na liściewords
wstaw słowa, które powinny się zmienić.Następnie pętla utworzy zawartość wiersza dla każdego słowa listy, wstawi wiersz do bufora i przejdzie do tego nowego wiersza.
Następnie można po prostu wywołać funkcję:
call GenerateLines()
.Edycja Aby ułatwić manipulację, możesz również przekazywać różne części jako argumenty, funkcja powinna wyglądać następująco:
Możesz to tak nazwać:
źródło
call map(a:words, 'a:firstpart . v:val . a:secondpart')
icall append(line('.'), a:words)
.Moja strategia w takich przypadkach będzie się różnić, ale często obejmuje następujące kroki:
Wpisz unikalne słowo (słowa), np
Zarówno
a) przeszukaj i zamień, np
b) lub użyj trybu blokowania wizualnego, patrz
:h blockwise-visual
. W szczególności wybieram słowa i używamI
do wstawiania podobnego tekstu na początku lubA
dodawania podobnego tekstu po.Twierdziłbym, że ta strategia ma sens, gdy wykonuje się tego rodzaju zadania edycyjne stosunkowo rzadko. Jeśli jednak często musisz to robić, postępuj zgodnie z sugestią @ statox za pomocą funkcji, która rozszerza listę słów.
źródło
:read
zastąpienie go ma sens.Będę argumentować, że jest to zadanie dla bloku wizualnego ( Ctrl+ v). Najpierw napiszę wszystkie wyraźne słowa:
Zaczynając od pierwszego kursora,
w
wykonałbym:Mogę kontrolować, ile kolumn potrzebuję, naciskając
A <esc>p
tyle razy, ile chcę. Załóżmy, że potrzebowałem trzech kolumn, tak jak pokazuje powyższe polecenie. Teraz mamy to:I kursor znajduje się na początku 3.
wordA
w pierwszym wierszu. Następnie zablokowałbym wybranie kolumny białych znaków między kolumnami cofającymi się i dodającymi tekst pomiędzy nimi. Z bieżącej lokalizacji kursora:Powoduje to (% oznacza pozycję kursora):
Powtórz dla następnej kolumny:
I ostatnia / pierwsza (ta po lewej stronie) kolumna:
Ostatecznie skutkując:
Aktualizacja: dodano screencast
Wydaje się, że to dużo pisania, ale w rzeczywistości bardzo łatwo się przyzwyczaić. Zapewnia swobodę zmiany liczby słów, liczby kolumn, a nawet odstępów między kolumnami.
Wadą jest to, że musisz znać liczbę różnych słów, których używasz. Mam na
5
stałe wszystkie polecenia powyżej, ponieważ jest to liczba wierszy, na których działają polecenia.Uwaga debugowania: wszystkie polecenia zaczynają się i kończą w trybie normalnym, jeśli znajdziesz się w trybie wizualnym lub wstawisz na końcu polecenia, robisz coś źle.
źródło