Como posso impedir que o yasnippet se quebre quando atualizo meus pacotes?

8

Após a atualização dos pacotes, o local dos arquivos elisp carregados será alterado para a pasta da nova versão do pacote.

O Yasnippet tenta carregar preguiçosamente trechos para o arquivo em que foi instalado, quando abro um arquivo no modo principal que o yasnippet não tinha visto antes.

Isso significa que carregar coisas com modos principais nunca vistos antes que o emacs seja atualizado falhará, porque o yasnippet interrompe a coisa toda reclamando sobre "esse arquivo ou diretório não existe".

Existe uma boa maneira geral de resolver isso, como não deixar que as atualizações quebrem as coisas? (Eu recebo um problema semelhante, mas menos tedioso, quando o ag é atualizado). Como alternativa, aconselhar algo no yasnippet a engolir apenas os erros, para que apenas avise em vez de errar quando não puder carregar pacotes, seria um plano melhor?

Esclarecimento:

  • Inicio o emacs e o yasnippet é carregado.
  • Não carrego arquivos cujo modo principal seja (por exemplo) makefiles.
  • Eu atualizo para uma nova versão do yasnippet, usando o gerenciador de pacotes
  • Eu carrego um makefile e o yasnippet tenta carregar os trechos para makefiles, mas ele falha, porque a pasta que estava usando para trechos não existe mais. Não apenas isso, mas praticamente todos os outros comandos falham, porque o pré-gancho para eles que o yasnippet instalado falha.
  • Solução alternativa: abra o buffer de mensagem, encontre qual pasta não pode ser aberta e execute mkdir ~/.blargh/folder-yasnippet-wants.

Claramente, alguém poderia escrever alguns conselhos para um pouco de yasnippet, mas estou esperando por uma solução mais global (e levaria um tempo para brincar com o elisp para que o conselho funcionasse, tenho certeza).

Squidly
fonte
Por favor, explique seu problema com mais clareza: qual caminho está faltando? Depois de atualizar o YASnippet ou depois de atualizar outra coisa? Que configuração você tem no seu arquivo init do Emacs?
Lorenzo Gatti
Sei que você só quer package.eltrabalhar na perfeição e provavelmente está procurando uma solução em relação a isso. Pessoalmente, fico desapegado quando as coisas quebram, então reduzo a probabilidade de quebra colocando as bibliotecas em um local completamente diferente - em alguns casos, até altero todos os nomes adicionando um prefixo na biblioteca - por exemplo, lawlist-... Dessa forma, nada quebras, exceto uma função modificada pela equipe do Emacs - por exemplo, um novo argumento para uma função existente etc. Copiei yasnippet.elem outro lugar, removi-o do gerenciador de pacotes e nunca me preocupei.
lawlist
Arquive um problema. Isso é algo que pode ser corrigido no Yasnippet, AFAICT.
Dmitry
@Dmitry Waaaay à sua frente. Veja # 495 .
Sean Allred
@SeanAllred Huh, de fato. Então, o problema já está corrigido no mestre?
Dmitry

Respostas:

1

O que faço é um pouco complexo: eu aconselho a função de package-activatemodo que toda vez que um pacote é ativado, o Emacs procurará um arquivo chamado [package]-conf.ele o executará usando em loadvez de require, para que possa ser executado várias vezes.

(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 no meu pkg-configs/yasnippet-conf.el, eu defino a yas-snippet-dirsvariável para apontar onde está o yasnippetpacote:

(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é uma função que eu uso para encontrar meus diretórios personalizados por símbolo; você pode substituí-lo por diretórios.

Tudo isso é copiado diretamente dos meus arquivos de configuração. Eu acho que é tudo que você precisa, ou deveria, pelo menos, apontar na direção certa.

Roberto Huelga
fonte