如何使用 Ace Editor 执行以下操作。
我基本上希望 @ 作为自动完成的触发器,但我不希望它在之后徘徊。
谢谢你
addAutoComplete() {
var me = this;
ace.require('./config').loadModule('ace/ext/language_tools', () => {
this.aceEditor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: false
});
me.include = /[a-z.]/i;
this.aceEditor.on('change', (obj, editor) => {
switch (obj.action) {
case 'insert':
let lines = obj.lines;
let char = lines[0];
if ((lines.length === 1) && (char.length === 1) && me.include.test(char)) {
setTimeout(() => {
me.aceEditor.commands.byName.startAutocomplete.exec(me.aceEditor);
}, 50);
}
break;
}
});
});
}
这就是演示。工作正常
我们可以绑定'@'关键字并触发自动完成:
editor.commands.addCommand({
name: "myCommand",
bindKey: { win: "@", mac: "@" },
exec: function (editor) {
autocomplete();
}
});
autocomplete: function () {
staticWordCompleter = {
var getWordList = function(editor, session, pos, prefix, callback, isRHSEditor) {
var wordList = []; // add your words to this list
callback(null, wordList.map(function(word) {
return {
caption: word,
value: word
};
}));
editor.completers = [staticWordCompleter];
}
以上方法都不适合我。我最终推出了自己的自动完成/自动建议以使其发挥作用。很难举出一个例子,但简而言之,步骤是:
const {row, column} = window.editor.getCursorPosition();
const {pageX, pageY} = window.editor.renderer.textToScreenCoordinates(row, column)
const autosuggest = document.getElementById("ELEMENT_NAME")
autosuggest.style.left = pageX
autosuggest.style.top = pageY
function disableEnterKeyInEditor() {
editor.commands.addCommand(commmand_enter);
}
function enableEnterKeyInEditor() {
editor.commands.removeCommands(commmand_enter);
}
command_enter = {
name: "enterKeyPressedCommand",
bindKey: {win: "Enter", mac: "Enter"},
exec: function (editor) {
return true;
}
};
这比使用 ace 的自动完成功能要容易得多。
使用最新版本的ace就可以使用
triggerCharacters
下面的代码将触发自动完成弹出窗口
@
const completer = {
getCompletions: function (editor, session, pos, prefix, callback) {
callback(
null,
autoCompletes.map((word) => ({ value: word, score: 1000, meta: "components" }))
);
},
triggerCharacters: ["@"],
};
完整示例JSfiddle
您可以通过以下代码查看:
var getWordList = function(editor, session, pos, prefix, callback, isRHSEditor) {
var wordList = [];
if(prefix === '@') {
wordList.push('add you're name list here');
}
callback(null, wordList.map(function(word) {
return {
caption: word,
value: word
};
}));
}