У меня есть папка /var/~/
. В config .emacs
Я хочу загрузить некоторые файлы из этой папки. Я пытаюсь использовать (load-file "/var/~/foobar.el")
, но emacs оповещения File error: Cannot open load file, ~/foobar.el
. Кроме того, я даже не мог открыть файлы в этой папке с помощью c-x c-f
. В минибуфере путь будет автоматически перенаправлен в мой дом. Как загрузить файлы в этой папке?Путь с папкой с именем tilde (~) не может быть возвращен файлом load в emacs
ответ
Необходимо переименовать каталог.
load-file
- это простая обертка вокруг load
, которая передает данное имя файла через substitute-in-file-name
. Из документа dockstring substitute-in-file-name
(выделение мое):
Замените переменные окружения, упомянутые в FILENAME. `$ FOO ', где FOO - это имя переменной среды, означает подставить значение значение этой переменной. Имя переменной должно быть прекращено с символом, а не буквой, цифрой или подчеркиванием; в противном случае заключите все имя переменной в фигурных скобках.
Если появляется `/ ~ ', все FILENAME через это` /' отбрасываются. Если появляется `// ', все до и включая первое из этих` /' отбрасывается.
Другими словами, substitute-in-file-name
выбрасывает все перед /~
, превращая /var/~/foo.el
в ~/foo.el
.
Я полностью не вижу причин в этом поведении, но это то, что есть, и вы не можете (легко) обойти его, поэтому переименование - ваш лучший выход из этой дилеммы.
В любом случае это разумная вещь. Использование ~
в качестве имени каталога - плохая идея для систем Unix, как правило, не только для Emacs.
Благодарим вас за ответ, возможно, переименование - лучшее решение. –
Я считаю, что причина состоит в том, чтобы действовать как ярлык для возврата в '~' или '/' (корневой каталог). В противном случае единственным способом было бы вернуться к корневому каталогу из любого произвольно глубокого каталога, а затем '/ home/username /', чтобы вернуться к '~'. –
lunaryorn хорошо объяснил вашу проблему, и я согласен с его предложением, что не использовать ~
в пути к файлам - лучшее решение. Однако, если вы не можете переименовать эти пути по какой-либо причине, я считаю, что вы можете работать с substitute-in-file-name
по адресу load
в относительном пути к файлу, как задокументировано here.
В принципе, вам нужно добавить nil
к вашим load-path
переменным, затем установите default-directory
переменный беспокойный путь, наконец, а затем загрузить файл, используя относительное имя. например .:
; adding nil causes load to also search your 'default-directory'
(setq load-path (append '(nil) load-path))
(setq default-directory "/tmp/~/")
(load "foobar.el")
Обратите внимание, что если вы подозреваете, что имя файла может существовать (быть загружены из) в другом месте в вашем load-path
вам необходимо будет обеспечить нужный Вам файл является первым в load-path
.
Спасибо, я попробую .. –
Этот каталог буквально называется '~'? Если это так, это не совсем блестящая идея, так как '~' имеет тенденцию расширяться до домашнего каталога в различных контекстах. –
Emacs шутит в сторону, речь идет об использовании программы, а не о ее создании. – MSalters
Пол R правильно - переименуйте свою папку '~' в нечто другое, так как этот символ обычно распознается Emacs как путь к домашнему каталогу. – lawlist