¿Cómo puedo evitar que yasnippet se rompa cuando actualizo mis paquetes?

8

Una vez que se hayan actualizado los paquetes, la ubicación de los archivos elisp cargados cambiará para estar en la carpeta de la nueva versión del paquete.

Yasnippet intenta cargar fragmentos perezosamente para el archivo en el que se instaló, cuando abro un archivo en un modo principal que no ha visto antes.

Esto significa que la carga de cosas con modos principales nunca antes vistos una vez que se ha actualizado emacs falla, porque yasnippet lo rompe todo al quejarse de "ningún archivo o directorio".

¿Hay una buena forma general de resolver esto, como no permitir que las actualizaciones rompan las cosas? (Tengo un problema similar pero menos tedioso cuando ag se actualiza). Alternativamente, ¿recomendaría algo en yasnippet para simplemente tragar los errores, de modo que simplemente advierta en lugar de generar errores cuando no puede cargar paquetes, sería un mejor plan?

Aclaración:

  • Comienzo emacs y se carga yasnippet.
  • No cargo archivos cuyo modo principal es (por ejemplo) makefiles.
  • Actualizo a una nueva versión de yasnippet, usando el administrador de paquetes
  • Cargo un archivo MAKE, y yasnippet intenta cargar los fragmentos para archivos MAKE pero falla, porque la carpeta que estaba usando para fragmentos ya no existe. No solo eso, sino que prácticamente todos los demás comandos fallan, porque falla el enganche previo a ellos que instaló yasnippet.
  • Solución alternativa: abra el búfer de mensajes, busque qué carpeta no se puede abrir y ejecutar mkdir ~/.blargh/folder-yasnippet-wants.

Claramente, uno podría escribir algunos consejos para un poco de yasnippet, pero espero una solución más global (y tomaría un tiempo jugar con elisp para que los consejos funcionen, estoy seguro).

Calamares
fuente
Explique su problema con mayor claridad: ¿qué ruta falta? ¿Después de actualizar YASnippet o después de actualizar otra cosa? ¿Qué configuración tiene en su archivo de inicio de Emacs?
Lorenzo Gatti
Me doy cuenta de que solo quieres package.eltrabajar sin problemas y probablemente estés buscando una solución en relación con esto. Personalmente, me pego cuando las cosas se rompen, por lo que reduzco la probabilidad de rotura al colocar las bibliotecas en una ubicación completamente diferente; en algunos casos, incluso cambio todos los nombres agregando un prefijo en la biblioteca, por ejemplo, de lawlist-... esa manera, nada se rompe excepto una función modificada por el equipo de Emacs, por ejemplo, un nuevo argumento para una función existente, etc. Copié yasnippet.elen otro lugar, lo eliminé del administrador de paquetes y nunca me preocupé por eso.
abogados el
Presentar un problema. Esto es algo que se puede solucionar dentro de Yasnippet, AFAICT.
Dmitry
@Dmitry Waaaay delante de ti. Ver # 495 .
Sean Allred
@SeanAllred Huh, de hecho. Entonces, ¿el problema ya está solucionado en el maestro?
Dmitry

Respuestas:

1

Lo que hago es un poco complejo: le aconsejo a la función package-activateque cada vez que se active un paquete, Emacs busque un archivo llamado [package]-conf.ely lo ejecute usando en loadlugar de require, para que pueda ejecutarse varias veces.

(defun kzn-package-dir (package)
  "Return the full path of the directory where the package is installed."
  (interactive)
  (let ((desc (cadr (assq package package-alist))))
    (if desc
        (package-desc-dir desc))))

(defadvice package-activate (after kzn-package-activate-load-conf activate)
  "Load kzn/<package.el> file after the package is activated."
  (let* ((package-name (symbol-name package))
         (dir (kzn-package-dir package))
         (pkg-conf (kzn-path :lisp (concat (file-name-as-directory "pkg-confs") package-name "-conf.el"))))
    (if ad-return-value
        (progn
          (message (concat package-name ": activated (dir: " dir ")"))
          (if (file-exists-p pkg-conf)
              (progn
                (message (concat "loading package configuration file: '" pkg-conf "'"))
                (load pkg-conf))))
      (message (concat package-name ": couldn't be activated with dir: " dir )))))

Y en mi pkg-configs/yasnippet-conf.el, configuré la yas-snippet-dirsvariable para señalar dónde está el yasnippetpaquete:

(setq yas-snippet-dirs
      `(,(kzn-path :emacsd "snippets")
        ,(concat (file-name-as-directory (kzn-package-dir 'yasnippet)) "snippets")
        ,(kzn-path :vendor "yasnippets-rails/rails-snippets")
        ,(kzn-path :vendor "yasnippets-shoulda")))

kzn-pathes una función que uso para encontrar mis directorios personalizados por símbolo; Puedes reemplazarlo por directorios.

Todo esto se copia directamente de mis archivos de configuración. Creo que es todo lo que necesita, o al menos debería orientarlo en la dirección correcta.

Roberto Huelga
fuente