Paketlemek ve güncellemek için package.el kullanma, yükleme ve yapılandırma için use-package kullanma


15

Son zamanlarda öğrendikten sonra, use-packageyapılandırmamı ona taşımaya karar verdim, ancak package.elpaketleri yüklemek ve güncel tutmak için kendimi rahat hissetmekten kendimi isteksiz buldum . Ben birleştirmek biraz zor buldum use-packageve package.el.

Genellikle insanlar bir araya öğrenme ilgilenen kulüpler use-packageile package.elsistemde, ancak daha özel bir soru için, okumaya devam.

İşte istediğim:

  1. Paketlerin paket yöneticisi tarafından yüklenmesini sağlamak, böylece paketlere kolayca göz atabilir ve bunları güncel tutabilirim list-packages.
  2. Paketleri özel olarak yapılandırmak ve yüklemek için use-package, init dosyamda tam olarak ne yüklediğimi ve nasıl yapılandırıldığını kolayca görebiliyorum.
  3. İsteğe bağlı olarak, ben de içinden paketleri yükleyebilmek için istiyorum use-package'ın :ensureanahtar kelime.

Doğru anlıyorsam, ne yaptığından çok az şey istiyorum package-initialize, temelde sadece ayarlandığı şekilde load-path. Şu anda benim konfigürasyonda bu var:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

İlk yorum yapılan satır Emacs 25 (package-initialize)init dosyama yardımcı olmaz . Buradaki bit, normal-top-level-add-subdirs-to-load-pathne package-initializeyapacağı konusunda load-pathbir tahmin, yeterince iyi görünen bir tahmin.

Bu benim arzularım 1 ve 2, ancak 3 elde etmek gibi görünüyor. Kullanmaya çalışırsanız :ensure, package.elbaşlatılmamış söyleyen bir hata mesajı alıyorum . Arama package-initializebunu düzeltir, ancak bundan kaçınmak istiyorum, çünkü a) Tüm sayısız otomatik yüklerin yüklenmesini istemiyorum ( use-packagetam olarak ihtiyacım olan otomatik yükleri oluşturmak için kullanmayı tercih ediyorum) ve b) Kolayca yapabilmek istiyorum istediğim zaman yüklü paketleri yüklemekten kaçının (bununla yapmak kolaydır use-package).

Bunun nasıl yapılacağı konusunda bir önerisi olan var mı?

Yanıtlar:


11

IIUC yapmak istediğiniz şey:

(package-initialize t)

Burada kurulu tmutluluğunuzun anahtarı olan argümanı not edin , çünkü kurulu tüm paketleri etkinleştirmeden package.el dosyasını başlatır (veya en azından başlatmalıdır).


1
Bu sorumu cevaplıyor, şimdi package-initializesorularımın tartışmalı kimliğini kullanmaya yönelmeme rağmen .
Omar

15

Geçerli yapılandırmanızla, paket yöneticisini başlatmadığınız ve Emacs'ın otomatik olarak başlatılmasını engellediğiniz için paketi etkili bir şekilde devre dışı bıraktınız. Bunun karşılığında tek yaptığınız ELPA'yı eklemektir load-path, ancak bu paketin ne yaptığının sadece küçük bir alt kümesidir. Bunu neden yaptığınızdan emin değilim, ama tavsiye edeceğim bir kurulum değil.

Özellikle, yaklaşımınızla birlikte paket otomatik yüklemeleri alamazsınız, yani başlangıçta herhangi bir paketten komut kullanılamaz.

Başka bir deyişle, M-xyalnızca yerleşik komutlar sunar. Senin paketlerden komutlar eklemek için açık eklemek olurdu :commandsiçin tanımlarını tüm senin use-packagebir manasına gelen, bildirimleri çok esasen sıfır kazanç-package.el verir gibi büyük paketler için-özellikle çaba bakım ve için Magit-ücretsiz autoloads .


Package.el use-packageile birleştirmek aslında çok basittir - tüm kurulum bu birleşime dayanır - ancak package.el'i aslında işine bırakmak çok daha iyidir. Init dosyanızın en başında package.el dosyasını başlatın:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

Kolaylık sağlamak için, daha use-packageönce yüklü değilse, daha sonra önyükleme yapmak isteyebilirsiniz :

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

Bu, yeni bir sistemde Emacs oturumu başlatmanıza izin verir ve init.el dosyanız otomatik olarak yüklenir use-package.

Nihayetinde yüklemeniz gerekir use-package:

(eval-when-compile
  (require 'use-package))

Artık use-packagepaketleri yüklemek ve yapılandırmak için kullanabilirsiniz :

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

Emacs şimdi başlatma sırasında bu formu değerlendirdiğinde, use-packageMagit'in önceden yüklenmiş olup olmadığını kontrol eder ve gerekirse otomatik olarak yükler.


3
"Bunu neden yaptığınızdan emin değilim": görebilmemin tek nedeni başlangıç ​​zamanlarıdır: package-initializeyolu doldurmak, otomatik yüklemeleri tanımlamak ve geri kalanını yapmak biraz zaman alır. Sanırım Jon Wiegley'in kendisinin (yazarının use-package) tüm otomatik yüklenen komutları use-packagegüvenmek yerine stanzalarda bildirmeyi tercih ettiğini okudum package.el.
François Févotte

Son baktığımda paketi kullanmadı. Hiç ve her durumda, çok kazanacağını sanmıyorum. Her load-pathiki durumda da, aracılığıyla use-packageveya yoluyla doldurmanız ve otomatik yük eklemeniz gerekir package.el. Özellikle hızlı bir diske sahip modern bir sisteminiz varsa, ölçülebilir bir fark olduğundan şüpheliyim.
lunaryorn

3
Kabul. Zamanlamaları kendim yaptım. Hızlı bir diskle, hiçbir farkın etkili olduğunu görmezsiniz. Yavaş bir diskte, başlatma, package-initializeözel bir listeden çok daha yavaş olabilir (0.2s gibi bir şey) load-path. Ben bunu yapan dosya sisteminin "keşfi" ile ilişkilendiririm package.el. Ancak, autoloadtanımları dosyalardan yüklemek ve bunları use-packagestanzalarda tutmak arasında performans açısından hiçbir önemli fark ölçmedim.
François Févotte

Ben ettik Eh, söyleyemem devrepackage.el sistemini, ben sadece engelli söyleyebilirim package-initialize! Bunun nedeni, list-packagesyeni paketlere göz atmak ve özellikle şu anda yüklü olan tüm paketleri güncellemek isterken , hedeflenen yüklemeyi tercih ettiğimi düşünüyorum use-package. Benim için sadece komutlar için otomatik yüklemeler yapmak benim için iyi bir şey gibi sesler kullanıyorum!
Omar

1
@ OmarAntolín-Camarena Neden olmasın? Otomatik yüklemeler aslında kullanıcıya bakan bir paketin genel arabirimidir ve paket.el, paketleri dağıtmanın standart yolu haline geldiğinden, varlıklarına güvenebiliriz.
lunaryorn
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.