TL; DR : Với việc find-file-noselect
bạn không kiểm soát được những gì thực sự xảy ra và bạn có thể kết thúc với các chế độ nhỏ tùy ý bật trong bộ đệm, tùy thuộc vào những gì người dùng kích hoạt trong chúng init.el
. Ngoài ra, dọn dẹp là khó khăn.
Sử dụng with-temp-buffer
và insert-file-contents
thay vào đó. Nếu bạn cần các chế độ chính hoặc phụ cụ thể trong bộ đệm, hãy bật chúng một cách rõ ràng . Để ghi tập tin, hãy sử dụng with-temp-file
thay vào đó, mà mặc dù tên của nó cho phép bạn ghi vào các tập tin tùy ý.
Phản ứng phụ
find-file-noselect
có rất nhiều tác dụng phụ, bao gồm
- đặt câu hỏi tương tác (một mình là không nên sử dụng không tương tác),
- tự động kích hoạt chế độ xem cho các tệp chỉ đọc,
- vào chế độ bình thường,
- và chạy
find-file-hook
.
Chế độ bình thường
- tự động chọn một chế độ chính phù hợp cho bộ đệm hiện tại,
- chạy tất cả các móc chế độ chính và phụ tương ứng,
- và đọc tất cả các biến cục bộ cho bộ đệm hiện tại, tức là biến tệp và biến thư mục, một lần nữa có thể đặt câu hỏi tương tác về các biến cục bộ không an toàn.
Vì tất cả các hook đều được chạy, bạn có được tất cả các chế độ nhỏ và các chức năng hook mà người dùng kích hoạt init.el
, chúng có thể gây ra mọi thứ, từ những bất tiện nhỏ (nếu các chế độ nhỏ không mong muốn được bật) cho đến sự tàn phá lớn (nếu người dùng đã thêm chức năng hook dự kiến được gọi từ một bối cảnh tương tác).
Xem https://github.com/flycheck/flycheck/issues/366 để biết ví dụ. Việc sử dụng find-file-noselect
gây ra một tệp dữ liệu được kiểm tra cú pháp bởi Flycheck và vì nó đã xảy ra khi tắt Emacs, không có thời gian để dọn dẹp lại một cách chính xác, để lại một tệp tạm thời.
Dọn dẹp
Với find-file-noselect
bạn cần phải hết sức cẩn thận để giết bộ đệm một lần nữa. find-file-noselect
không làm điều đó cho bạn.
Bạn cần nhớ bộ đệm ở một nơi nào đó và cẩn thận sử dụng unwind-protect
để đảm bảo rằng bộ đệm bị giết ngay cả trong trường hợp không có lối thoát cục bộ.
Lựa chọn thay thế
Để đọc tệp, sử dụng with-temp-buffer
và insert-file-contents
, chỉ thực hiện những điều cơ bản nhất, ví dụ: chuyển đổi hệ thống mã hóa, nhưng không đặt câu hỏi, bật móc nối hoặc thiết lập các biến cục bộ:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
chăm sóc để tiêu diệt đúng cách bộ đệm tạm thời ở phần cuối của cơ thể.
Để ghi tệp, sử dụng with-temp-file
, tạo một bộ đệm tạm thời và ghi nội dung vào tên tệp đã cho ở cuối phần thân của nó:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
thẻ trước đó; nó là một ý tưởng tốt để sử dụng nó?