Методы в git grep и vim

Примечание: помечено как сообщество wiki

Я код в vim.

Я использую git; и любовь git grep.

Есть ли у кого-нибудь особенно хороший набор методов/скриптов для использования git grep внутри vim?

Читатели: пожалуйста, поддержите ответы с участием vim + git grep; пожалуйста, уменьшите ответы, связанные с редакторами, отличными от vim, и редакторами, ссылающимися на внешние инструменты, кроме git grep.

Ответы

Ответ 1

У вас есть этот расширение 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>)

Вы также можете ограничить поиск файлов, соответствующих шаблону (git выполнит сопоставление с образцом):

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

Дополнения:

Следующее дополнение будет запускать git grep в слове под курсором при нажатии Ctrl + X G.

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

Ответ 2

Также проверьте fugitive.vim - обертка Git настолько велика, что она должна быть незаконной
(это его официальная строка тегов;)), от Тим Папа (см. Git проект репо):

Он включает среди многих других команд один для 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

Ответ 3

В том же наборе Git инкапсуляции (включая git grep) у вас есть:

MinSCM: абстрактный интерфейс для Mercurial/Git/Bazaar, от Такеши НИШИДА:
См. Его 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: (недоступно)

Ответ 4

У вас также есть этот набор команд vim, из проекта Git git grep vim, от tjennings.
(вдохновленный ack.vim: плагин для модуля Perl/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>)

Ответ 5

Я нашел 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 файл