2014-01-23 2 views
2

Я пытаюсь написать функцию, которая, учитывая путь к файлу, загрузит содержимое этого файла и добавит его в список. Конечная цель состоит в том, чтобы иметь один файл для каждого шаблона org-capture и загружать их из списка файлов или org-table.Elisp - Загрузка выражения в виде данных из файла

Моя проблема в том, что функции load и load-file возвращают только t, если загрузка выполнена успешно.

Какую функцию я могу использовать для возврата содержимого файла в качестве выражения?

, например, учитывая файл test.el:

'("foo" "bar" "baz" "fnord") 

Как можно достичь следующего:

(mysterious-function "~/test.el") 

=> '("foo" "bar" "baz" "fnord") 

Заранее спасибо

+0

Загрузите файл во временный буфер, затем читать из буфера. Избавьтесь от цитаты перед списком. – Barmar

ответ

2

Так же, как @barmar предложил в комментарии :

(defun read-from-file (file) 
    (with-temp-buffer 
    (insert-file-contents file) 
    (read (current-buffer)))) 

Обратите внимание, что поскольку вы читаете и не оцениваете, вам не нужно помещать цитату в файл.

Если по какой-то причине у вас уже есть цитаты в файле, вы должны не использование eval, чтобы избавиться от него, потому что представляет брешь в системе безопасности (представьте себе файл, который содержит форму (launch-missiles)). Вы должны сделать что-то вроде этого:

(defun my-unquote (form) 
    (if (and (eq (first form) 'quote) 
      (null (cddr form))) 
     (second form) 
     form)) 
+0

Если в файле уже есть цитата (по какой причине когда-либо), и вам нужно ее проехать, вы можете использовать '(eval (read-from-file" ~/test.el "))'. – Tobias

+0

@Tobias: нет, это вводит дыру в безопасности; см. редактирование. – sds

+0

Это зависит от приложения. '(пусковые ракеты)' также могут быть '(start-pigeons)'. – Tobias

3
(defun mysterious-function (filename) 
    (setq filename (expand-file-name filename)) 
    (with-temp-buffer 
    (insert-file-contents filename) 
    (read (current-buffer)))) 
+0

Я не думаю, что вам нужно явно называть 'expand-file-name'. – sds

+0

Не был уверен - документация не всегда понятна, какие функции требуют точных имен файлов и которые будут расширяться. – Barmar

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