Ace Editor自定义关键词按Enter/Tab无法触发自动补全
Ace Editor自定义补全器无法通过Tab/Enter应用补全的问题解决
问题原因分析
- 默认插入逻辑未触发:自定义补全项缺少
score字段时,Ace可能无法识别其为有效可插入项,导致按Tab/Enter仅关闭弹窗而无补全动作。 - 自定义
insertMatch实现错误:直接插入补全文本未删除已输入的前缀,导致重复内容(如输入"fo"后插入"foo"变成"fofoo")。
解决方案
方案一:补全项添加score字段(推荐)
给自定义补全项添加score字段(设置较高值确保优先级),让Ace的默认插入逻辑自动处理前缀替换:
/* my own completer */ const staticWordCompleter = { getCompletions(_editor, _session, _pos, _prefix, callback) { callback(null, suggestions.map(item => ({ caption: item.name, value: item.name, meta: 'MyOwn', score: 1000 // 添加高优先级分数 }))); }, }; editor.completers.push(staticWordCompleter);
添加后,Ace会自动用补全项的value替换当前输入的前缀,无需自定义insertMatch,Tab/Enter即可正常应用补全。
方案二:正确实现自定义insertMatch
如果方案一无效,可自定义insertMatch方法,先删除已输入的前缀再插入补全内容:
/* my own completer */ const staticWordCompleter = { getCompletions(_editor, _session, _pos, prefix, callback) { callback(null, suggestions.map(item => ({ caption: item.name, value: item.name, meta: 'MyOwn', prefix: prefix // 存储当前前缀,供insertMatch使用 }))); }, insertMatch(editor, data) { // 删除已输入的前缀 const prefixLength = data.prefix.length; if (prefixLength > 0) { editor.navigateLeft(prefixLength); editor.remove(prefixLength); } // 插入补全内容 editor.insert(data.value); } }; editor.completers.push(staticWordCompleter);
此方法会先清除输入的前缀(如"fo"),再插入完整补全文本(如"foo"),避免重复内容。
内容的提问来源于stack exchange,提问作者Nicolas Kopp
相关产品推荐
相关产品推荐

