1

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

4

2 回答 2

2

所以底线是 Vim 有它自己的正则表达式语法,它有很好的文档记录。但是我花了很多时间尝试\v在开头使用它来编写表达式,据说它将语法变成更常见的语法:

如果你只是用 \v 开始你所有的正则表达式,你永远不需要担心 Vimscript 的其他三种疯狂的正则表达式模式。(点击这里查看全文。)

但事实证明这真的很困难,因为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()
于 2013-10-19T20:14:01.330 回答
1

也许使用 POSIX 字符类[[:lower:]]在正则表达式中不起作用?使用类似[a-z]- 甚至更好\l- 而不是 的东西怎么样[[:lower:]]

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

于 2013-10-19T15:29:21.967 回答