Comment puis-je empêcher Yasnippet de se casser lorsque je mets à jour mes packages?

8

Une fois les packages mis à jour, l'emplacement des fichiers elisp chargés changera pour se trouver dans le dossier de la nouvelle version du package.

Yasnippet tente de charger des extraits paresseusement pour le fichier sur lequel il a été installé, lorsque j'ouvre un fichier dans un mode majeur que yasnippet n'a jamais vu auparavant.

Cela signifie que le chargement de choses avec des modes majeurs jamais vus une fois qu'emacs a été mis à jour échoue, car yasnippet rompt le tout en se plaignant de "aucun fichier ou répertoire".

Existe-t-il un bon moyen général de résoudre ce problème, comme ne pas laisser les mises à jour interrompre les choses? (J'obtiens un problème similaire mais moins fastidieux lorsque ag est mis à jour). Alternativement, conseiller quelque chose dans yasnippet pour simplement avaler les erreurs afin qu'il avertisse simplement au lieu d'erreurs quand il ne pourrait pas charger les paquets serait-il un meilleur plan?

Clarification:

  • Je démarre emacs et yasnippet est chargé.
  • Je ne charge aucun fichier dont le mode principal est (par exemple) les makefiles.
  • Je mets à jour vers une nouvelle version de yasnippet, en utilisant le gestionnaire de paquets
  • Je charge un makefile et yasnippet tente de charger les extraits de fichiers pour les makefiles mais il échoue, car le dossier qu'il utilisait pour les extraits de code n'existe plus. Non seulement cela, mais pratiquement toutes les autres commandes échouent, car le pré-raccordement à elles que yasnippet a installé échoue.
  • Solution: ouvrez le tampon de messages, recherchez le dossier qui ne peut pas être ouvert et exécuté mkdir ~/.blargh/folder-yasnippet-wants.

De toute évidence, on pourrait écrire quelques conseils pour un peu de yasnippet, mais j'espère une solution plus globale (et il faudrait un certain temps pour jouer avec elisp pour que les conseils fonctionnent, je suis sûr).

Squidly
la source
Veuillez expliquer votre problème plus clairement: quel chemin a été trouvé manquant? Après avoir mis à jour YASnippet ou après avoir mis à jour autre chose? Quelle configuration avez-vous dans votre fichier init Emacs?
Lorenzo Gatti
Je me rends compte que vous voulez juste package.eltravailler sans problème et que vous cherchez probablement une solution à ce sujet. Personnellement, je me décolle lorsque les choses se cassent, donc je réduit la probabilité de rupture en plaçant les bibliothèques dans un emplacement complètement différent - dans certains cas, je change même tous les noms en ajoutant un préfixe dans la bibliothèque - par exemple, de lawlist-... cette façon, rien casse sauf une fonction modifiée par l'équipe Emacs - par exemple, un nouvel argument à une fonction existante, etc. J'ai copié yasnippet.elailleurs, je l'ai supprimée du gestionnaire de paquets, et je ne m'en fais jamais
lawlist
Déposer un problème. C'est quelque chose qui peut être corrigé dans Yasnippet, AFAICT.
Dmitry
@Dmitry Waaaay devant vous. Voir # 495 .
Sean Allred
@SeanAllred Huh, en effet. Donc, le problème est déjà résolu dans master?
Dmitry

Réponses:

1

Ce que je fais est un peu complexe: je conseille la fonction de package-activatetelle sorte que chaque fois qu'un package est activé, Emacs recherchera un fichier appelé [package]-conf.elet l'exécutera en utilisant loadau lieu de require, afin qu'il puisse être exécuté plusieurs fois.

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

Et dans mon pkg-configs/yasnippet-conf.el, j'ai défini la yas-snippet-dirsvariable pour indiquer où se trouve le yasnippetpackage:

(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-pathest une fonction que j'utilise pour trouver mes répertoires personnalisés par symbole; vous pouvez le remplacer pour les répertoires.

Tout cela est copié directement à partir de mes fichiers de configuration. Je pense que c'est tout ce dont vous avez besoin, ou cela devrait au moins vous orienter dans la bonne direction.

Roberto Huelga
la source