wxStyledTextCtrl как стилизовать ключевые слова

У меня возникли проблемы с получением wxStyledTextCtrl для раскрашивания моих списков слов.

x->m_ctlEdit->SetKeyWords(0,"true false");
x->SetWordChars(wxT("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ._") );
x->StyleSetForeground(wxSTC_HPHP_WORD, wxColour(0x67,0xa6,0xff));

true и false таким образом не окрашиваются, я использовал StyleSetForeground для многих других определений, и все это работает нормально, просто возникают проблемы со списками слов.

В качестве второго вопроса: как разделить цвета для разных списков слов? Я знаю, что могу установить другой список ключевых слов с числовым идентификатором, но как мне применить стили для каждого списка ключевых слов, поскольку функция не принимает идентификатор?

Примечание. Использование лексера HTML/PHP, который поставляется по умолчанию с wxStyledTextCtrl.


person Prodigle    schedule 10.05.2019    source источник


Ответы (1)


Для лексера wxSTC_LEX_HTML html или лексера wxSTC_LEX_PHPSCRIPT php вам необходимо указать набор ключевых слов 4. Например:

x->m_ctlEdit->SetKeyWords(4,"true false");

Если вы используете лексический модуль html, вы можете узнать это, вызвав x->m_ctlEdit->DescribeKeyWordSets();, который вернет следующий список:

  • HTML-элементы и атрибуты
  • Ключевые слова JavaScript
  • Ключевые слова VBScript
  • Ключевые слова Python
  • Ключевые слова PHP
  • Ключевые слова SGML и DTD

В этом случае индекс ключевых слов PHP, отсчитываемый от 0, равен 4, поэтому это число будет передано в метод SetKeyWords.

Однако этот способ проверки не работает при использовании лексера PHP, поскольку вызов DescribeKeyWordSets вернет только «ключевые слова PHP». Таким образом, вы могли бы подумать, что вы должны вызывать SetKeyWords с 0, но на самом деле вам все равно нужно использовать 4, потому что лексер php-скрипта такой же, как лексер html. Это просто кажется странностью Сцинтиллы.

Кстати говоря, я думаю, что вызов SetWordChars не нужен. Согласно документации, это поиск по словам, а не по ключевым словам.

В качестве второго вопроса: как разделить цвета для разных списков слов?

Это зависит от лексера. Например, лексер C предлагает следующие наборы ключевых слов

  • Основные ключевые слова и идентификаторы
  • Второстепенные ключевые слова и идентификаторы
  • Ключевые слова комментариев к документации
  • Глобальные классы и определения типов
  • Определения препроцессора

которые соответствуют состояниям лексера wxSTC_C_WORD, wxSTC_C_WORD2, wxSTC_C_COMMENTDOCKEYWORD и т. д.

К сожалению, как описано выше, html-лексер предлагает только 1 набор ключевых слов для PHP.

person New Pagodi    schedule 10.05.2019
comment
Спасибо за хорошо продуманный ответ. Можно ли расширить наборы ключей HTML-лексера или перезаписать существующие определения? Например, если я заполню набор ключевых слов 7 (true false null), будет ли это или набор ключевых слов 4 иметь приоритет при стилизации? - person Prodigle; 10.05.2019
comment
Перед публикацией этого ответа я попытался посмотреть, можно ли использовать JavaScript и Python, но похоже, что лексер не будет использовать их с PHP-кодом. И если вы установите наборы ключевых слов 6 или 7, лексер вообще не будет их использовать. Так что я не буду ни перезаписывать, ни расширять. - person New Pagodi; 10.05.2019
comment
Если вам действительно нужно использовать несколько наборов ключевых слов, единственное, что я могу придумать, это взять существующий scintilla html-лексер, преобразовать его во внешний лексер и изменить, чтобы использовать наборы ключевых слов 6 и 7 для дополнительных наборов ключевых слов PHP. вот пример преобразования существующего лексера Python во внешний лексер. Глядя на код лексера html, похоже, это не должно быть слишком сложно. - person New Pagodi; 10.05.2019
comment
Вы также можете попробовать спросить в списке рассылки scintilla-interest, есть ли способ использовать несколько наборов ключевых слов с PHP. - person New Pagodi; 10.05.2019
comment
Цените помощь. Должно быть более чем достаточно, чтобы уйти :) - person Prodigle; 10.05.2019
comment
Изучил исходный код для лексера JSON и не смог его найти, не смог понять, включает ли его HTML, включает ли он лексику JS, но есть идеи, распространяется ли это на JSON или мне нужно захватить пользовательский? - person Prodigle; 14.05.2019
comment
Если вы используете версию 3.1.1 или выше, есть лексер JSON. Но если вы используете ветку 3.0, я предполагаю, что вам придется использовать лексер java-скриптов, который является частью HTML. (На самом деле все, что я сказал выше о внешних лексерах, применимо только к 3.1.1 или выше.) - person New Pagodi; 14.05.2019
comment
Взглянул на то, чтобы просто добавить новейший лексер Scintilla JSON в мою старую версию, но, основываясь на Wiki, каждому лексеру нужна соответствующая функция ColouriseLine и ColouriseDoc, которой, похоже, не хватает в лексере JSON. Поиск по остальной части Сцинтиллы также не смог найти это :/ - person Prodigle; 15.05.2019
comment
Это одна из областей, в которой я не могу вам помочь. Если вы не можете обновить wxWidgets до более высокой версии и собираетесь изменить исходные коды wxSTC, я думаю, вам повезет больше, добавив изменения, которые позволяют wxSTC использовать внешние лексеры, а затем пытаются использовать лексер JSON в качестве внешнего. - person New Pagodi; 15.05.2019
comment
Чтобы подвести итог для тех, кто наткнется на это, скажу, что лексер YAML будет работать с JSON, но не имеет специального идентификатора для значения, но имеет для ключа EG в заголовке случая: привет, вы можете раскрасить «заголовок», но не «привет». ', что было достаточно хорошо для моих нужд. Еще раз спасибо Пагоди - person Prodigle; 16.05.2019