2014-09-30 2 views
2

У меня есть папка /var/~/. В config .emacs Я хочу загрузить некоторые файлы из этой папки. Я пытаюсь использовать (load-file "/var/~/foobar.el"), но emacs оповещения File error: Cannot open load file, ~/foobar.el. Кроме того, я даже не мог открыть файлы в этой папке с помощью c-x c-f. В минибуфере путь будет автоматически перенаправлен в мой дом. Как загрузить файлы в этой папке?Путь с папкой с именем tilde (~) не может быть возвращен файлом load в emacs

+2

Этот каталог буквально называется '~'? Если это так, это не совсем блестящая идея, так как '~' имеет тенденцию расширяться до домашнего каталога в различных контекстах. –

+0

Emacs шутит в сторону, речь идет об использовании программы, а не о ее создании. – MSalters

+0

Пол R правильно - переименуйте свою папку '~' в нечто другое, так как этот символ обычно распознается Emacs как путь к домашнему каталогу. – lawlist

ответ

4

Необходимо переименовать каталог.

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.

+0

Благодарим вас за ответ, возможно, переименование - лучшее решение. –

+1

Я считаю, что причина состоит в том, чтобы действовать как ярлык для возврата в '~' или '/' (корневой каталог). В противном случае единственным способом было бы вернуться к корневому каталогу из любого произвольно глубокого каталога, а затем '/ home/username /', чтобы вернуться к '~'. –

1

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.

См. How programs do loading.

+0

Спасибо, я попробую .. –

 Смежные вопросы

  • Нет связанных вопросов^_^