注意:标记为社区维基
我在vim中编码.
我用git; 并且喜欢git grep.
有没有人有一套特别好的技巧/脚本在vim中使用git grep?
读者:请upvote涉及vim + git grep的答案; 请关注非vim编辑的答案,以及除git grep之外引用外部工具的编辑.
检查 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)
你有这个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)