如何在用vim.zip打开的epub文件中搜索和替换

时间:2017-08-07 19:58:39

标签: vim vim-plugin

在我的.vimrc中添加一个简单的行我设法在vim缓冲区上用zip.vim打开一个ePub档案。这基本上打开了一个可以单独访问的htm,css,jpg,xml文件的编号列表。我想执行搜索并替换所有这些编号的文件,因为编辑它们并执行它太痛苦 - 大约有400个文件。 :args和:argdo没有真正起作用,或者至少我无法制作它们。有任何想法吗?

2 个答案:

答案 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