Saya mengembangkan perpustakaan dan ingin memuatnya kembali setelah diedit tanpa keluar dari Emacs (anggap sudah aktif load-path
):
(load-library "myname")
Ketika saya melakukan ini, Emacs tidak mengambil perubahan ke defvar
variabel-terikat.
Saya tidak ingin memanggil eval-defun
( C-M-x) secara manual di setiap formulir tingkat atas. Apakah M-x eval-buffer
rasa hormat defvar
/ defcustom
?
(unload-feature 'myname)
dulu?eval-defun
itu tidak menerima perubahandefvar
.defvar
file atau buffer, jika saya mengerti dengan benar.load-file
menyiratkan bahwa ia ingin mengevaluasi seluruh file sambil memastikan bahwa defvars dievaluasi kembali.Jawaban:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Ini akan berfungsi selama Anda pertama kali memuat defvars dengan memuat perpustakaan melalui emacs, dan tidak menggunakan
eval-defun
,eval-buffer
dll.Saat Anda menggunakan
require
,load-library
dll. Emacs akan melacak variabel dan fungsi mana yang merupakan bagian dari perpustakaan Anda, dan akan menghapusnya sepenuhnya untuk Anda saat Anda menggunakannyaunload-feature
.Saat menulis paket, saya menemukan bahwa menggunakan kode di atas adalah solusi yang lebih baik daripada menjalankan
eval-defun
saat Anda menulis kode baru sehingga Anda tidak masuk ke kondisi perantara.sumber
(info "(elisp) Loading")
,(info "(elisp) Unloading")
danunload-feature
memerlukanforce
arg jika pustaka adalah ketergantungan untuk pustaka lain. Jawaban bagus! Saya bertanya-tanya versi Emacs apa yang mulai menyediakan bongkar ...defvar
tidak menetapkan ulang nilai variabel dengan cara yang sama seperti, katakansetq
atausetf
. Setelah variabel memiliki nilai,defvar
tidak akan menyentuhnya.Dari
defvar
dokumentasi:Karena Anda mungkin
defvar
mengedit variabel yang bersangkutan untuk memberi mereka nilai saat pertama kali memuat pustaka, memuat ulang pustaka tidak akan mengubah nilai.Lihat juga simpul manual elisp pada Mendefinisikan Variabel Global .
Alih-alih mengandalkan
defvar
, Anda selalu dapat menetapkan ulang nilaisetq
. Sebagai alternatif, opsi kikuk, Anda dapatunintern
simbol sehinggadefvar
s tidak akan menemukannya saat memuat ulang:sumber
defvar
adalah hal yang benar untuk digunakan.setq
akan kustomisasi yang ditetapkan oleh pengguna individu. OP meminta cara untuk memaksa menimpadefvar
variabel selama pengembangan paket . Beralih kesetq
akan membutuhkan beralih kembali kedefvar
saat paket dirilis.defvar
sesuai untuk pengembangan paket. Saya hanya menunjukkan bahwadefvar
tidak menetapkan ulang nilai, sementarasetq
demikian.Coba ini:
Itu hanya menggunakan kode yang sama yang
eval-defun
digunakan pada adefvar
. Itu melintasi buffer (atau pembatasannya dengan mempersempit), berhenti di masingdefvar
- masing dan menggunakaneval-defun
kode di atasnya.sumber
Setelah saya mendengar bahwa tidak ada solusi yang mudah untuk mengevaluasi kembali buffer dengan menugaskan ulang
defvar
, saya membuat fungsi sederhana yang menyampaikaneval-defun
:Struktur kode terinspirasi oleh
eval-defun-2
implementasi. Ini mirip dengan Bagaimana saya memaksa evaluasi ulang defvar? larutan.Awalnya saya ingin fungsi tingkat tinggi untuk mengevaluasi kembali perpustakaan yang diinstal ulang melalui skrip build jadi:
Solusi Drew bekerja bahkan pada nested
defvar
tetapi sulit untuk sepenuhnya memahami kode.Saya juga berpikir tentang
unintern
semua simbol berdasarkan awalan simbol / regex (seperti yang disarankan Dan ) tapi saya malas mengetik awalan setiap kali ... Lihat Bagaimana saya bisa melepaskan ikatan semua definisi simbol dengan awalan tertentu?sumber