文字列から装飾(テキストプロパティ)を削除する方法は?


17

「装飾文字列」とは

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

...「プレーン文字列」とは対照的に

"foo"

(Elispコードがバッファから文字列を直接読み取る場合、このように装飾されている可能性があります。)

装飾された文字列を単純なものに変換する最も簡単な方法は何ですか(すべての装飾を取り除くことによって)?


7
substring-no-properties
ダン

これらのプロパティを削除する必要があるのはなぜですか?彼らは通常害を与えません。存在しないふりをするだけで十分な解決策になるかもしれません。
YoungFrog

回答:


15

[あなたの固有化された文字列は間違っているようです-おそらくあなたはそれを間違ってコピーしました。 foo文字が3文字しかないため、0〜4文字(つまり、0、1、2、3文字-4文字)でフォント化することはできません。ここの例では、4ではなく3を使用しています。]

(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

3番目の引数PROPERTIESは、新しいプロパティリストです。

オプションの4番目の引数OBJECTがバッファー(または現在のバッファーを意味するnil)でSTARTありEND、バッファー位置(整数またはマーカー)である場合。if OBJECTは文字列でSTARTありEND、0から始まるインデックスです。場合はPROPERTIESnilで、効果は、オブジェクトの指定された部分からすべてのプロパティを削除することです。

Elispマニュアルのノード「プロパティの変更」を参照してください。ここで、機能の下にこれが表示されますremove-text-properties(ジョブを実行するためにも使用できます)。

特定のテキストからすべてのテキストプロパティを削除set-text-propertiesするにnilは、新しいプロパティリストを使用して指定します。


@Danが述べたように、を使用することもできsubstring-no-propertiesますが、新しい文字列を返すことに注意してください。渡した実際の文字列オブジェクトは変更されません。両方でremove-text-propertiesset-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まだあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.