[Ваша выделенная строка выглядит неправильно - возможно, вы скопировали ее неправильно. 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являются позициями буфера (целые числа или маркеры). If 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все еще имеет их.