Я пытаюсь использовать пакеты customize-group
в emacs для настройки некоторых частей моей установки, и я в тупике. Я вижу такие вещи в своем файле .emacs после внесения изменений с помощью customize:
'(tramp-backup-directory-alist (quote (("\\\\`.*\\\\'" . "~/.emacs.d/autobackups"))))
Это было результатом помещения в текстовое поле настройки:
Regexp matching filename: \\`.*\\'
Это типичный пример: я на самом деле пытаюсь изменить несколько вещей, которые хотят регулярное выражение, и все они показывают ту же проблему. Сколько на самом деле уровней цитирования? Кажется, я не могу найти магическое число обратных косых черт, чтобы заставить вещь черт возьми делать то, что я прошу, даже для самых простых регулярных выражений, таких как .*
. Прямо сейчас, данная настройка производит - ничего. Это не меняет поведение по умолчанию в emacs.
Еще лучше, где на земле это задокументировано? Для Google это немного сложно, но я пробовал довольно много вещей там, а также в официальной документации и вики Emacs. Где авторитетный источник того, сколько чертовой обратной косой черты необходимо для того, чтобы регулярное выражение в режиме настройки действительно работало - или, по крайней мере, не сработало с каким-то предупреждением, а не молча?
РЕДАКТИРОВАТЬ: Как это часто бывает с вопросами, заданными в гневе, я задавал неправильный вопрос. К счастью, ответы ниже привели меня к ответу на вопрос, который мне был нужен, о правилах цитирования. Я попытаюсь записать то, что я узнал здесь, потому что я нахожу документацию и ресурсы Google доступными до безумия. Итак, вот правила цитирования, которые я нашел методом проб и ошибок, и я надеюсь, что они помогут кому-то еще, вдохновят на исправление или на то и другое.
Когда буфер режима настройки emacs запрашивает у вас «имя файла, совпадающее с регулярным выражением Regexp», он, как и часто бывает в emacs, краткий и своеобразный (как часто личность создателя передается созданию !). Это означает, с одной стороны, регулярное выражение, которое будет сравниваться с полным путем файла в поиске совпадения, а не только с именем самого файла, как можно предположить из термина "имя файла" ». Это то же самое значение «имени файла», которое используется, например, в функции emacs 'buffer-file-name
.
Кроме того, хотя, если вы введете foo
в поле, вы увидите "foo"
(с двойными кавычками), записанные в фактический файл, этого недостаточно для цитирования и неправильного цитирования. Вам нужно процитировать ваше регулярное выражение со стилем цитирования, который, насколько я могу судить, использует только emacs: схема `` backtick-foo-single-quote'`. И тогда вам нужно избежать этого, сделать его \`backslash-backtick-foo-backslash-single-quote\'
(и если вы думаете, что вводить головную боль в Markdown, это больше относится к emacs).
Кроме того, в emacs, по-видимому, есть правило, согласно которому специальный символ .
regexp не соответствует /
в начале имен файлов, поэтому, как я уже говорил выше, классический шаблон .*
будет отображаться как ничего не совпадающий: чтобы соответствовать "всем файлам", вам действительно нужно регулярное выражение /.*
, которое затем вы вводите в формат кавычек в customize-mode для получения \`/.*\'
, после чего настраивает краски еще слой перехода на него и записи в файл настроек.
Окончательный результат для одного из моих усилий - настройка, такая что # autosave # файлы не собирают каталог, в котором вы работаете, а вместо этого все живут в одном месте:
(custom-set variables
'(auto-save-file-name-transforms (quote (
("\\`/[^/]*:\\([^/]*/\\)*\\([^/]*\\)\\'" "~/.emacs.d/autobackups/\\2" t)
("\\`/.*/\\(.*?\\)\\'" "~/.emacs.d/autobackups/\\1" t)
))))
Обратная косая черта в elisp представляет собой гораздо большую угрозу вашему здравомыслию, чем скобки.
РЕДАКТИРОВАТЬ 2 : Пора мне снова ошибаться.В конце концов я нашел соответствующую документацию (прочитав другой вопрос переполнения стека , конечно!): Regexp Constructions Backslash .Для меня решающий момент путаницы: обратные кавычки и одинарные кавычки - это , а не в этом контексте: они эквивалентны специальным символам perl ^
и $
.Конструкция backslash-backtick соответствует пустой строке, привязанной в начале строки, проверяемой на совпадение, а конструкция backslash-single-quote соответствует пустой строке в конце рассматриваемой строки.И под «рассматриваемой строкой» я подразумеваю «буфер», который в данном случае содержит только путь к файлу, но вам нужно сопоставить всю чертову вещь, если вы хотите найти совпадение вообще, так как это глобальное поведение регулярного выражения elisp. "
Клянусь богом, это все равно что иметь дело с инопланетной цивилизацией.
EDIT 3 : во избежание путаницы для будущих читателей -
\`
является регулярным выражением emacs для "начала буфера"."(cf Perl's \A
) \'
- это регулярное выражение emacs для "конца буфера".(см. Perl \Z
) ^
- это регулярное выражение для «начала строки».Его можно использовать в emacs. $
- это регулярное выражение для «конца строки».Он может использоваться в emacs.
Поскольку поиск в регулярных выражениях по многострочным текстовым текстам более распространен в emacs, чем где-либо еще (например, M-x occur
), используются специальные символы обратной кавычки и одинарные кавычкив emacs, и, насколько я могу судить, они используются в контексте режима настройки, потому что, если вы рассматриваете общий неизвестный ввод в поле режима настройки, он может содержать символы новой строки, и поэтому вы хотите использовать начало-of-buffer и специальные символы конца-буфера, потому что начало и конец input не обязательно должны быть началом и концом строки.
Я не уверен, стоит ли сожалеть об угоне моего собственного вопроса переполнения стека и превращении его в сообщение в блоге.