Временная граница Emacs regex (в частности, подчеркивание)

Я пытаюсь заменить все вхождения целого слова на emacs (скажем, foo), используя M-x replace-regexp.

Проблема в том, что я не хочу заменять вхождения foo в подчеркнутых словах, таких как word_foo_word

Если я использую \bfoo\b для соответствия foo, то он будет соответствовать подчеркнутым строкам; потому что, как я понимаю, emacs считает, что подчеркивания являются частью границ слова, что отличается от других систем регулярных выражений, таких как perl.

Каким будет правильный способ?

Спасибо

Ответ 1

Регулярное выражение \<foo\> или \bfoo\b соответствует foo только тогда, когда ему не предшествует или не следует текстовый составной символ (код синтаксиса w, обычно alphanumerics, поэтому он соответствует foo_bar, но не в foo1).

Так как Emacs 22, regexp \_<foo_bar\_> соответствует foo_bar только тогда, когда ему не предшествует или не следует символьный составной символ. Компонент символа является либо составной частью слова, либо символом с синтаксисом _. Большинство режимов программирования определяют _ как составляющую символа.

Ответ 2

Вы писали:

поскольку я понимаю, что emacs считает, что подчеркивания являются частью границ слова, которая отличается от других систем регулярных выражений

Обработка подчеркивания, как и все остальное в emacs, настраивается. Этот вопрос:
Как сделать передовое слово, обратное слово, рассматривать подчеркивание как часть слова?

... спрашивает обратное.

Я думаю, вы могли бы решить свою проблему, изменив синтаксис подчеркивания в таблице синтаксиса, чтобы они не были частью слов, а затем выполняли поиск/замену.

Для этого вам нужно знать, какой режим вы используете, и имя таблицы синтаксиса для этого режима. В С++ это будет так:

(modify-syntax-entry ?_ "." c++-mode-syntax-table)

Точка обозначает "пунктуацию", которая подразумевает не часть слова. Подробнее об этом попробуйте M-x describe-function на modify-syntax-entry.