CodeMirror自动完成自定义列表

Rob*_*ger 12 codemirror

我在代码镜像中有一点困难的自动完成功能.我想要做的是两件事(我正在努力解决):

1)我想启用自动完成两个HTMLJavaScript.目前我只能使用以下方式一次工作:

 CodeMirror.commands.autocomplete = function (cm) {
     CodeMirror.showHint(cm, CodeMirror.hint.html);
 };
Run Code Online (Sandbox Code Playgroud)

如何CodeMirror.hint.javascript从列表中添加列表HTML

2)(更重要的一种) - 如何将自定义变量添加到HTML从ajax调用中检索的区域的提示列表.....

即我想让下拉显示来自html提示的当前数据列表,但随后添加自定义条目,如##SomeCode1####SomeCode2##

我这里有两个问题.首先,当我尝试对'html-hint.js'文件中的值进行硬编码时,所有值都会附加<...这不是我想要的.

第二个问题是,我认为我必须写一个新的'html-hint.js'文件正确吗?我的意思是没有办法在上面的'options'参数中传递任何东西CodeMirror.hint.html,基本上合并两个列表.

我和客人一两个都有同样的想法......将两个值列表合并为一起自动完成.

我猜测框架中已经没有任何内容,我必须编写自定义提示文件,对吗?

任何指针将不胜感激.示例代码非常棒.

Mar*_*ijn 20

如果你没有指定提示函数,show-hint addon将采用为完成发生的本地模式定义的提示辅助函数,因此它将CodeMirror.hint.javascriptJavaScript代码和CodeMirror.hint.htmlHTML中.

如果您需要添加自己的完成逻辑,可以通过使用自己的代码覆盖它们来替换(或换行)这些函数.

这是一个粗略的示例黑客,总是将"bozo"添加到JavaScript完成:

var orig = CodeMirror.hint.javascript;
CodeMirror.hint.javascript = function(cm) {
  var inner = orig(cm) || {from: cm.getCursor(), to: cm.getCursor(), list: []};
  inner.list.push("bozo");
  return inner;
};
Run Code Online (Sandbox Code Playgroud)

  • 很有帮助。也许您可以扩展答案,使真正的自动补全功能像我输入“ bo”时那样,仅建议“ bozo”,而不是“ foobar”,并且不会在“ bo”后添加“ bozo”,而是替换为“ bo”和“ bozo”。谢谢 :) (2认同)
  • 提示函数负责过滤.如果它只是无条件地添加一个单词,就像在我的例子中那样,不会发生过滤.但是如果你愿意,你可以在那里添加你自己的逻辑. (2认同)

Ser*_*mir 8

感谢@Marjin的简要解释,但由于它不包括过滤而且很多人都需要它,这是我在mongoclient中通过遵循Marjin的答案所做的.并从这里部分得到了帮助

ps不要忘记改变你的提示,因为我正在使用javascript我已经改变了javascript提示.

CodeMirror.hint.javascript = function (editor) {
        var list = Session.get(Template.strSessionDistinctFields) || [];
        var cursor = editor.getCursor();
        var currentLine = editor.getLine(cursor.line);
        var start = cursor.ch;
        var end = start;
        while (end < currentLine.length && /[\w$]+/.test(currentLine.charAt(end))) ++end;
        while (start && /[\w$]+/.test(currentLine.charAt(start - 1))) --start;
        var curWord = start != end && currentLine.slice(start, end);
        var regex = new RegExp('^' + curWord, 'i');
        var result = {
            list: (!curWord ? list : list.filter(function (item) {
                return item.match(regex);
            })).sort(),
            from: CodeMirror.Pos(cursor.line, start),
            to: CodeMirror.Pos(cursor.line, end)
        };

        return result;
    };
Run Code Online (Sandbox Code Playgroud)