2012-04-18 32 views
5

Tôi muốn chèn một đoạn mã cụ thể như một phần của hàm trong emacs-lisp. Có cách nào làm được việc này không?Chèn đoạn mã theo tên

Lệnh duy nhất có vẻ liên quan là yas/insert-snippet, nhưng chỉ đơn giản là mở cửa sổ bật lên với tất cả các tùy chọn và tài liệu không nói gì về việc bỏ qua cửa sổ bật lên bằng cách chỉ định tên đoạn mã.

Trả lời

5

yas/insert-snippet thực sự chỉ là một trình bao bọc mỏng xung quanh yas/expand-snippet để sử dụng tương tác. Tuy nhiên, cấu trúc bên trong là ... thú vị. Đánh giá từ các mã nguồn sau đây không làm việc cho tôi khi tôi muốn mở rộng "defun" đoạn mã trong elisp-mode:

(yas/expand-snippet 
    (yas/template-content (cdar (mapcan #'(lambda (table) 
              (yas/fetch table "defun")) 
             (yas/get-snippet-tables))))) 
3

Là tác giả của yasnippet, tôi nghĩ rằng bạn không muốn dựa vào chi tiết nội bộ cấu trúc dữ liệu thú vị của yasnippet, có thể thay đổi trong tương lai. Tôi sẽ làm việc này dựa trên các tài liệu của yas/insert-snippetyas/prompt-functions:

(defun yas/insert-by-name (name) 
    (flet ((dummy-prompt 
      (prompt choices &optional display-fn) 
      (declare (ignore prompt)) 
      (or (find name choices :key display-fn :test #'string=) 
       (throw 'notfound nil)))) 
    (let ((yas/prompt-functions '(dummy-prompt))) 
     (catch 'notfound 
     (yas/insert-snippet t))))) 

(yas/insert-by-name "defun") 
+0

Có lẽ đó sẽ là một bổ sung đáng giá cho gói? – phils

+0

Thực ra, tôi rất muốn nghe về cấu trúc dữ liệu, mặc dù tôi không nghĩ rằng câu trả lời/nhận xét này là nơi thích hợp. – Malabarba

1

Tôi chỉ đi vào yasnippet và tôi muốn tự động chèn một trong những đoạn tôi khi mở một tập tin mới cho các chế độ nhất định. Điều đó dẫn tôi đến đây nhưng tôi đã tạo ra một giải pháp hơi khác. Cung cấp thêm một lựa chọn: ("mới vỏ" là tên của đoạn cá nhân của tôi trong việc cung cấp một kịch bản shell mới mẫu)

(defun jsm/new-file-snippet (key) 
    "Call particular yasnippet template for newly created 
files. Use by adding a lambda function to the particular mode 
hook passing the correct yasnippet key" 
    (interactive) 
    (if (= (buffer-size) 0) 
     (progn 
     (insert key) 
     (call-interactively 'yas-expand)))) 

(add-hook 'sh-mode-hook '(lambda() (jsm/new-file-snippet "new-shell"))) 

IMO, giải pháp của tôi là một chút ít nhạy cảm để phá vỡ nên yasnippet thay đổi đáng kể .

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