Lớp phủ là gì?
Trước hết, chúng là những đối tượng cần thiết. Điều này sẽ có liên quan sau.
Như bạn đã nói, chúng đại diện cho các lớp áp dụng trên đầu các vùng của bộ đệm. Các lớp này có thuộc tính văn bản, giống như văn bản thực tế trong bộ đệm. Bất kỳ thuộc tính thông thường nào mà lớp phủ có, áp dụng cho văn bản bên dưới nó. Tuy nhiên, có một số thuộc tính đặc biệt đối với lớp phủ (chúng không làm gì nếu được áp dụng trên văn bản).
Tại sao chúng hữu ích?
Vì hai lý do tôi đã gợi ý ở trên:
Chúng là đồ vật
Điều này có nghĩa là bạn có thể lưu trữ chúng trong danh sách và xử lý chúng dễ dàng. Bạn có thể thay đổi thuộc tính của họ mà không cần phải theo dõi vị trí của họ ngay bây giờ. Thậm chí tốt hơn, bạn có thể sử dụng chúng để theo dõi nơi mọi thứ trong bộ đệm.
Câu trả lời này của Stefan là một ví dụ điển hình về lớp phủ được sử dụng để theo dõi các vùng đệm. Đây là một đoạn ngắn của nó.
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
Nó sử dụng các lớp phủ để ghi lại các khu vực sẽ được căn chỉnh và sử dụng regrec nào trên mỗi khu vực đó. my--auto-align-overlays
Là
một danh sách nơi các lớp phủ được lưu trữ và chúng có thể được truy cập thuận tiện bằng cách xem qua danh sách này.
Ngược lại, nếu chúng ta sử dụng các thuộc tính văn bản cho điều này (có thể), chúng ta sẽ không có cách nào dễ dàng truy cập chúng. Bạn cần phân tích bộ đệm để tìm thuộc tính văn bản.
Họ mạnh hơn một chút
Có một vài thuộc tính văn bản chỉ có ảnh hưởng đến lớp phủ. Bạn có thể tìm thấy toàn bộ danh sách
trên hướng dẫn . Nó quá lớn để bao gồm ở đây, nhưng đây là một điểm nổi bật ngắn.
before-string
Giá trị của thuộc tính này là một chuỗi để thêm vào màn hình ở đầu lớp phủ. Chuỗi không xuất hiện trong bộ đệm theo bất kỳ ý nghĩa nào chỉ có trên màn hình.
tiền tố dòng
Thuộc tính này chỉ định một thông số hiển thị để thêm vào từng dòng không tiếp tục tại thời điểm hiển thị. Xem Cắt ngắn.
tiền tố bọc
Thuộc tính này chỉ định một thông số kỹ thuật hiển thị để thêm vào từng dòng tiếp tục tại thời điểm hiển thị. Xem Cắt ngắn.
Đặc biệt, thuộc before-string
tính cho phép bạn ảnh hưởng đến việc hiển thị bộ đệm ngay cả với lớp phủ 0 chiều rộng. Đó là điều bạn không thể làm với thuộc tính văn bản. Mọi thứ bạn làm với thuộc tính văn bản cần phải đi qua một văn bản hiện có (có thể ẩn văn bản này) hoặc đi qua một chuỗi văn bản mới mà bạn chèn (làm thay đổi thực tế nội dung của bộ đệm).
Đây là một đoạn ví dụ về điều đó. Đánh giá nó trên một bộ đệm tạm thời.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Khi nào họ xấu?
Lớp phủ đòi hỏi nhiều hơn (xử lý khôn ngoan) hơn các thuộc tính văn bản. Một số thao tác có liên quan (chẳng hạn như chèn văn bản, nếu tôi không nhầm) mất thời gian tỷ lệ thuận với số lượng lớp phủ trong bộ đệm. Vì lý do đó, chúng không phù hợp khi bạn cần một số lượng lớn chúng. Trong trường hợp này, bạn nên từ chức để thuộc tính văn bản.
i text properties
, tất nhiên.