如何使用ace编辑器动态触发自动完成:输入命令和完整选项

时间:2015-09-16 09:57:20

标签: javascript autocomplete editor ace-editor

  1. 我知道如何在网页中使用ace编辑器
  2. 我知道如何添加完成者
  3. 我想这样做,输入一个命令,一个空格,然后按-(短划线), 让ace编辑器自动完成选项(参数),我该怎么办?

    例如,这是一个带有选项Print的命令-a|-b|-c|-d, 当我输入Print -时,如何触发自动完成,并让您选择 -a-b-c-d

2 个答案:

答案 0 :(得分:5)

我自己解决。 代码如下:

var langTools = ace.require("ace/ext/language_tools");
    var editor = ace.edit("stepEditor");
    editor.setTheme("ace/theme/chrome");
    editor.getSession().setMode("ace/mode/tcl");
    editor.setOptions({
        enableBasicAutocompletion: true,
        enableSnippets: false,
        enableLiveAutocompletion: true
    });
    var wordList = [];
    var icc2Commands = null;
    jQuery.getJSON("auto_completion.json",function(obj){  
        icc2Commands = obj;
        for(var name in obj){         
            wordList.push(name);    
        }    
        for(var i = 0; i < 5; i++)
        {
            console.log(wordList[i]);
        }
    }); 
    var icc2Completer = {
            getCompletions: function(editor, session, pos, prefix, callback) {
            var curLine = session.getDocument().getLine(pos.row);
            var curTokens = curLine.slice(0, pos.column).split(/\s+/);
            var curCmd = curTokens[0];
            if (!curCmd) return;
            var lastToken = curTokens[curTokens.length-1];
            var candidates = [];
            if (lastToken && lastToken.match(/^-/)) {
              for (var option of icc2Commands[curCmd]) {
                if (option.startsWith(lastToken.slice(1))) {
                  candidates.push("-"+option);
                }
              }
              callback(null, candidates.map(function(ea) {
                return {name: ea, value: ea, score: 300, meta: "ICC2Option"};
              }));
            } 
            else{
                callback(null, wordList.map(function(word) {
                    return {
                        caption: word,
                        value: word,
                        meta: "ICC2Command"
                    };
                }));
            }
        }
    }
    langTools.addCompleter(icc2Completer);

答案 1 :(得分:0)

enableLiveAutocompletion在许多情况下似乎都可以使用,但是我发现由于某些原因,如果您先键入一个单词,然后键入一个空格,然后键入另一个单词,它不会显示弹出窗口。对我有用的是打电话给我:

sourceEditor.execCommand('startAutocomplete');

这是触发 ctrl + space 动作的编程方式,在某些情况下似乎弹出了enableLiveAutocompletion未涵盖的弹出式窗口。