Neden her paketi yükleme yoluna eklemem gerekiyor? (veya init dosyamda requir 'paketi ile ilgili sorun)


17

Paket Menüsünden her paket yüklediğimde, requireinit dosyamda denediğimde , yükleme yoluna el ile eklemediğim sürece bir hata alıyorum:

(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")

(require 'use-package-autoloads)
(require 'use-package)

Bu sıkıcı. Ve genellikle paket yolu sürüm numaralarını içerir. Bir paket güncellendiğinde, yükleme yolunu el ile düzenlemem gerekir.

Bunu otomatikleştirmenin bir yolu var mı?

Yanıtlar:


23

TL; DR:

Aşağıdaki satırı init dosyanızın ( .emacs.d/init.elveya .emacs) en üstüne ekleyin :

(package-initialize)

Açıklama

Emacs'ın kullanabileceği daha fazla dosya oluşturmak user-init-filekesinlikle doğru bir yaklaşım değildir. Kılavuz, en azından alıntıladığınız bölümde bir çatışma olması durumunda hangisinin tercih edildiğini söylemediğinden, tek yapmanız gereken karışıklık eklemek - şimdi hangisinin gerçekte olduğunu bilmiyoruz user-init-file(değeri isteyebileceğiniz öğrenmek için incelemek).

Bu nedenle ~/.emacs.d/init.el, genellikle (kullanıcılar tarafından) tercih edilen dışındaki tüm adayları kaldırarak başlayın, çünkü bu kutsal olmayan karmaşaya katkıda bulunmaz $HOMEve en önemlisi de dahil olmak üzere tüm Emacs yapılandırma dosyalarının, yalnızca Emacs.

Varsayılan olarak , kullanıcının init dosyası yüklendikten package-initialize sonra Emacs çağrıları . O kadar yaptığı hiç bugünlerde, çünkü çoğu kullanıcıların kullanarak paketleri yükleme package.elonlar bu paketleri mevcuttur yapılacak için bir şey yapmak zorunda olmamalıdır yüzden -.

Değil Öte yandan herkes yapar, nedenle mümkün olmalıdır değil diyoruz package-initialize. Bu işlevin çağrılmasını (setq package-enable-at-startup nil)önlemek, kullanıcının init dosyasına (başka bir yere koyabilirsiniz?) Eklenerek yapılır .

package-initializekullanıcının Emacs'a bunu yapmamasını söyleyecek bir değişiklik yapmadan önce çağrılamaz ve bu nedenle init dosyasını yükledikten sonra yapılması gerekir . Kullanıcı yalnızca paketleri yükleyip daha sonra olduğu gibi kullandığı veya iyi çalışan Özel arabirimi kullanarak özelleştirdiği sürece. Ancak elisp kullanarak paketlerinizi özelleştirmek istiyorsanız, load-pathtanımladıkları işlevleri kullanmadan önce bunların gerçekten olduğundan emin olmanız gerekir .

Bunu yapmak oldukça kolay ve doğru bir şekilde belgelenmiş (eğer daha önce baksaydım, yukarıdakilerin çoğunu yazmak zorunda kalmazdım: - /

Otomatik paket yüklemesinin, init dosyası yüklendikten sonra gerçekleşmesinin nedeni, kullanıcı seçeneklerinin, paketleme sistemini etkileyen kullanıcı seçenekleri de dahil olmak üzere, yalnızca init dosyasını yükledikten sonra özelleştirilmiş değerlerini almasıdır. Bazı durumlarda, paketleri init dosyanıza açıkça yüklemek isteyebilirsiniz (genellikle init dosyanızdaki diğer bazı kodlar bir pakete bağlı olduğundan). Bu durumda, init dosyanız işlevi çağırmalıdır package-initialize. Aramadan package-load-listönce (aşağıya bakın) gibi ilgili kullanıcı seçeneklerinin ayarlandığından emin olmak size bağlıdır package-initialize. Ayrıca şunu da ayarlamanız package-enable-at-startupgerekir:nilinit dosyasını işledikten sonra paketlerin tekrar yüklenmesini önlemek için. Alternatif olarak, başlangıçta paket yüklemesini tamamen engellemeyi seçebilir ve paketlerinizi manuel olarak yüklemek için `` Mx paketini başlat '' komutunu çağırabilirsiniz.

Yani:

;;; .emacs.d/init.el -- the `user-init-file'

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

(require 'use-package)

(use-package some-package
  :init (setq some-package-variable "foobar")

    ...

;;; .emacs.d/init.el ends here

Tabii ki sorun (veya ek bir sorun) da yazım hatası Symbol's function definition is void: use-packgeinit dosyanızda olabilir ve siz emacs.se yazana kadar gerçekleşmemiş olabilir.



Daha (require 'use-package)önce kullanmak uygun (package-initialize)mu?
力 力

3

Bence after-init-hookbelirtilen çözüm bu yığın taşması cevap belirtilmesi gerekir:

(defun my-packages-init ()
  (require 'some-great-package))

(add-hook 'after-init-hook 'my-packages-init)

Bunun yapılması gerektiği gibi olduğunu düşündüm, ancak diğer cevaplar bunu yapmanın diğer yolları hakkında bilgi veriyor.


0

Aşağıdakiler ~/.emacs.d/site-lisp, yükleme yoluna tüm dizinleri ekler , böylece yalnızca requirepaketi ve işinizi tamamlayabilirsiniz:

(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.