Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim中的重构_Vim_Refactoring - Fatal编程技术网

Vim中的重构

Vim中的重构,vim,refactoring,Vim,Refactoring,当然,您可以在IDE上进行重构这一事实对许多人来说是无价的,我很少在编写代码时进行重构,但我可能会在编辑其他人的源代码时尝试进行重构。如何在Vim中跨多个文件完成这样一项琐碎的任务 我找到了重构Ruby的方法,但是“任何”语言呢?我同意“Vim不是IDE”的范例。但有时没有IDE。以下是我在这些情况下使用的方法: 免责声明:自从我写下这个答案以来,语言服务器协议服务器、linter和fixer无处不在,这也给Vim(和其他编辑器)带来了一些强大的重构功能。在我看来,它们与您在专门构建的IDE中看

当然,您可以在IDE上进行重构这一事实对许多人来说是无价的,我很少在编写代码时进行重构,但我可能会在编辑其他人的源代码时尝试进行重构。如何在Vim中跨多个文件完成这样一项琐碎的任务


我找到了重构Ruby的方法,但是“任何”语言呢?

我同意“Vim不是IDE”的范例。但有时没有IDE。以下是我在这些情况下使用的方法:

免责声明:自从我写下这个答案以来,语言服务器协议服务器、linter和fixer无处不在,这也给Vim(和其他编辑器)带来了一些强大的重构功能。在我看来,它们与您在专门构建的IDE中看到的功能相比还有很长一段路要走(我更喜欢这些特性)。有关更多信息,请参阅此问题的其他答案

:grep,:vimgrep,:GrepperAg,:Ggrep 重构更多地涉及我通常在项目树上使用的常规替换,然后再进行重构-:g和:s是不需要动脑筋的。通常,它可以让我轻松地快速修改大量文件。老实说,我使用这种方法比其他任何方法都多

根据您的工作流程,内置命令可能速度慢/不方便。如果您使用git,那么您将希望使用优秀的插件及其
:Ggrep
命令只搜索签入git的文件。我还喜欢它的快速性和搜索不可知性(支持ag、sift等)

:argdo、:cdo和:bufdo 并且可以方便地在一组文件上执行vim命令

命令行 当很难通过
:vimgrep
确定需要更改的文件列表时,我求助于命令行grep/find命令来更精确地管理需要重构的文件列表。将列表保存到文本文件中,并使用
:e
和宏录制的mashup进行所需的更改

我发现,我的宏记录技能越不生疏,我就越觉得Vim对重构有用:从寄存器保存/恢复、递增/递减寄存器计数器变量、清理/保存宏记录以供以后使用等等


更新

自从写了这篇文章之后,我所描述的方法的更多视频已经发布在vimcasts.org上(我鼓励您观看)。对于重构,请关注以下内容:


也是一种很好的实践方式。

我是为通用重构而写的。它仍然需要许多改进。在将来的某个时候,我会尝试放弃CTAG,转而使用clang进行C&C++重构。

也许不是最优雅的解决方案,但我发现它非常方便:我使用它连接VIM和Eclipse。当然,我所有的源代码编辑都是在VIM中完成的,但是当需要重构时,可以利用Eclipse在这方面的优越能力


试试看。

我用vim编写了很多C/C++代码。我做的最常见的重构是重命名变量、类名等。通常,我使用
:bufdo:%s/source/dest/g
在文件中进行搜索/替换,这与大型IDE提供的重命名几乎相同。
然而,在我的例子中,我发现我通常重命名类似的实体,以不同的形式拼写(如CamelCase、snake_case等),因此我决定编写一个小实用程序来帮助进行这种“智能案例”搜索/替换,它是托管的。这是一个命令行实用程序,不是vim的插件,我希望您能发现它很有用。

C-Family
  • 尝试为c族重命名重构插件。它基于clang,但有一些限制,插件被标记为已弃用

    Clighter建议的映射是

    nmap r:call clighter#Rename()
    
    注意,后续插件已删除中的重命名功能

  • 如果你使用neovim,你可以看看这个插件。它表明

     nmap <silent> <Leader>r :call ClampRename()<CR>
    
    nmap r:call ClampRename()
    

  • 对于重构,如果您正在使用(并且应该使用),那么您可以使用并使其变得非常简单。检查此项以演示其工作原理。一旦设置了工作流,就可以进行一些映射来优化它(而不是像在视频中那样键入大多数内容)。

    Python 对于python语言,以下插件为vim提供了“智能”重命名功能:

    • 绝地维姆()
      r
    • ropevim
      ()
      CTRL-c r
    • python模式
      ()
      :h pymode rope重构

    两个插件的组合:,查找所有文件并将结果放入“快速修复”窗口,将更改保存在“快速修复”窗口中,并使其自动保存所有文件的更改。

    Plugin Factorus 还有另一个专门用于重构的vim插件,名为factorus,可在上获得

    目前(2017-12),它支持以下语言

    • c
    • 爪哇,和
    • 蟒蛇
    (LSP) 语言服务器协议包含跨项目智能重命名符号的功能:

    例如,以下语言服务器支持此功能:

    • 对于C++
    • 对于C/C++/Objective-C
    • 对于Java
    • (带绳索)用于Python
    • 对于类型脚本
    • 对于Ruby
    • Go的官方lsp(2019年11月阿尔法阶段)
    • 对于乳胶
    您可以在下找到更多语言服务器

    维姆 在vim中使用它们需要一个vim编辑器客户端。存在以下选项:

  • (需要生锈)建议映射:

     nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
     " Remap for rename current word
     nmap <leader>rn <Plug>(coc-rename)
    
    与Ale类似,不建议使用映射。但是,您当然可以定义如下

     nmap <leader>r <plug>(lsp-rename)
    
  • 另请参见有助于LSP的

    Neovim对lsp的初始内置支持始于 nnoremap <silent> <Plug>(ale_rename) :ALERename<Return>
     :LspRename
    
     nmap <leader>r <plug>(lsp-rename)
    
     'Rename': 'gR'
    
    :Rename <newname>
    
    :Refactor extract newfunc
    
    " Symbol renaming.
    nmap <leader>rn <Plug>(coc-rename)