Vim中的重构
当然,您可以在IDE上进行重构这一事实对许多人来说是无价的,我很少在编写代码时进行重构,但我可能会在编辑其他人的源代码时尝试进行重构。如何在Vim中跨多个文件完成这样一项琐碎的任务Vim中的重构,vim,refactoring,Vim,Refactoring,当然,您可以在IDE上进行重构这一事实对许多人来说是无价的,我很少在编写代码时进行重构,但我可能会在编辑其他人的源代码时尝试进行重构。如何在Vim中跨多个文件完成这样一项琐碎的任务 我找到了重构Ruby的方法,但是“任何”语言呢?我同意“Vim不是IDE”的范例。但有时没有IDE。以下是我在这些情况下使用的方法: 免责声明:自从我写下这个答案以来,语言服务器协议服务器、linter和fixer无处不在,这也给Vim(和其他编辑器)带来了一些强大的重构功能。在我看来,它们与您在专门构建的IDE中看
我找到了重构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
nmap r:call clighter#Rename()
注意,后续插件已删除中的重命名功能
nmap <silent> <Leader>r :call ClampRename()<CR>
nmap r:call ClampRename()
对于重构,如果您正在使用(并且应该使用),那么您可以使用并使其变得非常简单。检查此项以演示其工作原理。一旦设置了工作流,就可以进行一些映射来优化它(而不是像在视频中那样键入大多数内容)。Python 对于python语言,以下插件为vim提供了“智能”重命名功能:
- 绝地维姆()
r
()ropevim
CTRL-c r
()python模式
:h pymode rope重构
- c
- 爪哇,和
- 蟒蛇
- 对于C++
- 对于C/C++/Objective-C
- 对于Java
- (带绳索)用于Python
- 对于类型脚本
- 对于Ruby
- Go的官方lsp(2019年11月阿尔法阶段)
- 对于乳胶
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)
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)