Làm thế nào để dải trang trí (thuộc tính văn bản) từ một chuỗi?


17

Bởi một "chuỗi trang trí" tôi có nghĩa là một cái gì đó như

#("foo" 0 4 (fontified t face font-lock-function-name-face))

... trái ngược với "chuỗi đơn giản"

"foo"

(Nếu mã Elisp đọc một chuỗi trực tiếp từ bộ đệm, nó có thể được trang trí như thế này.)

Cách đơn giản nhất để chuyển đổi một chuỗi trang trí thành một chuỗi đơn giản (bằng cách tước tất cả các trang trí) là gì?


7
chuỗi con-không có thuộc tính
Dan

Tại sao bạn cần loại bỏ các thuộc tính này? Họ thường không làm hại. Cứ giả vờ rằng chúng không tồn tại có thể là một giải pháp đủ tốt.
YoungFrog

Câu trả lời:


15

[Chuỗi thích hợp của bạn có vẻ sai - có lẽ bạn đã sao chép sai. foochỉ có 3 ký tự, do đó không thể in phông chữ trên các ký tự 0 đến 4 (nghĩa là các ký tự 0, 1, 2 và 3 - đó là 4 ký tự). Tôi sử dụng 3 thay vì 4 trong ví dụ ở đây.]

(let* ((foo    #("foo" 0 3 (fontified t face font-lock-function-name-face)))
       (start  0)
       (end    (length foo)))
  (set-text-properties start end nil foo)
  foo)

set-text-propertieslà một chức năng tích hợp trong C source code.

(set-text-properties START END PROPERTIES &optional OBJECT)

Thay thế hoàn toàn các thuộc tính của văn bản từ STARTđến END.

Đối số thứ ba PROPERTIESlà danh sách tài sản mới.

Nếu đối số thứ tư tùy chọn OBJECTlà bộ đệm (hoặc nil, có nghĩa là bộ đệm hiện tại) STARTENDlà vị trí bộ đệm (số nguyên hoặc đánh dấu). Nếu OBJECTlà một chuỗi STARTENDlà các chỉ số dựa trên 0 vào nó. Nếu PROPERTIESlà con số không, hiệu quả là loại bỏ tất cả các thuộc tính khỏi phần được chỉ định của ĐỐI TƯỢNG.

Xem hướng dẫn Elisp, thay đổi thuộc tính nút . Ở đó bạn sẽ thấy điều này, dưới chức năng remove-text-properties(mà bạn cũng có thể sử dụng để thực hiện công việc):

Để xóa tất cả các thuộc tính văn bản khỏi văn bản nhất định, sử dụng set-text-propertiesvà chỉ định nilcho danh sách thuộc tính mới.


Như @Dan đã đề cập, bạn cũng có thể sử dụng substring-no-properties, nhưng lưu ý rằng nó trả về một chuỗi mới. Nó không sửa đổi đối tượng chuỗi thực tế mà bạn vượt qua nó. Cả hai remove-text-propertiesset-text-propertiesthay đổi chuỗi bạn vượt qua chúng.

Ví dụ:

(setq foo #("foo" 0 3 (fontified t face font-lock-function-name-face)))
(setq bar foo)
(set-text-properties 0 (length foo) nil foo)

Cả hai foobarbây giờ chỉ là "foo", không có tài sản.

Nhưng:

(setq foo #("foo" 0 3 (fontified t face font-lock-function-name-face)))
(setq bar foo)
(setq foo (substring-no-properties foo))

Bây giờ fookhông có tài sản nhưng barvẫn có chúng.

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.