3

私はついにYIに追加したいGitCommitメッセージモードを具体化することに戻りましたが、基本的なものが欠けているようです。文法の1つの文字に一致するようには見えません。すべてのルールは、行全体に一致する場合にのみ機能します。YIの他の文法は明らかにこれを行うので、これが可能でなければならないことを私は知っていますが、同じことをすることはうまくいかないようです。

最終的にvimのものと非常によく似たコミットモードが欲しいです。vimのモードで役立つものの1つは、コメント内で強調表示されるキーワードです。Gitは、実行するほとんどすべてのこと(コミット、リベースなど)のコメント内に大量の情報を入れるので、これは便利です。私の考えは、gitコメントの最初の「#」文字と一致し、キーワードと一致する別のコンテキストに切り替えることでした。ただし、「#」だけに一致するルールを作成できないようです。ルールは、「#」のみを含む行ではコメントスタイルに切り替わりますが、「#」の後に何かを含む行ではスタイルが切り替わりません。

私が今持っているのは:

<0> {
\#                             { m (const $ LineComment) Style.commentStyle }
$commitChars*$                 { c Style.defaultStyle }
}

<lineComment> {                                                                                                    
$nl                            { m (const Digest) Style.defaultStyle }                                               
·                              { c Style.regexStyle }                                                                
}      

詳細は明らかに省略。アイデアは、「#」が表示されたら「lineComment」モードに切り替え、行の終わりが表示されるまでスタイルを変えることです。ドキュメントと例によると、私がやりたいことをする方法があるはずです。'#'パターンについて考えられるほとんどすべての順列を試しましたが、表示されている動作は何も変わりません。
私が見逃している明らかなことは何ですか?

編集:上記のコードは、私のYIブランチ内の実装からのものです。ここで同じ問題を示すスタンドアロンのパーサーがあります。実行alex GitCommit.x && ghc --make GitCommit.hs && ./GitCommit < shortmsgすると、コンテンツが解析されたコメント行とMessageLine、正しくマークされた空のコメント行が表示されCommentStartます。

4

1 に答える 1

1

さて、私はついにこれを理解しました。アレックスは最初の試合ではなく、常に最長の試合を取るようです。コミット行を一致させるためのルールは、行全体に一致するため、常に長くなります。これにより、Alex は常にコメント ブランチよりもそのブランチを選択します。アレックスのドキュメントからの引用

When the input stream matches more than one rule, the rule which matches the longest prefix of the input stream wins. If there are still several rules which match an equal number of characters, then the rule which appears earliest in the file wins.

ドキュメントを複数回読むべきだったと思います。$commitChars解決策は、文字セットから「#」を削除することです。

于 2011-07-07T12:14:31.317 に答える