向我的.vimrc添加一條簡單的線我設法在vim緩衝區中打開一個帶有zip.vim的ePub存檔。這基本上打開了一個可以單獨訪問的htm,css,jpg,xml文件的編號列表。我想執行搜索並替換所有這些帶有編號的文件,因爲編輯每個文件都太痛苦,而且要做 - 大概有400個文件。 :args和:argdo沒有真正的工作,或者至少我不能做到。有任何想法嗎?如何在使用vim.zip打開的epub文件中搜索和替換
回答
我不知道它會爲你工作,我會認爲,當你在Vim緩衝區內的文件路徑上按Enter鍵,將打開一個新視口(通過$VIMRUNTIME/autoload/zip.vim
中定義的ZipBrowseSelect()
函數)以顯示該文件的內容。
如果是這樣,您可以嘗試以下方法。
:%argd
該命令刪除當前arglist中的所有路徑。 然後,您必須在視覺上選擇包含要修改文件路徑的所有行。例如,在正常模式下,您可以按vip
,並根據需要調整視覺選擇以排除一些行。
:'<,'>g/^/exe "norm \r" | argadd % | close
這個命令應該打請輸入您的視覺選擇裏面的每一行,添加一個已經在新視口被打開的文件,並關閉後,回到原來的窗口。
:vim /pattern/ ##
該命令應該用包含所需模式的所有行填充quickfix列表。
:cfdo %s/pattern/replacement/ge | update
該命令應與目前在quickfix列表中的每個文件replacement
更換pattern
,如果它已經改變保存文件。
最後一步使用將其在Vim的版本7.4.858引入的:cfdo
命令。如果你的Vim版本不是新的,足以支持:cfdo
,你可以繞過最後2個步驟,並直接執行:
: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
編輯:
您也可以嘗試在視覺上選擇文件的路徑,然後執行:
:'<,'>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
以下。如果這是你的話,那麼你可以合併2個步驟(可視選擇+全局命令)在一個命令:
1/mimetype/+,$g/^/e `='zipfile:'.expand('%:p').'::'.getline(".")` | %s/pattern/replacement/ge | update | b#
首先感謝非常清楚的答案。每種方法取決於:%argd命令;但是當我啓動它,然後繼續視覺選擇,然後按Enter鍵,我得到一些錯誤信息: E121:未定義的變量b:zip文件 E15:無效expresson:B:zip文件 E121:未定義的變量:zip文件 E116:無效的參數對於小說fnameescape(「zip文件:」。zipfile。'::'.fname) E15:無效表達式:「e」.fnameescape(「zipfile:」。zipfile /'::'.fname)。 每當我嘗試選擇多個文件時都會發生這種情況。 – Dalamar
@達拉馬我不確定要理解,但只是可以肯定的是,一旦你視覺上選擇了你的路徑,你就不應該點擊回車。你只需要點擊冒號(':'),從可視模式轉到命令行模式。當你這樣做的時候,Vim應該自動地用視覺範圍「<,'>」來填充命令行。 (如果需要,可以將其刪除,因爲我將它包含在示例中。)從那裏,您將不得不添加(或複製粘貼)全局命令。例如,'g/^/exe「norm \ r」| argadd%| close'。 – user852573
@達拉馬最後最重要的是你執行全局命令,在它前面的可視範圍內輸入'<,'> g/^/...'。我還添加了其他2種可能的方法,最後,其中一種方法不要求您直觀地選擇任何內容。它們可能比以前更簡單(因爲它們只涉及一個或兩個命令)。他們都在我的機器上工作,但我無法向你保證它會爲你工作,因爲我不知道你正在使用哪個Vim版本,安裝了哪個zip插件版本,以及你正在工作的epub。 – user852573
我不知道,但是這可能會幫助您
Esc鍵模式嘗試
:%s/word you want to search/word you want yo replace with/g
不,對不起,這隻能在一個打開的文件上工作,無論如何謝謝 – Dalamar
- 1. 僅在打開的文件(netbeans)中搜索和替換
- 2. 如何搜索和替換打開Office文檔?
- 3. 搜索和替換使用文件名
- 4. 搜索和在Linux(SED)替換文件
- 5. 如何搜索和替換文本文件中的整行?
- 6. 在PHP中打開epub文件
- 7. 如何使用SED搜索和替換xml文件中的文本?
- 8. 如何使用delphi在xml文件中搜索和替換標籤值?
- 9. 在xib文件中搜索並替換
- 10. 在htm文件中搜索並替換
- 11. 如何在使用SED的文本文檔中進行搜索和替換?
- 12. 如何在gvim中搜索和替換以下模式搜索
- 13. 搜索和文件替換在Windows上使用win_lineinfile
- 14. Python搜索和替換文件
- 15. 屬性文件搜索和替換
- 16. 文件manupulation搜索和替換CSV PHP
- 17. bashscript文件搜索和替換!
- 18. 如何打開當前目錄中的所有.txt和.log文件,搜索並打印搜索到的文件
- 19. 使用sed和awk替換搜索文本中的文本?
- 20. 搜索和打開文件提示
- 21. 搜索和替換使用DOM和jQuery
- 22. 如何使用搜索和替換表中的所有列
- 23. 搜索和替換
- 24. 如何使用Wix進行搜索並替換配置文件?
- 25. 如何使用搜索:搜索API在txt文件中搜索?
- 26. 使用鍵搜索/替換:bash中的文件中的值?
- 27. 搜索和替換在Vi
- 28. 如何在Eclipse中搜索所有打開的文件?
- 29. 如何使用OpenXML搜索和替換Word文檔中的文本?
- 30. 在Perl中使用〜搜索並替換
':bufdo'在所有載入的緩衝區運行命令? – phd
它似乎不工作,因爲我真的沒有在緩衝區中打開所有400個文件。我很難說出它是什麼以及如何加載所有文件,如果你有時間,應該嘗試打開一個ePub。感謝您的嘗試 – Dalamar