在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>