2013-10-19 85 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

相关问题