使用CodeMirror的lint功能的异步警告源

Dus*_*rea 12 javascript python ajax syntax-highlighting codemirror

这些示例仅显示如何使用CodeMirror(语法高亮基于Javascript的编辑器)实现JSON和Javascript lint插件,这些插件是同步的.

不幸的是,大多数语言都没有基于Javascript的解析器/ lint'ers.我想为Python实现自己的linter.不幸的是,似乎现有的lint插件依赖于linter(lint插件调用的)是同步的.

angelozerr说在remoting-lint.js中有一个"CodeMirror.remotingValidator"插件,但是Github显示该文件已被删除.marijnh说它被删除了,因为它"通常不是很有用",但没有澄清任何替代方案.

是否存在一种策略,以某种方式异步调用linter,以便我可以执行Ajax调用以远程解析代码?

Dus*_*rea 17

当然有.快速浏览最新版本的remoting-lint.js(https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e)的内容表明它只是一个jQuery AJAX请求,它会调用提供的回调作为参数的功能.只有在为lint插件提供"async"选项时才会传递此回调.请注意,我有一些传入CodeMirror的选项可能与您无关.与棉绒有关的选项是"排水沟"和"lintWith".

请注意,Python一次只出现一个错误,但lint插件接受错误列表.由于前者,后者最多只能有一个项目.

function python_validator(cm, updateLinting, options) {
    var text = cm.getValue() + "\n";

    if(text.trim() == "")
    {
        updateLinting(cm, []);
        return;
    }

    function result_cb(error)
    {
        var found = [];

        if(error != null) {
            var start_line = error.line_no;
            var start_char = error.column_no;
            var end_line = error.line_no;
            var end_char = error.column_no;
            var message = error.message;

            found.push({
                from: CodeMirror.Pos(start_line - 1, start_char),
                to: CodeMirror.Pos(end_line - 1, end_char),
                message: message
            });
        }

        updateLinting(cm, found);
    }

    check_python_syntax(text, result_cb)
};  

var text_obj = $discriminator_text.get()[0];
var editor = CodeMirror.fromTextArea(text_obj, {
    mode: { name: "python",
            version: 2,
            singleLineStringErrors: false },
    lineNumbers: true,
    indentUnit: 4,
    tabMode: "shift",
    matchBrackets: true,
    styleActiveLine: true,
    lineWrapping: false,
    gutters: ["CodeMirror-lint-markers"],
    lintWith: {
        "getAnnotations": python_validator,
        "async" : true,
    },
});
Run Code Online (Sandbox Code Playgroud)

我发布了一个非常简单的项目,使其更简单:https://github.com/dsoprea/CodeMirrorRemoteValidator

  • 好吧,+1表示愿意分享你的知识(回答你自己的帖子)以及发布github项目的额外努力. (2认同)
  • 这就是它的一切. (2认同)