LINUX.ORG.RU

XEmacs: подсветка произвольных слов в c++-mode


0

0

Допустим, нужно подсветить слова foo и FOO как ключевые. 
В соответствии с документацией на переменную font-lock-keywords
пишем в хуке для соответствующей моды:

(set (make-local-variable 'font-lock-keywords)
  (append c++-font-lock-keywords
     '(("\\<\\(foo\\|FOO\\)\\>" 0 font-lock-keyword-face t))))

Получаем требуемую подсветку, но внутри комментариев тоже! 
То есть выбранный face перебивает font-lock-comment-face?
Может, надо сунуть в переменную более сложное выражение?

В общем, прошу помощи у знатных емаксеров, например у lg :-)
★★★★

убери override, в этом случае подкрашеваться будет в случае если еще не
подкрашено, типа:

(set (make-local-variable 'font-lock-keywords)
  (append c++-font-lock-keywords
     '(("\\<\\(foo\\|FOO\\)\\>" 0 font-lock-keyword-face))))

lg ★★
()

На всякий случай, версия XEmacs 21.4 (patch 16), то есть самая новая из стабильных.

hbee ★★★★
() автор топика
Ответ на: комментарий от lg

Конкретнее:

class Test
{
signals:
    void ok();

public:
    Test() {}
};

Новый модификатор доступа - signals. 
Нужно, чтобы красился, как public.

hbee ★★★★
() автор топика
Ответ на: комментарий от hbee

hbee: это обеспечит матчинг самого 'signal:'

в коментах не будет подсвечиваться если ты не укажешь override как я писал

у тебя регексп задан слижком обще ("\\<signal\\>"), поэтому подсветить кейворды которые он матчит без оверрайдинга практически невозможо (будут подсвечиваться только отдельно стоящиее кейворды) мы же сузили регексп таким образом, что он еще матчит полезные нам кейворды, но в тоже время может работать без оверрайда .. тем самым в коментах подсветки не будет

lg ★★
()
Ответ на: комментарий от lg

> в таком случае пользуй регексп типа: "signals[ \t\n]*:"

Так:

(set (make-local-variable 'font-lock-keywords)
  (append c++-font-lock-keywords
     '(("signals[ \t\n]*:" (0 font-lock-keyword-face)))))

Странно, это работает только если перед signals поставить
точку или слэш или что-нибудь такое. А в нормальном случае
не подсвечивается... 

"[ \t\n]*signals[" \t\n]*:" не помогло.

hbee ★★★★
() автор топика
Ответ на: комментарий от lg

На самом деле я этой фигней страдаю уже третью неделю, перерыл гугль, wiki, просмотрел кучу .el файлов... В переменной font-lock-keywords содержится очень сложное выражение, в котором мелькает c-skip-comments-and-strings. Может, эта функция имеет отношение к моей проблеме?

hbee ★★★★
() автор топика
Ответ на: комментарий от lg

Вообще, font-locking в XEmacs - загадочная вешь. Стандартные-то ключевые слова подсвечиваются в любом контексте, даже в неправильном для них, и комментарии их успешно скрывают... Кстати, в FSF Emacs с этим дело выглядит лучше. Там более высокоуровневый интерфейс для добавления слов - функция font-lock-add-keywords, и работает сразу как надо.

hbee ★★★★
() автор топика
Ответ на: комментарий от hbee

да :) вынудил таки сесть и разобраться ..  вобщем твой signal: нельзя
вообще подкрасить без оверайда, так как он уже матчиться по дефольту
кем-то, но глобальный оверайд тоже не каканает юзать, так как в
комментах и строках тоже будет подкрашиваться.  Как ты правильно нашел
тут есть грамотная функция c-skip-comments-and-strings которую можно
пользовать ..

в итоге имеем:

(setq font-lock-keywords
      (append font-lock-keywords
              '(("signals[ \t\n]*:" (0 font-lock-keyword-face
                                     t c-skip-comments-and-strings)))))

или типа того ..

да я согласен в GNU Emacs font lock keywording API более удобный ..

lg ★★
()
Ответ на: комментарий от lg

блян, разобрался называется ... ужас, этот font-lock-keywords для меня
филькина грамота теперь .. как это работает я не знаю (а раньше думал
что знал) .. убожество полное ..

попробуй вот это:

(setq font-lock-keywords
      (append font-lock-keywords
              (list (list (c-make-font-lock-search-function
                           "signals[ \t\n]*:" '(0 font-lock-keyword-face t))))))

у меня заработало ..


lg ★★
()
Ответ на: комментарий от lg

Гениально! У меня тоже получилось. Огромное спасибо.

hbee ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.