AutoCShow 不会触发动态添加的单词?

Posted

技术标签:

【中文标题】AutoCShow 不会触发动态添加的单词?【英文标题】:AutoCShow does not trig on dynamically added words? 【发布时间】:2015-12-07 08:04:11 【问题描述】:

我目前正在尝试编写一个小的“C# 作为脚本”IDE。 (编辑器,带有内存代码编译器,并执行)

我对其他任何实现都没有不满意,我只是真的希望自己能够做到这一点。现在一切进展顺利。我可以使用 winform 文本控制器编写代码,编译并运行它..

今天我想加点糖,所以我接触了 ScintillaNET。 (用于 Scintilla 的 .Net 包装器)并简单地使用此控制器而不是我的文本控制器。这很有帮助,而且关键字突出显示很到位。

现在解决问题: 我想要一些类似 IntelliSense 的功能。 我想,Scite 带有自动完成功能,所以这个功能必须在 Scintilla 的某个地方。我找到了 AutoCshow,并让它与突出显示的关键字一起工作。 我现在唯一需要的是使用反射来获取类列表,每次成功编译代码时,然后将其转换为字符串列表,并将其添加到自动完成单词列表中..

我让反射部分运行,并成功从运行时代码中获取类列表并将其转储到字符串列表knownClasses

所以最后我这样做是为了触发自动补全:

//do automatic keyword completion:
editor.CharAdded += AutoCompleter;

我在其他地方做了这个: (我知道它可以优化,但这不是这里的问题)

 public void AutoCompleter(object sender, ScintillaNET.CharAddedEventArgs e)
 
        var currentPos = editor.CurrentPosition;
        var wordStartPos = editor.WordStartPosition(currentPos, true);

        // Display the autocompletion list
        var lenEntered = currentPos - wordStartPos;
        if (lenEntered > 0)
        
            List<string> AutoCompleteList = new List<string>();
            AutoCompleteList.AddRange(ReservedKeywords);
            //AutoCompleteList.AddRange(ReservedMagicKeywords); //we should never autocomplete theese
            AutoCompleteList.AddRange(ReservedTypeKeywords);
            AutoCompleteList.AddRange(knownClasses);
            AutoCompleteList.Sort();
            AutoCompleteList = AutoCompleteList.Distinct().ToList();

            string AutoCompleteString = String.Join(" ", AutoCompleteList.ToArray());
            editor.AutoCShow(lenEntered, AutoCompleteString);
        

由于某种原因,这适用于所有 ReservedKeywordsReservedTypeKeywords,但不完全适用于 knownClasses

knownClasses 中的单词 包含在自动完成窗口中,因此您可以滚动查看它们,但如果我开始输入仅在 @ 中的任何单词,则不会触发自动完成窗口987654328@。要触发窗口,我需要从关键字列表中输入一些内容,例如“void”

如果我想动态地将单词添加到自动完成列表中,我需要处理 Scintilla 中的其他一些秘密机制吗?

ps。我也在初始化时这样做以获得关键字颜色:

editor.SetKeywords(0, String.Join(" ", ReservedKeywords.AddRange(ReservedMagicKeywords).AddRange(ReservedTypeKeywords).Sort()));

但即使我在调用 AutoCshow 之前这样做也无济于事:

editor.SetKeywords(1, String.Join(" ", knownClasses));    

【问题讨论】:

【参考方案1】:

(如果有人想知道的话)

您无需再做任何事情。

就我而言,问题在于添加的单词以大写字母开头。 scintilla 默认设置为搜索确切的情况。

设置:

editor.AutoCIgnoreCase = true;

在初始化时,修复了问题

【讨论】:

以上是关于AutoCShow 不会触发动态添加的单词?的主要内容,如果未能解决你的问题,请参考以下文章

动态添加的表行不会触发 Click 事件

VB.Net:动态创建的月历不会触发 Lost Focus 或 GotFocus

用Jquery的append事件动态添加控件,点击添加时会清空原来动态控件中的值。是啥原因?

jQuery动态添加的节点事件无法触发

SCI_AUTOCSHOW 上闪烁

springboot添加多数据源 以及 动态添加数据源动态切换数据源