私は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ヘッダーと一致させるにはどうすればよいですか?
私は同じ問題を解決します。 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の行末ファイルで問題が発生する場合があります。
完璧ではありませんが、より良い解決策は見つかりませんでした。