문자열에서 장식 (텍스트 속성)을 제거하는 방법은 무엇입니까?


17

"장식 된 문자열"이란

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

... "일반 문자열"과 반대

"foo"

Elisp 코드가 버퍼에서 직접 문자열을 읽는 경우 다음과 같이 장식 될 수 있습니다.

장식 된 문자열을 일반 문자열로 변환하는 가장 간단한 방법은 무엇입니까 (모든 장식을 제거하여)?


7
substring-no-properties
Dan

왜 이러한 속성을 제거해야합니까? 그들은 일반적으로 해를 끼치 지 않습니다. 존재하지 않는 척하는 것이 충분한 해결책 일 수 있습니다.
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.

세 번째 인수 PROPERTIES는 새로운 속성 목록입니다.

선택적 인수 제 경우 OBJECT버퍼 (현재 버퍼 수단 또는 무기 호)이고, STARTEND이다 위치 (정수 또는 마커) 버퍼. 경우 OBJECT문자열입니다, START하고 END있습니다 그것으로 인덱스를 0 기반. 경우 PROPERTIES무기 호입니다, 효과는 개체의 지정된 부분에서 모든 속성을 제거하는 것입니다.

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)

모두 foobar단지 지금 "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.