我对vimscript中使用正则表达式感到有点困惑。我真的尝试了,但match
函数没有返回我期望它...在特定情况下我试图创建一个自定义折叠表达式:
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正则表达式缺少什么?”
答案 0 :(得分:1)
也许使用像[[:lower:]]
这样的POSIX字符类在正则表达式中不起作用?如何使用[a-z]
- 甚至更好\l
- 而不是[[:lower:]]
呢?
答案 1 :(得分:1)
所以最重要的是,Vim有自己的正则表达式语法,这个语法确实很好。但是我花了很多时间尝试在开始时使用\v
编写表达式,据说将语法转换为更常见的语法:
如果您只是用\ v启动所有正则表达式 永远不必担心Vimscript的其他三种疯狂的正则表达式模式。 (Click here查看完整文章。)
但事实证明这非常困难,因为非常神奇模式(即调用\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()