16

コード ミラーリングのオート コンプリート機能に少し苦労しています。私がやろうとしているのは2つのことです(どちらも苦労しています):

HTML1) と の両方でオートコンプリートを有効にしたいJavaScript。現在、次の例を使用して、一度に 1 つのみ動作させることができます。

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

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

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

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

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

2 つ目の問題は、新しい 'html-hint.js' ファイルを正しく作成する必要があると思いますか? 上記の「オプション」パラメーターに何かを渡す方法がないことを意味し、CodeMirror.hint.html本質的に2つのリストをマージします。

考えてみると、ゲスト1と2は同じようなものです...オートコンプリートの2つの値のリストを一緒にマージします。

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

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

4

3 に答える 3

22

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

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

以下は、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;
};
于 2013-10-09T10:47:31.533 に答える
9

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

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;
    };
于 2016-10-11T08:21:42.240 に答える