使用Theia——添加語言支持


上一篇:使用Theia——創建插件

Theia——添加語言支持

Theia中TextMate的支持

  使用TextMate語法可以為大部分源文件提供精准的着色修飾,雖然這只是在語法級別上(沒有語言本身的深度解析)。語義着色可以由語言服務器提供。
  TextMate語法主要有兩種格式: .plist.tmLanguage.json,這兩種Theia都支持。
  更多有關TextMate語法的內容可以查看 這里
  注意:特定語言的語法應該包含在該語言的專用擴展包中。 @theia/textmate-grammars中只注冊了當前沒有任何特定擴展包的語言。

添加新語法

  要提供一種新語法,通常的做法是在擴展包的根目錄下創建一個 data目錄,在其中保存不同的語法。
extension/
    data/
        grammars go here
    lib/
        ...
    src/
        ...
    package.json
    ...

  然后,在package.json文件中聲明以下屬性,這樣新提供的語法可以與源代碼和編譯的文件一同發布。

"files": [
    "data",
    "lib",
    "src"
  ],

  在擴展包中,我們可以通過LanguageGrammarDefinitionContribution的contribution point來提供這一特性。

@injectable()
export class YourContribution implements LanguageGrammarDefinitionContribution {

    readonly id = 'languageId';
    readonly scopeName = 'source.yourLanguage';

    registerTextmateLanguage(registry: TextmateRegisty) {
        registry.registerTextmateGrammarScope(this.scopeName, {
            async getGrammarDefinition() {
                return {
                    format: 'json',
                    content: require('../data/yourGrammar.tmLanguage.json'),
                }
            }
        });
        registry.mapLanguageIdToTextmateGrammar(this.id, this.scopeName);
    }
}

  如果使用.plist語法,則不能使用require來直接獲取內容,因為Webpack將返回從服務器獲取的文件的名稱。這種情況下,可以使用下面的模式來獲取文件的內容:

@injectable()
export class YourContribution implements LanguageGrammarDefinitionContribution {

    readonly id = 'languageId';
    readonly scopeName = 'source.yourLanguage';

    registerTextmateLanguage(registry: TextmateRegisty) {
        registry.registerTextmateGrammarScope(this.scopeName, {
            async getGrammarDefinition() {
                const response = await fetch(require('../data/yourGrammar.plist'));
                return {
                    format: 'plist',
                    content: await response.text(),
                }
            }
        });
        registry.mapLanguageIdToTextmateGrammar(this.id, this.scopeName);
    }
}

 

原文地址:https://theia-ide.org/docs/textmate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM