Автосохранение Emacs: почему файлы не хранятся в правильной папке?

Я искал в разных местах и, наконец, придумал следующую настройку для режима «автосохранения» в Emacs:

(defvar my-auto-save-folder (concat "~/.emacs.d/auto-save")); folder for auto-saves
(setq auto-save-list-file-prefix "~/.emacs.d/auto-save/.saves-"); set prefix for auto-saves 
(setq auto-save-file-name-transforms `((".*", my-auto-save-folder t))); location for all auto-save files
(setq tramp-auto-save-directory my-auto-save-folder); auto-save tramp files in local directory

После такой настройки в течение нескольких недель я посетил ~ / .emacs.d и обнаружил, что папка ~ / .emacs.d / auto-save пуста, а ~ / .emacs.d содержит два файла автосохранения в форме #!home!<myusername>!<myfolder>!<myfile>. Почему файлы автосохранения не хранятся в ~ / .emacs.d / auto-save? [папка auto-save имеет права 775, .emacs.d 700]


person Marius Hofert    schedule 08.03.2013    source источник


Ответы (2)


Ваша ошибка:

(defvar my-auto-save-folder (concat "~/.emacs.d/auto-save")); folder for auto-saves

(кстати, вызов concat с одним аргументом бессмыслен).

Если необязательный элемент UNIQUIFY не равен нулю, имя файла автосохранения создается путем взятия части каталога замененного имени файла, соединенного с именем файла буфера, при этом все разделители каталогов изменяются на ` ! ' для предотвращения столкновений.

Emacs идентифицирует имена каталогов с помощью символа / в конце, что означает, что «часть каталога» пути, который вы использовали, - это «~ / .emacs.d /».

Вы хотите:

(defvar my-auto-save-folder "~/.emacs.d/auto-save/"); folder for auto-saves

Расположение запятой в следующем примере тоже странное (хотя, видимо, оно все еще работает):

`((".*", my-auto-save-folder t)))

Это действительно должно быть:

`((".*" ,my-auto-save-folder t)))
person phils    schedule 09.03.2013
comment
Привет, Филс, спасибо за помощь. Почему важно расстановка запятой (точнее: почему она должна быть такой, как вы указали)? - person Marius Hofert; 09.03.2013
comment
Мариус: Прочтите это: C-h i g (elisp) Backquote RET. Запятая говорит об оценке my-auto-save-folder, поэтому она связана с этим элементом списка, а не с предыдущим элементом ".*" (в какой позиции он больше похож на случайную попытку использовать значения, разделенные запятыми, в списке lisp!). - person phils; 09.03.2013

Это то, что у меня есть в моем .emacs, который мне подходит:

(add-to-list 'auto-save-file-name-transforms
             (list "\\(.+/\\)*\\(.*?\\)" (expand-file-name "\\2" my-auto-save-folder))
             t)
person jtahlborn    schedule 08.03.2013
comment
Было бы неплохо получить более подробную информацию о том, что делает код. Я нашел нечто подобное здесь (lists.gnu. org / archive / html / bug-gnu-emacs / 2003-09 / msg00022.html), но это не совсем то же самое. Я также нашел stackoverflow.com/questions/2020941/, который использует expand-file-name вместо concat. - person Marius Hofert; 09.03.2013
comment
jtahlborn: Это выглядит немного странно. Установка аргумента UNIQUIFY (t) означает, что используется только часть каталога замененного имени, поэтому нет смысла заменять вторую группу на этот путь (хотя, поскольку ваша вторая группа не является жадной, я не думаю, что когда-либо будет содержать что-нибудь). - person phils; 09.03.2013
comment
@phils - я не устанавливаю аргумент uniquify, это последний параметр для добавления в список. и он отлично работает. - person jtahlborn; 09.03.2013
comment
jtahlborn: Мои извинения; Я плохо это понял. Однако меня действительно смущает не жадный матч. После вызова string-match (match-string 2 string) определенно является пустой строкой, но я также вижу, что вызов replace-match действительно заменяет \2 именем файла. Ах, но, конечно, он заменяет только часть строки, которая была сопоставлена ​​ с помощью регулярного выражения (которое исключает имя файла), так что фактически он заменяет \2 пустым строка в конце концов. Что объясняет его! - person phils; 10.03.2013