【问题标题】:Writing a custom mode for CodeMirror, for use in Brackets为 CodeMirror 编写自定义模式,用于 Brackets
【发布时间】:2014-07-09 17:33:45
【问题描述】:

我正在尝试为将处理 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

            }   
        }  
    };    
});



使用此代码按原样运行 Brackets 时,我收到一个错误(开发人员控制台),它无法从“Program Files(x86)\Brackets\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。

【问题讨论】:

  • 我遇到了类似的问题,你能解释一下为什么 var PowerShellMode 存在吗?它似乎没有被使用。

标签: javascript powershell codemirror adobe-brackets


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多