2010-12-04 21 views
5

Tôi có một tệp Emacs Lisp với macro tùy chỉnh Tôi muốn được phân biệt và thụt lề khác nhau. Mã này trông giống như:Emacs Per File Tùy biến

(defmacro* when-let ((var value) &rest body) 
    `(let ((,var ,value)) 
    (when ,var ,@body))) 

(defun func() 
    (when-let (a 1) 
    a)) 

Tôi muốn when-let fontified như một font-lock-keyword và thụt vào như trên. Tôi biết tôi có thể làm điều này trong tập tin .emacs của tôi nhưng tôi muốn làm cho nó một thư mục địa phương hoặc tập tin tuỳ biến địa phương. Vấn đề là thư mục địa phương và tập tin tùy chỉnh địa phương dường như được giới hạn để thiết lập các biến. Trong tập tin .emacs của tôi, tôi có những điều sau đây.

(add-hook 'emacs-lisp-mode-hook 
    (lambda() 
      (put 'when-let 'lisp-indent-function 1) 
      (font-lock-add-keywords nil 
            '(("(\\(when-let\\)\\>" 1 
             font-lock-keyword-face))))) 

Tôi muốn điều này trong .dir-locals.el vì nó chỉ áp dụng cho một tệp.

Trả lời

9

Bạn có thể chỉ định elisp để đánh giá trong tập các biến địa phương bằng cách xác định một giá trị eval: (tài liệu nói 'Eval:' nhưng chỉ có trường thấp 'eval:' dường như làm việc). ví dụ:

;;; Local Variables: 
;;; mode: outline-minor 
;;; eval: (hide-body) 
;;; End: 

Như một biện pháp an ninh, Emacs sẽ yêu cầu bạn xác nhận bất cứ khi nào nó thấy giá trị mà nó chưa nhận ra là an toàn. Nếu bạn yêu cầu nó ghi nhớ nó vĩnh viễn, nó ghi giá trị vào safe-local-variable-values trong phần (custom-set-variables) của tệp init của bạn.

Lưu ý rằng ví dụ trên cho phép chế độ phụ không được dùng nữa (biến số mode chỉ dành cho các chế độ chính), vì vậy chúng tôi cần viết lại dưới dạng một dạng đánh giá khác, trong đó chúng tôi gọi chức năng chế độ phụ.

Nếu bạn cần phải đánh giá nhiều hình thức, bạn có thể chỉ định nhiều eval giá trị, mà sẽ được đánh giá theo thứ tự:

;;; Local Variables: 
;;; eval: (outline-minor-mode 1) 
;;; eval: (hide-body) 
;;; End: 

Hoặc cách khác, chỉ cần sử dụng progn:

;;; Local Variables: 
;;; eval: (progn (outline-minor-mode 1) (hide-body)) 
;;; End: 

Sự khác biệt là sau này sẽ được coi là một giá trị duy nhất cho các mục đích của safe-local-variable-values, trong khi với nhiều giá trị eval, mỗi giá trị được xem là độc lập.

Chig(elisp) File Local VariablesRET

+1

Làm rõ một chút, các khối mã ở trên phải nằm ở đầu (các) tệp bạn muốn áp dụng. Điều này sẽ làm việc cho bất kỳ loại tệp nào, miễn là nó xuất hiện trong ngôn ngữ của tệp dưới dạng nhận xét (ví dụ: trong tệp C++, ;;; có thể được thay thế bằng //). – jwernerny

+1

Tôi hy vọng nó có thể đi bất cứ nơi nào, nhưng nó là điển hình hơn để đặt một biến địa phương khối như thế này ở * rất * kết thúc của một tập tin.Các biến tập tin cục bộ tại * đầu * của một tập tin luôn sử dụng cú pháp khác (xem 'C-h i g'' (emacs) Chỉ định các biến tập tin '' RET'). – phils

3

Đối identing của bạn khi-hãy macro, bạn có thể sử dụng tờ khai thụt lề:

(defmacro* when-let ((var value) &rest body) 
    (declare (indent 1)) 
    `(let ((,var ,value)) 
    (when ,var ,@body))) 

nhìn vào các thông tin nút (elisp)Indenting Macros để biết thêm thông tin về điều này. Tôi không biết về những điều tương tự để phân loại.

Các vấn đề liên quan