パッケージを更新するときにyasnippetが壊れないようにするにはどうすればよいですか?


8

パッケージが更新されると、ロードされたelispファイルの場所が、新しいバージョンのパッケージのフォルダーに変更されます。

Yasnippetは、それがインストールされたファイルのスニペットを遅延ロードしようとします。これは、これまでに見たことのないメジャーモードでファイルを開いたときです。

これは、emascが更新された後、以前に表示されなかったメジャーモードでの読み込みに失敗することを意味します。

これを解決するための良い一般的な方法はありますか?(agが更新されると、似たような面倒な問題が発生します)。または、パッケージを読み込めなかった場合にエラーを表示するのではなく、警告を表示するだけで警告を表示するように、yasnippetで何かをアドバイスすることをお勧めしますか?

明確化:

  • emacsを起動すると、yasnippetが読み込まれます。
  • メジャーモードが(たとえば)makefileであるファイルをロードしません。
  • パッケージマネージャーを使用して、新しいバージョンのyasnippetに更新します
  • 私はメイクファイルをロードし、yasnippetはメイクファイルのスニペットをロードしようとしますが、スニペットに使用していたフォルダーが存在しないため失敗します。それだけでなく、yasnippetがインストールしたコマンドへの事前フックが失敗するため、他のすべてのコマンドも失敗します。
  • 回避策:メッセージバッファーを開き、開くことができないフォルダーを見つけて実行しmkdir ~/.blargh/folder-yasnippet-wantsます。

明らかに、yasnippetについて少しアドバイスを書くこともできますが、もっとグローバルなソリューションを望んでいます(確かに、elispで遊んでアドバイスを得るには少し時間がかかります)。


あなたの問題をより明確に説明してください:どのパスが見つからないのですか?YASnippetを更新した後、または何か他のものを更新した後?Emacsのinitファイルにはどのような構成がありますか?
Lorenzo Gatti

package.elはあなたが完璧に働きたいだけで、おそらくそれに関連する解決策を探していると思います。物事が壊れると個人的にはぐちゃぐちゃになるので、ライブラリをまったく別の場所に置くことで壊れる可能性を減らします-場合によっては、ライブラリにプレフィックスを追加してすべての名前を変更することもあります-例:lawlist-... そのように、何もEmacsチームによって変更された関数を除いて壊れます-たとえば、既存の関数への新しい引数など。yasnippet.elどこか他の場所にコピーし、パッケージマネージャーから削除しました。心配することはありません。
法律家、2014

問題を提出してください。これは、Yasnippet、AFAICT内で修正できるものです。
ドミトリー

@Dmitry Waaaay先に。#495を参照してください。
Sean Allred 2014年

@SeanAllred Huh、確かに。それで、問題はすでにマスターで修正されていますか?
ドミトリー

回答:


1

私がやっていることは少し複雑です。package-activateパッケージがアクティブ化されるたびに、Emacsが呼び出されたファイルを探し、の代わりに[package]-conf.elを使用して実行するように関数をアドバイスします。これloadによりrequire、複数回実行できます。

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

そして、私のpkg-configs/yasnippet-conf.elyas-snippet-dirsで、yasnippetパッケージがどこにあるかを指すように変数を設定しました:

(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シンボルでカスタムディレクトリを検索するために使用する関数です。ディレクトリの代わりに使用できます。

これらはすべて、私の構成ファイルから直接コピーされます。それはあなたが必要とするすべてのものだと思います、または少なくとも正しい方向にあなたを向けるべきです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.