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 Group
từ 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
:).
defcustom
là 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 và 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 defgroup
là 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 defgroup
tạo một nhóm mới trong giao diện Tùy chỉnh trong convenience
mụ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 :group
phần chỉ ra rằng nó thuộc về nhóm trước đó được xác định, và :type
chỉ 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 RET
và điều hướng đến Convenience > Checkbox
, tôi thấy như sau:
Đâ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-states
bê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.
customize
phươ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ưdefcustom
và tương tự.