【问题标题】:Using an asynchronous warning source for CodeMirror's lint feature为 CodeMirror 的 lint 功能使用异步警告源
【发布时间】:2013-04-08 12:07:55
【问题描述】:

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

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

angelozerr 说 remoting-lint.js 中有一个“CodeMirror.remotingValidator”插件,但 Github 显示该文件已被删除。 marijnh 说它被删除是因为它“通常没有用”,但没有说明任何替代方案。

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

【问题讨论】:

    标签: javascript python ajax syntax-highlighting codemirror


    【解决方案1】:

    当然有。快速浏览最新版本的 remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) 的内容表明它只不过是一个 jQuery AJAX 请求,它调用作为参数提供给函数的回调。仅当将“异步”选项提供给 lint 插件时,才会传递此回调。请注意,我有一些可能与您无关的选项被传递到 CodeMirror。与 lint 相关的选项是“gutters”和“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,
        },
    });
    

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

    【讨论】:

    • 说得好,+1 表示愿意分享您的知识(回答您自己的帖子)以及发布 github 项目的额外努力。
    • 就是这样。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2018-10-07
    相关资源
    最近更新 更多