Я пытаюсь использовать пакеты 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 используются специальные символы с обратной кавычкой и одинарными кавычками, и, насколько я могу судить, они используются в контексте режима настройки, потому что если вы рассматриваете общий неизвестный ввод в поле режима настройки, оно может содержать новые строки, и поэтому вы хотите использовать специальные символы начала и конца буфера, потому что начало и конец ввод не обязательно будет началом и концом строки.
Я не уверен, стоит ли сожалеть о том, что я угнал свой собственный вопрос о переполнении стека и, по сути, превратил его в сообщение в блоге.