Làm thế nào để Emacs quản lý để bắt đầu ngay lập tức với nhiều tệp el?


11

Như mọi Emacs'er sẽ biết, tôi hiện đang bị cấu hình dot-Emacs mở rộng của mình. Tất cả các gói của tôi đều nằm trong các thùng chứa use-packagevà tôi đã tổng hợp tất cả các tệp của tôi .el. Ngay cả với điều đó, Emacs bắt đầu trong 6,4 giây và sau đó tải phần còn lại của gói (khoảng 40 trong số chúng) sau đó.

Tôi đã suy nghĩ về một cách khác để giải quyết thời gian khởi động dài, sau đó tôi nhận thấy một cái gì đó. Các Emacs mặc định (không có cấu hình người dùng) sử dụng nhiều .elthư viện, được bao gồm trong mỗi Emacs. Họ đang ở \shares\emacs\version number\lisp\.

Ngay cả với nhiều tập tin lisp, nó vẫn quản lý để bắt đầu trong một giây. Khi tôi đang kiểm tra các tập tin của nhiều gói được bao gồm với các Emacs mặc định, tôi không tìm thấy gì khác có thể giải thích tại sao Emacs quản lý để bắt đầu trong vòng một giây. Bất cứ ai có thể cho tôi biết làm thế nào Emacs quản lý điều đó, ngay cả với hàng ngàn tập tin .el?


1
Bạn có sử dụng :defer ttrong use-packagekhai báo của bạn bất cứ nơi nào có thể?
lunaryorn

7
Vô số thư viện lõi trong Emacs được tải sẵn trong tệp thực thi, thông qua cơ chế kết xuất được sử dụng khi xây dựng Emacs, điều này cũng tạo ra ảo tưởng về việc nó tải rất nhiều thứ cực kỳ nhanh chóng. Xem C-h i g (elisp) Building Emacsnếu bạn quan tâm đến việc tìm hiểu về điều đó.
phils

2
@phils: Sẽ thật tuyệt nếu bạn có thể mở rộng nhận xét của mình thành câu trả lời, có vẻ như cơ chế kết xuất chưa được đề cập trên Emacs-SE.
paprika

và của tôi là 76s ..
Leu_Grady

paprika: Xong ..
phils

Câu trả lời:


9

Ai đó có thể cho tôi biết Emacs quản lý điều đó như thế nào, thậm chí với hàng ngàn tệp .el không?

Emacs "quản lý" bằng cách không tải khi khởi động do đó không giữ được tải ứng dụng cốt lõi. Điều này lần lượt là hiệu ứng trả lại điều khiển bàn phím cho người dùng nhanh hơn.

Nhưng khi nào nó được tải? Lần đầu tiên sử dụng chức năng, chế độ hoặc tính năng đó.

Nó không chậm lại à? Vâng, lần đầu tiên sử dụng. Đó là sự đánh đổi. Bạn có muốn làm chậm thời gian khởi động emacs hoặc lần đầu tiên sử dụng.

Có đáng chú ý? Tải tại thời điểm khởi động dường như mất nhiều thời gian hơn vì các thư viện cốt lõi khác cũng được tải. Nhưng trong lần sử dụng đầu tiên, nó cảm thấy nhanh hơn khi chỉ có tính năng tập hợp con được tải.

Vậy thì tại sao mọi người sẽ chọn tải khi khởi động? Bởi vì một số người không ngại chờ đợi để tải tất cả các thư viện được sử dụng thường xuyên khi khởi động nên một khi đã tải tất cả các hoạt động sẽ thực hiện một cách nhanh chóng sau đó.

Làm thế nào tôi có thể chọn? Như Drew và những người khác đã chỉ ra trong câu trả lời của họ cho chính câu hỏi này, bạn có thể sử dụng tự động tải và các thủ thuật tương tự để kiểm soát. Nhưng cân nhắc quan trọng nhất phải là mô hình sử dụng của bạn. Nếu bạn tình cờ sử dụng emacs như vi, liên tục mở và đóng, vâng thời gian khởi động trở nên rõ ràng. Nhưng mặt khác, nếu bạn sử dụng emacs chạy mọi lúc, thời gian khởi động 1 giây hoặc 1 phút sẽ không đáng chú ý hoặc đủ quan trọng để quan tâm.

