Сколько символов обратной косой черты требуется, чтобы экранировать регулярные выражения в режиме настройки emacs?

Я пытаюсь использовать пакеты customize-group emacs, чтобы настроить некоторые части моей установки, и я в тупике. Я вижу такие вещи в моем файле .emacs после внесения изменений с помощью настройки:

'(tramp-backup-directory-alist (quote (("\\\\`.*\\\\'" . "~/.emacs.d/autobackups"))))

Это было результатом помещения в текстовое поле настройки следующего:

Regexp matching filename: \\`.*\\'

Это репрезентативная выборка: на самом деле я пытаюсь изменить несколько вещей, которые требуют регулярного выражения, и все они показывают одну и ту же проблему. Сколько слоев цитирования существует на самом деле? Кажется, я не могу найти волшебное количество обратных косых черт, чтобы заставить эту чертову штуку делать то, о чем я ее прошу, даже для простейших регулярных выражений, таких как .*. Щас данная кастомизация выдает - ничего. Это не меняет поведения emacs по умолчанию.

А еще лучше, где это задокументировано? Это немного сложно для Google, но я пробовал довольно много вещей там, а также в официальной документации и вики Emacs. Где авторитетный источник того, сколько чертовых обратных слэшей нужно, чтобы регулярное выражение в режиме настройки действительно работало - или, по крайней мере, чтобы оно выдало какое-то предупреждение, а не молча?


РЕДАКТИРОВАНИЕ: Как это часто бывает с вопросами, заданными в гневе, я задал неправильный вопрос. К счастью, приведенные ниже ответы привели меня к ответу на вопрос, который мне был нужен, а именно о правилах цитирования. Я попытаюсь записать то, что я узнал здесь, потому что я считаю, что документация и ресурсы, доступные для Google, невероятно неясны по этому поводу. Итак, вот правила цитирования, которые я нашел методом проб и ошибок, и я надеюсь, что они помогут кому-то еще, вдохновят на исправление или и то, и другое.

Когда буфер режима настройки emacs запрашивает у вас «соответствующее регулярному выражению имя файла», он, как это часто бывает с emacs, одновременно лаконичен и идиосинкразичен (как часто личность создателя передается творению!). Это означает, во-первых, регулярное выражение, которое будет сравниваться с полным путем файла в поисках совпадения, а не только с именем самого файла, как можно было бы предположить из термина " имя файла". Это тот же смысл имени файла, который используется, например, в функции emacs buffer-file-name.

Кроме того, если вы поместите foo в поле, вы увидите "foo" (с двойными кавычками), записанное в фактический файл, это недостаточное цитирование и неправильное цитирование. Вы должны заключать свое регулярное выражение в кавычки со стилем цитирования, который, насколько я могу судить, использует только emacs: схема backtick-foo-single-quote. И тогда вам нужно избежать этого, сделав его \`backslash-backtick-foo-backslash-single-quote\' (и если вы думаете, что ввод в Markdown — это головная боль, то в emacs это еще сложнее).

Кроме того, в emacs, похоже, есть правило, согласно которому специальный символ регулярного выражения . не соответствует / в начале имен файлов, поэтому, как это происходило со мной выше, классический шаблон .* не будет соответствовать ничему: чтобы соответствовать " все файлы", на самом деле вам нужно регулярное выражение /.*, которое затем вы вставляете в формат кавычек режима настройки для создания \`/.*\', после чего настройка рисует еще один слой экранирования на нем и записывает его в настройку файл.

Конечный результат одной из моих попыток — настройка, при которой файлы #autosave# не загромождают каталог, в котором вы работаете, а вместо этого все живут в одном месте:

(custom-set variables
  '(auto-save-file-name-transforms (quote (
    ("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" "~/.emacs.d/autobackups/\\2" t)
    ("\\`/.*/\\(.*?\\)\\'" "~/.emacs.d/autobackups/\\1" t)
))))

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


