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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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


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

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

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

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

9
задан Community 23 May 2017 в 11:55
поделиться