Ưu điểm của việc đặt biến với setq thay vì custom.el?


69

Tôi thấy rất nhiều người (tác giả mở rộng và những người khác) đưa ra các ví dụ cấu hình với setq:

(setq foo 'bar)

Các tham số này thường được xác định với defcustom, làm cho chúng có sẵn để tùy chỉnh thông qua custom.el.

Tôi thường sử dụng custom.elđể thiết lập chúng. Sẽ có bất kỳ lợi thế để sử dụng setqthay thế hoặc là hai phương pháp gần như tương đương?

Câu trả lời:


86

Một số người có thể nghĩ rằng đó là đơn giản để sử dụng setq. Một số người có thể nghĩ rằng nó là lispy hơn. Trong thực tế, nó là ngây thơ trong trường hợp chung.

Đúng là đối với một số tùy chọn người dùng, điều đó không thành vấn đề. Nhưng đối với những người khác, nó có vấn đề, và setqlà cách tiếp cận sai cho những lựa chọn đó. Vì vậy, như một quy tắc chung, setqlà cách tiếp cận sai.

Nếu bạn sử dụng custom-set-variableshoặc customize-set-variablethay vì setqhoặc nếu bạn sử dụng Giao diện người dùng Tùy chỉnh (ví dụ M-x customize-option), thì bạn chắc chắn rằng mọi mã khởi tạo hoặc cập nhật dự định cần thiết cho giá trị tùy chọn sẽ được tự động kích hoạt và chạy khi cần. Nếu bạn sử dụng setq, điều này sẽ không được thực hiện.

Bây giờ, nó cũng là trường hợp mà hầu hết các tùy chọn của người dùng, đặc biệt là nhiều trong số họ bằng văn bản cho các thư viện của bên thứ 3, không tận dụng các defcustomtừ khóa :set:initialize, và sử dụng setqkhông quan trọng đối với họ. Nhưng rất nhiều tùy chọn Emilla vanilla sử dụng các từ khóa như vậy, và đối với những từ đó, setqkhông phải là điều đúng đắn. Vì vậy, nếu bạn muốn sử dụng mã Lisp chứ không phải UI tùy chỉnh để đặt các tùy chọn của mình, thì tốt hơn hết bạn nên sử dụng custom-set-variableshoặc customize-set-variablethay vì setq. Nó không bao giờ đau và đôi khi nó giúp (rất nhiều).

Nhưng những gì tôi khuyên là nên làm cả hai điều này:

  • Sử dụng Tùy chỉnh giao diện người dùng thay vì viết mã Lisp cho việc này.

  • Xác định biếncustom-file , để Tùy chỉnh ghi các tùy chỉnh vào tệp đó chứ không phải vào tệp init của bạn ( ~/.emacs). IOW, giữ mã khởi tạo viết tay của bạn tách biệt với mã tự động được viết bởi Tùy chỉnh.


1
Câu trả lời này rất hay và tôi nghĩ thực sự hữu ích cho người mới bắt đầu, có cách nào để quảng bá loại câu hỏi / câu trả lời này không?
Willyfrog

5
Tôi nghĩ rằng đáng để đề cập rằng ngay cả với các tham số: set và: khởi tạo, setq vẫn hoạt động nếu nó được đọc trước khi gói được tải.
Malabarba

2
@Willyfrog Bạn có thể nâng cấp nó!
Zane Shelby

17
không chắc chắn về điều đó Drew. Toàn bộ điều tùy chỉnh là khá phức tạp. Không có nó, hệ thống emacs đơn giản hơn nhiều. Tùy chỉnh là một lớp không chính xác lưới tốt với elisp. Đối với một điều, nó đặt hàng tất cả các vars bằng bảng chữ cái. Ngoài ra, nhiều tùy chỉnh không phải là về các biến (ví dụ: móc, khóa) vì vậy không thể sử dụng tùy chỉnh. Vì vậy, bạn có một tình huống của mã elisp thủ công nào.
Xah Lee

4
@XahLee. Vâng, tôi chắc chắn. ;-) Nhưng vâng, Tùy chỉnh là như vậy. Nó không phải là thứ tốt nhất cho khóa, móc, từ khóa khóa phông chữ, bảng hiển thị, v.v. Nhưng đối với những gì nó làm (tùy chọn & khuôn mặt), nó hoạt động khá tốt. Không phải là UI là tuyệt vời, nhưng việc xử lý các kích hoạt, kiểm tra loại, vv là hữu ích. Tôi thậm chí muốn các lập trình viên có thể (tùy chọn) sử dụng những thứ như :typevới defvar- Tôi không nghĩ rằng nó nên được giới hạn trong các tùy chọn người dùng. Thật không may, nhiều lập trình viên lười sử dụng :typevà kết quả không hữu ích lắm (đó không phải là lỗi của Tùy chỉnh).
vẽ

