如何实现代码镜像以显示没有CTRL + SPACE的提示

时间:2018-05-17 06:18:09

标签: javascript autocomplete codemirror

JavaScript:

        $http.get("/getApexBody", config).then(function(response) {
            document.getElementById("saveBtn").disabled = false;
            document.getElementById("cleanBtn").disabled = false;
            $scope.apexClassWrapper = response.data;
            $('#loaderImage').hide();
            if (globalEditor1) {
                globalEditor1.toTextArea();
            }
            setTimeout(function(test) {
                CodeMirror.commands.autocomplete = function(cm) {
                    cm.showHint({
                        hint: CodeMirror.hint.auto
                    });
                };
                var editor = CodeMirror.fromTextArea(document.getElementById('apexBody'), {
                    lineNumbers: true,
                    matchBrackets: true,
                    extraKeys: {
                        "Ctrl-Space": "autocomplete"
                    },
                    gutters: ["CodeMirror-lint-markers"],
                    lint: true,
                    mode: "text/x-apex"
                });
                globalEditor1 = $('.CodeMirror')[0].CodeMirror;
            }), 2000
        });

这是我的JS文件,ctrl-space工作正常但我需要实现自动完成而不需要任何键绑定。

我甚至试过这个:

        $http.get("/getApexBody", config).then(function(response) {
            document.getElementById("saveBtn").disabled = false;
            document.getElementById("cleanBtn").disabled = false;
            $scope.apexClassWrapper = response.data;
            $('#loaderImage').hide();
            if (globalEditor1) {
                globalEditor1.toTextArea();
            }
            setTimeout(function(test) {
                /* CodeMirror.commands.autocomplete = function(cm) {
                    cm.showHint({
                        hint: CodeMirror.hint.auto
                    });
                };*/
                var editor = CodeMirror.fromTextArea(document.getElementById('apexBody'), {
                    lineNumbers: true,
                    matchBrackets: true,
                    /*extraKeys: {
                        "Ctrl-Space": "autocomplete"
                    },*/
                    gutters: ["CodeMirror-lint-markers"],
                    lint: true,
                    mode: "text/x-apex"
                });
                editor.on('inputRead', function onChange(editor, input) {
                    if (input.text[0] === ';' || input.text[0] === ' ') {
                        return;
                    }
                    CodeMirror.commands.autocomplete = function(editor) {
                        editor.showHint({
                            hint: CodeMirror.hint.auto
                        });
                    };
                });
                globalEditor1 = $('.CodeMirror')[0].CodeMirror;
            }), 2000
        });

但这不起作用。 这里有什么我想念的吗?如何使用codemirror显示实时完成提示?

我使用了show-hints.js,并对其进行了一些修改,以便为#34;。"太。 请帮忙。

2 个答案:

答案 0 :(得分:0)

    $http.get("/getApexBody", config).then(function(response) {
            document.getElementById("saveBtn").disabled = false;
            document.getElementById("cleanBtn").disabled = false;
            $scope.apexClassWrapper = response.data;
            $('#loaderImage').hide();
            if (globalEditor1) {
                globalEditor1.toTextArea();
            }
            setTimeout(function(test) {
                /*CodeMirror.commands.autocomplete = function(cm) {
                    cm.showHint({
                        hint: CodeMirror.hint.auto
                    });
                };*/
                var editor = CodeMirror.fromTextArea(document.getElementById('apexBody'), {
                    lineNumbers: true,
                    matchBrackets: true,
                    styleActiveLine: true,
                    extraKeys: {
                        ".": function(editor) {
                            setTimeout(function() {
                                editor.execCommand("autocomplete");
                            }, 100);
                            throw CodeMirror.Pass; // tell CodeMirror we didn't handle the key
                        }
                    },
                    gutters: ["CodeMirror-lint-markers"],
                    lint: true,
                    mode: "text/x-apex"
                });
                editor.on('inputRead', function onChange(editor, input) {
                    if (input.text[0] === ';' || input.text[0] === ' ') {
                        return;
                    }
                    //CodeMirror.commands.autocomplete = function(editor) {
                    editor.showHint({
                        hint: CodeMirror.hint.auto
                    });
                    //};
                });
                globalEditor1 = $('.CodeMirror')[0].CodeMirror;
            }), 2000
        });

这是有效的,但在输入“。”后,它确实给出了该特定变量的方法,但在输入几个匹配的单词后,它再次开始显示原始单词集的提示。

例如:isBatchisAbort是System类的两种方法。

当我开始输入Sy ...系统出现时,我输入“。”,这两种方法显示isBatchisAbort,但是当我输入isA时显示isAbort它会再次从完整的单词列表中显示提示。

有没有办法避免这种情况?

答案 1 :(得分:0)

使用此功能可以自动完成codeMirror,而无需 CTRL + 空格

show-hint.js

中将completeSingle设置为false
editor.on("inputRead", function(instance) {
    if (instance.state.completionActive) {
            return;
    }
    var cur = instance.getCursor();
    var token = instance.getTokenAt(cur);
    if (token.type && token.type != "comment") {
            CodeMirror.commands.autocomplete(instance);
    }
});