AutoCShow не срабатывает при добавлении динамических слов?

В настоящее время я пытаюсь написать небольшую 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));    

person Henrik    schedule 07.12.2015    source источник


Ответы (1)


(если кто-нибудь когда-нибудь задумывался)

Вам больше нечего делать.

В моем случае проблема заключалась в том, что добавленные слова начинались с заглавных букв. scintilla по умолчанию настроена на поиск точных случаев.

параметр:

editor.AutoCIgnoreCase = true;

при инициализации исправлена ​​проблема

person Henrik    schedule 08.12.2015