我現在已經通過在光標前面有一個命令時觸發自動完成來解決問題。這樣可以解決這兩個問題,因爲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是上面顯示的對象。