git grep和vim中的技巧

时间:2010-03-10 07:37:50

标签: git vim grep

注意:标记为社区维基

我在vim中编码。

我用git;并且喜欢git grep。

有没有人在vim中使用git grep有一套特别好的技巧/脚本?

读者:请upvote涉及vim + git grep的答案;请关注非vim编辑的答案,以及除git grep之外引用外部工具的编辑。

5 个答案:

答案 0 :(得分:9)

同时检查fugitive.vim - A Git wrapper so awesome, it should be illegal
(这是它的官方标记行;)),来自 Tim Pope (请参阅Git repo project):

在许多其他命令中,它包括一个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

答案 1 :(得分:7)

你确实有这个VIM extension(由 Timo Hirvonen 创建于2006年!)

  

git grep <pattern>在当前选定的git分支中搜索模式   这会添加:G <pattern>命令以在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>)
  

您还可以限制搜索与模式匹配的文件(git将执行模式匹配):

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

加法:

     

当按下 Ctrl + X G 时,以下添加将对光标下的单词运行git grep

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

答案 2 :(得分:2)

仍然在同一套Git封装中(包括git grep),你有:

来自MinSCM : An abstract front-end for Mercurial/Git/Bazaar

Takeshi NISHIDA
见他的Git repo

alt text http://bitbucket.org/ns9tks/vim-minscm/wiki/log.png

:MinSCMGrep[!]                  (Default mapping: \sg)
  

搜索指定的图案并创建| quickfix |列表。

     

使用过的SCM命令〜

     
      
  • hg:grep -n
  •   
  • git:grep -n -e
  •   
  • bzr :(不可用)
  •   

答案 3 :(得分:1)

您还可以从git grep vim的Git项目 tjennings 获得这组vim命令。
(灵感来自ack.vim : Plugin for the Perl module / CLI script 'ack'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>)

答案 4 :(得分:0)

我发现gist会在快速修正窗口中打开来自git grep的结果来跳转:

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

只需将要点的内容添加到~/.vimrc文件

即可