2017-04-16 11 views
0

エースエディタを使用して、スニペットの補完に加えてユーザータイプの自動補完を提供したいと思います。例を挙げると、私は以下のスニペットを持っています。エースエディタ|自動コードブロックの完成

\begin{${1:something}} 

\end{${1:something}} 

これは一般的なスニペットとして機能します。ユーザータイプとして

\begin{equation} 

と入力したら、最初のスニペットに示すように一致する終了ブロックを挿入します。 keyboardHandlerを追加して上記のテキストをチェックするよりも良い方法はありますか?おそらく、$ {1}の値をオートコンプリートとして含むカスタマイズされた「スニペット」を表示する方法はありますか?

答えて

0

カーソルの前にコマンドがあるときにオートコンプリートをトリガーすることで、この問題を解決しました。これにより、ENTERキーが現在選択されているスニペットを挿入するため、両方の問題が修正されます。

editor.commands.on("afterExec", function(e) { 
     if (e.command.name === "insertstring") { 
      if (getCommand(editor)) { 
       editor.execCommand("startAutocomplete"); 
      } 
     } 
}); 

getCommandは、基本的に、カーソルの後ろにコマンドがあるか否かを判定する:私は次のコードを使用してオートコンプリートを引き起こし。コマンドがあるときにオートコンプリートがトリガーされるので、\ endタグを含む入力コマンドからスニペットを動的にビルドするためにカスタムコンプリートが必要になりました。

identifierRegexps: [/[\\a-zA-Z0-9{}\[\]]/], 
getCompletions: function(editor, session, pos, prefix, callback) { 
    const command = getCommand(editor); 
    if (!command) { callback(null, []); return } 
    const completions = []; 

    let caption = command.cmd; 
    if (command.mods.length > 0) caption += `[${command.mods}]`; 
    if (command.args.length > 0) caption += `{${command.args}}`; 

    let snippet = command.cmd; 
    if (command.mods.length > 0) snippet += `[${command.mods}]`; 
    if (command.args.length > 0) snippet += `{${command.args}}`; 

    if (command.cmd === '\\begin') { 
     snippet += '\n\t${1}'; 
     snippet += `\n\\end{${command.args}}` 
    } 

    completions.push({ 
     caption: caption, 
     snippet: snippet, 
     meta: command.cmd === '\\begin' ? 'env' : 'cmd', 
    }); 

    callback(null, completions); 
} 

ユーザーが自動補完をトリガする前に入力された古いコマンドを、維持からエディタを防止するために必要とされるidentifierRegexpsを、注意してください。基本的にすべての英数字、大括弧、バックスラッシュと一致します。次に、このコードをエディタに追加しました。

langTools.addCompleter(customCompleter); 

ここで、customCompleterは上記のオブジェクトです。