web-dev-qa-db-ja.com

あふれんばかりのctagsでMarkdownSetextヘッダーを一致させる方法

私はctagsでのpandocマークダウンの言語定義に取り組んでいます。ただし、ヘッダーテキストの下の新しい行で複数の_=_または_-_によって定義されている正規表現のSetextヘッダーを一致させるのに問題があります。 Setextヘッダーは次のようになります。

_My Firts Level Setext Header
============================

My Second Level Setext Header
-----------------------------

### My Third Level Setext Header
_

あふれんばかりのctagsのマンページには、改行がサポートされている場合は_\n_を使用した拡張POSIX正規表現が使用されていると記載されています。

したがって、/^(.*)$\n={3,}は_\1_のマークダウンSetextヘッダーと一致する必要があります

私の_.ctags_の対応する言語定義は次のようになります。

_--langdef=pandoc
--langmap=pandoc:.pandoc
--regex-pandoc=/^(.*)$\n={3,}/\1/h,Heading_L1/
--regex-pandoc=/^(.*)\n-{3,}/\1/i,Heading_L2/
--regex-pandoc=/^###[ \t]+(.*)/\1/k,Heading_L3/
_

ただし、タグは、改行の一致を必要としないレベル3ヘッダーに対してのみ作成されます。レベル1および2ヘッダーの場合、tags出力ファイルにタグ/一致はありません。

例えば:

_Introduction    dissertation.pandoc /^### Introduction$/;"  k
_

これはなぜですか?また、あふれんばかりのctagsのSetextヘッダーと一致させるにはどうすればよいですか?

2
Cutú Chiqueño

私は同じ問題を解決します。 Exuberant Ctags は複数行の正規表現をサポートしていません。しかし、それをサポートする後継プロジェクト niversal Ctags があります。

ユニバーサルCtags構成は、複数のファイルに分割できます。詳細については、プロジェクトWebサイトの_ctags/doc/optlib.rst_を参照してください。

次の構成ファイルを作成しました:_~/.ctags.d/optlib/markdown.ctags_ --langdef=markdown --langmap=markdown:.md --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(===+)/\1/h,Heading_L1/{_multiline=1} --regex-markdown=/^(.+)[[:cntrl:]]{1,3}^(---+)/\1/i,Heading_L2/{_multiline=1} --regex-markdown=/^###[ \t]+(.*)/\1/k,Heading_L3/ --excmd=number

tagsファイルは次のコマンドで生成できます:_ctags --options=markdown -R test.md_

新しいのは_{_multiline=N}_フラグです。番号Nは、パターン内のグループの番号です。このグループで表されるファイル内のテキストの位置は、tagsファイルに保存されます。将来的には、下線ではなくヘッダーの名前にジャンプしたいと思います。したがって、1つのグループ_(.+)_があり、それに_{_multiline=1}_でリンクします。

正規表現の改行を確認するのに問題がありました。使いやすい_\n_または_\r_は機能しません。チェックには、グループ_[[:space:]]_または_[[:cntrl:]]_という名前の新しい行を使用できます。共通スペースが含まれていないため、_[[:cntrl:]]_の方が優れていると思います。

次の問題は、DOSファイルとUnixファイルの行末が異なることです。ファイルがUnixの行末を使用している場合、パターン_{1,3}_の数量化は省略できます。明らかに、使用の定量化はより一般的ですが、Unixの行末ファイルで問題が発生する場合があります。

完璧ではありませんが、より良い解決策は見つかりませんでした。

4