Emacs 24: Đang tải gói được cài đặt qua ELPA


12

Tôi vừa cài đặt cmake-modegói trong Emacs 24 bằng cách sử dụng:

M-x package-install cmake-mode

Tôi có thể xem gói tại : ~/.emacs.d/elpa/cmake-mode-20110824, và tôi có thể tải gói bằng hướng dẫn tại Commentary:phần ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el:

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

Tuy nhiên, điều này mâu thuẫn với hướng dẫn sử dụng trên trang EmacsWiki của ELPA:

... Các gói được khởi tạo SAU KHI init.el được tải. Điều này có nghĩa là bạn KHÔNG nên đặt khởi tạo cụ thể gói vào init.el của mình ...

Tôi có xu hướng đồng ý với hướng dẫn này vì thêm vào ~/.gnu-emacstệp của tôi một dòng như:

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

là xấu, và sẽ phá vỡ nếu và khi tôi sẽ nâng cấp gói. Tuy nhiên không có dòng này tôi không thể sử dụng cmake-mode.

Am i thiếu cái gì ở đây?

Ghi chú:

  • Tôi không có gì lạ với package-enable-at-startupvà giá trị của nó là t.
  • Tôi đang sử dụng khúc dạo đầu .
  • user-emacs-directorygiá trị là "~/.emacs.d/" (Cảm ơn @lawlist cho đề xuất)
  • package-user-dir giá trị là "~/.emacs.d/elpa"

1
Có thể bạn đã thay đổi vị trí của default-directoryhoặc user-emacs-directory, như vậy elpathư mục không được tải? package-installtạo một elpathư mục và tệp tự động tải được tạo trong quá trình cài đặt dựa trên vị trí đó.
luật

1
Dòng mã cuối cùng của bạn trong câu hỏi của bạn cho thấy rằng bạn đã chuyển gói ra khỏi elpathư mục - tức là, ~/.emacs.d/cmake-mode-20110824/không phải là nơi tệp tự động tải dự kiến ​​sẽ có.
luật

@lawlist: Bạn rất quan sát. Tôi đã phạm một lỗi trong câu hỏi. Bây giờ nó đã được cố định (câu hỏi) với giá trị chính xác của ~/.emacs.d/elpa/cmake-mode-20110824/. Vấn đề vẫn còn.
Chen Levy

Câu trả lời:


2

Tôi đã cài đặt chế độ cmake với marmalade-repo và xem qua cmake-mode-autoloads.el. Có vẻ như tác giả đã đưa ra quyết định có ý thức notbao gồm mọi thứ cần thiết cho thiết lập trong tệp tự động tải. Tuy nhiên, các hướng dẫn trên dòng 25 đến 30 của cmake-mode.el là chính xác, mà bạn đã trích dẫn trong câu hỏi của mình. Nếu bạn sử dụng các dòng 25 đến 30 và đặt đường dẫn chính xác, thì bạn KHÔNG cần thêm một dòng mã như (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Rõ ràng, bạn sẽ không muốn sử dụng /dir/with/cmake-mode- bạn muốn sử dụng ~/.emacs.d/elpa/cmake-mode-20110824mà không cần chuyển tiếp vào cuối.

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

Bạn có thể cần xóa thư mục c-make-mode ... và thử cài đặt lại nếu đoạn mã trên không hoạt động (sử dụng đường dẫn của riêng bạn).


Chắc chắn, nhưng trừ khi tôi thiếu một cái gì đó, nếu sau đó bạn cập nhật chế độ cmake thông qua ELPA, thì thư mục đó sẽ được đổi tên thành một cái gì đó không có trong tệp init của bạn, hoặc phiên bản mới hơn kết thúc trong một thư mục không nằm trong đường dẫn tải của bạn; trong trường hợp sau, bạn sẽ không thấy bản cập nhật hoặc bạn nhận được sự kỳ lạ không đáng có vì bạn đang tải thủ công một phiên bản và (package-initialize)đang tải phiên bản khác. Tôi có lầm không? Ý tôi là, tôi chưa sử dụng ELPA nhiều và chưa cập nhật bất kỳ gói nào với nó, vì vậy tôi có thể sai. Và, chắc chắn, nó không phải là một mối quan tâm lớn trong mọi trường hợp, nhưng tại sao không tránh nó hoàn toàn?
Aaron Miller

Bạn nói đúng. Tuy nhiên, các gói không chỉ tự cập nhật mà bạn không biết về nó - nếu và khi bạn cập nhật, thì đó sẽ là thời gian để làm việc nhà của bạn. Tôi thường đầu tư một lượng thời gian đáng kể để sửa đổi các tệp nguồn của các gói khác nhau và tôi không nhất thiết muốn chúng được cập nhật sau khi đã dành tất cả thời gian để làm cho chúng vừa phải. Emacs khác xa với những gì người ta có thể coi là "không cần bảo trì".
luật

Một điểm tuyệt vời.
Aaron Miller

3

Do tính chất của wiki là kho lưu trữ một nửa mã, một nửa ghi nhớ cho tin tặc Emacs, bạn có thể bỏ qua điểm này một cách dễ hiểu:

Có thể dễ dàng hơn khi di chuyển gói khởi tạo đến một điểm khác trong khi khởi động để bạn có thể (yêu cầu) các gói ELPA; điều này quan tâm đến rất nhiều vấn đề được mô tả:

Đây là những gì tôi làm; một trong những tệp đầu tiên được tải bởi tập lệnh init tùy chỉnh của tôi (việc tạo ra nó, từ tất cả những gì tôi có thể thu thập được, đó là các tài khoản của các Emacs nghiêm túc sử dụng 1 )

(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)

và từ đó tôi chỉ đơn giản là (require)những gì gói ELPA tôi cần. Điều này cũng có lợi ích là cho phép kiểm soát tốt hơn đối với hành vi của các gói được cài đặt ELPA; ví dụ, nếu tôi muốn vô hiệu hóa một gói nhất định trong lúc này nhưng không gỡ cài đặt hoàn toàn, thì việc bình luận (require)cuộc gọi có liên quan là một vấn đề đơn giản , trong đó hành vi mặc định sẽ yêu cầu chuyển toàn bộ gói ra khỏi thư mục ELPA của tôi.

(1. Mặc dù có sự cám dỗ gần như áp đảo, tôi đã từ chối đặt tên cho kịch bản init tùy chỉnh của mình lightsaber.el.)


Chỉ cần một lời nhắc để kiểm tra thư mục người dùng-emacs nếu thay đổi khi các gói ELPA nằm trong đó theo mặc định. Tôi giữ công cụ của mình trong Dropbox và tôi rất ngạc nhiên khi thấy không có hiệu lực từ các lệnh trên trong tập lệnh bó của tôi cho đến khi tôi đặt nó.
mlt

1

Bạn chỉ có thể thực hiện tất cả các khởi tạo của mình sau khi tải gói bằng cách sử dụng after-init-hook. Từ EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))

0

Tôi đã gặp vấn đề tương tự khi tôi bắt đầu sử dụng ELPA. Trong trường hợp của tôi, tôi đã có một số gói địa phương vì chúng không có trong ELPA.

Và do đó tôi đã thay đổi đường dẫn tải. Vì một số lý do, đường dẫn tải không được cập nhật đúng bởi gói.el. Để giải quyết vấn đề tôi phải đặt (setq load-path (cons "~/.emacs.d" load-path)) sau cuộc gọi đếnpackage-initialize

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.