Làm thế nào để sử dụng đúng cách defcustom?


16

Giống như hầu hết người dùng Emacs tôi đã tùy chỉnh một chế độ bằng cách thay đổi các biến. Điều không bao giờ xảy ra với tôi là toàn bộ tâm lý lập trình đằng sau việc có thể tùy chỉnh cái này và cái kia. Tôi nhận ra điều này khi tôi bắt đầu xem xét một số mã nguồn cho eshell. Tôi không phải là một lập trình viên elisp, nhưng em-ls.eldường như đặc biệt sử dụng defcustom, defgroupv.v ... Đây dường như là một thế giới bóng tối của các biến được định nghĩa toàn cầu mà mã elisp sử dụng. Vì vậy, một câu hỏi sẽ là, việc sử dụng defcustommột cách khác để làm các biến toàn cầu (có thể tùy chỉnh)?

Bất cứ ai có thể chỉ cho tôi sáng về cách sử dụng đúng (trước tiên hiểu) toàn bộ ý tưởng đằng sau defcustom, khi nào sử dụng, tại sao, khi nào không? Có lẽ một ví dụ mới bắt đầu cho một người mới bắt đầu elisp.


Bạn có thể làm rõ những gì bạn đang hỏi? Bạn có muốn biết khi nào nên sử dụng các customizephương tiện so với khi nào để tùy chỉnh bằng tay? Hay bạn quan tâm đến việc viết một chế độ? Điều thứ hai là tình huống mà bạn thực sự có thể thấy mình sử dụng những thứ như defcustomvà tương tự.
Dân

Câu trả lời:


20

Các hệ thống tùy biến là một built-in tính năng của Emacs được thiết kế để giải quyết chính xác vấn đề bạn mô tả-lập trình có thể không phải là cách lý tưởng cho người dùng trung bình để cấu hình biên tập của họ.

Điểm vào chính của chức năng tùy chỉnh là M-x customize RET(hoặc Options > Customize Emacs > Top-level Customization Grouptừ menu). Từ đó bạn sẽ thấy một hệ thống menu tương tác để điều chỉnh cài đặt. Giao diện này thực thi rằng tất cả các cài đặt thuộc loại chính xác (số, chuỗi, màu, v.v.), tránh một nguồn lỗi lớn gặp phải khi người dùng định cấu hình Emacs theo chương trình. Nếu người dùng chọn duy trì bất kỳ thay đổi nào họ thực hiện thông qua giao diện người dùng, cài đặt sẽ được lưu trữ vào một phần đặc biệt trong tệp khởi tạo của người dùng (đọc .emacs:).

defcustomlà trình bao bọc xung quanh chức năng Emacs Lisp cấp thấp hơn defvar, cả hai đều khai báo biến làm cho nó hiển thị trong giao diện tùy chỉnh. Nó cũng cho phép nhà phát triển cung cấp thêm siêu dữ liệu cần thiết để hiển thị một điều khiển tương tác thích hợp, tức là loại giá trị nào được lưu trữ trong biến này? Một chuỗi tùy ý? Một số? Một sự lựa chọn từ một tập hợp các tùy chọn cố định? vv defgrouplà một cấu trúc nhóm cho các tùy chọn tùy chỉnh này để chúng có thể được sắp xếp thành một hệ thống phân cấp đẹp.

Chức năng này nên được sử dụng bất cứ khi nào một phần dữ liệu nên được coi là một tùy chọn có thể định cấu hình cho người dùng thay vì một chi tiết bên trong của thư viện.

Đây là một ví dụ đơn giản được viết từ một thư viện nhỏ của tôi:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

Việc defgrouptạo một nhóm mới trong giao diện Tùy chỉnh trong conveniencemục cấp cao nhất. Sau đó tôi cần một biến để lưu trữ các trạng thái hộp kiểm có thể. Tôi có thể đã sử dụng defvar, nhưng vì tôi muốn điều này dễ dàng tùy chỉnh, tôi đã chọn sử dụng defcustom. Các :groupphần chỉ ra rằng nó thuộc về nhóm trước đó được xác định, và :typechỉ ra rằng nó là một chuỗi các chuỗi. Cũng có một giá trị mặc định và một mô tả. Ngoài ra còn có các phương tiện bổ sung (không được hiển thị ở đây) để chuyển đổi các giá trị được nhập bởi người dùng.

Nếu bây giờ tôi chạy M-x customize RETvà điều hướng đến Convenience > Checkbox, tôi thấy như sau:

giao diện tùy biến

Đây không phải là giao diện đẹp nhất trên thế giới, nhưng lưu ý rằng nó có các công cụ tương tác để tùy chỉnh giá trị của "Trạng thái hộp kiểm" ( checkbox-statesbên trong). Nó hiển thị các giá trị chuỗi hiện tại cùng với các nút INS(chèn) và DEL(xóa) và cho phép chúng tôi chỉnh sửa các giá trị chuỗi trong các hộp chỉnh sửa. Khi hoàn tất, chúng tôi có thể quyết định áp dụng các thay đổi của mình, hoàn nguyên hoặc áp dụng và lưu chúng cho các phiên trong tương lai.


2
Bài đăng tốt Ưu điểm đáng kể nhất để Tùy chỉnh (và defcustom) là nó tự động chăm sóc : (1) kiểm tra loại , để giúp ngăn bạn gán giá trị không chính xác cho một biến (với điều kiện người viết defcustomđã nỗ lực cung cấp loại hợp lý kiểm tra), (2) khởi tạo ( :initialize) và cập nhật ctions (được kích hoạt) ( :set).
vẽ

Cảm ơn! Tôi đã cập nhật bài viết để phản ánh đề xuất của bạn.
camdez

7

Là việc sử dụng defcustom một cách khác để làm các biến toàn cầu (có thể tùy chỉnh)?

Đúng. Đặc biệt nếu bạn muốn người dùng mã của bạn có thể thay đổi các biến dễ dàng thông qua giao diện tùy chỉnh Mx .

defcustom cung cấp hai lợi ích quan trọng cho người dùng của bạn: tài liệu và loại an toàn. Tài liệu là tốt đẹp để có ngay ở đó. Kiểu an toàn cho phép một người chỉ định loại giá trị hợp lệ nào mà biến của bạn có thể lấy.

Tất nhiên defvar vẫn ổn nếu tất cả những gì bạn đang làm là tùy chỉnh cho chính mình và không lường trước việc sử dụng rộng rãi hơn. Tuy nhiên, một số người sẽ nói rằng gắn bó với defcustom xuyên suốt là một thói quen tốt để khắc sâu.

Bất cứ ai có thể chỉ cho tôi sáng về cách sử dụng đúng cách ...

Các trang hướng dẫn cho defcustom có thêm làm rõ. Chủ đề tùy chỉnh trong hướng dẫn có chi tiết đầy đủ.

... Khi nào nên sử dụng, tại sao, khi nào không?

Cá nhân tôi thấy defcustom ít cồng kềnh hơn trong quá trình phát triển vì tôi không phải đối phó với các vấn đề tải lại với defvar và setq.

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.