代码重构(Code refactoring)说起来挺高深的,实际上要求程序员在编辑上面的工作是:需要大量的修改原项目源文件中大量变量、结构体的名称,需要经常用到替换,全局搜索,全局替换。
最近我折腾下 vim 在这方面的相关配置,欢迎交流。
首先 vim 自带的vimgrep
是非常慢的,所以我们通常是使用外部工具类似 egrep ,后来我们发现一个搜索神器the_silver_searcher,命令行的叫做 ag 。
ag 搜索速度神快, ag 可以用在ctrlp.vim插件上,让 Ctrlp 在 linux 源码下第一次 4 秒内就索引搞定,下一次都是秒开。
"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
既能选择,再按一次自动选中下一个同样的单词,选中完毕之后进入插入模式然后替换成新的单词。
比如上面的示意图在, vim 操作的序列是:2Gfp<C-n><C-n><C-n>cname
可是,这个插件只能在当前 buffer 下进行,加上 ag 或者 ack2 这些搜索神器,我们还是不能很方便的进行全局替换。
方案一:ctrlsf.vim + vim-multiple-cursors
首先是ctrlsf.vim,这个插件既能搜索,也能在搜索结果中进行直接编辑然后替换,加上vim-multiple-cursors这个插件我们就可以实现迅速的在整个项目进行快速的全局替换了。
方案二:ag.vim+vim-multiple-cursors+vim-qfreplace
"默认不打开 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 来搜索。
let g:EasyGrepCommand=1
set grepprg=ag\ --nogroup\ --nocolor
使用简介:
normal 模式下按下<Leader>vr
就能取当前光标的单词执行全局搜索并弹出提示进行模式替换。
normal 模式下按下<leader>vv
就能全局搜索当前光标下单词。
示例 gif 图(大图可能加载比较慢):
方案一:替换是比较直观可以看到除了替换单词之外前后几行。
方案二:比较简洁,插件代码量比较少。
方案三:只需要一个插件。
要选哪个方案?你们怎么进行代码重构的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.