Lớp phủ để làm gì và chúng khác với các thuộc tính văn bản như thế nào?


23

Các hướng dẫn sử dụng :

Bạn có thể sử dụng lớp phủ để thay đổi giao diện của văn bản bộ đệm trên màn hình, vì mục đích của các tính năng trình bày.

Từ tên của nó, nó gợi ý rằng nó có thể được sử dụng để tạo ra các lớp lớp trên các văn bản hiện có, nhưng mô tả ở trên dường như cho thấy nó làm thay đổi diện mạo của văn bản, cảm giác rất giống với các thuộc tính văn bản.

Sử dụng cụ thể của lớp phủ là gì? Họ cung cấp những gì thuộc tính văn bản không? Chúng có thể được sử dụng để viết văn bản trên văn bản trong bộ đệm, như cửa sổ bật lên, hộp thông tin, v.v. không?


Đọc nhiều phần hướng dẫn sử dụng hơn là chỉ một câu. Nó được giải thích khá rõ ràng, IMO. Bao gồm sự khác biệt từ các thuộc tính văn bản. Xem thêm (trong cùng một hướng dẫn) i text properties, tất nhiên.
vẽ

Câu trả lời:


10

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

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-stringtí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.


12

Lớp phủ và thuộc tính văn bản có khả năng chính xác như nhau. Họ thêm lề thay đổi, nút, mặt, biểu tượng rìa, chú giải công cụ, hình ảnh, điểm nổi bật, v.v. vào một phần cụ thể của văn bản. Tuy nhiên, có một sự khác biệt lớn về khái niệm:

Lớp phủ là độc lập , thuộc tính văn bản là không. Emacs có một sự khác biệt loại lớp phủ , nhưng không có loại thuộc tính văn bản nào mà đề xuất. Các thuộc tính văn bản vốn đã được gắn với chuỗi mà chúng được đặt. Lớp phủ mặt khác được gắn vào một bộ đệm.

Có một vài ý nghĩa thực tế của sự khác biệt này:

  • Bạn có thể đặt thuộc tính văn bản trên các chuỗi không phải là một phần của bất kỳ bộ đệm nào, trong khi bạn luôn cần một bộ đệm cho lớp phủ.
  • Bạn không thể giữ một danh sách các thuộc tính văn bản bạn đã thêm ở đâu đó, trong khi thật dễ dàng để giữ một danh sách các lớp phủ được thêm vào bộ đệm, và ví dụ, xóa tất cả các lớp phủ của bạn trong một lần.
  • Bạn có thể có một lớp phủ đơn đặt nhiều lớp phủ trên một văn bản (ví dụ: khuôn mặt, chú giải công cụ và biểu tượng rìa), vì vậy bạn có thể sử dụng lớp phủ để quản lý một nhóm thuộc tính của nhóm thành một đơn vị, trong khi không có điều đó cho các thuộc tính văn bản. Bạn đặt chúng riêng lẻ và bạn quản lý chúng riêng lẻ.

Bản chất của tất cả điều này là bạn có thể quản lý các lớp phủ riêng biệt với nội dung văn bản. Về mặt khái niệm, bạn sẽ sử dụng chúng cho những thứ bạn hiển thị trong bộ đệm, mặc dù nó độc lập với văn bản.

Thực tế, bạn sẽ sử dụng lớp phủ nếu nội dung bạn muốn thêm vào văn bản thay đổi thường xuyên, trong khi bạn sử dụng thuộc tính văn bản nếu nội dung không đổi.

Chẳng hạn, Emacs sử dụng các thuộc tính văn bản để tạo các nút và các vật dụng đầu vào trong một M-x customize bộ đệm. Các widget này được tạo một lần và ở đó miễn là bộ đệm còn sống, do đó không cần phải đưa vào các lớp phủ.

Tuy nhiên, Flycheck sử dụng các lớp phủ để làm nổi bật các lỗi trong bộ đệm, bởi vì nó thường xuyên cần phải loại bỏ và thêm các điểm nổi bật.

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.