Bagaimana saya bisa memuat ulang .emacs setelah mengubahnya?

375

Bagaimana saya bisa membuat Emacs memuat ulang semua definisi saya yang telah saya perbarui .emacstanpa memulai ulang Emacs?

Yazz.com
sumber
18
Saya tahu emacs sering dianggap sebagai OS, tapi ... s / reboot / restart /?
William Pursell
6
Saya bukan pengembang, jadi banyak jawaban yang masuk akal bagi pengembang tidak terlalu berarti bagi saya
Yazz.com
4
@MJB tujuan dari Stack Overflow adalah untuk menjadi tempat penyimpanan pengetahuan bahkan untuk pertanyaan paling mendasar sekalipun. Pertanyaan ini sangat cocok dengan tujuan Stack Overflow. Silakan lihat stackoverflow.com/faq
chollida
5
kemungkinan duplikat dari stackoverflow.com/questions/2281593/...
Trey Jackson
10
haha sekarang lima tahun kemudian "pencarian Google pertama yang disarankan" mengarah di sini! bagus
JimLohse

Jawaban:

350

Anda dapat menggunakan perintah memuat file ( M-x load-file, lalu tekan kembali dua kali untuk menerima nama file default, yang merupakan file saat ini sedang diedit).

Anda juga bisa memindahkan titik ke akhir dari setiap sexp dan tekan C-xC-euntuk mengeksekusi hanya sexp itu. Biasanya tidak perlu memuat ulang seluruh file jika Anda hanya mengubah satu atau dua baris.

Bryan Oakley
sumber
22
Perlu diingat bahwa ini mungkin tidak selalu melakukan apa yang Anda pikirkan. Jika Anda memiliki variabel yang isinya ditolak (yaitu mengatur boolean untuk itu berlawanan) maka perilaku tidak akan sama dengan memuat file.
chollida
4
Setiap efek samping secara umum cenderung merusak perilaku yang diinginkan: memuat file, dll.
vemv
Ketika saya melakukan ini, saya mendapatkan pesan: load-with-code-conversion: Nilai simbol sebagai variabel tidak valid: n
Chris Marie
2
Alih-alih memindahkan titik di belakang defunatau defvar, Anda juga dapat meninggalkannya di dalam badan dan tipe deklarasi C-M-x. Sangat berguna.
Thomas
151

Sangat aneh bahwa sangat nyaman

M-x eval-buffer

tidak disebutkan di sini.

Segera mengevaluasi semua kode dalam buffer, ini metode tercepat, jika .emacsidempotent Anda.

Peter
sumber
3
Siapa bilang itu .emacs(atau harus) idempoten?
mike
@ Mike: bukan aku. "Diberikan, b benar" dimaksudkan untukku, "jika a, b benar", tapi aku bisa mengerti maksudmu. Saya mengubah diberikan jika untuk lebih jelas.
Peter
7
@ Mike: Kapan masuk akal untuk .emacstidak menjadi idempoten?
Zaz
Saya akan berpikir ini menjadi saran pertama.
Stryker
1
Saya tidak akan mengatakan itu gaya yang baik tetapi itu mungkin terjadi. Misalnya Anda dapat memilih untuk tidak mendefinisikan kembali suatu fungsi jika sudah ditentukan (dari startup pertama). Anda mungkin tidak melihat perubahan dalam definisi ketika mengevaluasi file init Anda.
Kaligule
43

Anda biasanya hanya dapat mengevaluasi kembali wilayah yang diubah. Tandai wilayah ~ / .emacs yang telah Anda ubah, lalu gunakan M-x eval-region RET. Ini sering lebih aman daripada mengevaluasi ulang seluruh file karena mudah untuk menulis file .emacs yang tidak berfungsi dengan benar setelah dimuat dua kali.

