Retool :Ggrep

This commit is contained in:
Tim Pope
2019-07-09 11:11:46 -04:00
parent bb05732d7f
commit 0a758c22b3

View File

@@ -3371,44 +3371,66 @@ function! s:LogComplete(A, L, P) abort
return s:CompleteSubcommand('log', a:A, a:L, a:P) return s:CompleteSubcommand('log', a:A, a:L, a:P)
endfunction endfunction
function! s:Grep(cmd,bang,arg) abort function! s:GrepParseLine(cached, name_only, dir, line) abort
let listnr = a:cmd =~# '^l' ? 0 : -1 if a:line =~# '^git: \|^usage: \|^error: \|^fatal: '
let grepprg = &grepprg return {'text': a:line}
let grepformat = &grepformat endif
try let entry = {'valid': 1}
let cdback = s:Cd(s:Tree()) let match = matchlist(a:line, '^\(.\{-\}\):\(\d\+\):\(\d\+:\)\=\(.*\)$')
let &grepprg = s:UserCommand() . ' --no-pager grep -n --no-color' if len(match)
let &grepformat = '%f:%l:%c:%m,%f:%l:%m,%m %f match%ts,%f' let entry.module = match[1]
if fugitive#GitVersion(2, 19) let entry.lnum = +match[2]
let &grepprg .= ' --column' let entry.col = +match[3]
let entry.text = match[4]
else
let entry.module = matchstr(a:line, '\CBinary file \zs.*\ze matches$')
if len(entry.module)
let entry.text = 'Binary file'
let entry.valid = 0
endif endif
let args = s:SplitExpand(a:arg) endif
exe a:cmd.'! '.escape(s:shellesc(args), '|#%') if empty(entry.module) && a:name_only
let list = s:GetLocList(listnr) let entry.module = a:line
for entry in list endif
if bufname(entry.bufnr) =~ ':' if empty(entry.module)
let entry.filename = s:Generate(bufname(entry.bufnr)) return {'text': a:line}
unlet! entry.bufnr endif
let changed = 1 if a:cached
elseif s:HasOpt(args, '--cached') let entry.module = ':0:' . entry.module
let entry.filename = s:Generate(':0:'.bufname(entry.bufnr)) endif
unlet! entry.bufnr if entry.module !~# ':'
let changed = 1 let entry.filename = fugitive#Find(':(top)' . entry.module, a:dir)
endif else
endfor let entry.filename = fugitive#Find(entry.module, a:dir)
if exists('changed') endif
call s:SetLocList(listnr, list, 'r') return entry
endif endfunction
if !a:bang && !empty(list)
return (listnr < 0 ? 'c' : 'l').'first' function! s:Grep(type, bang, arg) abort
else let dir = s:Dir()
return '' let listnr = a:type =~# '^l' ? 0 : -1
endif let cmd = s:UserCommandList(dir) + ['--no-pager', 'grep', '-n', '--no-color', '--full-name']
finally if fugitive#GitVersion(2, 19)
let &grepprg = grepprg call add(cmd, '--column')
let &grepformat = grepformat endif
execute cdback let args = s:SplitExpand(a:arg, s:Tree(dir))
endtry if exists(':chistory')
call s:SetLocList(listnr, [], ' ', {'title': (listnr < 0 ? ':Ggrep ' : ':Glgrep ') . s:fnameescape(args)})
else
call s:SetLocList(listnr, [], ' ')
endif
let tempfile = tempname()
exe '!' . s:shellesc(cmd + args)
\ printf(&shellpipe . (&shellpipe =~# '%s' ? '' : ' %s'), s:shellesc(tempfile))
let cached = s:HasOpt(args, '--cached')
let name_only = s:HasOpt(args, '-l', '--files-with-matches', '--name-only', '-L', '--files-without-match')
let list = map(readfile(tempfile), 's:GrepParseLine(cached, name_only, dir, v:val)')
call s:SetLocList(listnr, list, 'a')
if !a:bang && !empty(list)
return (listnr < 0 ? 'c' : 'l').'first'
else
return ''
endif
endfunction endfunction
function! s:Log(type, bang, line1, count, args) abort function! s:Log(type, bang, line1, count, args) abort
@@ -3474,8 +3496,8 @@ function! s:Log(type, bang, line1, count, args) abort
return '' return ''
endfunction endfunction
call s:command("-bar -bang -nargs=? -complete=customlist,s:GrepComplete Ggrep :execute s:Grep('grep',<bang>0,<q-args>)") call s:command("-bar -bang -nargs=? -complete=customlist,s:GrepComplete Ggrep :execute s:Grep('c',<bang>0,<q-args>)")
call s:command("-bar -bang -nargs=? -complete=customlist,s:GrepComplete Glgrep :execute s:Grep('lgrep',<bang>0,<q-args>)") call s:command("-bar -bang -nargs=? -complete=customlist,s:GrepComplete Glgrep :execute s:Grep('l',<bang>0,<q-args>)")
call s:command("-bar -bang -nargs=? -range=-1 -complete=customlist,s:LogComplete Glog :exe s:Log('c',<bang>0,<line1>,<count>,<q-args>)") call s:command("-bar -bang -nargs=? -range=-1 -complete=customlist,s:LogComplete Glog :exe s:Log('c',<bang>0,<line1>,<count>,<q-args>)")
call s:command("-bar -bang -nargs=? -range=-1 -complete=customlist,s:LogComplete Gllog :exe s:Log('l',<bang>0,<line1>,<count>,<q-args>)") call s:command("-bar -bang -nargs=? -range=-1 -complete=customlist,s:LogComplete Gllog :exe s:Log('l',<bang>0,<line1>,<count>,<q-args>)")