VIM代码重构插件 PK

代码重构

代码重构(Code refactoring)说起来挺高深的,实际上要求程序员在编辑上面的工作是:需要大量的修改原项目源文件中大量变量、结构体的名称,需要经常用到替换,全局搜索,全局替换。

最近我折腾下vim在这方面的相关配置,欢迎交流。

vim下的代码重构插件

全局搜索

首先vim自带的vimgrep是非常慢的,所以我们通常是使用外部工具类似egrep,后来我们发现一个搜索神器the_silver_searcher,命令行的叫做ag。

ag搜索速度神快,ag可以用在ctrlp.vim插件上,让Ctrlp在linux源码下第一次4秒内就索引搞定,下一次都是秒开。

1
2
3
4
5
6
7
8
"use ag as the ctrlp command
let g:ctrlp_user_command = 'ag %s -l --nocolor --nogroup --hidden
\ --ignore .git
\ --ignore out
\ --ignore .svn
\ --ignore .hg
\ --ignore .DS_Store
\ -g ""'

当然ag也可以集成到其它需要进行搜索的插件上比如说unite.vim,ctrlsf.vim

vim的ag命令wrapper插件ag.vim

另外一个搜索很快的工具是ack,wrapper插件是ack.vim

ack2它也可以非常方便的集成到上面提到的基于文本搜索插件上面。这让有选择恐惧症的我和其它一些人非常难抉择,但我最后选择了ag,因为ag只有两个字母(==!)。

这篇是对比文章:何不 Ack?Grep, Ack, Ag的搜索效率对比

多光标编辑

vim-multiple-cursors,天王级别的插件,安装好之后,你只需要记住一个normal模式下的快捷键Ctrl-n就行,然后鼠标移动到想要进行编辑的单词下面按下Ctrl-n既能选择,再按一次自动选中下一个同样的单词,选中完毕之后进入插入模式然后替换成新的单词。

example

比如上面的示意图在,vim操作的序列是:2Gfp<C-n><C-n><C-n>cname

可是,这个插件只能在当前buffer下进行,加上ag或者ack2这些搜索神器,我们还是不能很方便的进行全局替换。

全局替换

方案一ctrlsf.vim + vim-multiple-cursors

首先是ctrlsf.vim,这个插件既能搜索,也能在搜索结果中进行直接编辑然后替换,加上vim-multiple-cursors这个插件我们就可以实现迅速的在整个项目进行快速的全局替换了。

ctrlsf+multipleCursors

方案二ag.vim+vim-multiple-cursors+vim-qfreplace

1
2
3
4
5
"默认不打开quickfix
let g:ag_qhandler=""
"在normal模式下某个单词下,按下`<leader>vr`搜索结果将呈现在Qfreplace窗口上,`<leader>vv`则用quickfix来显示搜索结果方便跳转。
nnoremap <leader>vr :exec ":Ag '\\b" . expand("<cword>") . "\\b'" . " ."<cr>:Qfreplace<cr>
nnoremap <leader>vv :exec ":Ag '\\b" . expand("<cword>") . "\\b'" . " ."<cr>:copen 10<cr>

做了以上设置之后,我们就可以在Qfreplace上使用vim-multiple-cursors的功能来进行全局替换了。

方案三vim-easygrep

当然这个插件也是可以指定搜索的命令行的,比如说指定用ag来搜索。

1
2
let g:EasyGrepCommand=1
set grepprg=ag\ --nogroup\ --nocolor

使用简介:

normal模式下按下<Leader>vr就能取当前光标的单词执行全局搜索并弹出提示进行模式替换。

normal模式下按下<leader>vv就能全局搜索当前光标下单词。

示例gif图(大图可能加载比较慢):

easygrep

总结

方案一:替换是比较直观可以看到除了替换单词之外前后几行。

方案二:比较简洁,插件代码量比较少。

方案三:只需要一个插件。

问题来了

要选哪个方案?你们怎么进行代码重构的?