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