大写的 ACE 编辑器自动完成关键字

ACE editor autocompletion keywords in upper case

我有一个基于 sql 模式的自定义突出显示模式的 ACE 编辑器,一切正常,但我以大写形式定义关键字,当自动完成器显示可用选项时,所有它们是小写的。

我检查了旧的 sql 模式(在我修改之前),行为完全相同。

有什么方法可以将此选项转换为大写吗?

我已经查看了此 question,但我一直无法找到执行此操作的方法。 我还尝试将所有 toLowerCase() 函数删除到 ext-language-tools.js,但仍然以小写字母显示选项。

谢谢!

这是一个非常肮脏的解决方法,但您可以尝试通过添加以下内容来调整 ext-language_tools.js

代码的位置:

this.filterCompletions = function(items, needle) {
    var results = [];
    var upper = needle.toUpperCase();
    var lower = needle.toLowerCase();
    loop: for (var i = 0, item; item = items[i]; i++) {       
        var caption = item.value || item.caption || item.snippet;
        if (!caption) continue;

更改为以下内容,其中 'keyword''builtinFunctions' 是您要大写的完成组:

this.filterCompletions = function(items, needle) {
    var results = [];
    var upper = needle.toUpperCase();
    var lower = needle.toLowerCase();
    loop: for (var i = 0, item; item = items[i]; i++) {
        if (item.meta === 'keyword' || item.meta === 'builtinFunctions'){
            items[i].name = items[i].name.toUpperCase();
            items[i].value = items[i].value.toUpperCase();
        }
        var caption = item.value || item.caption || item.snippet;
        if (!caption) continue;

这是一个使用自定义完成器的干净解决方案:

const customKeyWordCompleter = {
  getCompletions(editor, session, pos, prefix, callback) {
    if (session.$mode.completer) {
      return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);
    }
    const state = editor.session.getState(pos.row);
    let keywordCompletions;
    if (prefix === prefix.toUpperCase()) {
      keywordCompletions = session.$mode.getCompletions(state, session, pos, prefix);
      keywordCompletions = keywordCompletions.map((obj) => {
        const copy = obj;
        copy.value = obj.value.toUpperCase();
        return copy;
      });
    } else {
      keywordCompletions = session.$mode.getCompletions(state, session, pos, prefix);
    }
    return callback(null, keywordCompletions);
  },
};

this.editor.completers = [
  customKeyWordCompleter,
  customCompleter,
];