私はctagsでpandoc markdownの言語定義に取り組んでいます。ただし、ヘッダーテキストの下に複数行=
または新しい-
行で定義されている正規表現でSetextヘッダーを一致させるのに問題があります。 Setextヘッダーは次のとおりです。
My Firts Level Setext Header
============================
My Second Level Setext Header
-----------------------------
### My Third Level Setext Header
活気に満ちたctagsのマニュアルページでは、拡張されたPOSIX正規表現を使用して改行をサポートすると\n
言われています。
したがって、/^(.*)$\n={3,}
マークダウンSetextヘッダーは一致する必要があります。\1
myの対応する言語定義.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ヘッダーを一致させるのですか?
ベストアンサー1
私は同じ問題を解決します。私は説得力があります活気に満ちたcタグ複数行の正規表現はサポートされていません。しかし、その後のプロジェクトがあります。一般的なCタグ、これをサポートします。
共通のCtags設定は複数のファイルに分割できます。詳しくは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
。今後は下線ではなくタイトル名に移動したいと思います。だから私たちはグループを持っていて、それに(.+)
接続します{_multiline=1}
。
正規表現で新しい行をチェックするのに問題があります。使い方は簡単でも動作しませ\n
ん\r
。新しい行を確認するには、groupまたは[[:space:]]
というグループを使用できます。これは共通のスペースを含まないので、より良いと[[:cntrl:]]
思います。[[:cntrl:]]
次の問題は、DOSとUnixファイルの行末が異なることです。{1,3}
ファイルがUnix行末を使用している場合は、パターンの量子化を省略できます。明らかに量子化を使用する方が一般的ですが、時にはUnix行末ファイルに問題を引き起こすことがあります。
完璧ではありませんが、より良い解決策が見つかりませんでした。