カーソルの前にコマンドがあるときにオートコンプリートをトリガーすることで、この問題を解決しました。これにより、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は上記のオブジェクトです。