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);
由于某种原因,这适用于所有 ReservedKeywords
和 ReservedTypeKeywords
,但不完全适用于 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 不会触发动态添加的单词?的主要内容,如果未能解决你的问题,请参考以下文章
VB.Net:动态创建的月历不会触发 Lost Focus 或 GotFocus