Регулярное выражение для сопоставления переменных-членов

Я пытаюсь улучшить подсветку синтаксиса в режиме 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, (Цитата здесь уместна, поскольку у выделенных граней нет псевдонимов переменных, таких как грани блокировки шрифта.)

Другие вопросы по тегам