1

Fountain.io マークアップ言語の既存の構文ファイルに vim の折りたたみを実装しようとしています。既存の構文ファイルはこちら: http://www.vim.org/scripts/script.php?script_id=3880

しかし、私が何をしても、折り畳み領域は期待したところで終わりません。検索で正規表現をテストすると、正規表現は完全に機能します。しかし、構文領域で使用すると、一連のネストされた折り畳みが作成されました。折りは適切な行から始まり、既存の折りの内側に次の折りが作成されます。基本的に、INT または EXT で始まる任意の行で折り畳みが始まり、行が TO: で終わるか行が >: で始まる後に終了するように、次のことを試みました。

syn region fountainScene start="^\(INT\|EXT\)" end="^\(\(\L\)* TO:\|\s*>\(.*\)\)$" fold transparent contains=fountainCharacter,fountainDialogue,fountainParenthetical,fountainSceneHeading,fountainTransition

さらに奇妙なことに、「end」引数で \ze を使用して、一致した行の前の行を取得すると、期待どおりに機能します。マッチの上の行で折り目を止め、最後の行を折り目の外側に残します。以下は、「CUT TO:」と書かれた行の上で折り畳みを停止します。

\n\ze\(\L\)* TO:\n

トラブルシューティングを行うために、基本的に構文ファイルをゼロから再構築し始めました。これまでのファイルの内容 (hi コマンドを除く) は、相互に重複しないように正規表現を大幅に変更しました。元の正規表現にはこの問題があり、それが原因である可能性があると思いました:

syn match fountainCharacter "^\(\s\)*\n\zs\(INT\|EXT\)\@!\(\L\)*[^:]$"
syn region fountainDialogue matchgroup=fountainCharacter start="^\(\s\)*\n\zs\(INT\|EXT\)\@!\(\L\)*[^:]$" end="^\s*$" contains=fountainCharacter,fountainParenthetical
syn match fountainParenthetical "^\s*\((.*)\)$"
syn region fountainSceneHeading start="^\(INT\|EXT\)" end="$" contains=fountainSceneNumber,fountainBoneyard,fountainNotes
syn match fountainTransition "^\(\L\)* TO:$" 
syn region fountainScene start="^\(INT\|EXT\)" end="\n\ze\(\L\)* TO:\n" fold transparent contains=fountainCharacter,fountainDialogue,fountainParenthetical,fountainSceneHeading

ご協力いただきありがとうございます。不明な点がありましたらお知らせください。私はPythonサポートでカスタムコンパイルされたMacVimバージョン7.3.646を使用しています。

4

1 に答える 1

0

私はついにこれを理解しました。私の要素の 1 つは、「終わり」の議論を超えていました。syn リージョンで "keepend" 引数を使用する必要がありました。

この行はすべてを修正しました:

syn region fountainScene start="^\s*\(\.\|INT\. \|EXT\. \|INT\./EXT\. \|INT/EXT\. \|INT \|EXT \|INT/EXT \|I/E \|int\. \|ext\. \|int\./ext\. \|int/ext\. \|int \|ext \|int/ext \|i/e \)" end="^\(\(\L\)* TO:\|\s*>[^<]*\)$" fold transparent keepend

詳細については、:he keepend

于 2013-02-26T23:06:47.877 に答える