在我的.vimrc中添加一个简单的行我设法在vim缓冲区上用zip.vim打开一个ePub档案。这基本上打开了一个可以单独访问的htm,css,jpg,xml文件的编号列表。我想执行搜索并替换所有这些编号的文件,因为编辑它们并执行它太痛苦 - 大约有400个文件。 :args和:argdo没有真正起作用,或者至少我无法制作它们。有任何想法吗?
答案 0 :(得分:2)
我不确定它是否会对你有用,我将假设当你在Vim缓冲区内的文件路径上按Enter键时,会打开一个新的视口(由ZipBrowseSelect()
函数定义$VIMRUNTIME/autoload/zip.vim
)显示文件的内容。
如果是这种情况,您可以尝试以下方法。
:%argd
此命令删除当前arglist中的所有路径。
然后,您必须在视觉上选择包含要修改的文件的路径的所有行。例如,在正常模式下,您可以点击vip
,并根据需要调整视觉选择以排除某些行。
:'<,'>g/^/exe "norm \r" | argadd % | close
此命令应在视觉选择内的每一行上按Enter键,添加已在新视口中打开的文件,然后关闭后者以返回原始窗口。
:vim /pattern/ ##
此命令应填充quickfix列表,其中所有行都包含您正在查找的模式。
:cfdo %s/pattern/replacement/ge | update
此命令应在quickfix列表中的每个文件中用pattern
替换replacement
,如果文件已更改,则保存该文件。
最后一步使用Vim版本7.4.858中引入的:cfdo
命令。如果你的Vim版本不够新,无法支持:cfdo
,你可以绕过最后两步,直接执行:
:argdo %s/pattern/replacement/ge | update
好处:
:vim /pattern/ ##
:cfdo %s/pattern/replacement/ge | update
...是从不包含模式的文件中删除arglist,以便仅在需要时执行替换命令。
如果您没有:cfdo
但仍希望修剪arglist,则可以获取此自定义命令:
com! -nargs=0 -bar Qargs exe 'args '.s:qfl_names()
fu! s:qfl_names() abort
let buffer_numbers = {}
for qf_item in getqflist()
let buffer_numbers[qf_item['bufnr']] = bufname(qf_item['bufnr'])
endfor
return join(map(values(buffer_numbers), 'fnameescape(v:val)'))
endfu
我已从此视频中复制了它:Project-wide find and replace。 大多数其他命令也是从这个视频中获取的,所以如果你还没有,它可以帮助你看看它。
然后,您将使用:
替换:cfdo
命令
:Qargs
:argdo %s/pattern/replacement/ge | update
总而言之,您可以尝试以下三种方法之一:
:%argd
visually select the paths of the files
:'<,'>g/^/exe "norm \r" | argadd % | close
:argdo %s/pattern/replacement/ge | update
或者:
:%argd
visually select the paths of the files
:'<,'>g/^/exe "norm \r" | argadd % | close
:vim /pattern/ ##
:cfdo %s/pattern/replacement/ge | update
或者:
:%argd
visually select the paths of the files
:'<,'>g/^/exe "norm \r" | argadd % | close
:vim /pattern/ ##
:Qargs
:argdo %s/pattern/replacement/ge | update
编辑:
您也可以尝试直观地选择文件的路径,然后执行:
:'<,'>g/^/e `='zipfile:'.expand('%:p').'::'.getline(".")` | %s/pattern/replacement/ge | update | b#
此方法依赖于存档中文件的路径似乎遵循以下这一事实:
zipfile:/path/to/epub::path/to/file/in/archive
因此,您可以使用Vim表达式获取光标下文件的路径:
'zipfile:'.expand('%:p').'::'.getline(".")
您可以使用反引号编辑此文件(请参阅:h `=
):
:e `=Vim expression`
→
:e `='zipfile:'.expand('%:p').'::'.getline(".")`
从那里,您需要全局命令,在视觉选择内的每一行上重复编辑。
在我测试的epub中,所有路径都在mimetype
行之下。如果是这种情况,那么您可以在一个命令中合并两个步骤(视觉选择+全局命令):
1/mimetype/+,$g/^/e `='zipfile:'.expand('%:p').'::'.getline(".")` | %s/pattern/replacement/ge | update | b#
答案 1 :(得分:1)
我不确定,但这可以帮助你
在esc模式下尝试
:%s/word you want to search/word you want yo replace with/g