2013-10-19 142 views
0

我對vimscript中正則表達式的使用有點困惑。我真的盡力了,但match函數不返回什麼,我期待它。在特殊情況下,我想創建一個自定義的摺疊式這樣:正則表達式到Vimscript正則表達式

function! SuperColliderFolds() 
    let thisline = getline(v:lnum) 
    if match(thisline, '^[\s\t\n]*[[:lower:]]\w*\s*{') >= 0 
    return "1" 
    elseif match(thisline, '^entity'') >= 0 
    return ">2" 
    else 
    return "=" 
    endif 
endfunction 
setlocal foldmethod=expr 
setlocal foldexpr=SuperColliderFolds() 

正則表達式應該棄牌的所有方法具有類似結構的類:

ClassName{ 
    methodName{//implementation 
    } 
} 

,但它不工作......這將是理想的對具體的例子幫助,但問題是更多的「我錯過什麼關於Vimscript中的正則表達式? 「

回答

1

因此,底線是,Vim有那真的是有據可查自己的正則表達式的語法。不過,我花了很多時間試圖寫在它被說把語法到開始使用\v表達一種較爲常見的一種:

如果你只是用\啓動所有的正則表達式訴你永遠不需要擔心Vimscript的其他三種瘋狂的正則表達式模式。 (Click here查看全文)。

但是,這竟然是爲verymagic模式(這正是\v模式被稱爲)似乎並沒有被作爲有案可稽作爲默認的魔術模式真的很難。所以最後我只是用手冊來學習vim正則表達式語法,並解決了使用它的問題。

以供將來參考,這裏是我的結果(自定義倍的SuperCollider語言類表達式):

function! SuperColliderFolds() 
    let thisline = getline(v:lnum) 
    let previousline = v:lnum-1 
    " match instance methods 
    if match(thisline, '^\s\{1,5}\l\a*\s*{') >= 0 
    return ">1" 
    " match class methods 
    elseif match(thisline, '^\s\{1,8}\*\l\a*\s*{') >= 0 
    return ">1" 
    " don't fold Class names 
    elseif match (thisline, '^\s\{,3}\u\a*\s*{\|(:\s*{)') >= 0 
    return "0" 
    "match method closing brackets (assuming no more than 3 spaces intend which should be ok for my purpose) 
    elseif match (getline(previousline), '^\s\{,3}}') >= 0 
    return "0" 
    else 
    return "=" 
    endif 
    endfunction 
    setlocal foldmethod=expr 
    setlocal foldexpr=SuperColliderFolds() 
1

也許使用像[[:lower:]]這樣的POSIX字符類在正則表達式中不起作用?怎麼樣使用像[a-z] - 或甚至更好\l - 而不是[[:lower:]]

參考:http://vimregex.com/#pattern

+0

沒有做到這一點,但所指的感謝!我要去研究它。 – Dionysis

相關問題