Как убрать украшения (свойства текста) из строки?

18

Под «украшенной струной» я имею в виду

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

... в отличие от "простой строки"

"foo"

(Если код Elisp читает строку непосредственно из буфера, она может быть оформлена следующим образом.)

Какой самый простой способ преобразовать декорированную строку в простую (сняв все декорации)?

KJo
источник
7
подстрока-нет-свойств
Дан
Почему вам нужно удалить эти свойства? Они обычно не причиняют вреда. Просто притвориться, что их не существует, может быть достаточно хорошим решением.
YoungFrog

Ответы:

16

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

Нарисовалась
источник