2010-02-15 6 views
3
Vim

Comment définir une fonction vim telle que lorsqu'elle est appelée avecrecherche pour la classe

Foo 

il recherche par vimgrep pour

\s*class Foo 

ou

\s*struct Foo 

?

[Voici cscope/ctag de poorman's; Je veux être en mesure de taper un nom de classe, et avoir la recherche de la classe.]

Si c'est facile, y a-t-il un moyen que je peux dire à regarder sous mon curseur pour utiliser ce 'mot' comme le nom à rechercher?

Merci!

+0

pourquoi ne pas utiliser CTags? – Artyom

Répondre

2

est ici un hack d'un novice de vim qui semble fonctionner:

function! SearchFunc() 
    let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g') 
    try 
    execute 'vimgrep /^\s*\(struct\|class\)\s*' . expand("<cword>") . '/ ' . l:filenames 
    catch 
    echon 'No results found.' 
    sleep 800m 
    endtry 
endfunction 
nmap <Leader>fi :call SearchFunc()^M 

Cela devrait chercher le mot sous le curseur lorsque vous tapez \ fi.

Expliciter le code:

Si vous appelez vimgrep normalement dans une fonction et il ne trouve pas de résultats, il renvoie une erreur qui semble assez laid, d'où je passai à l'intérieur d'un try/catch/endtry bloc. Quand une erreur se produit, nous supposons que c'est parce qu'il n'y avait pas de correspondance, et nous affichons un message, puis faisons une courte pause pour ne pas disparaître immédiatement. "Nmap" mappe une séquence de touches en "mode normal" pour faire quelque chose. Dans ce cas, il appelle la fonction que nous venons de définir. Vous devez taper Ctrl-V, Ctrl-M à la fin de la ligne pour créer le ^M, de sorte qu'il vous simule en appuyant sur retour.

Si vous souhaitez modifier la fonction de prendre un argument que vous pourriez changer comme ceci:

function! SearchFunc(findme) 
    let l:filenames = substitute(glob("*.c") . glob("*.cpp") . glob("*.h"), '\n', ' ', 'g') 
    try 
    execute 'vimgrep /^\s*\(struct\|class\)\s*' . a:findme . '/ ' . l:filenames 
    catch 
    echon 'No results found.' 
    sleep 800m 
    endtry 
endfunction 

Ensuite, vous pouvez l'appeler en tapant

:call SearchFunc('foo') 

Mais il semble plus facile pour utiliser simplement la fonctionnalité intégrée <cword>.

2

Vérifiez <cword> dans :h expand() fonction.

fun! MySearch() 
    exe 'vimgrep /\s*class '.expand('<cword>').'/ *' 
endfun 
Questions connexes