包含工具: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 这样的插件来对搜索结果做快速替换等操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。