2010-02-22 20 views
64

C'è un rapido modo semplice/a "Yank" nel registro di vim "ultima ricerca" ("/)Vim -? Tirare in cerca registrare

Dalla documentazione vim, sembra che la risposta è no, ma che può essere assegnato tramite un comando di "lasciare":

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. 

Idealmente quello che mi piacerebbe fare è qualcosa di simile:

"/5yw 

che tirare i prossimi 5 parole sotto il cursore & put esimo em nell'ultimo buffer di ricerca

In alternativa, se esiste un modo per cercare il contenuto di un registro con nome, anche questo funzionerebbe. In altre parole, se potessi fare:

"A5yw 

e quindi cercare quello che è nel registro A, che funzionerebbe anche.

Il più vicino a cui posso arrivare è di inserire un registro con nome & quindi copiare quel registro nell'ultimo registro di ricerca, ad es.

"A5yw 
:let @/[email protected] 

A rischio di fare una domanda lunga più, voglio dire che non è sempre 5 parole che mi piacerebbe "tirare & ricerca" - a volte è 17 caratteri, a volte è alla fine del la linea, ecc ... quindi una macro hard-coded non mi dà la flessibilità che vorrei.

risposta

81

Dopo aver premuto / per immettere una stringa di ricerca, è quindi possibile utilizzare Ctrl-R e quindi digitare la lettera che rappresenta il registro che si desidera utilizzare.

es.

  • In primo luogo, "Ayw a Yank una parola nel registro A
  • Poi, / ^R A di mettere il contenuto del registro A nella stringa di ricerca.
+0

Questa di lavori di corso, ma suona come il PO non può in realtà vuole ricerca, ottieni l'evidenziazione. Se questo è il caso, un operatore personalizzato sarebbe la strada da percorrere. – Cascabel

+0

Super - grazie ar ... questo è esattamente ciò di cui avevo bisogno (beh, sotto i vincoli che la soluzione perfetta non è effettivamente possibile in primo luogo.) Grazie per la soluzione concisa. – Dan

+0

@Jefromi - grazie per la tua risposta (sotto) e il tuo aiuto. Scusa, non avrei potuto essere abbastanza chiaro nella mia domanda iniziale, ma in realtà volevo questo per la ricerca e in realtà ho disattivato l'evidenziazione. Grazie per l'input però! – Dan

5

Quindi in pratica una versione estesa dei comandi # e *, giusto? Sembra che tu voglia definire un operatore personalizzato (un comando che si aspetta un movimento). Non l'ho mai fatto, ma ho trovato uno plugin che sembra possa rendere più semplice farlo. Ci sono alcuni esempi forniti.

9

sto usando seguente codice per questo:

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

    function! VisualSearch(dirrection) 
     let l:[email protected]@ 
     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 
+0

Nel caso in cui non sia chiaro, questo ti permette di selezionare del testo in modalità visuale, e usare * o # per cercare quel testo. –

23

Se non è stato utilizzato alcun registro per memorizzare il testo recuperato vim utilizza 0 registro. Puoi cercarlo digitando Ctrl-R 0 dopo il /.

Un esempio più complicato.Dire che si desidera cercare in un altro buffer per il testo tra virgolette, che è sotto il cursore in questo momento:

  • È possibile farlo con yi" (yank citazione interno)
  • Vai al buffer in cui si desidera Ricerca
  • Tipo /Ctrl-R 0
1

Ricerca di una selezione:

se si vuole a tirare prima una sezione di una linea, quindi utilizzare "v" e muoversi con cursori fino ad aver segnato ciò che si vuole, quindi premere Y per Yank e ora la selezione è nel registro 0

è possibile digitare /Ctrl-R 0