Come posso evitare che yasnippet si interrompa quando aggiorno i miei pacchetti?


8

Dopo l'aggiornamento dei pacchetti, la posizione dei file elisp caricati cambierà in modo che si trovi nella cartella della nuova versione del pacchetto.

Yasnippet tenta di caricare pigramente frammenti per il file in cui è stato installato, quando apro un file in una modalità principale che yasnippet non ha mai visto prima.

Ciò significa che il caricamento di cose con modalità principali mai viste prima che emacs sia stato aggiornato non riesce, perché yasnippet si rompe il tutto lamentandosi di "nessun file o directory".

C'è un buon modo generale per risolvere questo problema, come non lasciare che gli aggiornamenti rompano le cose? (Ottengo un problema simile ma meno noioso quando AG viene aggiornato). In alternativa, consiglierebbe qualcosa in yasnippet di ingoiare gli errori in modo che avvisasse invece di sbagliare quando non poteva caricare i pacchetti sarebbe un piano migliore?

Una precisazione:

  • Avvio emacs e yasnippet viene caricato.
  • Non carico file la cui modalità principale è (ad esempio) makefile.
  • Aggiornamento ad una nuova versione di yasnippet, usando il gestore pacchetti
  • Carico un makefile e yasnippet tenta di caricare gli snippet per i makefile ma non riesce, poiché la cartella che utilizzava per gli snippet non esiste più. Non solo, ma praticamente ogni altro comando fallisce, perché il pre-hook a loro installato su yasnippet fallisce.
  • Soluzione alternativa: aprire il buffer dei messaggi, individuare la cartella che non può essere aperta ed eseguita mkdir ~/.blargh/folder-yasnippet-wants.

Chiaramente, si potrebbe scrivere qualche consiglio per un po 'di yasnippet, ma spero in una soluzione più globale (e ci vorrebbe un po' di gioco con elisp per ottenere il consiglio di lavorare, ne sono sicuro).


Spiega più chiaramente il tuo problema: quale percorso manca? Dopo aver aggiornato YASnippet o dopo aver aggiornato qualcos'altro? Quale configurazione hai nel file init di Emacs?
Lorenzo Gatti,

Mi rendo conto che vuoi solo package.ellavorare in modo impeccabile e probabilmente stai cercando una soluzione in relazione a ciò. Personalmente divento non incollato quando le cose si rompono, quindi riduco la probabilità di rottura posizionando le librerie in una posizione completamente diversa - in alcuni casi, cambio anche tutti i nomi aggiungendo un prefisso nella libreria - ad esempio, In lawlist-... questo modo, niente si interrompe tranne una funzione modificata dal team di Emacs - ad esempio, un nuovo argomento in una funzione esistente, ecc. Ho copiato yasnippet.elda qualche altra parte, rimosso dal gestore dei pacchetti e non mi preoccupo mai.
elenco delle leggi

Invia un problema. Questo è qualcosa che può essere risolto all'interno di Yasnippet, AFAICT.
Dmitry,

@Dmitry Waaaay davanti a te. Vedi # 495 .
Sean Allred,

@SeanAllred Huh, davvero. Quindi, il problema è già stato risolto nel master?
Dmitry

Risposte:


1

Quello che faccio è un po 'complesso: consiglio la funzione in modo package-activatetale che ogni volta che un pacchetto viene attivato, Emacs cercherà un file chiamato [package]-conf.eled eseguirà usando loadinvece di require, in modo che possa essere eseguito più volte.

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

E nel mio pkg-configs/yasnippet-conf.el, ho impostato la yas-snippet-dirsvariabile per indicare dove si trova il yasnippetpacchetto:

(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-pathè una funzione che uso per trovare le mie directory personalizzate per simbolo; puoi sostituirlo per le directory.

Tutto questo viene copiato direttamente dai miei file di configurazione. Penso che sia tutto ciò di cui hai bisogno, o almeno dovrebbe indirizzarti nella giusta direzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.