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 の他の 3 つのクレイジーな正規表現モードについて心配する必要はありません。(記事全文を表示するには、ここをクリックしてください。)

しかし、これは非常に難しいことが判明しました。非常に魔法のモード (つまり、\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 に答える