37

Tôi thích setqhơn customizevì nhiều lý do:

  1. Đầu tiên và quan trọng nhất, nó cho phép các biến được đặt theo chương trình (như trong, (setq foo (calculate-foo))). Tôi sử dụng năng lượng này mọi lúc trong cấu hình của mình để giữ mọi thứ KHÔ. Đối với tôi, toàn bộ quan điểm của việc sử dụng Emacs là khả năng lập trình và customizegiao diện không làm gì khác ngoài việc cản trở.
  2. setqcho vay tốt hơn để kiểm soát phiên bản và tổ chức mã. Tôi chia phần khởi tạo của tôi giữa hàng tá tệp; nếu mọi thứ nằm trong một custom.eltệp lớn , việc tìm và chỉnh sửa cài đặt sẽ khó hơn nhiều.
  3. Điều này là chủ quan, nhưng với tôi toàn bộ customizegiao diện cảm thấy như một di tích khủng khiếp từ các UI tồi tệ nhất của thập niên 90. Tôi muốn chỉnh sửa văn bản với sức mạnh của Emacs bất cứ ngày nào.

@Drew làm cho một số điểm tốt về một số tinh tế với :set:initialize. Tôi đã sử dụng Emacs trong nhiều năm và hiếm khi gặp phải vấn đề như vậy. Khi tôi làm, thật dễ dàng để trao đổi ra setqcho custom-set-variablecác trường hợp cụ thể.


10
1. Bạn có thể đặt các biến tùy chỉnh theo chương trình customize-set-variable(s)và tốt hơn vì các trình kích hoạt chúng tự động chạy. 2. Bạn có thể sử dụng các lệnh tùy chỉnh khác nhau để xem tất cả các biến được đặt và / hoặc các biến đã lưu trong các cấu trúc phân cấp khác nhau, do đó bạn có thể tự động tổ chức các nhóm khác nhau mà không phải sử dụng các tệp riêng biệt trong kiểm soát phiên bản. 3. Nó đã tốt hơn rất nhiều. Nếu bạn không thích UI, bạn vẫn có thể sử dụng tùy chỉnh theo chương trình và thông qua các lệnh tương tác tránh chế độ tùy chỉnh để đạt được tất cả các lợi ích khác của việc sử dụng tùy chỉnh.
Nick McCurdy

23

Một lợi thế của việc sử dụng setqthay vì customizelà khả năng đọc. Một người được tự do chú thích từng tùy chỉnh theo ý thích mà IMO cải thiện khả năng đọc. Người ta cũng có thể nhóm các tùy chỉnh liên quan với nhau để cải thiện tính mô đun. Cuối cùng, tôi sẽ lập luận rằng việc điều hướng qua một bộ đệm elisp "dễ dàng" hơn sau đó điều hướng UI và các widget tùy chỉnh.

Mặt khác, tùy chỉnh cho phép bạn dễ dàng trở lại các giá trị mặc định có thể là vô giá khi mọi thứ trở nên rắc rối.

