오버레이 란 무엇입니까?
우선, 그것들은 생략 대상입니다. 나중에 관련이 있습니다.
당신이 말했듯이, 그것들은 버퍼의 영역 위에 적용되는 레이어를 나타냅니다. 이 레이어에는 버퍼의 실제 텍스트와 마찬가지로 텍스트 속성이 있습니다. 오버레이에있는 일반 속성은 아래 텍스트에 적용됩니다. 그러나 오버레이에 특수한 일부 속성이 있습니다 (텍스트에 적용되는 경우 아무 것도 수행하지 않음).
왜 유용한가요?
위의 두 가지 이유로 힌트를 드리겠습니다 :
그들은 객체입니다
즉, 목록에 저장하고 쉽게 처리 할 수 있습니다. 현재 위치를 추적하지 않고도 속성을 변경할 수 있습니다. 더 나은, 당신은 사용할 수 를 일을 버퍼에있는 곳을 추적 할 수 있습니다.
Stefan의 답변 은 버퍼 영역을 추적하는 데 사용되는 오버레이의 좋은 예입니다. 다음은 짧은 스 니펫입니다.
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
오버레이를 사용하여 정렬 할 영역과 각 영역에서 사용할 정규식을 기록합니다. my--auto-align-overlays
이다
오버레이가 저장된 목록이며이 목록을 통해 편리하게 액세스 할 수 있습니다.
이와 반대로 텍스트 속성을 사용하는 경우 (가능한 경우) 쉽게 액세스 할 수있는 방법이 없습니다. 텍스트 속성을 찾으려면 버퍼를 구문 분석해야합니다.
그들은 조금 더 강력합니다
오버레이에만 영향을주는 텍스트 속성이 몇 가지 있습니다. 매뉴얼 에서 전체 목록 을 찾을 수 있습니다
. 여기에 포함하기에는 너무 크지 만 여기에 짧은 하이라이트가 있습니다.
before-string
이 속성 값은 오버레이 시작시 디스플레이에 추가 할 문자열입니다. 문자열은 어떤 의미로도 버퍼에 나타나지 않으며 화면에서만 나타납니다.
line-prefix
이 특성은 표시시 각 비 연속 행 앞에 추가 할 표시 스펙을 지정합니다. 잘림을 참조하십시오.
wrap-prefix
이 특성은 표시시 각 연속 행 앞에 추가 할 표시 스펙을 지정합니다. 잘림을 참조하십시오.
특히이 before-string
속성을 사용하면 너비가 0 인 오버레이에서도 버퍼 표시에 영향을 줄 수 있습니다. 텍스트 속성으로는 할 수없는 것입니다. 텍스트 속성을 사용하여 수행하는 모든 작업은 기존 텍스트 (이 텍스트를 숨길 수 있음)로 이동하거나 삽입 한 새 텍스트 문자열 ( 버퍼 의 실제 내용 을 변경 함 )로 이동해야합니다.
여기에 대한 스 니펫 예제가 있습니다. 임시 버퍼에서 평가하십시오.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
언제 나쁜가요?
오버레이는 텍스트 속성보다 훨씬 까다 롭습니다 (현명한 처리). 일부 관련 작업 (예 : 실수하지 않은 경우 텍스트 삽입)은 버퍼의 오버레이 수에 비례하여 시간이 걸립니다. 따라서 많은 수의 제품이 필요할 때 적합하지 않습니다. 이 경우 텍스트 속성에 사임해야합니다.
i text properties
.