如何在用 vim.zip 打开的 epub 文件中搜索和替换
How to search and replace in epub file opened with vim.zip
在我的 .vimrc 中添加一个简单的行,我设法在 vim 缓冲区上用 zip.vim 打开一个 ePub 存档。这基本上打开了一个可以单独访问的 htm、css、jpg、xml 文件的编号列表。我想搜索并替换所有这些编号的文件,因为编辑每个文件并执行它太痛苦了 - 大约有 400 个文件。 :args 和 :argdo 并没有真正起作用,或者至少我做不到。有任何想法吗?
我不确定,但这可能会对你有所帮助
在 esc 模式下尝试
:%s/word you want to search/word you want yo replace with/g
我不确定它是否适合您,我假设当您在 Vim 缓冲区内的文件路径上按 Enter 键时,会打开一个新的视口(由 ZipBrowseSelect()
中定义的函数$VIMRUNTIME/autoload/zip.vim
)显示文件内容。
如果是这种情况,您可以试试下面的方法。
:%argd
此命令删除当前arglist 中的所有路径。
然后,您必须在视觉上 select 所有包含您要修改的文件路径的行。例如,在正常模式下,您可以点击 vip
,并根据需要调整视觉 selection 以排除一些行。
:'<,'>g/^/exe "norm \r" | argadd % | close
此命令应在您的视觉 selection 中的每一行上按 Enter,添加已在新视口中打开的文件,然后关闭后者以返回原始 window .
:vim /pattern/ ##
此命令应使用包含您要查找的模式的所有行填充 quickfix 列表。
:cfdo %s/pattern/replacement/ge | update
此命令应将 quickfix 列表中存在的每个文件中的 pattern
替换为 replacement
,如果已更改则保存文件。
最后一步使用 :cfdo
命令,该命令在 Vim 版本 7.4.858 中引入。如果你的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
总而言之,您可以尝试以下 3 种方法之一:
:%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
编辑:
您也可以尝试直观地select文件的路径,然后执行:
:'<,'>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(".")`
从那里开始,您需要全局命令,以在视觉 selection.
中的每一行重复编辑
在我测试的epub中,所有的路径都在mimetype
这一行下面。如果您是这种情况,那么您可以将 2 个步骤(视觉 selection + 全局命令)合并到一个命令中:
1/mimetype/+,$g/^/e `='zipfile:'.expand('%:p').'::'.getline(".")` | %s/pattern/replacement/ge | update | b#
在我的 .vimrc 中添加一个简单的行,我设法在 vim 缓冲区上用 zip.vim 打开一个 ePub 存档。这基本上打开了一个可以单独访问的 htm、css、jpg、xml 文件的编号列表。我想搜索并替换所有这些编号的文件,因为编辑每个文件并执行它太痛苦了 - 大约有 400 个文件。 :args 和 :argdo 并没有真正起作用,或者至少我做不到。有任何想法吗?
我不确定,但这可能会对你有所帮助
在 esc 模式下尝试
:%s/word you want to search/word you want yo replace with/g
我不确定它是否适合您,我假设当您在 Vim 缓冲区内的文件路径上按 Enter 键时,会打开一个新的视口(由 ZipBrowseSelect()
中定义的函数$VIMRUNTIME/autoload/zip.vim
)显示文件内容。
如果是这种情况,您可以试试下面的方法。
:%argd
此命令删除当前arglist 中的所有路径。
然后,您必须在视觉上 select 所有包含您要修改的文件路径的行。例如,在正常模式下,您可以点击 vip
,并根据需要调整视觉 selection 以排除一些行。
:'<,'>g/^/exe "norm \r" | argadd % | close
此命令应在您的视觉 selection 中的每一行上按 Enter,添加已在新视口中打开的文件,然后关闭后者以返回原始 window .
:vim /pattern/ ##
此命令应使用包含您要查找的模式的所有行填充 quickfix 列表。
:cfdo %s/pattern/replacement/ge | update
此命令应将 quickfix 列表中存在的每个文件中的 pattern
替换为 replacement
,如果已更改则保存文件。
最后一步使用 :cfdo
命令,该命令在 Vim 版本 7.4.858 中引入。如果你的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
总而言之,您可以尝试以下 3 种方法之一:
:%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
编辑:
您也可以尝试直观地select文件的路径,然后执行:
:'<,'>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(".")`
从那里开始,您需要全局命令,以在视觉 selection.
中的每一行重复编辑在我测试的epub中,所有的路径都在mimetype
这一行下面。如果您是这种情况,那么您可以将 2 个步骤(视觉 selection + 全局命令)合并到一个命令中:
1/mimetype/+,$g/^/e `='zipfile:'.expand('%:p').'::'.getline(".")` | %s/pattern/replacement/ge | update | b#