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ć.

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.


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.


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).


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.


Świetny! To powinien być waniliowy vim.
Philipp Moers,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.