2017-08-07 57 views
1

向我的.vimrc添加一條簡單的線我設法在vim緩衝區中打開一個帶有zip.vim的ePub存檔。這基本上打開了一個可以單獨訪問的htm,css,jpg,xml文件的編號列表。我想執行搜索並替換所有這些帶有編號的文件,因爲編輯每個文件都太痛苦,而且要做 - 大概有400個文件。 :args和:argdo沒有真正的工作,或者至少我不能做到。有任何想法嗎?如何在使用vim.zip打開的epub文件中搜索和替換

+0

':bufdo'在所有載入的緩衝區運行命令? – phd

+0

它似乎不工作,因爲我真的沒有在緩衝區中打開所有400個文件。我很難說出它是什麼以及如何加載所有文件,如果你有時間,應該嘗試打開一個ePub。感謝您的嘗試 – Dalamar

回答

2

我不知道它會爲你工作,我會認爲,當你在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# 
+0

首先感謝非常清楚的答案。每種方法取決於:%argd命令;但是當我啓動它,然後繼續視覺選擇,然後按Enter鍵,我得到一些錯誤信息: E121:未定義的變量b:zip文件 E15:無效expresson:B:zip文件 E121:未定義的變量:zip文件 E116:無效的參數對於小說fnameescape(「zip文件:」。zipfile。'::'.fname) E15:無效表達式:「e」.fnameescape(「zipfile:」。zipfile /'::'.fname)。 每當我嘗試選擇多個文件時都會發生這種情況。 – Dalamar

+0

@達拉馬我不確定要理解,但只是可以肯定的是,一旦你視覺上選擇了你的路徑,你就不應該點擊回車。你只需要點擊冒號(':'),從可視模式轉到命令行模式。當你這樣做的時候,Vim應該自動地用視覺範圍「<,'>」來填充命令行。 (如果需要,可以將其刪除,因爲我將它包含在示例中。)從那裏,您將不得不添加(或複製粘貼)全局命令。例如,'g/^/exe「norm \ r」| argadd%| close'。 – user852573

+0

@達拉馬最後最重要的是你執行全局命令,在它前面的可視範圍內輸入'<,'> g/^/...'。我還添加了其他2種可能的方法,最後,其中一種方法不要求您直觀地選擇任何內容。它們可能比以前更簡單(因爲它們只涉及一個或兩個命令)。他們都在我的機器上工作,但我無法向你保證它會爲你工作,因爲我不知道你正在使用哪個Vim版本,安裝了哪個zip插件版本,以及你正在工作的epub。 – user852573

1

我不知道,但是這可能會幫助您

Esc鍵模式嘗試

:%s/word you want to search/word you want yo replace with/g 
+0

不,對不起,這隻能在一個打開的文件上工作,無論如何謝謝 – Dalamar