【问题标题】:ACE editor autocompletion keywords in upper caseACE 编辑器自动完成关键字大写
【发布时间】:2016-02-03 17:05:17
【问题描述】:

我有一个带有自定义高亮模式的 ACE 编辑器,基于 sql 模式,一切正常,但我将关键字定义为大写,并且当自动完成器显示可用选项时,它们都是小写的。

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

有没有办法把这个选项转换成大写?

我已查看此question,但我一直无法找到解决方法。 我还尝试将所有toLowerCase() 函数删除到ext-language-tools.js 中,但仍以小写显示选项。

谢谢!

【问题讨论】:

  • 这看起来像是 ace 中的一个错误,请尝试在 github 上打开一个问题。

标签: angularjs ace-editor


【解决方案1】:

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

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,
];

【讨论】:

    【解决方案2】:

    这是一个非常肮脏的解决方法,但您可以尝试通过添加以下内容来调整 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;
    

    【讨论】:

    • 最后我做了另一个解决方法,在控制器中创建了一个自定义完成器,使用这个解决方案不需要修改ext-language_tools.js。如果你愿意,我可以分享完整的代码。无论如何,您的解决方案运行良好,因此我将其标记为已接受的答案。
    • 感谢您的更新,自定义完成程序是另一种前进方式,我同意。我选择保留语言文件提供的关键字并为表和列创建自定义完成器,但当然有多种方法可以解决这个问题
    • 你能把代码分享给自定义完成者吗?
    • @RomeoMihalcea 你去吧:gist.github.com/yuvalherziger/aa48782568c6914b55066d290ff88360 请注意,这适用于某个版本的 Ace 编辑器,并且要点不包括您需要的样板代码以使 Ace 启动并运行.让我知道这对你有什么影响,很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多