「装飾文字列」とは
#("foo" 0 4 (fontified t face font-lock-function-name-face))
...「プレーン文字列」とは対照的に
"foo"
(Elispコードがバッファから文字列を直接読み取る場合、このように装飾されている可能性があります。)
装飾された文字列を単純なものに変換する最も簡単な方法は何ですか(すべての装飾を取り除くことによって)?
「装飾文字列」とは
#("foo" 0 4 (fontified t face font-lock-function-name-face))
...「プレーン文字列」とは対照的に
"foo"
(Elispコードがバッファから文字列を直接読み取る場合、このように装飾されている可能性があります。)
装飾された文字列を単純なものに変換する最も簡単な方法は何ですか(すべての装飾を取り除くことによって)?
回答:
[あなたの固有化された文字列は間違っているようです-おそらくあなたはそれを間違ってコピーしました。 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
、バッファー位置(整数またはマーカー)である場合。ifOBJECT
は文字列でSTART
ありEND
、0から始まるインデックスです。場合はPROPERTIES
nilで、効果は、オブジェクトの指定された部分からすべてのプロパティを削除することです。
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
まだあります。