2017-04-25 88 views
0

我試圖使用循環多個單詞過濾器,但下面不工作:如何獲得變量的值在這個循環中,VIM

function! Myfilter (...) 
    for s in a:000 
    v/s/d 
    endfor 
endfunction 

它刪除不包含字母s,而不是所有的行值爲s。我如何在聲明v/s/d中獲得s的值?

回答

0

:execute命令被精確地用於 此任務計算表達式並執行它作爲一個命令設計:

exec 'v/' . s . '/d' 
0

一種更有效的解決辦法是從您的參數構成一個正則表達式,並用它來刪除不匹配的行。

exe 'v/\('.join(a:000, '\|').'\)/d_' 
+0

這隻保留包含* any *參數的行。我想他只想保留包含*全部*參數的行。 –

+0

@JimU。你是對的。一路上,我的邏輯倒過來了。 –

1

刪除包含所有的函數的參數

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 
相關問題