web-dev-qa-db-ja.com

CodeMirrorオートコンプリートカスタムリスト

コードミラーのオートコンプリート機能を少し難しくしています。私がやろうとしていることは2つのことです(両方とも私は苦労しています):

1)HTMLJavaScriptの両方でオートコンプリートを有効にしたい。現在、次の例を使用して、一度に1つしか機能させることができません。

 CodeMirror.commands.autocomplete = function (cm) {
     CodeMirror.showHint(cm, CodeMirror.hint.html);
 };

HTMLからCodeMirror.hint.javascriptをリストに追加するにはどうすればよいですか?

2)(より重要な種類) -HTMLからのヒントのリストにカスタム変数を追加するにはどうすればよいですか?ajax呼び出しから取得した領域...。

つまり、HTMLヒントのデータの現在のリストをドロップダウンに表示したいのですが、##SomeCode1####SomeCode2##などのカスタムエントリを追加します。

ここで2つの問題があります。まず、「html-hint.js」ファイルの値をハードコーディングしようとすると、すべての値に<...が追加されます。これは私が望むものではありません。

2番目の問題は、新しい「html-hint.js」ファイルを正しく作成する必要があると私が信じていることです。つまり、上記のCodeMirror.hint.htmlの 'options'パラメータに何かを渡して、2つのリストを本質的にマージする方法はありません。

私はゲスト1と2が同じように考えています...オートコンプリートの値の2つのリストをマージします。

フレームワークにはまだ何もないと思います。カスタムヒントファイルを作成する必要がありますよね?

任意のポインタをいただければ幸いです。サンプルコードは素晴らしいでしょう。

13
Robin Rieger

ヒント関数を指定しない場合、show-hintアドオンは、完了が発生するlocalモード用に定義されたヒントヘルパー関数を使用するため、JavaScriptコードではCodeMirror.hint.javascriptになります。 、およびHTMLのCodeMirror.hint.html

独自の完了ロジックを追加する必要がある場合は、これらの関数を独自のコードで上書きするだけで、これらの関数を置き換える(またはラップする)ことができます。

これは、JavaScriptの補完に常に「bozo」を追加するハックの大まかな例です。

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;
};
21
Marijn

簡単な説明をしてくれた@Marjinに感謝しますが、フィルタリングをカバーしておらず、多くの人がそれを必要としているので、Marjinの答えに従って mongoclient で行ったことを次に示します。そして部分的に ここ から助けを借りました

p.s.私は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;
    };
9
Sercan Ozdemir