[Ваш належний рядок виглядає неправильно - можливо, ви його скопіювали неправильно. 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все ще має їх.