2017-07-29 228 views
4

道歉,如果這已經發布,因爲我找不到答案,即使在vim wiki上也是如此。vim:運行基於一個命令的多個命令:全局命令

有沒有一種方法可以在vim命令行模式下運行多個命令關閉一個:g搜索?

例如,

:%g/foo/ s/bar/\[email protected]/g | exe "norm /cat\<enter>\"ayiw" 

哪個(什麼,我想讓它做)應該在每一行匹配foo,更換bar與寄存器a的內容,然後找到的下一個迭代cat(即使前面有很多行),並將周圍的單詞放入寄存器a

而是,此特定語法使用初始a寄存器的當前內容完成替換命令,然後在一行(在替換完成後)上執行正常模式命令。

此示例不是我特定的用例,但顯示了此功能有用的一個實例。我意識到我可以把它全部放入一個exe,即%g/foo/exe "norm :s/bar/\\[email protected]/g\<enter>/cat\<enter>\"ayiw",但我想這樣做的第一種方式,因爲我覺得它更靈活。


我寧願做這個用香草vim的,但如果一個插件存在這一點,這是一個不錯的選擇。有人知道是否有語法來做這樣的事情嗎?

+1

有趣。通常,每個匹配行上應該執行一次'規範...',但它看起來好像只能執行一次。 '/.../'搜索似乎會導致這種情況。 –

回答

1

好吧,有點「髒」,但這對你有用嗎?

:let list = split(execute('g/cat/p'), '\n') | g/foo/ s/bar/\=matchstr(remove(list, 0), '\s\d\+\s\zs.*')/g 

它首先讀取cat所有出現保存在列表中。 然後用第一隻貓替換第一個bar ...等等。

髒部分是matchstr命令。在g//p也返回一個數字的結果,所以列表如下:

1 cat 
2 cat 
3 cat 
... 

,這就是爲什麼我們必須拆掉了一下。我很想聽聽是否有人知道一個乾淨的解決方案(我也對一個乾淨的vimscript解決方案感興趣,並不一定是一個oneliner)。