Як зняти прикраси (властивості тексту) з рядка?


18

Під "прикрашеною струною" я маю на увазі щось подібне

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

... на відміну від "простої струни"

"foo"

(Якщо код Elisp читає рядок безпосередньо з буфера, він може бути оформлений так.)

Який найпростіший спосіб перетворити прикрашений рядок у звичайний (знімаючи всі прикраси)?


7
substring-no-properties
Dan

Навіщо потрібні ці властивості? Зазвичай вони не приносять шкоди. Просто зробіть вигляд, що їх немає, може бути досить хорошим рішенням.
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- це буфер (або нуль, що означає поточний буфер), 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все ще має їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.