豊富なctagでMarkdown Setextのタイトルを一致させる方法

豊富なctagでMarkdown Setextのタイトルを一致させる方法

私は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行末ファイルに問題を引き起こすことがあります。

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

おすすめ記事