Сколько обратной косой черты требуется для выхода из регулярных выражений в режиме emacs "Customize"? - PullRequest
9 голосов
/ 12 ноября 2011

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

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

1 Ответ

3 голосов
/ 12 ноября 2011

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

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

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

...