Wie kann ich verhindern, dass yasnippet beim Aktualisieren meiner Pakete beschädigt wird?

8

Nachdem die Pakete aktualisiert wurden, ändert sich der Speicherort der geladenen Elisp-Dateien in den Ordner der neuen Version des Pakets.

Yasnippet versucht, Snippets für die Datei, in der es installiert wurde, träge zu laden, wenn ich eine Datei in einem Hauptmodus öffne, den Yasnippet zuvor noch nicht gesehen hat.

Dies bedeutet, dass das Laden von Dingen mit zuvor nicht sichtbaren Hauptmodi nach der Aktualisierung von emacs fehlschlägt, da yasnippet das Ganze durch die Beschwerde über "keine solche Datei oder kein solches Verzeichnis" zerstört.

Gibt es eine gute allgemeine Möglichkeit, dies zu lösen, z. B. nicht zuzulassen, dass Updates Probleme verursachen? (Ich bekomme ein ähnliches, aber weniger langwieriges Problem, wenn ag aktualisiert wird). Wäre es alternativ ein besserer Plan, etwas in yasnippet zu empfehlen, nur die Fehler zu verschlucken, damit es nur warnt, anstatt Fehler zu machen, wenn es keine Pakete laden kann?

Klärung:

  • Ich starte Emacs und Yasnippet wird geladen.
  • Ich lade keine Dateien, deren Hauptmodus (zum Beispiel) Makefiles sind.
  • Ich aktualisiere mit dem Paketmanager auf eine neue Version von yasnippet
  • Ich lade ein Makefile und yasnippet versucht, die Snippets für Makefiles zu laden, aber es schlägt fehl, da der Ordner, den es für Snippets verwendet hat, nicht mehr existiert. Nicht nur das, sondern praktisch jeder andere Befehl schlägt fehl, da der von yasnippet installierte Pre-Hook für sie fehlschlägt.
  • Problemumgehung: Öffnen Sie den Nachrichtenpuffer, suchen Sie, welcher Ordner nicht geöffnet werden kann, und führen Sie ihn aus mkdir ~/.blargh/folder-yasnippet-wants.

Natürlich könnte man einige Ratschläge für ein bisschen Yasnippet schreiben, aber ich hoffe auf eine globalere Lösung (und es würde eine Weile dauern, mit Elisp zu spielen, um die Ratschläge zum Laufen zu bringen, da bin ich mir sicher).

Tintenfisch
quelle
Bitte erläutern Sie Ihr Problem klarer: Welcher Pfad fehlt? Nach dem Update von YASnippet oder nach dem Update von etwas anderem? Welche Konfiguration haben Sie in Ihrer Emacs-Init-Datei?
Lorenzo Gatti
Mir ist klar, dass Sie einfach package.eleinwandfrei arbeiten möchten und wahrscheinlich nach einer entsprechenden Lösung suchen. Ich persönlich werde ungeklebt, wenn Dinge kaputt gehen, und reduziere die Wahrscheinlichkeit eines Bruchs, indem ich Bibliotheken an einem völlig anderen Ort platziere. In einigen Fällen ändere ich sogar alle Namen, indem ich der Bibliothek ein Präfix hinzufüge - z. B. auf lawlist-... diese Weise nichts Pausen mit Ausnahme einer geänderten Funktion des Emacs-Teams - z. B. eines neuen Arguments für eine vorhandene Funktion usw. Ich habe sie an eine yasnippet.elandere Stelle kopiert , aus dem Paketmanager entfernt und mich nie darum gekümmert.
Lawlist
Ein Problem einreichen. Dies kann in Yasnippet, AFAICT, behoben werden.
Dmitry
@Dmitry Waaaay vor dir. Siehe # 495 .
Sean Allred
@ SeanAllred Huh, in der Tat. Das Problem ist also bereits im Master behoben?
Dmitry

Antworten:

1

Was ich mache, ist ein wenig komplex: Ich rate der Funktion package-activate, dass Emacs jedes Mal, wenn ein Paket aktiviert wird, nach einer aufgerufenen Datei sucht [package]-conf.elund diese loadstattdessen mit ausführt require, damit sie mehrmals ausgeführt werden kann.

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

Und in meinem pkg-configs/yasnippet-conf.elsetze ich die yas-snippet-dirsVariable so, dass sie darauf hinweist, wo sich das yasnippetPaket befindet:

(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-pathist eine Funktion, mit der ich meine benutzerdefinierten Verzeichnisse nach Symbolen finde. Sie können es für Verzeichnisse ersetzen.

All dies wird direkt aus meinen Konfigurationsdateien kopiert. Ich denke, es ist alles, was Sie brauchen, oder es sollte Sie zumindest in die richtige Richtung weisen.

Roberto Huelga
quelle