Bir dizeden süslemeleri (metin özellikleri) nasıl şeritlenir?


18

"Dekore edilmiş bir ip" derken

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

... "düz ipin" aksine

"foo"

(Elisp kodu doğrudan bir arabellekten bir dize okursa, bu şekilde dekore edilebilir.)

Dekore edilmiş bir dizeyi düz bir diziye dönüştürmenin en basit yolu nedir (tüm süslemeleri soyarak)?


7
substring-no-properties
Dan

Neden bu mülklerin kaldırılmasına ihtiyacınız var? Genellikle zarar vermezler. Sadece yokmuş gibi davranın, yeterince iyi bir çözüm olabilir.
YoungFrog

Yanıtlar:


16

[Doğrulanmış dizeniz yanlış görünüyor - belki de yanlış kopyaladınız. fooyalnızca 3 karakterden oluşur, bu nedenle 0 ila 4 arasındaki karakterlere fonlanması mümkün değildir (yani, 0, 1, 2 ve 3 karakterleri - bu 4 karakterdir). Buradaki örnekte 4 yerine 3 kullanıyorum.]

(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-propertiesyerleşik bir işlevdir C source code.

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

Tamamen metin özelliklerini değiştirmek STARTiçin END.

Üçüncü argüman PROPERTIESyeni özellik listesidir.

İsteğe bağlı dördüncü argüman OBJECTbir tampon (veya geçerli tampon anlamına gelen nil) STARTve ENDtampon konumları (tamsayılar veya işaretçiler) ise. Eğer OBJECTbir dizedir STARTve ENDiçine 0 tabanlı indeksler. Eğer PROPERTIESsıfırdır, etkisi OBJECT belirlenmiş bölümünden tüm özellikleri kaldırmaktır.

Elisp kılavuzuna bakın, Düğüm Değiştirme Özellikleri . Orada, işlevi altında remove-text-properties(iş yapmak için de kullanabilirsiniz) göreceksiniz:

Belirli bir metinden tüm metin özelliklerini kaldırmak için tuşunu kullanın set-text-propertiesve nilyeni özellik listesi için belirtin .


@Dan'ın belirttiği gibi, kullanabilirsiniz substring-no-properties, ancak yeni bir dize döndürdüğünü unutmayın. İlettiğiniz gerçek dize nesnesini değiştirmez. Hem remove-text-propertiesve set-text-propertiesonları geçmek dize değiştirin.

Örneğin:

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

Her ikisi de foove barşimdi sadece "foo", hiçbir özelliği ile.

Fakat:

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

Şimdi foohiçbir özelliği yok ama barhala var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.