2012-04-18 12 views
5

Ich möchte einen bestimmten Yasnippet als Teil einer Funktion in Emacs-Lisp einfügen. Gibt es eine Möglichkeit, das zu tun?Insert Yasnippet nach Name

Der einzige Befehl, der verwandt scheint, ist yas/insert-snippet, aber es öffnet einfach ein Popup mit allen Optionen und die Dokumentation sagt nichts über das Umgehen des Popup durch Angabe des Snippet-Namens.

Antwort

5

yas/insert-snippet ist in der Tat nur ein dünner Wrapper um yas/expand-snippet für die interaktive Nutzung. Die internen Strukturen sind jedoch ... interessant. Geht man von der Quellcode der folgenden für mich nicht funktioniert, wenn ich die „defun“ Schnipsel in elisp-Modus erweitern möchten:

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

Als Autor yasnippet, ich glaube, Sie lieber nicht auf interne Details verlassen von yasnippets interessanten Datenstrukturen, die sich in Zukunft ändern können. Ich würde dies tun, auf der Grundlage der Dokumentation von yas/insert-snippet und yas/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

Vielleicht wäre das eine lohnende Ergänzung für das Paket? – phils

+0

Eigentlich würde ich gerne über die Datenstrukturen hören, obwohl ich nicht denke, dass diese Antwort/Kommentare der richtige Ort sind. – Malabarba

1

Ich bin nur in yasnippet bekommen und ich wollte automatisch eine meines Schnipsel einfügen auf eine neue Datei für bestimmte Modi zu öffnen. Das hat mich hierher geführt, aber ich habe eine etwas andere Lösung erzeugt. Die Bereitstellung noch eine weitere Alternative: („new-Shell“ ist der Name meiner persönlichen Schnipsel für eine neue Shell-Skript-Vorlage bietet)

(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, ist meine Lösung ein bisschen weniger anfällig für brechen sollte yasnippet dramatisch ändern .