Làm cách nào tôi có thể tải lại .emacs sau khi thay đổi?


375

Làm cách nào tôi có thể tải Emacs để tải lại tất cả các định nghĩa mà tôi đã cập nhật .emacsmà không cần khởi động lại Emacs?


18
Tôi biết emacs thường được coi là HĐH, nhưng ... s / restart / restart /?
William Pursell

6
Tôi không phải là nhà phát triển, vì vậy rất nhiều câu trả lời có ý nghĩa ngay lập tức với các nhà phát triển không có ý nghĩa nhiều đối với tôi
Yazz.com

4
@MJB mục đích của Stack Overflow là trở thành kho lưu trữ kiến ​​thức cho cả những câu hỏi cơ bản nhất. Câu hỏi này phù hợp hoàn hảo với mục đích của Stack Overflow. Vui lòng xem stackoverflow.com/faq
chollida


10
haha bây giờ năm năm sau, đề xuất "tìm kiếm Google đầu tiên" được đề xuất ở đây! tốt đẹp
JimLohse

Câu trả lời:


350

Bạn có thể sử dụng lệnh tải tệp ( M-x load-filesau đó nhấn return hai lần để chấp nhận tên tệp mặc định, đây là tệp hiện tại đang được chỉnh sửa).

Bạn cũng có thể di chuyển điểm đến cuối của bất kỳ sexp nào và nhấn C-xC-eđể thực hiện sexp đó. Thông thường, không cần thiết phải tải lại toàn bộ tệp nếu bạn chỉ thay đổi một hoặc hai dòng.


22
Hãy nhớ rằng điều này có thể không phải lúc nào cũng làm chính xác những gì bạn nghĩ nó làm. Nếu bạn có các biến có nội dung bị bỏ qua (nghĩa là đặt boolean ngược lại) thì hành vi sẽ không giống như tải tệp.
chollida

4
Bất kỳ tác dụng phụ nào nói chung đều có khả năng phá vỡ hành vi mong muốn: tải tệp, v.v.
vemv

Khi tôi làm điều này, tôi nhận được thông báo: load-with-code-convert: Giá trị của biểu tượng là biến là void: n
Chris Marie

2
Thay vì di chuyển điểm phía sau một defunhoặc defvar, bạn cũng có thể để nó bên trong phần khai báo và nhập C-M-x. Rất tiện dụng.
Thomas

151

Rất lạ mà rất tiện.

M-x eval-buffer

không được đề cập ở đây.

Nó ngay lập tức đánh giá tất cả các mã trong bộ đệm, đây là phương pháp nhanh nhất, nếu bạn .emacslà idempotent.


3
Ai nói rằng đó .emacslà (hoặc phải là) idempotent?
chước

@mike: không phải tôi. "Cho a, b là đúng" đối với tôi, "nếu a, b là đúng", nhưng tôi có thể thấy ý của bạn là gì. Tôi thay đổi được đưa ra nếu cho rõ ràng hơn.
Peter

7
@mike: Khi nào thì không có nghĩa .emacslà không bình thường?
Zaz

Tôi đã có thể nghĩ rằng đây là gợi ý đầu tiên.
Stryker

1
Tôi sẽ không nói đó là phong cách tốt nhưng nó có thể xảy ra. Ví dụ, bạn có thể chọn không xác định lại chức năng nếu nó đã được xác định (từ lần khởi động đầu tiên). Bạn có thể không thấy sự thay đổi trong định nghĩa của nó khi đánh giá tệp init của bạn.
Kaligule

43

Bạn thường chỉ có thể đánh giá lại khu vực đã thay đổi. Đánh dấu vùng ~ / .emacs mà bạn đã thay đổi và sau đó sử dụng M-x eval-region RET. Điều này thường an toàn hơn so với đánh giá lại toàn bộ tệp vì dễ dàng viết tệp .emacs không hoạt động hoàn toàn ngay sau khi được tải hai lần.


2
Hấp dẫn. Tôi đã không xem xét ý tưởng về tệp .emacs không phải là idempotent. Một cái gì đó để xem khi tôi bắt đầu với ELisp
Erik

2
Tôi đoán rằng rất hiếm khi tìm thấy một tệp .emacs idempotent, ít nhất là theo nghĩa mạnh mẽ của hai lần thực thi dẫn đến trạng thái giống hệt như một lần thực thi. Ít nhất, việc thêm vào các danh sách khác nhau, thường là theo cách không loại bỏ các mục trùng lặp khi thực hiện lần thứ hai.
Dale Hagglund

1
Một suy nghĩ khác: sử dụng cách tiếp cận tôi đề xuất ở trên, có thể trạng thái emacs bạn có không phải là những gì .emacs của bạn thực sự làm. Tức là, vì bạn đã không thực hiện toàn bộ tệp .emacs từ một bảng rõ ràng, nên bạn không thực sự biết nó làm những gì bạn muốn.
Dale Hagglund

1
Điều đó đang được nói, sẽ không thể viết .emacs một cách bình thường? Nhà nước toàn cầu là icky.
Ehtesh Choudhury

39

Nếu bạn đã mở tệp .emacs của mình trong bộ đệm hiện đang hoạt động:

Mx eval-đệm

12
Một điều cần lưu ý ở đây là làm điều này có thể không khiến bạn rơi vào trạng thái giống hệt với phương pháp khởi động lại. (Ví dụ có thể xảy ra: nếu bạn có ảnh hưởng "chuyển đổi" trong .emacs của bạn).
luaccoad

28
M-x load-file
~/.emacs

1
Làm điều này tôi đã học được rằng khi cài đặt Windows 7, thư mục .emacs.d được đặt trong thư mục% appdata% thay vì thư mục nhà của người dùng.
Bassdrop Cumberwubwubwub


