包含工具:git,ag,bash,vim

增强版 git grep

  • --no-index --exclude-standard 支持搜索未加入版本控制但是忽略 gitignore 的文件

  • 通过 sed awk 的处理让 git grep 支持显示列,后面会需要

#! /bin/bash
git --no-pager grep --no-color --no-index --exclude-standard -n $1 | while read git_grep; do

  file_and_line=$(echo "$git_grep" | cut -d : -f 1,2)
  match=$(echo "$git_grep" | sed 's/[^:]*:[^:]*:\(.*\)/\1/')
  column=$(echo "$match" | awk "{print index(\$0, \"$1\")}")

  echo "$file_and_line:$column:$match"
done

保存为 grepprg

让 vim 使用 grepprg 做 grep

    set grepprg=grepprg\ $*
    set grepformat=%f:%l:%c:%m

让 vim 使用 ag 做 grep

    set grepprg=ag\ --vimgrep\ $*
    set grepformat=%f:%l:%c:%m

通过映射命令灵活切换 ag 和 grep

nnoremap <leader>ag :call <SID>SwitchGrepCmd()<cr>
let g:g:grep_using_git = 0
function! s:SwitchGrepCmd()
  if g:grep_using_git
    set grepprg=ag\ --vimgrep\ $*
    let g:grep_using_git = 0
    echohl Identifier | echon 'grep by ag' | echohl None
  else
    set grepprg=grepprg\ $*
    let g:grep_using_git = 1
    echohl Identifier | echon 'grep by git' | echohl None
  endif
endfunction

添加快捷命令搜索完成时自动弹出 quickfix 列表

用自定义 Ag 命令执行 vim grep

command! -nargs=+ -bar -complete=file Ag silent! grep! <args>|cwindow|redraw!

自定义操作命令快速搜索

可以减少搜索所需输入

vnoremap <leader>g :<C-u>call <SID>GrepFromSelected(visualmode())<cr>
nnoremap <leader>g :<C-u>set operatorfunc=<SID>GrepFromSelected<cr>g@

function! s:GrepFromSelected(type)
  let saved_unnamed_register = @@
  if a:type ==# 'v'
    normal! `<v`>y
    let g:grep_word = @@
  elseif a:type ==# 'char'
    normal! `[v`]y
    let g:grep_word = '\b' . @@ . '\b'
  else
    return
  endif
  silent execute "Ag '" . g:grep_word ."'"
  let @@ = saved_unnamed_register
endfunction
  • <leader>giw 可搜索光标下单词

  • v***<leader>g 可搜索选中字符串

使用 Unite 控制 quickfix 列表

首先需要安装 unite-location 插件

修改自定义 Ag 命令为:

command! -nargs=+ -bar -complete=file Ag silent! grep! <args>|execute "Unite -buffer-name=quickfix quickfix"

让 Unite 的 quickfix 列表选中后不要退出

call unite#custom#profile('quickfix', 'context', {
  \  'no_quit': 1
  \ })

添加映射快速控制 Unite 列表

function! s:ToggleUnite()
  for i in range(1, winnr('$'))
    let name = bufname(winbufnr(i))
    if match(name, '^\[unite\]') == 0
      UniteClose
      return
    endif
  endfor
  UniteResume
endfunction

" <space>u 显示/关闭列表
nmap <silent> <space>u :call <SID>ToggleUnite()<cr>

" [count]<space>j/[count]<space>k  在上/下 count(默认为 1) 个列表项上执行默认操作,对于 quickfix 来说就是跳转
nmap <space>j :<C-u>call <SID>Jump(v:count1, 'Next')<cr>
nmap <space>k :<C-u>call <SID>Jump(v:count1, 'Previous')<cr>

function! s:Jump(count, dir)
  execute a:count . 'Unite' . a:dir
endfunction

简单些可以直接配置 unite 的 grep 使用 ag 命令,我放弃那种用法是因为不想再为它做单独的搜索设置,另外vim-qargs 这样的插件来对搜索结果做快速替换等操作。


chemzqm
2k 声望83 粉丝

Javascript全栈开发,产品设计,自动化工具。追求简洁的设计,模块化开发,卓越的用户体验。