2010-09-22 8 views
6

Sto scrivendo uno script in cui voglio controllare le ricerche a livello di codice e ottenerle evidenziate. I risultati della funzione search() non sono evidenziati (credo), quindi l'utilizzo di tale funzione non mi è utile.Controllo ricerca ed evidenziazione Vim da uno script

Quello che voglio fare è usare il comando 'normal /' per cercare una variabile, ma non sembra essere semplice. Posso lo script del comando:

execute 'normal /' . my_variable . '\<CR>' 

(o altre varianti come suggerito nella punta vim qui: http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching)

ma non fa nulla. Riesco a vedere il termine di ricerca corretto in basso nella riga di comando dopo l'esecuzione della riga di script, ma il focus è nel documento, il registro di ricerca non è stato alterato e il cursore non ha effettuato alcuna ricerca. (Sembra che lo < CR> non venga immesso, anche se non viene emesso alcun errore - e sì, ho provato a usare anche il letterale^M)

Posso almeno controllare il registro di ricerca facendo questo:

execute 'let @/ ="' . a:term .'"' 

e poi la cosa più ovvia sembra essere quello di fare un:

normal n 

Ma che 'n normale' non fa nulla se l'eseguo in uno script. L'impostazione del registro di ricerca funziona, se premo manualmente "n" dopo che lo script termina la ricerca avviene (e l'evidenziazione appare, dato che hlsearch è attivo). Non mi interessa nemmeno se il cursore è posizionato, voglio solo che il pattern di registrazione sia evidenziato. Ma varie combinazioni di "set hlsearch" nello script non funzionano neanche.

So che potrei usare 'match()', ma voglio farlo funzionare con l'evidenziazione di ricerca regolare, e mi chiedo cosa sto facendo male. Deve essere qualcosa di semplice ma non lo vedo. Grazie per qualsiasi aiuto.

+0

Ho provato il mio comando di ricerca. 'execute" normal/^ --- \ "' funziona. Ma 'esegui 'normale/^ --- \ '' no. – ppan

risposta

3

Se lo script utilizza funzioni, allora questa citazione da :help function-search-undo è rilevante: ""

L'ultimo utilizzo modello di ricerca e il comando Redo non verrà modificato dalla funzione. Questo anche implica che l'effetto di: nohlsearch è annullato quando la funzione restituisce.

Vim cerca di solito di ripristinare il modello di ricerca (e poche altre cose) quando una funzione termina, spesso è possibile aggirare il problema aggiungendo il n (di ricerca successiva) per la fine di una mappatura, o utilizzando :map <expr> e con la funzione restituire la sequenza di tasti da eseguire.

1

A un esame più attento, sembra che lo \<CR> non venga rilevato tra virgolette singole.Provare a utilizzare questo, invece:

execute 'normal /' . my_variable . "\<CR>" 
+0

Grazie. Sono abbastanza sicuro che è stata la prima cosa che ho provato, e non ha funzionato. Penso che tu abbia il problema nella tua altra risposta in cui identifica il problema con la modifica del modello di ricerca in una funzione. Tutti i comandi con cui ho riscontrato il problema sono all'interno di una funzione, quindi controllerò per confermare. –

3

run:

lasciare @/= a: searchStr

da dentro la funzione quindi eseguire

normale n

dall'esterno della funzione (al suo interno non fa nulla) ad es.

comando -nargs = * Hs chiama MySearch() | normale n

oppure è possibile utilizzare:

set hlsearch

invece di normale n, se non si vuole muovere il cursore

(non riesco a capire un altro modo per farlo senza avere qualcosa al di fuori della funzione.)

+0

Lo stavo cercando da così tanto tempo. Una cosa così difficile per Google. La tua risposta ha funzionato perfettamente e fa esattamente quello che voglio! – Dan

Problemi correlati