2010-09-22 12 views
6

J'écris un script dans lequel je veux contrôler les recherches par programmation et les mettre en surbrillance. Les résultats de la fonction search() ne sont pas mis en surbrillance (je pense), donc l'utilisation de cette fonction n'est pas utile pour moi. Ce que je veux faire est d'utiliser la commande 'normal /' pour rechercher une variable, mais cela ne semble pas être simple. Je peux la commande de script:Commande de recherche et de surlignage Vim à partir d'un script

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

(ou d'autres variations comme le suggère la pointe de vim ici: http://vim.wikia.com/wiki/Using_normal_command_in_a_script_for_searching)

mais il ne fait rien. Je peux voir le terme de recherche correct dans la ligne de commande après l'exécution de la ligne de script, mais le focus est dans le document, le registre de recherche n'a pas été modifié et le curseur n'a fait aucune recherche. (Il semble que le < CR> ne soit pas entré, bien qu'aucune erreur ne soit lancée - et oui, j'ai aussi essayé d'utiliser le littéral^M.)

Je peux au moins contrôler le registre de recherche ceci:

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

et la chose évidente semble être de faire:

normal n 

Mais ce n normal »ne fait rien si je le lance dans un script. Le réglage du registre de recherche fonctionne, si j'appuie manuellement sur 'n' après la fin du script, la recherche se fait (et la surbrillance apparaît, puisque hlsearch est activé). Je ne m'inquiète même pas si le curseur est positionné, je veux juste que le modèle de registre soit mis en évidence. Mais diverses combinaisons de 'set hlsearch' dans le script ne fonctionnent pas non plus. Je sais que je pourrais utiliser 'match()', mais je veux le faire fonctionner avec un surlignage de recherche normal, et je me demande ce que je fais mal. Ça doit être quelque chose de simple mais je ne le vois pas. Merci pour toute aide.

+0

J'ai essayé ma commande de recherche. 'execute" normal/^ --- \ "' fonctionne. Mais 'execute 'normal/^ --- \ ' 'ne fonctionne pas. – ppan

Répondre

3

Si votre script utilise des fonctions, cette citation de :help function-search-undo est pertinent:

Le dernier motif de recherche utilisé et la commande redo « » ne sera pas modifié par la fonction. Cela aussi implique que l'effet de: nohlsearch est annulé lorsque la fonction renvoie.

Vim tente généralement de réinitialiser le modèle de recherche (et quelques autres) lorsqu'une fonction se termine, souvent, vous pouvez contourner ce problème en ajoutant la n (recherche suivante) à la fin d'une cartographie, ou en utilisant :map <expr> et ayant votre fonction retourne la séquence de touches à exécuter.

1

En y regardant de plus près, il semble que \<CR> ne soit pas repris dans les guillemets simples.Essayez d'utiliser ceci:

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

Merci. Je suis à peu près sûr que c'était la première chose que j'ai essayée, et ça n'a pas marché. Je pense que vous obtenez le problème dans votre autre réponse où vous identifiez le problème avec la modification du motif de recherche dans une fonction. Toutes les commandes avec lesquelles j'ai un problème sont dans une fonction, donc je vais vérifier pour confirmer. –

3

course:

let @/= a: searchStr

à l'intérieur de votre fonction puis exécutez

n normale

de l'extérieur de votre fonction (à l'intérieur il ne fait rien), par exemple.

commande -nargs = * Appel H MySearch() | normal n

ou vous pouvez utiliser:

ensemble hlsearch

au lieu de la normale n si vous ne voulez pas déplacer le curseur

(je ne peux pas travailler une autre façon de le faire sans avoir quelque chose en dehors de la fonction.)

+0

Je cherchais ça pour si longtemps. Une chose si difficile à Google. Votre réponse a parfaitement fonctionné et fait exactement ce que je veux! – Dan