Dale Hagglund
sumber
2
Menarik. Saya belum mempertimbangkan ide file .emacs yang tidak idempoten. Sesuatu yang harus diperhatikan ketika saya mulai dengan ELisp
Erik
2
Saya kira itu jarang untuk menemukan file Emacs yang adalah idempoten, setidaknya dalam arti yang kuat dari dua eksekusi menghasilkan persis keadaan yang sama sebagai salah satu eksekusi. Paling tidak, sangat umum untuk menambahkan ke berbagai daftar, seringkali dengan cara yang tidak akan menekan entri duplikat ketika dieksekusi untuk kedua kalinya.
Dale Hagglund
1
Satu pemikiran lain: menggunakan pendekatan yang saya sarankan di atas, mungkin emacs state yang Anda miliki bukanlah apa yang sebenarnya dilakukan oleh .emacs Anda. Yaitu, karena Anda belum menjalankan seluruh file .emacs dari yang bersih, Anda tidak benar - benar tahu itu melakukan apa yang Anda inginkan.
Dale Hagglund
1
Yang sedang berkata, bukankah mungkin untuk menulis .emac dengan cara idempoten? Negara global itu menjijikkan.
Ehtesh Choudhury
39

Jika file .emacs Anda terbuka di buffer yang sedang aktif:

Mx eval-buffer
Dominic Rodger
sumber
12
Satu hal yang perlu diperhatikan di sini adalah melakukan hal ini mungkin tidak membuat Anda dalam keadaan yang identik dengan pendekatan restart. (Contoh buatan: jika Anda memiliki pengaruh "toggle" di .emacs Anda).
luapyad
28
M-x load-file
~/.emacs
digitaldreamer
sumber
1
Melakukan hal ini, saya mengetahui bahwa pada instalasi Windows 7, folder .emacs.d terletak di folder% appdata%, bukan folder home pengguna.
Bassdrop Cumberwubwubwub
14

Yang berikut harus melakukannya ...

M-x load-file
Kecepatan
sumber
13

larutan

M-: (load user-init-file)


catatan

  • Anda mengetikkan Eval:prompt (termasuk tanda kurung)
  • user-init-fileadalah variabel yang menyimpan ~/.emacsnilai (menunjuk ke jalur file konfigurasi) secara default
  • (load)lebih pendek, lebih tua, dan versi non-interaktif (load-file); ini bukan perintah emacs (untuk diketik M-x) tetapi fungsi elisp belaka

kesimpulan

M-: > M-x


sumber
itu M-:> Ctrl Alt x? berdasarkan logika Anda, saya membayangkan M-: <CMx ketika hanya satu baris dalam file init yang diubah? Mungkin itu hanya ==
Robert Houghton
12

Orang lain sudah menjawab pertanyaan Anda sebagaimana dinyatakan, tetapi saya menemukan bahwa saya biasanya ingin mengeksekusi baris yang baru saja saya tulis. untuk itu, CtrlAltxdi lisp berfungsi dengan baik.

Bahbar
sumber
3
Lihat juga eval-lastsexp, diC-x C-e
Derek Slager
Dengan C-M-x, Anda tidak harus "di ujung pantat" - apakah Anda berpikir C-x C-emungkin? Yang menyenangkan C-M-xadalah bahwa Anda dapat menjalankannya bahkan ketika titik di tengah deklarasi fungsi / variabel.
Thomas
Saya mungkin punya kebiasaan pergi ke ujung lumpuh pada saat saya hanya menggunakan Cx Ce. Terima kasih atas tangkapannya!
Bahbar
9

Saya sarankan Anda tidak melakukan ini, pada awalnya. Sebagai gantinya, mulailah sesi emacs baru dan uji perubahan apa pun yang Anda buat untuk melihat apakah mereka berfungsi dengan benar. Alasan untuk melakukannya dengan cara ini adalah untuk menghindari meninggalkan Anda dalam keadaan di mana Anda memiliki file .emacs yang tidak dapat dioperasikan, yang gagal memuat atau gagal memuat dengan bersih. Jika Anda melakukan semua pengeditan dalam sesi asli, dan semua pengujian dalam sesi baru, Anda akan selalu memiliki sesuatu yang dapat diandalkan untuk mengomentari kode yang menyinggung.

