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

本文关键字:添加 单词 动态 AutoCShow | 更新日期: 2023-09-27 18:25:52

我目前正在尝试编写一个小型的"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的单词包含在自动完成窗口中,因此您可以滚动查看它们,但如果我开始键入仅在knownClasses中的任何单词,则不会触发自动完成窗口。要触发窗口,我需要从关键字列表中键入一些内容,比如"void"

如果我想动态地将单词添加到自动补全列表中,我需要处理闪烁体中的其他秘密机制吗

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

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

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

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

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

(如果有人想知道的话)

你再也不需要做什么了。

在我的案例中,问题是添加的单词以大写字母开头。默认情况下,闪烁体被设置为搜索确切的病例。

设置:

editor.AutoCIgnoreCase = true;

在初始化时,修复了

问题