EDIT: Câu trả lời của Drew cung cấp một lý do tuyệt vời để sử dụng customize-set-variablescó thể cung cấp tất cả những lợi thế tôi đã chỉ ra. Tuy nhiên, UI UI không cho vay cấu hình di động giữa các nền tảng khác nhau dễ dàng như elisp thô. Nếu bạn yêu cầu một biến để có cài đặt phụ thuộc os, bạn sẽ phải chuyển sang elisp trong nhiều trường hợp. Quan điểm của tôi về điều hướng dễ dàng hơn trong bộ đệm elisp vẫn đứng.


Bạn cũng có thể trở lại giá trị mặc định với setq, chỉ cần nhận xét setqdòng và khởi động lại emacs.
T. Verron

3
Có, nhưng tùy chỉnh có thể trở lại mà không cần khởi động lại pesky. Rất hữu ích để thử các cài đặt mới.
Vamsi

2
Về chú thích, giao diện tùy chỉnh cho phép bạn thêm nhận xét cho từng biến bạn thay đổi.
Andrew Swann

custom-set-variables "elisp raw" và tôi sử dụng nó mỗi ngày trên nhiều máy. Chỉ cần sao chép nó ra khỏi nơi tùy chỉnh ghi nó (nếu bạn không tự viết nó).
Croad Lang Sơn

Giao diện <kbd> Mx tùy chỉnh - * </ kbd> có trường "nhận xét" cho phép lưu trữ nhận xét cùng với một biến.
kdb

-1

Một lựa chọn khác là sử dụng John Wiegley của sử dụng gói . Điều này cung cấp một cách lập trình để cấu hình các gói chơi độc đáo với quá trình khởi tạo gói 24+ của emacs. Đây là một ví dụ về việc sử dụng từ readme:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Vấn đề là gói sử dụng là một macro và không đánh giá các đối số của nó ngay lập tức. Các tham số :init:configđược đánh giá ở các giai đoạn khác nhau của quá trình khởi tạo, cho phép cấu hình của từng gói ở một nơi, nhưng có từng phần được thực thi ở giai đoạn khởi tạo thích hợp.

Không có cái gì đó giống như use-packagemột số gói yêu cầu một phần mã khởi tạo của chúng đi trước (package-initialize)và một phần khác để đi sau. Nếu bạn có nhiều packegas như vậy thì việc khởi tạo sẽ phải được xen kẽ.

Một lợi ích khác use-packagelà nó có thể tự động cài đặt các gói bị thiếu từ việc sử dụng gói.el nếu bạn đưa bạn .emacs sang máy mới hoặc nếu bạn chia sẻ cấu hình của mình với người dùng khác và tất cả việc khởi tạo có thể được hoãn lại cho đến khi gói thực sự cần được tải.

Ngoài ra còn có các đối số từ khóa bổ sung cho phép kiểm soát nhiều hơn quá trình khởi tạo.

Tất cả những gì đã nói, một lợi thế lớn của tùy chỉnh là nó cho bạn thấy những gì cần phải được cấu hình trong bất kỳ gói nào. Đó là một lý do tôi vẫn sử dụng nó cho nhiều gói của mình.


2
Điều đó không thực sự trả lời câu hỏi. Trong câu trả lời của bạn, bạn sử dụng setq mà không giải thích lý do tại sao.
J David Smith

3
Tôi nghĩ rằng use-packagebản thân nó cung cấp các lợi thế của cấu hình đã được mô đun hóa, và cũng có thể nhập và định cấu hình các gói ở một nơi. Nhưng có, ví dụ sử dụng setq. Nó cũng có thể được sử dụng customize-set-variableở đây? Tôi không chắc. Chúng ta có thể / nên trao đổi nó (hoặc customize-set-value) cho setq?
mike

4
Vui lòng thay đổi ví dụ để làm cho nó sử dụng :customtừ khóa.
Toon Claes
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.