Emacs 24: Memuat paket yang diinstal melalui ELPA

12

Saya baru saja menginstal cmake-modepaket di Emacs 24 menggunakan:

M-x package-install cmake-mode

Saya dapat melihat paket di:, ~/.emacs.d/elpa/cmake-mode-20110824dan saya dapat memuatnya menggunakan instruksi di Commentary:bagian ~/.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))

Namun ini bertentangan dengan instruksi penggunaan pada halaman ELPA's EmacsWiki:

... paket diinisialisasi SETELAH init.el dimuat. Ini berarti Anda TIDAK boleh memasukkan inisialisasi khusus paket ke init.el Anda ...

Saya cenderung setuju dengan instruksi ini karena menambahkan ke ~/.gnu-emacsfile saya sebuah baris seperti:

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

jelek, dan akan rusak jika dan ketika saya akan memutakhirkan paket. Namun tanpa garis ini saya tidak dapat digunakan cmake-mode.

Apakah saya melewatkan sesuatu di sini?

Catatan:

  • Saya tidak melakukan apa pun yang aneh package-enable-at-startupdan nilainya t.
  • Saya menggunakan pembuka .
  • user-emacs-directorynilainya "~/.emacs.d/" (Terima kasih @lawlist untuk sarannya)
  • package-user-dir nilai adalah "~/.emacs.d/elpa"
Chen Levy
sumber
1
Apakah mungkin Anda telah mengubah lokasi default-directoryatau user-emacs-directory, sehingga elpadirektori tidak dimuat? package-installmembuat elpadirektori dan file autoloads yang dibuat selama instalasi didasarkan pada lokasi itu.
lawlist
1
Baris kode terakhir dalam pertanyaan Anda menunjukkan bahwa Anda memindahkan paket keluar dari elpadirektori - yaitu, ~/.emacs.d/cmake-mode-20110824/bukan tempat file autoload mengharapkannya.
lawlist
@lawlist: Anda sangat jeli. Saya membuat kesalahan dalam pertanyaan itu. Sekarang sudah diperbaiki (pertanyaan) dengan nilai yang benar dari ~/.emacs.d/elpa/cmake-mode-20110824/. Masalahnya tetap ada.
Chen Levy

Jawaban:

2

Saya menginstal cmake-mode dengan marmalade-repo, dan melihat cmake-mode-autoloads.el. Tampaknya penulis membuat keputusan sadar nottermasuk semua yang diperlukan untuk pengaturan dalam file autoloads. Namun, instruksi pada baris 25 hingga 30 dari cmake-mode.el sudah benar, yang Anda kutip dalam pertanyaan Anda. Jika Anda menggunakan baris 25 hingga 30 dan mengatur jalur dengan benar, maka Anda TIDAK perlu baris kode tambahan seperti (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Jelas, Anda tidak ingin menggunakan /dir/with/cmake-mode- Anda ingin menggunakan ~/.emacs.d/elpa/cmake-mode-20110824tanpa forwardslash di akhir.

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

Anda mungkin perlu menghapus direktori c-make-mode ... dan mencoba menginstal ulang jika kode di atas tidak berfungsi (menggunakan jalur Anda sendiri).

daftar hukum
sumber
Tentu, tetapi kecuali jika saya kehilangan sesuatu, jika Anda kemudian memperbarui cmake-mode melalui ELPA, maka direktori tersebut akan diganti namanya menjadi sesuatu yang tidak ada di file init Anda, atau versi yang lebih baru berakhir di direktori yang tidak ada di jalur muat Anda; dalam kasus yang terakhir, Anda tidak melihat pembaruan, atau Anda mendapatkan keanehan yang tidak semestinya karena Anda memuat satu versi secara manual dan (package-initialize)memuat yang lain. Apakah aku salah? Maksudku, saya belum pernah menggunakan ELPA banyak dan belum memperbarui paket apa pun dengan itu, jadi saya bisa salah. Dan, tentu saja, ini bukan masalah utama, tapi mengapa tidak menghindarinya sepenuhnya?
Aaron Miller
Anda benar. Namun, paket-paket tidak hanya memperbarui diri mereka sendiri tanpa Anda mengetahuinya - jika dan ketika Anda memperbarui, maka itu akan menjadi waktu untuk melakukan pekerjaan rumah tangga Anda. Saya sering menginvestasikan sejumlah besar waktu memodifikasi file sumber dari berbagai paket, dan saya tidak ingin mereka diperbarui setelah menghabiskan semua waktu untuk mendapatkannya dengan benar. Emacs jauh dari apa yang bisa dianggap "bebas perawatan".
hukum
Poin yang sangat bagus.
Aaron Miller
3

Mengingat sifat wiki sebagai repositori setengah kode, setengah aide-memoire untuk peretas Emacs, Anda dapat memahami hal ini:

bisa lebih mudah hanya dengan memindahkan inisialisasi paket ke titik lain saat startup sehingga Anda dapat (membutuhkan) paket ELPA; ini menangani banyak masalah yang dijelaskan:

Inilah yang saya lakukan; salah satu file pertama yang dimuat oleh skrip init khusus saya (penciptaan yang, dari semua yang bisa saya kumpulkan, adalah asinorum pons dari penggunaan Emacs serius 1 ) tidak

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

dan dari sana saya hanya (require)paket ELPA apa yang saya butuhkan. Ini juga memiliki manfaat memungkinkan kontrol yang lebih baik atas perilaku paket yang diinstal ELPA; jika, misalnya, saya ingin menonaktifkan paket yang diberikan untuk saat ini tetapi tidak mencopotnya sepenuhnya, ini adalah masalah sederhana untuk mengomentari (require)panggilan yang relevan , di mana perilaku default akan mengharuskan memindahkan paket keluar dari direktori ELPA saya sepenuhnya.

(1. Meskipun memiliki godaan yang luar biasa, saya dengan berani menolak menyebutkan nama skrip init kebiasaan saya lightsaber.el.)

Aaron Miller
sumber
Hanya pengingat untuk memeriksa direktori user-emacs- jika diubah sebagai paket ELPA berada di sana secara default. Saya menyimpan barang-barang saya di Dropbox dan saya terkejut melihat tidak ada efek dari perintah di atas dalam skrip batch saya sampai saya setq itu.
mlt
1

Anda bisa melakukan semua inisialisasi Anda setelah memuat paket menggunakan after-init-hook. Dari EmacsWiki :

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

Saya memiliki masalah serupa ketika saya mulai menggunakan ELPA. Dalam kasus saya, saya memiliki beberapa paket lokal karena tidak ada dalam ELPA.

Dan dengan demikian saya telah mengubah jalur beban. Untuk beberapa alasan load-path tidak diperbarui dengan benar oleh package.el. Untuk mengatasi masalah saya harus meletakkan (setq load-path (cons "~/.emacs.d" load-path)) setelah panggilan kepackage-initialize

Dmytro
sumber