Регулярное выражение для сопоставления переменных-членов
Я пытаюсь улучшить подсветку синтаксиса в режиме emacs C++ и мне нужно найти регулярное выражение для соответствия переменных-членов в коде.
То, что я хочу сопоставить с регулярным выражением, это красные ключевые слова на скриншоте, а не синие.
Чтобы найти вызовы функций (синие), я использую выражение ([a-zA-Z_]+[a-zA-Z0-9_]*)+[(]
Я хочу изменить это так, чтобы, если после ключевого слова были круглые скобки, оно не совпадало.
1 ответ
Я думаю, что это должно делать то, что вы хотите.
(font-lock-add-keywords
'c++-mode
'(("\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)[(]" 1 font-lock-function-name-face)
("\\.\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)" 1 font-lock-variable-name-face)))
Я немного изменил ваше первое регулярное выражение в попытке решить проблемы с производительностью (объяснение см. Ниже). Второе регулярное выражение просто заменяет завершающие скобки на ведущий период; мы полагаемся на порядок двух регулярных выражений для обработки вызовов методов, которые будут соответствовать обоим.
Как уже упоминали другие, ваши проблемы с производительностью, вероятно, связаны с регулярным выражением, которое может совпадать слишком многими способами. Закрепление с помощью символьных границ \_<
а также \_>
должно помочь Я был также обеспокоен соседним +
а также *
группы на непересекающихся наборах символов, но я не знаю, было ли это на самом деле проблемой.
Так как вам не нужно выделять строки и комментарии, вы должны оставить append
выкл. Если бы вы хотели выделение строк и комментариев, вы бы использовали prepend
, в то время как append
было бы полезно, только если вы использовали грань, которая задает свойство, которого не было в вашей строке или гранях комментария, и вы хотели объединить их. Чтобы увидеть, о чем я говорю, попробуйте заменить font-lock-function-name-face
с 'hi-yellow
, (Цитата здесь уместна, поскольку у выделенных граней нет псевдонимов переменных, таких как грани блокировки шрифта.)