在Vim重构
当然,你可以在IDE上重构这个事实对许多人来说是无价的,我编写代码时很less做,但是当编辑别人的代码时,我可能会尝试去做。 你如何在Vim的多个文件中完成这么简单的任务?
我发现这个插件重构Ruby,但是“任何”语言怎么样?
我同意'Vim不是IDE'的范例。 但有时候没有IDE。 以下是我在这些情况下使用的内容:
:grep,:vimgrep,:Ag,:Ggrep
与常规replace有关的重构我通常使用:在我的项目树上使用grep ,然后logging一个macros来执行重构 – :g和:s是无用的。 通常它会让我很快地修改大量文件。 老实说,我比其他任何人都更喜欢这种方法。
根据您的工作stream程,内置的命令可能会很慢/不方便。 如果你使用git,那么你会想使用优秀的Fugitive插件和它的:Ggrep
命令来只search检查到git的文件。 我也很喜欢Silver Searcher 。
:argdo,:cdo和bufdo
:cdo和:argdo可以方便地在一组文件上执行vim命令。
命令行
当通过以下方式确定需要更改的文件列表更难:vimgrep
我使用命令行grep / find命令来更精确地列出需要重构的文件列表。 将列表保存为文本文件,然后使用:e
和macroslogging的混搭来进行我需要做的更改。
我发现不那么生疏,我保持我的macros录制技能更有用,我发现Vim重构:感觉舒适的寄存器保存/恢复,递增/递减寄存器计数器variables,清理/保存macroslogging文件供以后使用等。
更新
由于为我描述的方法编写更多的video广播已经在vimcasts.org上发布(我鼓励你观看所有的Vimcast! )。 重构观看这些:
- 换人:颠覆
- 全项目search/replace
- 用vimgrepsearch多个文件
- 使用:argdo更改多个文件
Vimgolf也是练习的好方法。
C系列
试试这个插件 – > Clighter ,为c-family重命名 – 重构。 这是基于叮当,但有一定的局限性。 仍在发展中
build议由Clighter
nmap <silent> <Leader>r :call clighter#Rename()<CR>
python
对于python语言,下面的插件为vim提供了重构function:
-
jedi-vim
( github )<leader>r
-
ropevim
( github )CTRL-c rr
-
python-mode
( github ):h pymode-rope-refactoring
我为通用重构编写了这个插件 。 它仍然需要很多改进。 在将来的某个时候,我会尝试放弃ctags,转而使用Cng和C ++的重构。
也许不是最优雅的解决scheme,但我发现它非常方便:我使用ECLIM连接VIM和Eclipse。 当然,我所有的源代码编辑都是在VIM中完成的,但是当需要重构的时候,可以利用Eclipse的卓越可用性来解决这个问题。
试一试。
插件factorus
还有另外一个叫做factorus
( github )的重构vim插件。
目前(2017-07),它支持语言c,java和python。
我在vim中写了很多C / C ++代码。 我所做的最常见的重构是重命名variables,类名等。通常,我使用:bufdo :%s/source/dest/g
在文件中进行search/replace,这几乎与大提供的重命名相同IDE的。
然而,就我而言,我发现我通常会重命名类似的实体,拼写在不同的情况下(即CamelCase,snake_case等),所以我决定写一个小工具来帮助这种“智能”的search/取代,它在这里托pipe。 这是一个命令行工具,而不是vim的插件,我希望你能发现它有用。
对于重构,如果你正在使用Unite (你应该),那么你可以使用vim-qfreplace并使其变得非常简单。 检查这个video ,演示如何工作。 一旦你的工作stream程被设置,你可以做一些映射来优化它(而不是像在video中input大部分东西)。
两个插件的组合: vim-ripgrep ,用于查找文件并将结果放入quickfix窗口, quickfix-reflector将修改保存在quickfix窗口中,并自动保存每个文件的更改。
语言服务器协议(LSP)
专用语言服务器也允许重命名。 一个vim编辑器客户端是必要的,例如对于neovim请参阅https://github.com/autozimu/LanguageClient-neovimbuild议以下映射重命名:;
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>