定期正则表达式对Vimscript正则表达式

时间:2013-10-19 15:16:05

标签: regex vim

我对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正则表达式缺少什么?”

2 个答案:

答案 0 :(得分:1)

也许使用像[[:lower:]]这样的POSIX字符类在正则表达式中不起作用?如何使用[a-z] - 甚至更好\l - 而不是[[:lower:]]呢?

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

答案 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()