Vim - szarpnij do rejestru wyszukiwania

81

Czy jest jakiś łatwy / szybki sposób na "szarpnięcie" do rejestru "ostatniego wyszukiwania" vima ("/)?

Z dokumentacji Vima wynika, że ​​odpowiedź brzmi nie, ale można ją przypisać poleceniem „let”:

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

Idealnie, co chciałbym zrobić, to coś takiego:

"/5yw

co spowoduje szarpnięcie kolejnych 5 słów pod kursorem i umieszczenie ich w ostatnim buforze wyszukiwania

Alternatywnie, jeśli istnieje sposób wyszukania zawartości nazwanego rejestru, to również zadziała. Innymi słowy, gdybym mógł:

"A5yw

a następnie wyszukaj to, co jest w rejestrze A, to też by działało.

Najbliżej mnie jest szarpnięcie do nazwanego rejestru, a następnie skopiowanie tego rejestru do ostatniego rejestru wyszukiwania, np

"A5yw
:let @/=@A

Ryzykując wydłużenie długiego pytania, chcę stwierdzić, że nie zawsze jest to 5 słów, które chciałbym „szarpnąć i wyszukać” - czasami jest to 17 znaków, czasami do końca linii itp. więc zakodowane na stałe makro nie daje mi takiej elastyczności, jakiej bym chciał.

Dan
źródło

Odpowiedzi:

110

Po naciśnięciu klawisza w /celu wprowadzenia ciągu wyszukiwania możesz użyć, Ctrl-Ra następnie wpisać literę reprezentującą rejestr, którego chcesz użyć.

na przykład.

  • Po pierwsze, "Ayw aby wyciągnąć słowo do rejestru A
  • Następnie, / ^R A aby umieścić zawartość rejestru A w ciągu wyszukiwania.
a'r
źródło
1
To oczywiście działa, ale wygląda na to, że OP może w rzeczywistości nie chcieć wyszukiwać, po prostu uzyskać wyróżnienie. W takim przypadku najlepszym rozwiązaniem byłby operator niestandardowy.
Cascabel
1
Super - dzięki ar ... właśnie tego potrzebowałem (no cóż, pod warunkiem, że idealne rozwiązanie w ogóle nie jest możliwe). Dzięki za zwięzłe rozwiązanie.
Dan
11
Tylko komentarz… „Ayw nie szarpie słowa do rejestru„ A ”… dołącza szarpaną rzecz do rejestru„ a ”.
jkerian
1
+1 szukałem tego od jakiegoś czasu, idealne rozwiązanie problemu, który próbowałem rozwiązać - dzięki.
iblamefish,
8
Dla jasności - vim używa wielkości liter w rejestrze, aby określić, czy jest on dołączany do zawartości, czy też zastępujący, więc "ayw(małe litery) zastąpiłyby zawartość rejestru „a”, podczas gdy "Aywdopisałby do rejestru „a”
Peter Gibson
40

Jeśli nie używałeś żadnego rejestru do przechowywania szarpanego tekstu, vim używa 0register. Możesz to wyszukać, wpisując Ctrl-R 0po /.

Bardziej skomplikowany przykład. Powiedz, że chcesz wyszukać w innym buforze tekst w cudzysłowach, który znajduje się teraz pod kursorem:

  • Możesz to zrobić za pomocą yi"(szarpnij wewnętrzny cytat)
  • Przejdź do bufora, w którym chcesz przeszukać
  • Rodzaj /Ctrl-R 0
csierra
źródło
1
Okazało się, że to rozwiązanie jest bardziej przydatne niż a'r, ponieważ wielokrotne przeprowadzanie "Ayw daje dołączony ciąg w rejestrze A. Ale zwykłe wpisanie, ywa następnie wpisanie Ctrl-R 0po, /zawsze daje dokładnie to, co wyszarpnąłem.
David Jung
10

Używam do tego następującego kodu:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction
Nikolay Frantsev
źródło
W przypadku, gdy nie jest to jasne, umożliwia to wybranie tekstu w trybie wizualnym i użycie znaku * lub # do wyszukania tego tekstu.
Edward Anderson
6

Wyszukiwanie zaznaczenia:

jeśli chcesz najpierw yankować odcinek linii, użyj "v" i przesuwaj kursorami aż zaznaczysz to, co chcesz, następnie naciśnij y, aby yankować i teraz wybór jest w rejestrze 0

możesz wpisać /Ctrl-R 0

serup
źródło
5

A więc w zasadzie rozszerzona wersja poleceń # i *, prawda? Wygląda na to, że chcesz zdefiniować niestandardowy operator (polecenie, które oczekuje ruchu). Nigdy tego nie robiłem, ale znalazłem wtyczkę, która wygląda na to, że może to ułatwić. Podano kilka przykładów.

Cascabel
źródło