2010-03-10 4 views
15

Remarque: marqué comme wiki de communautétechniques dans git grep et vim

Code I dans vim.

J'utilise git; et j'adore git grep.

Quelqu'un at-il un ensemble de techniques/scripts particulièrement intéressants pour utiliser git grep à l'intérieur de vim?

Lecteurs: veuillez augmenter les réponses impliquant vim + git grep; Veuillez répondre par des réponses downvote impliquant des éditeurs non-vim, et des éditeurs faisant référence à des outils externes autres que git grep.

+2

+1 parce que je ne savais pas combien précieux 'grep' git était avant !! (J'utilisais 'ack-grep') – hasen

Répondre

6

vous avez cette VIM extension (créé par Timo Hirvonen en 2006!)

git grep <pattern> recherche un motif dans une branche git actuellement sélectionnée.
Ceci ajoute la commande :G <pattern> pour exécuter la commande depuis Vim.

func GitGrep(...) 
    let save = &grepprg 
    set grepprg=git\ grep\ -n\ $* 
    let s = 'grep' 
    for i in a:000 
    let s = s . ' ' . i 
    endfor 
    exe s 
    let &grepprg = save 
endfun 
command -nargs=? G call GitGrep(<f-args>) 

Vous pouvez également limiter la recherche aux fichiers correspondant à un motif (git fera la mise en correspondance de motif):

:G <pattern> -- '*.c' 

ajouts:

L'ajout suivant exécutera git grep sur le mot sous le curseur lorsque Ctrl + XG est enfoncé.

func GitGrepWord() 
    normal! "zyiw 
    call GitGrep('-w -e ', getreg('z')) 
endf 
nmap <C-x>G :call GitGrepWord()<CR> 
+0

C'est génial. Pouvez-vous poster plus/tout ce que vous avez sur ce sujet? Même si vous postez 9 lignes d'interface vim/git-grep "inutiles", ça vaut le coup pour l'astuce que j'utilise. – anon

+0

@anon: ajout d'un autre plugin Vim, comme demandé (voir ma deuxième réponse) – VonC

+0

Quand j'utilise, ce GitGrep, il cache d'abord mon écran vim, montre le résultat de git grep, puis après j'appuie sur une touche, me renvoie dans vim à la première ligne - est-il un moyen de passer directement à la première ligne (et de cacher la sortie git grep) – anon

1

Vous avez également cet ensemble de commandes de vim, du projet Git git grep vim, de tjennings.
(inspiré du ack.vim : Plugin for the Perl module/CLI script 'ack' de Miles Sterrett)

let g:gitgrepprg="git\\ grep\\ -n" 

function! GitGrep(args) 
    let grepprg_bak=&grepprg 
    exec "set grepprg=" . g:gitgrepprg 
    execute "silent! grep " . a:args 
    botright copen 
    let &grepprg=grepprg_bak 
    exec "redraw!" 
endfunction 

function! GitGrepAdd(args) 
    let grepprg_bak=&grepprg 
    exec "set grepprg=" . g:gitgrepprg 
    execute "silent! grepadd " . a:args 
    botright copen 
    let &grepprg=grepprg_bak 
    exec "redraw!" 
endfunction 

function! LGitGrep(args) 
    let grepprg_bak=&grepprg 
    exec "set grepprg=" . g:gitgrepprg 
    execute "silent! lgrep " . a:args 
    botright lopen 
    let &grepprg=grepprg_bak 
    exec "redraw!" 
endfunction 

function! LGitGrepAdd(args) 
    let grepprg_bak=&grepprg 
    exec "set grepprg=" . g:gitgrepprg 
    execute "silent! lgrepadd " . a:args 
    botright lopen 
    let &grepprg=grepprg_bak 
    exec "redraw!" 
endfunction 

command! -nargs=* -complete=file GitGrep call GitGrep(<q-args>) 
command! -nargs=* -complete=file GitGrepAdd call GitGrepAdd(<q-args>) 
command! -nargs=* -complete=file LGitGrep call LGitGrep(<q-args>) 
command! -nargs=* -complete=file LGitGrepAdd call LGitGrepAdd(<q-args>) 
9

Vérifiez aussi fugitive.vim - A Git wrapper so awesome, it should be illegal
(qui est son étiquette en ligne officielle;)), de Tim Pope (voir le Git repo project):

Il comprend , parmi beaucoup d'autres commandes, une pour un git grep:

call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Ggrep :execute s:Grep(<bang>0,<q-args>)") 
call s:command("-bar -bang -nargs=* -complete=customlist,s:EditComplete Glog :execute s:Log('grep<bang>',<f-args>)") 

function! s:Grep(bang,arg) abort 
    let grepprg = &grepprg 
    let grepformat = &grepformat 
    let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' 
    let dir = getcwd() 
    try 
    execute cd.'`=s:repo().tree()`' 
    let &grepprg = s:repo().git_command('--no-pager', 'grep', '-n') 
    let &grepformat = '%f:%l:%m' 
    exe 'grep! '.a:arg 
    let list = getqflist() 
    for entry in list 
     if bufname(entry.bufnr) =~ ':' 
     let entry.filename = s:repo().translate(bufname(entry.bufnr)) 
     unlet! entry.bufnr 
     elseif a:arg =~# '\%(^\| \)--cached\>' 
     let entry.filename = s:repo().translate(':0:'.bufname(entry.bufnr)) 
     unlet! entry.bufnr 
     endif 
    endfor 
    call setqflist(list,'r') 
    if !a:bang && !empty(list) 
     return 'cfirst' 
    else 
     return '' 
    endif 
    finally 
    let &grepprg = grepprg 
    let &grepformat = grepformat 
    execute cd.'`=dir`' 
    endtry 
endfunction 
0

J'ai trouvé un gist que les résultats ouverts de git grep dans un quickfix fenêtre pour sauter autour:

<C-x><C-x> runs grep for the word under the cursor 
:G <word> runs grep 
:Gi <word> runs grep as case-insensitive 

il suffit d'ajouter le contenu de l'essentiel à votre fichier ~/.vimrc