2012-04-18 20 views
5

Voglio inserire uno yasnippet specifico come parte di una funzione in emacs-lisp. C'è un modo per farlo?Inserire il comando di testo per nome

L'unico comando che sembra correlato è yas/insert-snippet, ma apre semplicemente un popup con tutte le opzioni e la documentazione non dice nulla sull'esclusione del popup specificando il nome del frammento.

risposta

5

yas/insert-snippet è in effetti solo un involucro sottile intorno a yas/expand-snippet per l'uso interattivo. Tuttavia, le strutture interne sono ... interessanti. A giudicare dal codice sorgente la seguente non funziona per me quando voglio espandere la "defun" frammento in elisp-mode:

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

Come l'autore di yasnippet, penso che si preferisce non fare affidamento su dettagli interni delle strutture dati interessanti di yasnippet, che potrebbero cambiare in futuro. Vorrei farlo sulla base della documentazione di yas/insert-snippet e 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

Forse sarebbe un'aggiunta utile al pacchetto? – phils

+0

In realtà, mi piacerebbe conoscere le strutture dati, anche se non penso che questa risposta/commenti siano il posto giusto. – Malabarba

1

Sto solo entrare in yasnippet e ho voluto inserire automaticamente uno dei miei frammenti all'apertura di un nuovo file per alcune modalità. Questo mi ha portato qui ma ho generato una soluzione leggermente diversa. Fornire ancora un'altra alternativa: ("new-shell" è il nome del mio frammento di personale per fornire un modello di script nuova shell)

(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, la mia soluzione è un po 'meno suscettibile alla rottura dovrebbe yasnippet cambiamento drammaticamente .

Problemi correlati