Saya menggunakan package
untuk mengelola ekstensi Emacs saya. Untuk menyinkronkan pengaturan Emacs saya di komputer yang berbeda, saya ingin cara untuk menentukan daftar nama paket dalam .emacs
file dan kemudian package
dapat secara otomatis mencari dan menginstal paket, sehingga saya tidak perlu menginstalnya secara manual dengan menelepon M-x package-list-packages
. Bagaimana cara melakukannya?
123
Jawaban:
sumber
package
.package-refresh-contents
hanya akan berjalan jika paket tersebut tidak diinstal? Bagaimana(or (file-exists-p package-user-dir))
lebih baik / bagaimana cara memeriksa apakah paket sudah diinstal?package-refresh-contents
. Ini mungkin hanya akan dijalankan saat pertama kali Anda membuka emacs di komputer baru, dan saya setuju dengan itu. Jika sebuah paket perlu diperbarui, itu dapat dilakukan secara manual.use-package
, Anda dapat menggunakan:ensure
kata kunci tersebut untuk menginstal paket secara otomatis. Ini juga mengaturpackage-selected-packages
jika Anda perlu mengakses daftar paket melalui customize atau programatically.Berdasarkan komentar Profpatsch dan jawaban di bawah ini:
sumber
or
? Oh wow.mapc
itu untuk efek sampingnya. Tapi kenapa tidak digunakanunless
?(package-initialize)
sebelum referensi kepackage-user-dir
Emacs 25.1+ akan secara otomatis melacak paket yang diinstal pengguna dalam
package-selected-packages
variabel yang dapat disesuaikan .package-install
akan memperbarui variabel kustomisasi, dan Anda dapat menginstal semua paket yang dipilih denganpackage-install-selected-packages
fungsi tersebut.Keuntungan praktis lainnya dari pendekatan ini adalah Anda dapat menggunakan
package-autoremove
untuk secara otomatis menghapus paket yang tidak termasuk dipackage-selected-packages
dalamnya (meskipun itu akan mempertahankan ketergantungan).Sumber: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html
sumber
Inilah kode yang saya gunakan untuk Emacs Prelude :
Jika Anda tidak menggunakan MELPA, Anda tidak perlu memerlukannya (dan jika Anda melakukannya
melpa.el
harus diload-path
(atau diinstal melalui MELPA). Paket db tidak di-refresh setiap kali (karena ini akan memperlambat startup secara signifikan ) - hanya jika ada paket yang dihapus instalasinya.sumber
Belum ada yang menyebutkan Cask , tapi cukup cocok untuk tugas ini.
Pada dasarnya Anda membuat
~/.emacs.d/Cask
daftar paket yang ingin Anda instal. Sebagai contoh:Menjalankan
cask
dari baris perintah akan menginstal paket-paket ini untuk Anda, dan semua dependensi yang mereka butuhkan.Selain itu, Anda dapat secara otomatis memperbarui paket yang diinstal menggunakan
cask update
.sumber
/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]
Panggil
package-install
dengan nama paket sebagai simbol. Anda dapat menemukan nama paket untuk paket Anda dengan menelepon secarapackage-install
interaktif dan melengkapi namanya. Fungsinyapackage-installed-p
akan memberi tahu Anda jika sudah diinstal.Sebagai contoh:
sumber
error: Package
dired + 'tidak tersedia untuk instalasi`. dired + adalah paket yang saya coba dengan kode Anda.dired+
muncul saat Anda berlaripackage-list-packages
? Saya yakin Anda harus menambahkan selai atau melpa ke Andapackage-archives
. Jika ya, bisakah kamu lari(package-install 'dired+)
?(package-installed-p 'dired+)
harus dikembalikant
dan akan dilewati dalam kode di atas.package-installed-p
satunya berfungsi dengan baik, tetapi seluruh blok kode tidak. Saya sudah mencoba beberapa paket.sumber
Saya suka memeriksa apakah pengguna ingin menginstal paket terlebih dahulu seperti yang dilakukan dalam jawaban ini . Juga saya menyegarkan konten paket saya sekali sebelum menginstal apa pun. Saya tidak yakin apakah ini cara terbaik, tetapi menurut saya jawaban teratas tidak melakukannya untuk saya.
sumber
Aku berlari ke dalam masalah yang tidak ada yang terjadi setelah menambahkan
(package-install 'org)
ke.emacs
. Saya ingin menginstal versi terbaru dan versiorg-mode
bawaannyaorg-mode
sudah cukup lama.Saya menggali kode sumber
package-install
dari Emacs 25.3.1. Fungsi itu sendiri sudah memeriksa apakah sebuah paket diinstal atau tidak dan menolak untuk menginstalnya jika paket tersebut sudah diinstal. Jadi cek(unless (package-installed-p package) ...)
dari jawaban 10093312 ternyata tidak beralasan.Bawaan
org-mode
juga dihitung sebagai terpasang danpackage-install
menolak untuk memasang versi yang lebih baru dari ELPA. Setelah menghabiskan waktu membaca package.el, saya menemukan solusi berikut.Alasan mengapa ini berhasil adalah
package-*
fungsi keluarga menangani argumen secara berbeda berdasarkan apakah itu simbol ataupackage-desc
objek. Anda hanya dapat menentukan info versipackage-install
melalui sebuahpackage-desc
objek.sumber
Ini milikku, lebih pendek :)
sumber
Berikut cara lain.
sumber