13

giải pháp

M-: (load user-init-file)


ghi chú

  • bạn gõ nó Eval:nhanh chóng (bao gồm cả dấu ngoặc đơn)
  • user-init-filelà một biến giữ ~/.emacsgiá trị (trỏ đến đường dẫn tệp cấu hình) theo mặc định
  • (load)là phiên bản ngắn hơn, cũ hơn và không tương tác (load-file); nó không phải là một lệnh emacs (được gõ vào M-x) mà chỉ là một chức năng elisp

phần kết luận

M-: > M-x


là M-:> Ctrl Alt x? dựa trên logic của bạn, tôi tưởng tượng M-: <CMx khi chỉ một dòng trong tệp init được thay đổi? Có lẽ đó chỉ là ==
Robert Houghton

12

Những người khác đã trả lời câu hỏi của bạn như đã nêu, nhưng tôi thấy rằng tôi thường muốn thực hiện các dòng mà tôi vừa viết. cho rằng, CtrlAltxtrong lisp hoạt động tốt.


3
Xem thêm eval-lastsexp, tạiC-x C-e
Derek Slager 17/210

Với C-M-x, bạn không cần phải "ở cuối cùng" - bạn có nghĩ đến C-x C-ekhông? Điều thú vị C-M-xlà bạn có thể gọi nó ngay cả khi điểm nằm ở giữa một khai báo hàm / biến.
Thomas

Tôi có lẽ đã có thói quen đi đến hết thời gian tôi chỉ sử dụng Cx Ce. Cảm ơn đã bắt!
Bahbar

9

Tôi đề nghị rằng bạn không làm điều này, ban đầu. Thay vào đó, hãy bắt đầu một phiên emacs mới và kiểm tra bất kỳ thay đổi nào bạn đã thực hiện để xem chúng có hoạt động chính xác không. Lý do để làm theo cách này là để tránh để bạn ở trạng thái bạn có tệp .emacs không thể hoạt động, không tải được hoặc không tải sạch. Nếu bạn thực hiện tất cả các chỉnh sửa của mình trong phiên ban đầu và tất cả các thử nghiệm của bạn trong một phiên mới, bạn sẽ luôn có thứ gì đó đáng tin cậy để nhận xét mã vi phạm.

Khi bạn cuối cùng hài lòng với những thay đổi của mình, hãy tiếp tục và sử dụng một trong những câu trả lời khác để tải lại. Sở thích cá nhân của tôi là evalchỉ phần bạn đã thêm / thay đổi và để làm điều đó chỉ làm nổi bật vùng mã được thêm / thay đổi và cuộc gọi M-x eval-region. Làm như vậy sẽ giảm thiểu mã được đánh giá, giảm thiểu bất kỳ tác dụng phụ không chủ ý nào, như luaccoad chỉ ra.


9

Phim tăt:

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

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file

xuất sắc! Điều này là rất tốt!
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

4

Tôi hiện đang sử dụng Ubuntu 15.04; Tôi muốn xác định một chìa khóa cho việc này.
[M-insert] dịch sang chèn alt trên bàn phím của tôi.
Đặt cái này trong tệp .emacs của bạn:

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

3

Xác định nó trong tệp init của bạn và gọi bằng Mx reload-user-init-file

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

2

Mặc dù M-x eval-buffersẽ hoạt động nhưng bạn có thể gặp vấn đề với toggles và những thứ tương tự khác. Cách tiếp cận tốt hơn có thể là "đánh dấu" hoặc làm nổi bật những gì mới trong .emacs của bạn (hoặc thậm chí là bộ đệm đầu nếu bạn chỉ loay hoay) và sau đó M-x eval-region. Hi vọng điêu nay co ich.


2

Đây là một cách nhanh chóng và dễ dàng để kiểm tra nhanh cấu hình của bạn. Bạn cũng có thể sử dụng C-x C-eở cuối lisp cụ thể để thực hiện chức năng nhất định riêng lẻ.

Cx Ce chạy lệnh eval-last-sexp (được tìm thấy trong bản đồ toàn cầu), đây là một hàm Lisp được biên dịch tương tác.

Nó bị ràng buộc với Cx Ce.

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

Đánh giá sexp trước điểm; giá trị in trong khu vực tiếng vang. Tương tác, với đối số tiền tố, in đầu ra vào bộ đệm hiện tại.

Thông thường, hàm này cắt ngắn đầu ra dài theo giá trị của các biến 'eval-express-print-length' và 'eval-express-print-level'. Tuy nhiên, với một đối số tiền tố bằng 0, không có sự cắt bớt như vậy. Đối số tiền tố như vậy cũng khiến số nguyên được in ở một số định dạng bổ sung (bát phân, thập lục phân và ký tự).

Nếu 'eval-express-debug-on-error' không phải là con số không, đó là mặc định, lệnh này sắp xếp cho tất cả các lỗi để vào trình gỡ lỗi.


2

Bên cạnh các lệnh như Mx eval-buffer hoặc Mx load-file, bạn có thể khởi động lại một emacs mới từ dòng lệnh:

emacs -q --load "init.el"

Ví dụ sử dụng stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/


Câu hỏi hỏi làm thế nào để làm điều này mà không cần khởi động lại Emacs. Ra mắt một bản sao mới, trong khi trả lời kỹ thuật câu hỏi, dường như không phù hợp với tinh thần của câu hỏi. 😄
chwarr

0

Bạn có thể đặt ràng buộc khóa cho emacs như thế này

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

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

Hy vọng điều này sẽ giúp!


-2

Nếu bạn có một cái vỏ được mở bên trong Emacs, bạn cũng có thể làm:

. ~/.emacs

Có thể lưu một vài nét chính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.