วิธีการตัดแถบตกแต่ง (คุณสมบัติข้อความ) จากสตริง?


17

โดย "สตริงตกแต่ง" ฉันหมายถึงสิ่งที่ชอบ

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

... ตรงข้ามกับ "สตริงธรรมดา"

"foo"

(หากรหัส Elisp อ่านสตริงโดยตรงจากบัฟเฟอร์มันอาจถูกตกแต่งเช่นนี้)

วิธีที่ง่ายที่สุดในการแปลงสตริงที่ตกแต่งเป็นสตริงธรรมดา (โดยการปอกการตกแต่งทั้งหมด) คืออะไร?


7
substring-no-properties
Dan

ทำไมคุณต้องเอาคุณสมบัติเหล่านี้ออก พวกเขามักจะไม่ทำอันตราย แค่แกล้งทำเป็นว่าพวกเขาไม่มีตัวตนอาจเป็นทางออกที่ดีพอ
YoungFrog

คำตอบ:


15

[สตริงที่เหมาะสมของคุณดูผิด - บางทีคุณอาจคัดลอกผิด fooมีเพียง 3 ตัวอักษรดังนั้นจึงเป็นไปไม่ได้ที่จะถูกทำให้เป็นแบบอักษรบนตัวอักษร 0 ถึง 4 (เช่นตัวอักษร 0, 1, 2 และ 3 - นั่นคือ 4 ตัวอักษร) ฉันใช้ 3 แทน 4 ในตัวอย่างที่นี่]

(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-propertiesเป็นฟังก์ชั่นในC source codeตัว

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

แทนที่คุณสมบัติของข้อความจากSTARTเป็นENDเป็น

อาร์กิวเมนต์ที่สามPROPERTIESคือรายการคุณสมบัติใหม่

หากอาร์กิวเมนต์ที่สี่ที่เป็นทางเลือกOBJECTคือบัฟเฟอร์ (หรือศูนย์ซึ่งหมายถึงบัฟเฟอร์ปัจจุบัน) STARTและENDเป็นตำแหน่งบัฟเฟอร์ (จำนวนเต็มหรือเครื่องหมาย) ถ้าOBJECTเป็นสตริงSTARTและENDเป็นดัชนีที่อ้างอิง 0 รายการ หากPROPERTIESเป็นศูนย์ผลกระทบคือการลบคุณสมบัติทั้งหมดออกจากส่วนที่กำหนดของ OBJECT

ดู Elisp คู่มือโหนดเปลี่ยนคุณสมบัติ ที่นั่นคุณจะเห็นสิ่งนี้ภายใต้ฟังก์ชั่นremove-text-properties(ซึ่งคุณสามารถใช้ในการทำงาน):

ในการลบคุณสมบัติข้อความทั้งหมดออกจากข้อความบางข้อความให้ใช้set-text-propertiesและระบุnilสำหรับรายการคุณสมบัติใหม่


ตามที่ @Dan พูดถึงคุณสามารถใช้งานsubstring-no-propertiesได้ แต่โปรดทราบว่ามันส่งคืนสตริงใหม่ มันไม่ได้ปรับเปลี่ยนวัตถุสตริงที่เกิดขึ้นจริงที่คุณผ่านมัน ทั้งสองremove-text-propertiesและset-text-propertiesเปลี่ยนสตริงที่คุณส่งผ่านพวกเขา

ตัวอย่างเช่น:

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

ทั้งสองfooและbarตอนนี้เป็นเพียง"foo"โดยไม่มีคุณสมบัติ

แต่:

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

ตอนนี้fooไม่มีคุณสมบัติ แต่barยังมีคุณสมบัติเหล่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.