Ketika Anda akhirnya puas dengan perubahan Anda, maka silakan dan gunakan salah satu jawaban lain untuk memuat ulang. Preferensi pribadi saya adalah evalhanya bagian yang Anda tambahkan / ubah, dan untuk itu cukup sorot wilayah kode / panggilan yang ditambahkan / diubah M-x eval-region. Melakukan hal itu meminimalkan kode yang dievaluasi, meminimalkan efek samping yang tidak disengaja, seperti yang ditunjukkan luapyad.

Joe Casadonte
sumber
9

Pintasan keyboard:

(defun reload-init-file ()
  (interactive)
  (load-file user-init-file))

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file
Matt Kneiser
sumber
cemerlang! Ini sangat bagus!
PinkCollins
7
C-x C-e ;; current line
M-x eval-region ;; region
M-x eval-buffer ;; whole buffer
M-x load-file ~/.emacs.d/init.el
WisdomFusion
sumber
4

Saya saat ini di Ubuntu 15,04; Saya suka mendefinisikan kunci untuk ini.
[M-insert] diterjemahkan menjadi alt-insert pada keyboard saya.
Masukkan ini ke dalam file .emacs Anda:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))
AAAfarmclub
sumber
3

Tentukan dalam file init Anda dan panggil dengan Mx reload-user-init-file

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))
jacekmigacz
sumber
2

Meskipun M-x eval-bufferakan berhasil, Anda mungkin akan mengalami masalah dengan matikan dan hal serupa lainnya. Pendekatan yang lebih baik mungkin untuk "menandai" atau menyorot apa yang baru di .emacs Anda (atau bahkan buffer awal jika Anda hanya bermain-main) dan kemudian M-x eval-region. Semoga ini membantu.

pengguna1026139
sumber
2

Berikut adalah cara cepat dan mudah untuk menguji konfigurasi Anda dengan cepat. Anda juga dapat menggunakan C-x C-edi akhir lisp tertentu untuk menjalankan fungsi tertentu secara individual.

Cx Ce menjalankan perintah eval-last-sexp (ditemukan di global-map), yang merupakan fungsi Lisp interaktif yang dikompilasi.

Itu terikat ke Cx Ce.

(eval-last-sexp EVAL-LAST-SEXP-ARG-INTERNAL)

Mengevaluasi sexp sebelum poin; nilai cetak di area gema. Secara interaktif, dengan argumen awalan, cetak output ke buffer saat ini.

Biasanya, fungsi ini memotong output panjang sesuai dengan nilai variabel 'eval-expression-print-length' dan 'eval-expression-print-level'. Namun, dengan argumen awalan nol, tidak ada pemotongan seperti itu. Argumen awalan seperti itu juga menyebabkan bilangan bulat dicetak dalam beberapa format tambahan (oktal, heksadesimal, dan karakter).

Jika 'eval-expression-debug-on-error' adalah non-nil, yang merupakan default, perintah ini mengatur semua kesalahan untuk masuk ke debugger.

Lorem Ipsum Dolor
sumber
2

Di samping perintah seperti Mx eval-buffer atau Mx load-file, Anda dapat memulai kembali emacs baru dari baris perintah:

emacs -q --load "init.el"

Contoh penggunaan stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Picaud Vincent
sumber
Pertanyaannya bertanya bagaimana melakukan ini tanpa me-restart Emacs. Meluncurkan salinan baru, sambil secara teknis menjawab pertanyaan, tampaknya tidak sesuai dengan semangat pertanyaan. 😄
chwarr
0

Anda dapat mengatur pengikatan kunci untuk emacs seperti ini

;; reload emacs configuration
(defun reload-init-file ()
  (interactive)
  (load-file "~/.emacs"))

(global-set-key (kbd "C-c r") 'reload-init-file) 

Semoga ini bisa membantu!

Vinh Trieu
sumber
-2

Jika shell Anda dibuka di dalam Emacs, Anda juga dapat melakukan:

. ~/.emacs

Dapat menyimpan beberapa goresan kunci.

benjaminz
sumber