строки emacs, auctex и query-replace с новой строкой - PullRequest
4 голосов
/ 30 июля 2010

Я использую emacs + auctex и режим автозаполнения.

Теперь иногда я хочу найти (и заменить) строку, содержащую пробелы, такие как «test1 test2».Проблема в том, что режим автозаполнения заменяет символы пробела иногда символами новой строки.Таким образом, поиск и замена «test1 test2» не находит те вхождения этой строки, где автоматическое заполнение заменяет пробел символом новой строки.

Есть идеи, как решить эту проблему?

В текстовом режиме он работает, используя \ s- в query-replace-regexp, то есть "test1 \ s-test2", но это не работаетв auctex-режиме я не знаю почему.

Использование Cq Cj очень неудобно в использовании, потому что такие случаи, как "test1 test2", встречаются очень часто, особенно потому, что я хочу получить переводы строки и пробелы за один проход, поэтому мне нужно сделать что-то вроде этого:

M-x query-replace-regexp RET

test1[ <-- one space

C-j C-q

]\s-*test2

Последний \ s- * из-за возможных отступов в auctex.Кажется, это не очень элегантно.

Кстати, если вы хотите найти и заменить «test1 test2», очень раздражает каждый раз, когда вы рассматриваете случаи новой строки специально ...

Ответы [ 2 ]

3 голосов
/ 30 июля 2010

Emacs также имеет «категории», которые похожи на синтаксические классы, но немного более гибкие.Вы можете использовать \cX в регулярных выражениях для сопоставления символа в категории X.

Вот функция для определения категории «все пробельные символы», которая включает пробелы, символы новой строки, табуляции и каналы формы,что вы можете ссылаться на регулярные выражения как \cs.

(defun define-all-whitespace-category (table)
  "Define the 'all-whitespace' category, 's', in the category table TABLE."
  ;; First, clear out any existing definition for category 's'. Otherwise,
  ;; define-category throws an error if one calls this function more than once.
  (aset (char-table-extra-slot table 0) (- ?s ? ) nil)
  ;; Define the new category.
  (define-category ?s "all whitespace
All whitespace characters, including tab, form feed, and newline"
    table)
  ;; Add characters to it.
  (mapc (lambda (c) (modify-category-entry c ?s table))
        '(?  ?\n ?\f ?\t)))

(define-all-whitespace-category (standard-category-table))

Мне кажется, что auctex-mode использует стандартную таблицу категорий, поэтому вы должны иметь возможность использовать query-replace-regexp с foo\cs+bar в этом режиме.

Чтобы проверить это, вы можете указать точку на интересующем вас персонаже и сказать:

M-: (looking-at "\\cs") RET

, которая оценивается в t, если указанный символ являетсяв категории «все пробелы».

0 голосов
/ 30 июля 2010

Самый простой способ исправить это - написать небольшую функцию elisp.

что-то вроде:

(defun auctex-query-replace-regexp (first second replace)
  (interactive "Mfirst:\nMsecond:\nM:replace:")
  (while (re-search-forward (concat first "[ 
]*" second))
    (replace-match replace)))

Вставьте это в свой .emacs, поставьте точку на последнем) и оцените с помощью C-x C-e

Привязать его к клавише либо глобально с global-set-key, либо с учетом режима с помощью add-hook.

обратите внимание, что класс символов состоит излитерал space, а затем литерал newline, вставленный с C-o или C-q C-j

Это довольно простой пример.Улучшение его оставлено в качестве упражнения для читателя;)

...