Найти и заменить целые слова (не подстроки) в Emacs - PullRequest
7 голосов
/ 08 сентября 2011

1) В процессе адаптации моего редактора GUI к EMACS у меня, похоже, возникают проблемы с нахождением четкого способа сделать относительно простую задачу для большинства редакторов: найти и заменить целые слова (не подстроки) в тексте и найти точные совпадения. M-x replace-string находит подстроки, а также целые слова. Есть ли регулярное выражение, которое делает это?

2) Кроме того, есть ли способ сопоставить точные строки? Например, если бы я хотел заменить myClaS точным регистром для каждой буквы, что я должен был бы сделать? Прямо сейчас строка замены соответствует myclass с myCLasS. Как я понимаю, только первые буквы в кейсе совпадают. Я предполагаю, что некоторые регулярные выражения также позаботятся об этом.

3) Есть ли возможность выполнить поиск по кругу? Или мне всегда придется решать, делать ли мне C-s (вперед) или C-r (назад)

Ответы [ 5 ]

8 голосов
/ 08 сентября 2011

Используйте привязки границ слова: \bfoo\b соответствует только foo, а не foobar.

Тогда регулярные выражения обычно чувствительны к регистру.В большинстве вариантов вы можете явно сделать их чувствительными к регистру, добавив (?I) или (?-i) к вашему регулярному выражению.Но я не уверен, что регулярные выражения Emacs могут это сделать.

Я понятия не имею о вашем третьем вопросе.К сожалению.

6 голосов
/ 08 сентября 2011

Все остальные ответы содержат информацию, которую вы можете использовать, чтобы заставить Emacs делать то, что вы хотите. Но вы также можете свернуть свою собственную функцию поиска / замены, чтобы сделать то, что вы хотите, так:

(defun search-replace-ala-octi (tosearch toreplace)
  (interactive "sSearch for word: \nsReplace with: ")
  (save-excursion
    (goto-char (point-min))
    (let ((case-fold-search nil)
          (count 0))
      (while (re-search-forward (concat "\\b" tosearch "\\b") nil t)
        (setq count (1+ count))
        (replace-match toreplace 'fixedcase 'literal))
      (message "Replaced %s match(es)" count))))

И свяжи его с тем ключом, который тебе нужен ...

1 голос
/ 11 сентября 2012

На вопрос 1 (поиск по всему слову) \b в ответе @Tim не может работать при встрече с символом _.Кажется, что foo\b может соответствовать foo_bar в Emacs (конечно, это не может совпадать в Perl).

1 голос
/ 08 сентября 2011

Для вопроса 2, если строка поиска имеет строчные буквы, emacs по умолчанию выполняет поиск без учета регистра. Вы можете принудительно выполнить поиск с учетом регистра, установив case-fold-search на ноль. Вы можете поместить это в свой файл .emacs: (setq case-fold-search nil).

1 голос
/ 08 сентября 2011

Во-первых, не могли бы вы в будущем поставить несколько вопросов на отдельные вопросы? Это облегчает другим пользователям помощь вам и другим пользователям, у которых в будущем возникнут те же вопросы, чтобы получить помощь из предыдущих ответов.

  1. См. @ Тим ответ

  2. См. C-h k M-% и прочитайте раздел о сопоставлении регистра

  3. Выполнение C-s после последнего матча подскажет вам, что вы находитесь в конце, снова нажав C-s с начала Прочитайте документы, нажав C-h i, затем нажмите * Emacs, затем нажмите g Repeat Isearch RET, второй до последнего абзаца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...