Answers:
[您的属性字符串看起来不正确-也许您复制了错误的字符串。 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
是缓冲区(或nil,表示当前缓冲区),START
并且END
是缓冲区位置(整数或标记)。IfOBJECT
是一个字符串,START
并且END
是从0开始的索引。如果PROPERTIES
为nil,则效果是从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
仍然有它们。