Bagaimana saya bisa mencegah yasnippet dari melanggar ketika saya memperbarui paket saya?

8

Setelah paket diperbarui, lokasi file elisp yang dimuat akan berubah berada di folder versi baru paket.

Yasnippet mencoba memuat cuplikan dengan malas untuk file yang diinstalnya, ketika saya membuka file dalam mode utama yasnippet belum pernah melihat sebelumnya.

Ini berarti bahwa memuat hal-hal dengan mode utama yang sebelumnya tidak terlihat setelah emacs telah diperbarui gagal, karena yasnippet memecah semuanya dengan mengeluh tentang "tidak ada file atau direktori".

Apakah ada cara umum yang baik untuk menyelesaikan masalah ini, seperti tidak membiarkan pembaruan merusak sesuatu? (Saya mendapatkan masalah yang serupa tetapi tidak terlalu membosankan saat ag diperbarui). Atau, akan menyarankan sesuatu di yasnippet untuk hanya menelan kesalahan sehingga hanya memperingatkan bukannya kesalahan ketika tidak dapat memuat paket menjadi rencana yang lebih baik?

Klarifikasi:

  • Saya memulai emacs, dan yasnippet dimuat.
  • Saya tidak memuat file yang moda utamanya (misalnya) makefile.
  • Saya memperbarui ke versi baru dari yasnippet, menggunakan manajer paket
  • Saya memuat makefile, dan yasnippet mencoba memuat cuplikan untuk makefile tetapi gagal, karena folder yang digunakannya untuk cuplikan tidak lagi ada. Bukan hanya itu, tetapi secara praktis setiap perintah lain gagal, karena pra-kait kepada mereka yang diinstal yasnippet gagal.
  • Penanganan Masalah: Buka buffer pesan, cari folder mana yang tidak dapat dibuka dan dijalankan mkdir ~/.blargh/folder-yasnippet-wants.

Jelas, orang bisa menulis beberapa saran untuk sedikit yasnippet, tapi saya berharap untuk solusi yang lebih global (dan itu butuh waktu bermain dengan elisp untuk mendapatkan saran untuk bekerja, saya yakin).

Squidly
sumber
Tolong jelaskan masalah Anda dengan lebih jelas: jalur mana yang hilang? Setelah memperbarui YASnippet atau setelah memperbarui sesuatu yang lain? Konfigurasi apa yang Anda miliki di file init Emacs Anda?
Lorenzo Gatti
Saya menyadari Anda hanya ingin package.elbekerja dengan sempurna dan Anda mungkin mencari solusi untuk itu. Saya pribadi menjadi unglued ketika ada masalah, jadi saya mengurangi kemungkinan kerusakan dengan menempatkan perpustakaan di lokasi yang sama sekali berbeda - dalam beberapa kasus, saya bahkan mengubah semua nama dengan menambahkan awalan di perpustakaan - misalnya, lawlist-... Dengan begitu, tidak ada istirahat kecuali fungsi yang dimodifikasi oleh tim Emacs - misalnya, argumen baru untuk fungsi yang ada, dll. Saya menyalin di yasnippet.eltempat lain, menghapusnya dari manajer paket, dan tidak pernah khawatir tentang hal itu.
hukum
Ajukan masalah. Ini adalah sesuatu yang dapat diperbaiki dalam Yasnippet, AFAICT.
Dmitry
@Dryry Waaaay di depan Anda. Lihat # 495 .
Sean Allred
@SeanAllred Huh, memang. Jadi, masalahnya sudah diperbaiki pada master?
Dmitry

Jawaban:

1

Apa yang saya lakukan sedikit rumit: Saya menyarankan fungsi package-activatesedemikian rupa sehingga setiap kali sebuah paket diaktifkan, Emacs akan mencari file yang dipanggil [package]-conf.eldan menjalankannya menggunakan loadalih-alih require, sehingga dapat dieksekusi beberapa kali.

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

Dan di saya pkg-configs/yasnippet-conf.el, saya mengatur yas-snippet-dirsvariabel ke titik di mana yasnippetpaket itu:

(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-pathadalah fungsi yang saya gunakan untuk menemukan direktori khusus saya dengan simbol; Anda dapat menggantinya untuk direktori.

Semua ini disalin langsung dari file konfigurasi saya. Saya pikir itu setiap hal yang Anda butuhkan, atau setidaknya harus mengarahkan Anda ke arah yang benar.

Roberto Huelga
sumber