Làm cách nào để tôi biên dịch byte mọi thứ trong thư mục .emacs.d của tôi?


138

Tôi đã quyết định kiểm tra Emacs, và tôi rất thích nó. Bây giờ, tôi đang sử dụng Bộ khởi động Emacs , loại cung cấp mặc định tốt hơn và một số tùy chỉnh đẹp cho cài đặt mặc định của Emacs.

Tôi đã tùy chỉnh nó một chút, thêm một số nội dung như yasnippet , chủ đề màu sắc , không ràng buộc và các nội dung khác. Tôi đã thiết lập một kho lưu trữ github nơi tôi giữ tất cả các tùy chỉnh để tôi có thể truy cập chúng từ nhiều nơi hoặc trong trường hợp có điều gì đó xấu và tôi mất thư mục .emacs.d của mình.

Tất cả điều này là rất tốt, nhưng có một vấn đề: Emacs mất khoảng 1-2 giây để tải. AFAIK Tôi có thể biên dịch các tệp .el riêng lẻ với tệp biên dịch byte Mx thành .elc và nó hoạt động. Nhưng có rất nhiều tệp .el và tôi tự hỏi liệu có cách nào để biên dịch tất cả chúng bằng một lệnh đơn giản hoặc một cái gì đó, để tăng tốc độ tải Emacs. Emacs của tôi không phải lúc nào cũng mở và tôi mở và đóng nó khá thường xuyên, đặc biệt là sau khi tôi đã thiết lập nó làm trình chỉnh sửa mặc định cho lệnh chỉnh sửa trong Total Commander để làm quen với nó nhanh hơn (yeah, windows xp here).

Phiên bản Emacs của tôi là 22.3. Và có, cài đặt Emacs mặc định mà không có bất kỳ tùy chỉnh nào sẽ kích hoạt ngay lập tức.

Tôi không chắc chắn phiên bản nào được ưa thích khi tải, .el hoặc biên dịch .elc một phiên bản bằng cách Oo

Vì vậy, có một lệnh elisp hoặc chuyển đổi dòng lệnh Emacs để làm cho Emacs biên dịch byte mọi thứ trong thư mục .emacs.d không?

Câu trả lời:


208

C-u 0 M-x byte-recompile-directory

sẽ biên dịch tất cả các tệp .el trong thư mục và trong tất cả các thư mục con bên dưới.

Một C-u 0phần là làm cho nó không hỏi về mọi tệp .el không có bản sao .elc.


9
Và sau đó (một khi mỗi cái đã được biên dịch một lần), chỉ cần sử dụng cùng một lệnh mà không có C-u 0(aka C-0, BTW). Điều đó sẽ chỉ biên dịch byte những tệp nguồn gần đây hơn các phiên bản được biên dịch byte của chúng.
vẽ

1
Một lưu ý nhỏ: đối với tôi đã không hoạt động cho đến khi tôi xóa tất cả các tệp theo «.elc». Nó chỉ nói một cái gì đó như «Xong, 0 tệp đã được chỉnh sửa, các tệp α bị bỏ qua».
Hi-Angel

1
@ Hi-Angel Tôi có cùng một vấn đề. Bạn đã tìm thấy giải pháp nào chưa?
zhanxw

@zhanxw vâng. Thật không may, lệnh chỉ biên dịch các tệp đã thay đổi hoặc không có bản sao «.elc». Vì vậy, để biên dịch lại mọi thứ trong một thư mục trước tiên, bạn phải xóa tất cả các tệp «.elc».
Hi-Angel

2
Rất tiếc, lệnh tương tác không hiển thị nó, nhưng nếu bạn gọi hàm trực tiếp, bạn có thể sử dụng đối số tùy chọn FORCEđể biên dịch lại các tệp đã có ".elc" được liên kết ngay cả khi chúng không cũ hơn tệp nguồn:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm

44

Để tự động biên dịch byte mọi thứ cần biên dịch byte mỗi khi tôi bắt đầu emacs, tôi đặt phần sau đây sau khi thay đổi load-pathở đầu .emacstệp của mình :

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Đáng ngạc nhiên, nó không thêm nhiều vào thời gian khởi động của tôi (trừ khi cần phải biên soạn một cái gì đó).

Để tăng tốc độ emacs của tôi, trước tiên tôi xác định các phần chậm bằng cách sử dụng profile-dotemacs.el và sau đó thay thế chúng bằng tự động tải .


tài liệu tự động tải đã di chuyển. Điều đó và tham chiếu profile-dotemacs.el chính xác là những gì tôi cần khi tôi xem qua trang này.
Digicrat

24

Bạn có thể sử dụng --batchcờ để biên dịch lại từ dòng lệnh.

Để biên dịch lại tất cả, làm

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

hoặc biên dịch lại một tệp như từ Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'

5
sử dụng biên dịch byte-byte thay thế.
npostavs

1
Bạn có thể làm thế nào để sử dụng nó?
nacho4d

8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- mặc dù nó không lặp lại như thư mục byte-recompile-thư mục .
Brian Burns

3
Bạn có thể muốn thêm một đối số để buộc biên dịch lại, vd. emacs --batch --eval '(byte-recompile-thư mục "~ / .emacs.d" 0)'
Ibrahim

17

Điều này gây ảnh hưởng một chút từ câu hỏi, nhưng để giải quyết vấn đề tải chậm, bạn có thể sử dụng tính năng daemon mới trong Emacs 23.

"Nếu bạn có nhiều gói hỗ trợ, khởi động emacs có thể hơi chậm. Tuy nhiên, emacs 23 mang emacs --daemon, cho phép bạn bắt đầu emacs trong nền (ví dụ: khi bạn đăng nhập). tất cả các cửa sổ emacs mới (khung hình) với emacsclient. Tất nhiên, bạn đã có thể có một 'máy chủ' emacs trong các phiên bản cũ hơn, nhưng việc có thể khởi động nó trong nền làm cho nó trở thành một giải pháp đẹp hơn nhiều "

Từ http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-gần.html


Tôi chắc chắn sẽ kiểm tra cái này Cảm ơn bạn!
Mikka

2
Nếu bạn thêm bí danh emacs = 'emacsclient -nw -a "" -c' vào bạn.
Frederick

2

Đối với tôi sử dụng spacemacs, lệnh là spacemacs/recompile-elpa. Lệnh byte-recompile-directorykhông biên dịch bất kỳ tập tin.


2
Những thứ khác. Các công cụ ELPA / MELPA đã xác định các phương thức xây dựng trong hệ thống phân cấp lưu trữ của riêng nó. byte-recompile-thư mục cố gắng biên dịch tất cả các tệp .el trong một thư mục do người dùng định nghĩa.
RichieHH
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.