为CodeMirror编写自定义模式,用于括号中

Writing a custom mode for CodeMirror, for use in Brackets

本文关键字:用于 模式 CodeMirror 自定义      更新时间:2023-09-26

我正试图为括号编写一个插件/扩展,将处理PowerShell。仔细研究之后,我发现CodeMirror也没有PowerShell模式,所以我需要自己创建它。我有一个可怕的时间,因为网上几乎没有任何详细的资源,我正在尝试做什么。



这是我的main.js文件:

    define(function (require, exports, module){
        "use strict";

        //Load Modules
        var LanguageManager = brackets.getModule("language/LanguageManager"),
            CodeMirror = brackets.getModule("thirdparty/CodeMirror2/lib/codemirror"),
            PowerShellMode = require("powershell.js");

        //Define the Language
        LanguageManager.defineLanguage("powershell", {
        name: "PowerShell",
        mode: "powershell",
        fileExtensions: ["ps1"],
        lineComment: ["'/'/"]
        });

        function log(s) {
            console.log("[PS-DevKit] " +s);
        }
        log("PowerShell module loaded!");

    });



这是我的powershell.js文件:
//CodeMirror Example
CodeMirror.defineMode("powershell", function() {
    return{
        startStat: function() {return {inString: false};},
        token: function(stream, state){
            //If a string starts here
            if (!state.inString && stream.peek() == '"'){
                stream.next();              //Skip quote
                state.inString = true;      //Update state
            }
            if (state.inString) {
                if (stream.skipTo('"')){    //Quote found on this line
                    stream.next();          //Skip quote
                    state.inString=false;   //Clear flag
                } else {
                    stream.skipToEnd();     //Rest of line is string
                }
                return "red-text";            //Token style
            } else {
                stream.skipTo('"') || stream.skipToEnd();
                return null;                //Unstyled token
            }   
        }  
    };    
});



当使用此代码运行括号时,我得到一个错误(开发人员控制台),它无法从"程序文件(x86)'括号'www"加载我的powershell.js文件。所以我试着把确切的路径文件是(括号扩展文件夹坐在我的用户目录),它工作,但我得到以下消息:

Use brackets.getModule("thirdparty/CodeMirror2/lib/codemirror") instead of global CodeMirror.
    at Object.defineProperty.get (/brackets.js:115:32)
    at file:///C:/Users/MY_USERNAME/AppData/Roaming/Brackets/extensions/user/PS-DevKit/powershell.js:2:1 



任何输入?现在,我所要做的就是让它加载并将引号中的任何文本更改为红色。即使我得到了关于需要使用CodeMirror模块的弃用警告,扩展也会加载,并且如果我创建一个"。ps1"文件,它识别它是PowerShell。

一般答案-实际上一些相当详细的资源:

  • 编写codemmirror模式
  • 在括号中定义一个新的语言-关于如何加载新的CodeMirror模式,请参阅小节"自定义CodeMirror模式"

具体答案-我可以在你的示例代码中发现一些肯定会导致问题的问题:

  1. 使用require("powershell") 而不使用 .js——这是JS模块加载器期望的格式
  2. powershell.js应该包含与main.js相同的define(...)包装器。它应该使用brackets.getModule()来获取对CodeMirror的引用,与main.js相同。(使用内置在括号中的JSLint,当您引用忘记显式加载为模块依赖的全局变量时,它有助于警告您)。
  3. 你的CM模式有一个错字:startStat -> startState
  4. 你需要在调用LanguageManager.defineLanguage()之前调用CodeMirror.defineMode() -参见上面链接的"自定义代码镜像模式"文档。你既可以在powershell.js模块中这样做,也可以在main.js早期这样做。