2014-01-23 4 views
2

파일 경로가 주어지면 해당 파일의 내용을로드하고이를 목록에 추가하는 함수를 작성하려고합니다. 최종 목표는 각 조직 캡처 템플릿에 대해 하나의 파일을 갖고 파일 목록이나 조직 테이블에서로드하는 것입니다.Elisp - 파일에서 데이터로 표현식로드하기

내 문제는로드 및로드 파일 함수는로드가 성공적 일 때만 t를 반환한다는 것입니다.

파일의 내용을 표현식으로 반환하는 데 사용할 수있는 함수는 무엇입니까? @barmar이 코멘트에 제안

+0

로드에게 파일을 다음 버퍼에서 읽어 임시 버퍼로. 목록 앞에서 따옴표를 제거하십시오. – Barmar

답변

2

것처럼 사전에

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

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

감사 : 나는 다음과 같은 달성 할 수있는 방법

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

: 파일 test.el 주어진 예를 들어

, :

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

읽는 중이고 평가하지 않기 때문에 따옴표를 파일에 넣지 않아도됩니다.

어떤 이유로, 당신은 이미 파일의 인용문이, 경우 그 보안 구멍 (양식 (launch-missiles) 포함 된 파일을 상상)을 소개하기 때문에, 당신은 하지 사용 eval 그것을 제거하는 것이다. 이 같은 것을 수행해야합니다

(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

응용 프로그램에 따라 다릅니다. '(발사 - 미사일)'도'(시작 - 비둘기)'일지도 모른다. – 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