Ace Editor自定义自动补全仅匹配指定word触发的实现方法
解决Ace Editor自定义补全仅完全匹配触发的问题
要实现仅当输入内容与自定义片段的word属性完全匹配时才显示对应的补全项,同时保留默认的关键字、本地变量补全,你需要修改getCompletions函数的逻辑,核心是过滤自定义补全项并合并默认补全结果,具体步骤如下:
1. 修正自定义补全列表的语法问题
首先检查你的autoCompleteList.getWordList,确保word是字符串类型,result也是合法的字符串(避免语法错误):
autoCompleteList.getWordList = () => { return [ { word: 'text', // 改为字符串格式 result: 'new myClass({ someProps: value })', // 用字符串包裹代码片段 meta: "Query" } ]; };
2. 修改getCompletions函数逻辑
在编辑器的补全回调中,先获取Ace默认的补全结果,再过滤出与当前输入prefix完全匹配的自定义项,最后合并两者返回:
getCompletions: (editor, session, pos, prefix, callback) => { // 先获取Ace原生的默认补全(关键字、本地变量等) session.$mode.getCompletions(editor, session, pos, prefix, (err, defaultCompletions) => { if (err) { callback(err, []); return; } // 过滤自定义补全:仅保留word与输入prefix完全相等的项 const wordList = autoCompleteList.getWordList(); const customCompletions = wordList .filter(item => item.word === prefix) .map(item => ({ name: item.word, value: item.result, meta: item.meta // 保留自定义的meta标识 })); // 合并默认补全和匹配的自定义补全 callback(null, [...defaultCompletions, ...customCompletions]); }); }
逻辑说明
- 默认补全保留:通过
session.$mode.getCompletions获取Ace原生的补全结果,确保输入new等关键字时能正常显示默认提示。 - 自定义项过滤:使用
filter(item => item.word === prefix)只保留与当前输入完全匹配的自定义片段,避免无关补全弹出。 - 结果合并:将过滤后的自定义项和默认补全合并,保证两种补全逻辑共存。
内容的提问来源于stack exchange,提问作者TheRobQ
相关产品推荐
相关产品推荐

