Jak zastąpić tekst wewnętrzny szarpanym tekstem

17

Wzorzec edycji, z którym często się spotykam, jest następujący: Chcę przeciągnąć kawałek tekstu w cudzysłowie lub nawiasach i zastąpić ten fragment tekstu inną parą cudzysłowów / nawiasów.

Na przykład, jeśli chcę skopiować nazwę klasy foo bari wkleić ją gdzie indziej:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Wiem to: jeśli poruszam się w klasie zakresu, używam yi"do szarpania tekstu w cudzysłowie.

Teraz mam to w swoim rejestrze, więc powinienem być w stanie zastąpić nim zawartość klasy div. Ale nie mogę znaleźć przydatnego sposobu na zrobienie tego.

Jeśli użyję ciwtego, nadpisuję mój rejestr treściami do zmiany, więc tracę szarpany tekst.

Najlepszą rzeczą, jaką mogę wymyślić, jest przejście do pierwszego cytatu z klasy div, uderzenie p, a następnie usunięcie następnego cytatu za pomocą dt".

Zwykle jednak popsuję swoją pozycję i wklejam ją gdzieś w cudzysłowie, łącząc dwa ciągi i to psuje wszystko.

Mam nadzieję, że istnieje sposób, aby zrobić kombinację „zamień tekst wewnętrzny na moją szarpaną treść”, aby to ułatwić.

jurgenb
źródło

Odpowiedzi:

19

Możesz użyć, vi"pgdy jesteś w środku "". Może to zastąpić tekst w rejestrze szarpnięć, więc ma to znaczenie, gdy chcesz użyć oryginalnego szarpanego tekstu więcej niż jeden raz.

EDYCJA : Dodatkowe informacje z komentarza Octaviour dotyczące wielokrotnego użytku:

Aby to zrobić, szarpnąłbym do nazwanego rejestru, który tworzy dwie komendy: "ayi"i vi""apjeśli używasz rejestru a.

grodzik
źródło
2
Rozwiążę to rozwiązanie. Najpierw szarpiesz tekst, który chcesz skopiować. Następnie przejdź do miejsca, które chcesz wkleić, wizualnie wybierz za pomocą vi ". Polecenie wklejenia jednocześnie umieści zawartość kursora bez nazwy w kursorze i usunie zaznaczony tekst. Dlatego vi" p osiąga dokładnie to, co chcesz, ale zastępuje zawartość nienazwanego rejestru, uniemożliwiając dwukrotne wklejenie tego samego tekstu. W tym celu szarpnąłbym do nazwanego rejestru, który tworzy dwie komendy: „ayi” i vi „” ap, jeśli używasz register a.
Octaviour
Dziękuję za opracowanie. Pomaga literować rzeczy ruchami vim, ułatwia późniejsze zapamiętanie. To wciąż nie jest tak łatwe, jak się spodziewałem, ale ma sens. Wydaje się jednak, że użycie polecenia kropki, aby powtórzyć i szybko zastąpić drugi raz, nie działa. Miałem nadzieję, że to będzie skrót. :)
jurgenb
11

Możesz użyć rejestru numerowanego. Najpierw szarpnij „foo-bar” yi", który wypełni "0rejestr, patrz :h "0. Następnie zrób, ci"<c-r>0aby zastąpić zawartością rejestru 0.

Zobacz :h i_CTRL-Ropis ostatniej części.

Karl Yngve Lervåg
źródło
2
Dlaczego nie po prostu szarpać go w rejestrze bez nazwy ( yi") i wklejać z rejestru, w 0którym jest on przechowywany po usunięciu tekstu do zmiany ( ci"<c-r>0)? Jeśli chodzi o vimgolf, wygrywasz 2 naciśnięcia klawiszy i nie zadzierasz z rejestrami.
statox
jak tylko
naciśniesz
@ n3wjack To prawdopodobnie dlatego, że nie naciskałeś CTRL+rwcześniej a, to <c-r>znaczy.
statox
1
@ KarlYngveLervåg Właściwie ciwumieszcza usunięty tekst w rejestrze bez nazwy, ale rejestry są przesuwane, dlatego <c-r>0zamiast tego należy użyć <c-r>". Zobaczyć :h quote_number.
statox
1
Pomyślałbym bardziej konkretnie, że nie chodzi tu o rejestr nienazwany, ale o rejestr numerowany. "0Rejestr jest wypełniona tylko przez polecenie wycinania i nie będzie przeszkadzał np c.
Karl Yngve Lervåg
9

Oto inne rozwiązanie. Nie jest najlepszy pod względem Vimgolfa, ale używa rejestru czarnej dziury:

Gdy znajdziesz się na foo barsznurku, możesz go normalnie szarpać yi".

Następnie w nawiasach, aby zmienić: "_di"P

Który jest:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

Zaletą rejestru czarnej dziury jest to, że nie zepsuje on innych rejestrów. Zobacz :h quote_po więcej szczegółów.

(Pamiętaj, że ta odpowiedź jest tylko tutaj, aby porozmawiać o rejestrze zaciemnionym. Ja osobiście używam selekcji wizualnej, jak sugeruje @grodzik).

statox
źródło
Myślę, że potrzebujesz do tego dużej litery P. Kiedy będziesz di"kursor pozostanie na ostatnich cytatach i pwklei po, gdzie jak Pwklei przed bieżącą pozycją.
jecxjo,
@jecxjo Zgadza się, zredagowałem swoją odpowiedź, dzięki!
statox
8

Potrzebuję tego tak często, napisałem wtyczkę, aby uprościć i umożliwić maksymalną prędkość: ReplaceWithRegister .

Ta wtyczka oferuje polecenie dwa w jednym, grktóre zastępuje tekst objęty obiektem {motion} / text, całą linię (linie) lub bieżące zaznaczenie zawartością rejestru; stary tekst jest usuwany do rejestru czarnej dziury, tzn. zniknął. Przejrzysto obsługuje wiele skrzynek narożnych i pozwala na szybkie powtórzenie za pomocą standardowego .polecenia. Jeśli ci się to nie podoba, jego strona zawiera linki do alternatyw.

Ingo Karkat
źródło
Świetny! To powinien być waniliowy vim.
Philipp Moers,