V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tracyone
V2EX  ›  Vim

[选择困难户]VIM 代码重构插件 PK

  •  
  •   tracyone · 2016-03-02 23:00:10 +08:00 · 3387 次点击
    这是一个创建于 3188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码重构

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

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

    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既能选择,再按一次自动选中下一个同样的单词,选中完毕之后进入插入模式然后替换成新的单词。

    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

    "默认不打开 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 图(大图可能加载比较慢):

    easygrep

    总结

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

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

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

    问题来了

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

    第 1 条附言  ·  2016-03-05 00:49:44 +08:00
    方案三的体验不错,方案三也可以加入 qfreplace ……
    第 2 条附言  ·  2016-03-05 00:50:57 +08:00
    我最后淘汰了 ctrlsf , ag.vim
    11 条回复    2016-04-16 22:22:53 +08:00
    wklken
        1
    wklken  
       2016-03-02 23:13:33 +08:00
    一直在用方案一, 非常实用:)
    congeec
        2
    congeec  
       2016-03-02 23:20:52 +08:00 via iPhone
    难道重构不是根据语义来的?
    tracyone
        3
    tracyone  
    OP
       2016-03-02 23:37:13 +08:00 via Android
    @congeec 嘻嘻替换只是重构过程中的一部分而已,本文主题和内容其实关系不太大,😜
    cosven
        4
    cosven  
       2016-03-02 23:39:33 +08:00   ❤️ 1
    git grep + sed 也很好用
    congeec
        5
    congeec  
       2016-03-02 23:43:27 +08:00 via iPhone
    @tracyone 单文件的话,不需要插件。 vim 本身就能快速搞定
    tracyone
        6
    tracyone  
    OP
       2016-03-02 23:45:30 +08:00
    @congeec 单文件任何编辑器都可以啊
    tracyone
        7
    tracyone  
    OP
       2016-03-03 09:24:52 +08:00
    @cosven 你是说用纯命令行?如果是就不在讨论范围内了。
    cosven
        8
    cosven  
       2016-03-03 12:33:03 +08:00
    @tracyone vim 本身也可以运行这些命令啊
    tracyone
        9
    tracyone  
    OP
       2016-03-03 13:43:27 +08:00 via Android
    @cosven 当然可以,但是要有相应的封装啊,不然比较麻烦
    yuuko
        10
    yuuko  
       2016-03-04 23:42:12 +08:00
    在用方案一,其他的还没用过,以后可以试试
    pollow
        11
    pollow  
       2016-04-16 22:22:53 +08:00
    怎么可以靠文本替换做重构 /修改变量名😂分分钟崩溃给你看啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2665 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:59 · PVG 13:59 · LAX 21:59 · JFK 00:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.