В настоящее время я пытаюсь написать небольшую IDE "С# как скрипт". (редактор, компилятор кода в памяти и выполнение)
Я не недоволен какими-либо другими реализациями, я просто очень хотел сделать это сам. Теперь все идет хорошо. Я могу написать код с помощью текстового контроллера winform, скомпилировать его и запустить.
Сегодня мне захотелось добавить немного сахара, поэтому я заполучил ScintillaNET. (обертка .Net для Scintilla) и просто использовал этот контроллер вместо моего текстового контроллера. Это очень помогло, и подсветка ключевых слов оказалась на высоте.
Теперь о проблеме: я хотел иметь какую-то функцию, подобную 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».
Есть ли в Scintilla какой-то другой секретный механизм, с которым мне нужно работать, если я хочу динамически добавлять слова в список автозавершения?
пс. Я также делаю это при инициализации, чтобы получить цвета ключевых слов:
editor.SetKeywords(0, String.Join(" ", ReservedKeywords.AddRange(ReservedMagicKeywords).AddRange(ReservedTypeKeywords).Sort()));
но это не поможет, даже если я сделаю это непосредственно перед вызовом AutoCshow:
editor.SetKeywords(1, String.Join(" ", knownClasses));