Lưu ý bạn có thể sử dụng chế độ hàng loạt hoặc Zile để khởi động tức thì trong khi thử nghiệm, chạy hoặc sử dụng các emacs như vi.

Sở thích của tôi là tải khi khởi động để bất kỳ lỗi nào được bắt trước. Tôi không muốn phải đối phó với bất kỳ lỗi tải nào trong khi ở giữa ngày làm việc khi tôi có vô số bộ đệm, chế độ và trạng thái biên dịch hoạt động cùng với một số vị trí từ xa do TRAMP quản lý. Gỡ lỗi tự động tải trong các điều kiện như vậy là không dễ chịu.


10

Nhiều thư viện đi kèm không được tải khi bạn khởi động.

Một số lệnh, vv được tự động tải , có nghĩa là Emacs nhận ra chúng và biết cách tải chúng. Khi bạn cố gắng sử dụng một lệnh được tải tự động, Emacs sau đó tải thư viện xác định nó, nếu nó chưa được tải.

Bạn có thể tạo tự động tải, cho dù đó là lệnh hoặc lệnh của riêng bạn trong thư viện mà bạn không viết. Xem hướng dẫn Elisp, Autoload nút .


Được gọi là lười tải, tôi đoán? Có ví dụ nào về cách tải lười biếng đạt được không, nó sẽ chỉ được tải khi được gọi?
ReneFroger

Không chắc chắn những gì bạn đang yêu cầu. Vâng, bạn có thể gọi nó là lười tải. Có những ví dụ và giải thích trong hướng dẫn Elisp. Thêm cookie tự động tải ( ;;;###autoload) ngay trước khi định nghĩa lệnh trong thư viện của bạn là một cách cung cấp cho nó định nghĩa tự động tải, đảm bảo rằng thư viện của nó sẽ được tải khi ai đó gọi nó.
vẽ

... nhưng đọc liên kết thủ công đó để hiểu cách / nếu những cookie tự động tải đó được xử lý. Người quản lý gói xử lý chúng cho tất cả các gói ELPA. Nếu không, bạn sẽ gọi (autoload...)trực tiếp trong tập tin init của bạn để đăng ký chúng.
phils

Cảm ơn cho cả hai câu trả lời của bạn, nó đã giúp rất nhiều để tìm hiểu thêm về nó!
ReneFroger

9

Ngoài các câu trả lời khác (giải thích cách phần lớn các thư viện thực sự chỉ được tải theo yêu cầu), còn có vấn đề tải trước nhiều thư viện elisp cốt lõi trong emacschính tệp thực thi, nó cung cấp ảo tưởng về việc tải nó rất nhiều thứ cực kỳ nhanh chóng

Điều này đạt được bằng cách chạy một cái gọi là "trần" phiên bản của Emacs (đó là những gì đã thực sự biên soạn, và đó đầy đủ chức năng, nhưng chỉ chứa các thông dịch viên elisp và chức năng cốt lõi khác viết bằng C), và nói rằng để tải tất cả các thư viện elisp cần được tải sẵn, trước khi cuối cùng "bỏ" emacsnhị phân thực tế với các thư viện được tích hợp sẵn.

Cơ chế này được chi tiết trong hướng dẫn elisp:
C-hig (elisp) Building Emacs RET

Nếu bạn đã tự biên dịch Emacs thì bạn có thể thử nghiệm quy trình này và thậm chí có thể kết xuất các phiên bản thay thế của tệp thực thi cuối cùng nếu bạn muốn (thường không được đề xuất, nhưng cơ sở ở đó).

temacsNhị phân đã biên dịch có thể được tìm thấy trong srcthư mục và bạn có thể so sánh sự khác biệt về thời gian bắt đầu bằng cách chạy từng phiên bản như vậy:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

Trên hệ thống của tôi, cái trước mất ~ 4 giây (trong đó 111 thư viện elisp được tải), trong khi cái sau mất ~ 0,02 giây.


Rất đẹp @phils để làm cho điểm này.
Người dùng Emacs
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.