Atom は、起動と実行が遅いことを除けば、説明の必要はないと思います。私は ASS 字幕を解析してレンダリングする JavaScript ライブラリ (ASS.js) を作成しているため、.ass ファイルをよく見ます。しかし、大きな白いコードに直面するのは不快でしたし、Atom 用の既製の ASS 構文強調表示プラグインもなかったので、自分で作成することにしました。
では、構文強調表示プラグインを作成するにはどうすればよいでしょうか? 公式ドキュメントでは、一般的なプラグインの作成方法について説明しています。構文強調表示プラグインに慣れる最も早い方法は、Atom によって公式に維持されている language-json などの既存のプラグインを確認することです。 。構文強調表示プラグインは通常、次のディレクトリ構造を持っています (ssa は言語名です):
language-ssa├── grammars│ └── ssa.cson├── spec│ └── ssa-spec.coffee├── LICENSE.md├── README.md└── package.json
language-ass 名はすでに使用されているため、高度な機能を備えた ASS 字幕が追加されています。 by SSA 字幕 後で開発されましたが、この 2 つの構文は基本的に同じです。このうち、ssa.cson は、通常の文法を記述するためのメイン ファイルです。接尾辞 CSON は、CoffeeScript のサブセットです。基本的には、プロジェクトの README を参照してください。 spec.coffee はテスト ファイルですが、必須ではありません。LICENSE.md と README.md は Atom プラグイン ページにリンクされて表示されます。通常の Node.js プロジェクトとそのエンジン フィールド Atom バージョンを指定する方法は他にもあります。例を見れば明らかです。
ローカルで開発およびテストする場合は、 language-ssa フォルダーを ~/.atom/packages/ ディレクトリに直接配置し、Atom をリロード (Ctrl+Alt+R) すると有効になります。
Atom 文法ファイルの各フィールドは、TextMate エディターの文法ファイルと同じです。 以下は、言語の文法ファイルと照らし合わせて補足的に説明するドキュメントです。 -ssa:
name フィールドは複数の . で区切られた文字列で、これらの名前は一致した部分のクラス名として使用されます。その値が comment.line.character.semicolon.ssa で、一致するテキストがセミコロン コメントである場合、Ctrl+Alt+I を押して DevTools を開くと、対応する生成された HTML が ; セミコロン コメント。
コードの強調表示の色の効果はテーマによって決まり、テーマは実際にこれらのクラスに基づいて色を追加します。従来のクラス名については後述します。
これらの「ルール」は順番に実行されます、各「ルール」は 1 回のみ一致します。ループの後、最初の「ルール」に戻り、現在の行で一致しないものを選択します。テキスト は実行されます。 2 回目のマッチング ラウンド。このサイクルは、すべてが一致するか、 サイクル数 を超えるまで継続します。 Atom のパターンのデフォルトのループ数は 99 のようです。これを超えると、一致範囲内のテキストは処理されなくなります。通常、圧縮された JS ファイルを開くときに、スクロール バーを行末までドラッグすると、ハイライトがないことがわかります。これが原因です。
上記の正規構文は、JavaScript での RegExp オブジェクトの使用法と基本的に同じですが、それでもいくつかの違いがあります。通常のルール自体に関する限り、ES5 と ES6 はまだ後読みをサポートしていないため、(?<=exp) と (?
文字列として書いた後は、ネイティブ正規表現のような修飾子を追加することはできません。TextMate で正規表現のドキュメントを見つけたところ、(?imx-imx) と (? を使用して、対応する正規表現をオンまたはオフにできることがわかりました。 imx-imx:subexp) 修飾子。たとえば、(?i)abc(?-i)def、(?i) は大文字と小文字を無視した後のマッチングを意味し、(?-i) は大文字と小文字を無視してキャンセルすることを意味します。つまり、この場合 abc は大文字でも小文字でも構いません。規則性があるため、 def は小文字にする必要があります。この記述方法は、修飾子の後に機能します。また、abc に対してのみ機能する (?i:abc)def の形式で記述することもできます。 (?m) は、複数行のマッチングをサポートすることを意味します。TextMate のドキュメントにはそう記載されていますが、私のテストでは、単一の通常のルールに対して複数行をマッチングする方法はありません。 begin メソッドと end メソッドを使用します。 (? 正規表現の特定の部分にコメントを追加することもできます。詳細については、この記事を参照してください。複数の修飾子がある場合は、(?ix)abc のようにまとめて記述することができます。 RegExp オブジェクトの g 修飾子はサポートされておらず、構文の規則性は一度に 1 回のみ照合されます。
構文の強調表示は主にコードを複数の部分に解析し、異なるセマンティクスを持つ部分に異なる色を追加します。クラスを生成するために各部分に任意の名前を付けることができますが、テーマが言語ごとにカラーマッチングの特別なセットを記述することは不可能であるため、いくつかの従来の名前があり、一般的なテーマはこれらの命名規則をサポートします:
通常,命名时应以上述的约定开头,并且能满足子项的都应写上去;之后一般会根据当前的部分写一个自定义的名称,虽然可能对样式不起作用,但额外的信息可以将它标识为特定的语义;最后一般都是跟一个语言名称。例如 ASS 文件中区块头部 [Script Info],其中的 [可以命名为 punctuation.definition.section.begin.ssa,约定部分是 punctuation.definition,自定义部分是 section.begin,最后是语言名称。
Atom 插件是使用 Jasmine测试框架的,对语法高亮插件的测试主要用到了 Atom Grammar API,Atom 官方维护的 语法高亮插件都有写测试,具体写法可以参考。
Atom 插件的持续集成依然可以参考 Atom 官方项目,一般 .travis.yml文件 长这样就行了,它会跑一遍 spec目录下的测试,有配置 lint 的话就再跑一遍 lint。如果不用 Travis CI,可以根据 这个项目部署其他服务。
发布插件时首先要检查名称是否可用,一般语法高亮插件都是命名为 language-语言名的。然后需要一个公开的 Git 仓库来放置代码,一般都是开源在 GitHub 上,并在 package.json中写明仓库地址。当第一次 push 到 Git 时, package.json中的 version一般是 0.0.0。然后登录 https://atom.io/account获得 API token,在终端输入 apm login --token YOUR_TOKEN就可以准备发布了:
$ apm publish minorPreparing and tagging a new version donePushing v0.1.0 tag donePublishing language-ssa@v0.1.0 done
运行上述命令后,apm 会自动给 version的次版本加一,然后生成一个 message 为 Prepare 0.1.0 release的 commit,并加上一个 v0.1.0的 Tag,一起 push 到 GitHub 上。之后就可以在 https://atom.io/packages/language-语言名上看到已成功发布了。
本文大致介绍了 Atom 语法高亮插件的编写流程和方式,并根据我在开发中遇到的情况对 TextMate 的文档进行了补充。但本文应当作为参考,在上手开发之前还需多看看已有的项目,才能理解并解决问题。