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);
}
}
出于某种原因,这对所有ReservedKeywords
和ReservedTypeKeywords
都起作用,但对knownClasses
来说并不完全起作用
来自knownClasses
的单词包含在自动完成窗口中,因此您可以滚动查看它们,但如果我开始键入仅在knownClasses
中的任何单词,则不会触发自动完成窗口。要触发窗口,我需要从关键字列表中键入一些内容,比如"void"
如果我想动态地将单词添加到自动补全列表中,我需要处理闪烁体中的其他秘密机制吗
ps。我也在初始化时这样做以获得关键字颜色:
editor.SetKeywords(0, String.Join(" ", ReservedKeywords.AddRange(ReservedMagicKeywords).AddRange(ReservedTypeKeywords).Sort()));
但即使我在调用AutoCshow之前这样做,这也无济于事:
editor.SetKeywords(1, String.Join(" ", knownClasses));
(如果有人想知道的话)
你再也不需要做什么了。
在我的案例中,问题是添加的单词以大写字母开头。默认情况下,闪烁体被设置为搜索确切的病例。
设置:
editor.AutoCIgnoreCase = true;
在初始化时,修复了