我試圖使用循環多個單詞過濾器,但下面不工作:如何獲得變量的值在這個循環中,VIM
function! Myfilter (...)
for s in a:000
v/s/d
endfor
endfunction
它刪除不包含字母s
,而不是所有的行值爲s
。我如何在聲明v/s/d
中獲得s
的值?
我試圖使用循環多個單詞過濾器,但下面不工作:如何獲得變量的值在這個循環中,VIM
function! Myfilter (...)
for s in a:000
v/s/d
endfor
endfunction
它刪除不包含字母s
,而不是所有的行值爲s
。我如何在聲明v/s/d
中獲得s
的值?
的:execute
命令被精確地用於 此任務計算表達式並執行它作爲一個例命令設計:
exec 'v/' . s . '/d'
一種更有效的解決辦法是從您的參數構成一個正則表達式,並用它來刪除不匹配的行。
exe 'v/\('.join(a:000, '\|').'\)/d_'
刪除包含所有的函數的參數
function! Myfilter0 (...)
exec 'v/\(.*' . join(a:000, '\)\@=\(.*') . '\)\@=/d'
endfunction
實施例緩衝器
word1 beta word2
a word1 b word2 c
a word2 b word1 c word3 d
a word2 b word3 c word1 d
word1 delta
epsilon
實施例的函數調用比其他所有行
:call Myfilter("word1", "word2", "word3")
實施例結果
a word2 b word1 c word3 d
a word2 b word3 c word1 d
注
使用正則表達式到先行以任何順序相匹配的話。這是示例正則表達式在替換之後的樣子,並且爲了清晰起見沒有轉義字符:
:v/(.*word1)@=(.*word2)@=(.*word3)@=/d
這隻保留包含* any *參數的行。我想他只想保留包含*全部*參數的行。 –
@JimU。你是對的。一路上,我的邏輯倒過來了。 –