到目前为止,我一直在使用查找和替换操作手动重构代码
%s:/stringiwanttoreplace/newstring/g
在 vim.
但是,如果我在特定目录内的许多文件中都有 stringiwanttreplace,这是一个缓慢而费力的过程。
我当前/典型的缓慢而费力的过程涉及一个 grep:-
grep -rn "stringiwanttoreplace" .
在我的终端中显示 stringiwanttoreplace 所在的所有位置/文件名;现在我知道哪些文件包含 stringiwanttoreplace,我将一个一个地打开每个文件以在每个文件中执行查找和替换操作。
是否有更有效的工作流程(在 vim 中)来完成这项工作?
澄清:我更喜欢基于 vim 的解决方案,而不是 bash 脚本/单行。
最佳答案
这是我将使用的完整命令序列:
/stringiwanttoreplace
:vimgrep /<c-r>// **
:Qargs
:argdo %s//newstring/g
:argdo update
在第一行中,我们搜索目标模式。这将填充最后一个搜索模式寄存器 (
:help quote/
),这意味着我们不必再次完整地输入它。:vimgrep
命令在整个项目中搜索指定的模式。输入 <c-r>/
作为 ctlr+r 后跟/- 这会将最后一个搜索模式寄存器的内容插入命令行。第一个和最后一个/
符号是搜索字段的分隔符。尾随**
告诉 Vim 查看当前目录下的每个文件和目录。此时,quickfix 列表将填充来自所有匹配文件的搜索匹配项。
:Qargs
是一个自定义命令,它使用 quickfix 列表中列出的所有文件填充参数列表。这是实现:command! -nargs=0 -bar Qargs execute 'args ' . QuickfixFilenames()
function! QuickfixFilenames()
" Building a hash ensures we get each buffer only once
let buffer_numbers = {}
for quickfix_item in getqflist()
let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])
endfor
return join(values(buffer_numbers))
endfunction
将其添加到您的
vimrc
文件。已运行
:Qargs
,我们的参数列表现在应该包含所有包含我们的目标字符串的文件。所以我们可以用 :argdo
运行替换命令, 在每个文件中执行命令。我们可以将替换命令的搜索字段留空,它会自动使用最新的搜索模式。如果需要,您可以包含 c
运行替换命令时标记,然后系统会提示您确认。最后,
:argdo update
命令保存已更改的每个文件。如@Peter Rincker指出,你应该确保 Vim 的 'hidden'选项已启用,否则在将任何更改写入事件缓冲区之前尝试切换到另一个缓冲区时会引发错误。
另外,请注意,最后 3 个命令可以在单个命令行中执行,方法是用竖线字符分隔它们。
:Qargs | argdo %s//replacement/gc | update
:Qargs
命令是从 this answer (由我),这反过来又受到 this answer 的启发由 DrAl .一个很similar solution由 @ib 发表,这表明 Vim 应该真正实现类似 :quickfixdo
的东西本地人。
关于vim - 使用 vim 在目录中重构类/方法/字符串的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7203963/