РЕДАКТИРОВАНИЕ 2: пора мне снова ошибаться. Наконец-то я нашел соответствующую документацию (прочитав другой вопрос о переполнении стека, конечно!): Конструкции обратной косой черты регулярных выражений. Для меня ключевой момент путаницы: обратная кавычка и одинарная кавычка не заключаются в кавычки в этом контексте: они эквивалентны специальным символам Perl ^ и $. Конструкция «обратная косая черта-обратная кавычка» соответствует пустой строке, закрепленной в начале строки, проверяемой на соответствие, а конструкция «обратная косая черта-одинарная кавычка» соответствует пустой строке в конце рассматриваемой строки. И под «рассматриваемой строкой» я подразумеваю «буфер», который в данном случае просто содержит только путь к файлу, но вам нужно сопоставить всю чертову вещь, если вы вообще хотите совпадение, поскольку это глобальное поведение регулярного выражения elisp ."

Клянусь богом, это как иметь дело с инопланетной цивилизацией.


РЕДАКТИРОВАТЬ 3: чтобы не запутать будущих читателей -

  • \` — это регулярное выражение emacs для «начала буфера». (см. Perl's \A)
  • \' — это регулярное выражение emacs для «конца буфера». (ср. Perl's \Z)
  • ^ — это регулярное выражение для «начала строки». Его можно использовать в emacs.
  • $ — это регулярное выражение для «конца строки». Его можно использовать в emacs.

Поскольку поиск с помощью регулярных выражений в многострочном тексте более распространен в emacs, чем где-либо еще (например, M-x occur), в emacs используются специальные символы с обратной кавычкой и одинарными кавычками, и, насколько я могу судить, они используются в контексте режима настройки, потому что если вы рассматриваете общий неизвестный ввод в поле режима настройки, оно может содержать новые строки, и поэтому вы хотите использовать специальные символы начала и конца буфера, потому что начало и конец ввод не обязательно будет началом и концом строки.

Я не уверен, стоит ли сожалеть о том, что я угнал свой собственный вопрос о переполнении стека и, по сути, превратил его в сообщение в блоге.


person Brighid McDonnell    schedule 12.11.2011    source источник
comment
Ответ на вопрос «Сколько обратных слэшей нужно, чтобы добраться до центра макроса troff?» то же самое: просто продолжайте пробовать, пока это не сработает. :)   -  person tchrist    schedule 13.11.2011
comment
+1 за то, что продолжаете и делитесь своими выводами с остальным миром! :)   -  person itsjeyd    schedule 01.04.2014


Ответы (1)


В поле настройки введите регулярное выражение в соответствии с синтаксисом, описанным здесь. Когда custom записывает регулярное выражение в строку, любые символы обратной косой черты или двойные кавычки в регулярном выражении будут экранированы в соответствии с обычными соглашениями об экранировании строк.

Короче говоря, просто введите одинарную обратную косую черту в поле регулярного выражения, и они будут правильно удвоены в результирующем предложении custom-set-variables, записанном в ваше .emacs.

Кроме того: поскольку ваше регулярное выражение предназначено для сопоставления имен файлов, вы можете попробовать открыть каталог, содержащий файлы, которые вы хотите сопоставить, а затем запустить M-x re-builder RET. Затем вы можете ввести регулярное выражение в формате с экранированием строки, чтобы убедиться, что оно соответствует этим файлам. Набрав % m в буфере dired, вы можете ввести регулярное выражение в неэкранированном формате (т. е. точно так же, как в поле настройки), и dired пометит совпадающие имена файлов.

person sanityinc    schedule 12.11.2011
comment
Более того, если вы оцениваете значение переменной напрямую (после того, как его установила настройка), вы можете установить, правильно ли оно. - person phils; 12.11.2011
comment
Хорошая точка зрения; M-: твой друг! Конечно, он также распечатает регулярное выражение в виде строки с дополнительными обратными косыми чертами. - person sanityinc; 12.11.2011
comment
Ваш ответ, к сожалению, не решил мою проблему, однако он был первым, дружелюбным и помог мне на пути к действительному решению моей проблемы, поэтому я принимаю его. - person Brighid McDonnell; 12.11.2011
comment
@centipedefarmer Можете ли вы быть немного более конкретным? :-) - person sanityinc; 07.02.2012