Làm cách nào tôi có thể ngăn yasnippet phá vỡ khi tôi cập nhật các gói của mình?


8

Sau khi các gói đã được cập nhật, vị trí của các tệp elisp được tải sẽ thay đổi thành trong thư mục của phiên bản mới của gói.

Yasnippet cố gắng tải các đoạn mã một cách lười biếng cho tệp mà nó đã được cài đặt, khi tôi mở một tệp ở chế độ chính mà yasnippet chưa từng thấy trước đây.

Điều này có nghĩa là tải mọi thứ với các chế độ chính chưa từng thấy trước đây một khi emacs đã được cập nhật không thành công, vì yasnippet phá vỡ toàn bộ bằng cách phàn nàn về "không có tệp hoặc thư mục như vậy".

Có một cách tổng quát tốt để giải quyết vấn đề này, chẳng hạn như không để các bản cập nhật phá vỡ mọi thứ? (Tôi nhận được một vấn đề tương tự nhưng ít tẻ nhạt hơn khi ag được cập nhật). Ngoài ra, có nên khuyên một điều gì đó trong yasnippet chỉ là nuốt lỗi để nó chỉ cảnh báo thay vì lỗi khi không thể tải các gói là một kế hoạch tốt hơn?

Làm rõ:

  • Tôi bắt đầu emacs và yasnippet được tải.
  • Tôi tải không có tệp nào có chế độ chính là (ví dụ) tệp tạo tệp.
  • Tôi cập nhật lên phiên bản mới của yasnippet, sử dụng trình quản lý gói
  • Tôi tải một tệp Makefile và yasnippet cố gắng tải đoạn mã cho tệp tạo tệp nhưng không thành công, vì thư mục mà nó đang sử dụng cho đoạn trích không còn tồn tại. Không chỉ vậy, nhưng thực tế mọi lệnh khác đều thất bại, vì móc nối trước với chúng mà yasnippet đã cài đặt không thành công.
  • Giải pháp thay thế: Mở bộ đệm thông báo, tìm thư mục nào không thể mở và chạy mkdir ~/.blargh/folder-yasnippet-wants.

Rõ ràng, người ta có thể viết một số lời khuyên cho một chút yasnippet, nhưng tôi hy vọng một giải pháp toàn cầu hơn (và phải mất một thời gian chơi với elisp để có được lời khuyên để làm việc tôi chắc chắn).


Hãy giải thích vấn đề của bạn rõ ràng hơn: con đường nào được tìm thấy bị thiếu? Sau khi cập nhật YASnippet hoặc sau khi cập nhật một cái gì đó khác? Bạn có cấu hình nào trong tệp init Emacs của bạn?
Lorenzo Gatti

Tôi nhận ra bạn chỉ muốn package.ellàm việc hoàn hảo và có lẽ bạn đang tìm kiếm một giải pháp liên quan. Cá nhân tôi trở nên vô duyên khi mọi thứ bị phá vỡ, vì vậy tôi giảm khả năng bị vỡ bằng cách đặt các thư viện ở một vị trí hoàn toàn khác - trong một số trường hợp, tôi thậm chí thay đổi tất cả các tên bằng cách thêm tiền tố vào thư viện - ví dụ: lawlist-... Bằng cách đó, không có gì phá vỡ ngoại trừ một chức năng đã được sửa đổi bởi nhóm Emacs - ví dụ: một đối số mới cho một chức năng hiện có, v.v. Tôi đã sao chép yasnippet.elở một nơi khác, xóa nó khỏi trình quản lý gói và không bao giờ lo lắng về nó.
luật

Nộp một vấn đề. Đây là một cái gì đó có thể được sửa trong Yasnippet, AFAICT.
Dmitry

@Dmitry Waaaay trước bạn. Xem # 495 .
Sean Allred

@Sean ALLred Huh, thực sự. Vậy, vấn đề đã được sửa trong master rồi?
Dmitry

Câu trả lời:


1

Những gì tôi làm hơi phức tạp: Tôi khuyên chức năng package-activatesao cho mỗi lần gói được kích hoạt, Emacs sẽ tìm một tệp được gọi [package]-conf.elvà thực thi nó bằng cách sử dụng loadthay requirevì đó có thể được thực thi nhiều lần.

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

Và theo tôi pkg-configs/yasnippet-conf.el, tôi đặt yas-snippet-dirsbiến thành điểm trong đó yasnippetgói:

(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-pathlà một chức năng tôi sử dụng để tìm các thư mục tùy chỉnh của mình bằng ký hiệu; bạn có thể thay thế nó cho các thư mục.

Tất cả điều này được sao chép trực tiếp từ các tập tin cấu hình của tôi. Tôi nghĩ rằng đó là tất cả mọi thứ bạn cần, hoặc ít nhất nó sẽ chỉ cho bạn đi đúng hướng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.