git grep和vim中的技巧

ano*_*non 15 git vim grep

注意:标记为社区维基

我在vim中编码.

我用git; 并且喜欢git grep.

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

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

Von*_*onC 9

检查 fugitive.vim - 一个Git包装器如此棒,它应该是非法的
(这是它的官方标记行;)),来自Tim Pope(参见Git repo项目):

它包括许多其他命令,一个用于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
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 7

你有这个VIM扩展(由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>)
Run Code Online (Sandbox Code Playgroud)

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

:G <pattern> -- '*.c'
Run Code Online (Sandbox Code Playgroud)

加法:

按下+ git grep时,将在光标下的单词上运行以下添加项.CtrlX G

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