为CodeMirror编写自定义模式,用于括号中
Writing a custom mode for CodeMirror, for use in Brackets
我正试图为括号编写一个插件/扩展,将处理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模式"
具体答案-我可以在你的示例代码中发现一些肯定会导致问题的问题:
- 使用
require("powershell")
而不使用 .js——这是JS模块加载器期望的格式 - powershell.js应该包含与main.js相同的
define(...)
包装器。它应该使用brackets.getModule()
来获取对CodeMirror的引用,与main.js相同。(使用内置在括号中的JSLint,当您引用忘记显式加载为模块依赖的全局变量时,它有助于警告您)。 - 你的CM模式有一个错字:
startStat
->startState
- 你需要在调用
LanguageManager.defineLanguage()
之前调用CodeMirror.defineMode()
-参见上面链接的"自定义代码镜像模式"文档。你既可以在powershell.js模块中这样做,也可以在main.js早期这样做。
相关文章:
- D3.js模式不适用于弧形或圆环图
- 用于操纵DOM API的Javascript设计模式
- 用于多个选项卡和模块化的knockoutjs设计模式
- Regex模式,用于检查字符串中每个单词的第一个字母(如果是Javascript中的大写字母)
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- Javascript仅适用于alert()和Debug模式
- 用于筛选无模式集合的最快数据结构
- 流星技术/模式,用于等待数据库变量更改,然后在 in 之后执行某些操作
- 用于登录/注册Angular应用程序的模式/对话框
- 验证模式中的HTML5不适用于以一些特定字符开头的字符串
- lightGallery动态模式不适用于Firefox和Safari
- 用于处理带有promise的外部接口中的参数的设计模式
- 为什么这种模式不适用于敲除验证?(分隔的邮政编码)
- json模式没有'不适用于空的响应体
- 用于忽略先前请求响应的前端 JavaScript 模式
- 用于编写用于使用 node.js 上传图像的筛选器列表的设计模式
- 用于中断浏览器事件上繁重计算的模式
- 用于匹配模式中上一个组的正则表达式
- 单个正则表达式,用于获取具有多个条件的多个模式
- 用于模式检查的正则表达式