2012-04-18 14 views
5

Quiero insertar un yasnippet específico como parte de una función en emacs-lisp. ¿Hay una manera de hacer eso?Insertar yasnippet por nombre

El único comando que parece relacionado es yas/insert-snippet, pero simplemente abre una ventana emergente con todas las opciones y la documentación no dice nada al omitir la ventana emergente especificando el nombre del fragmento.

Respuesta

5

yas/insert-snippet es de hecho solo una envoltura delgada alrededor de yas/expand-snippet para uso interactivo. Sin embargo, las estructuras internas son ... interesantes. A juzgar por el código fuente de la siguiente funciona para mí cuando quiero ampliar la "definición de función" fragmento de elisp-mode:

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

Como el autor de yasnippet, pienso que usted prefiere no depender de los detalles internos de las interesantes estructuras de datos de yasnippet, que pueden cambiar en el futuro. Me gustaría hacer esto en base a la documentación de yas/insert-snippet y 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

¿Quizás sería una valiosa adición al paquete? – phils

+0

En realidad, me encantaría escuchar sobre las estructuras de datos, aunque no creo que esta respuesta/comentarios sean el lugar adecuado. – Malabarba

1

Me acaba de entrar en yasnippet y quería para insertar automáticamente una de mis fragmentos al abrir un nuevo archivo para ciertos modos. Eso me llevó hasta aquí, pero he generado una solución ligeramente diferente. Proporcionar otra alternativa: ("nueva-shell" es el nombre de mi fragmento de personal para proporcionar una plantilla de secuencia de comandos shell nuevo)

(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"))) 

OMI, mi solución es un poco menos susceptibles a la rotura deberá yasnippet cambio drásticamente .

Cuestiones relacionadas