Có gì sai với `find-file-noselect`?


11

Trong một câu trả lời gần đây của lunaryorn , ông tuyên bố:

Tuy nhiên, tôi khuyên bạn nên chống lại hầu hết các phần khác của Org, vì những lý do đã được nêu trong các nhận xét: Nó cũ, và đầy đủ các di sản và thực tiễn có hại (ví dụ: find-file-noselect để đọc các tệp không tương tác).

Bất cứ ai có thể giải thích tại sao find-file-noselectmột ý tưởng tồi để đọc các tập tin trong các chương trình Elisp? Có cách nào tốt hơn? Tôi đang hỏi bởi vì tôi đã nghĩ đến việc sử dụng nó trong một trong những dự án của tôi.


Dường như, không có good-practicesthẻ trước đó; nó là một ý tưởng tốt để sử dụng nó?
mbork

Tôi nghĩ rằng nó good-practicessẽ thuộc danh mục "thẻ meta", được SE nhíu mày .
nispio

1
@nispio Tôi nghĩ đó là một thẻ hợp lệ, nhưng tất nhiên chúng ta có thể đưa nó vào meta.
Malabarba

1
@nsipio: Tôi đã đọc lướt qua bài viết đó và tôi không đồng ý. Nhưng không phải tôi là người quyết định. ;-)
mbork

Câu trả lời:


14

TL; DR : Với việc find-file-noselectbạ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-bufferinsert-file-contentsthay 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-filethay 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-noselectrấ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-noselectgâ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-noselectbạ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-noselectkhô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-bufferinsert-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)))

10

Từ phần 24.3 trong hướng dẫn Elisp:

Để sao chép nội dung của tệp vào bộ đệm, hãy sử dụng hàm insert-file-contents. (Không sử dụng lệnh insert-filetrong chương trình Lisp, vì nó đặt dấu.)

Tìm kiếm tài liệu Elisp cho find-file-noselectnó rõ ràng là nó không chỉ đơn thuần là đọc một tệp vào bộ đệm. Có lẽ những người nghĩ rằng sử dụng chức năng này là một ý tưởng tồi đang nghĩ về các tác dụng phụ, có thể không mong muốn? Tôi đoán nó phụ thuộc vào những gì bạn muốn đạt được. Nếu bạn muốn có nội dung bộ đệm sạch / không bị ảnh hưởng càng tốt, có thể nên sử dụng kết hợp with-temp-buffer+ cũ và đáng tin cậy insert-file-contents. Nếu bạn muốn các nội dung đệm là càng gần với những gì find-filetạo ra, có lẽ bạn làm muốn sử dụng find-file-noselect? Hoặc có lẽ anh ấy đã suy nghĩ về find-file;)


3
Nếu một cái gì đó đang được thực hiện không tương tác, tôi không thể thấy bất kỳ kịch bản nào trong đó bạn muốn "nội dung bộ đệm gần với những gì tập tin tìm kiếm sẽ tạo ra" . find-file chậm vì nó làm rất nhiều thứ không cần thiết, bao gồm tất cả các loại hook. "Tính năng" duy nhất của tệp tìm kiếm mà bạn có thể muốn là chế độ chính, nhưng sau đó bạn chỉ nên tự kích hoạt nó (thậm chí bạn không thể đảm bảo tệp tìm kiếm sẽ bật chế độ mà bạn muốn).
Malabarba

Malabarba: Nếu bạn dự định bộ đệm vẫn có sẵn để người dùng chỉnh sửa, thì bạn rất có thể muốn bắt chước find-filequy trình.
phils
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.