编写用于CodeMirror的自定义模式,以用于括号

5T4*_*TiC 5 javascript powershell codemirror adobe-brackets

我正在尝试为将处理PowerShell的Brackets编写一个插件/扩展。仔细研究它之后,我发现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!");


    });
Run Code Online (Sandbox Code Playgroud)



这是我的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

            }   
        }  
    };    
});
Run Code Online (Sandbox Code Playgroud)



当使用此代码按原样运行Brackets时,出现错误(开发人员控制台),提示它无法powershell.js从“ Program Files(x86)\ Brackets \ www” 加载文件。因此,我尝试输入文件的确切路径(位于我的用户目录中的Bracket extensions文件夹),并且可以正常工作,但收到以下消息:

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 
Run Code Online (Sandbox Code Playgroud)



有输入吗?现在,我要做的就是加载它并将引号中的任何文本更改为红色。即使我收到有关需要使用CodeMirror模块的弃用警告,该扩展也会加载,并且如果创建“ .ps1”文件,它会识别出它是PowerShell。

pet*_*ynn 8

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

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

  1. require("powershell") 不带 .js 使用-这是JS模块加载程序期望的格式
  2. powershell.js应包含与define(...)main.js 相同的包装。它应该brackets.getModule()用来获取对CodeMirror的引用,与main.js相同。(使用内置于Brackets中的JSLint,当您引用已忘记显式加载为模块依赖项的全局变量时,有助于警告您)。
  3. 您的CM模式有一个错字:startStat->startState
  4. 您需要在致电CodeMirror.defineMode()之前致电LanguageManager.defineLanguage()-请参阅上面链接的“自定义CodeMirror模式”文档。您可以在powershell.js模块中或在main.js早期进行此操作。