오버레이 란 무엇이며 텍스트 속성과 어떻게 다릅니 까?


23

수동 상태 :

프리젠 테이션 기능을 위해 오버레이를 사용하여 화면에 버퍼 텍스트의 모양을 변경할 수 있습니다.

이름에서 기존 텍스트 위에 "레이어"를 만드는 데 사용할 수 있다고 제안하지만 위의 설명은 텍스트의 모양을 변경하여 텍스트 속성과 매우 유사한 느낌을주는 것으로 보입니다.

오버레이의 구체적인 사용은 무엇입니까? 텍스트 속성이 제공하지 않는 것은 무엇입니까? 팝업, 정보 상자 등 버퍼의 텍스트 위에 텍스트를 쓰는 데 사용할 수 있습니까?


한 문장보다 그 매뉴얼 섹션을 더 읽으십시오. 꽤 명확하게 설명되어 있습니다. IMO. 텍스트 속성과의 차이점 포함 물론 (같은 매뉴얼에서) 참조하십시오 i text properties.
Drew

답변:


10

오버레이 란 무엇입니까?

우선, 그것들은 생략 대상입니다. 나중에 관련이 있습니다.

당신이 말했듯이, 그것들은 버퍼의 영역 위에 적용되는 레이어를 나타냅니다. 이 레이어에는 버퍼의 실제 텍스트와 마찬가지로 텍스트 속성이 있습니다. 오버레이에있는 일반 속성은 아래 텍스트에 적용됩니다. 그러나 오버레이에 특수한 일부 속성이 있습니다 (텍스트에 적용되는 경우 아무 것도 수행하지 않음).

왜 유용한가요?

위의 두 가지 이유로 힌트를 드리겠습니다 :

그들은 객체입니다

즉, 목록에 저장하고 쉽게 처리 할 수 ​​있습니다. 현재 위치를 추적하지 않고도 속성을 변경할 수 있습니다. 더 나은, 당신은 사용할 수 일을 버퍼에있는 곳을 추적 할 수 있습니다.

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!")

언제 나쁜가요?

오버레이는 텍스트 속성보다 훨씬 까다 롭습니다 (현명한 처리). 일부 관련 작업 (예 : 실수하지 않은 경우 텍스트 삽입)은 버퍼의 오버레이 수에 비례하여 시간이 걸립니다. 따라서 많은 수의 제품이 필요할 때 적합하지 않습니다. 이 경우 텍스트 속성에 사임해야합니다.


12

오버레이와 텍스트 속성은 정확히 동일한 기능을 갖습니다. 텍스트의 특정 부분에 여백, 버튼,면, 프린지 아이콘, 툴팁, 이미지, 하이라이트 등을 추가합니다. 그러나 개념 상 큰 차이가 있습니다.

오버레이는 독립적 이며 텍스트 속성은 다릅니다 . 이맥스에는 고유 한 오버레이 유형이 있지만 "텍스트 속성 유형"은 없습니다. 텍스트 속성은 기본적으로 설정된 문자열과 연결되어 있습니다. 반면에 오버레이는 버퍼에 부착됩니다.

이 차이점에는 몇 가지 실질적인 의미가 있습니다.

  • 버퍼의 일부가 아닌 문자열에 텍스트 속성을 설정할 수 있지만 오버레이에는 항상 버퍼가 필요합니다.
  • 추가 한 텍스트 속성 목록을 어딘가에 유지할 수 없지만, 오버레이에 추가 된 오버레이 목록을 버퍼에 추가하는 것은 쉽고, 예를 들어 한 번에 모든 오버레이를 삭제하는 것이 쉽습니다.
  • 텍스트 (예 :면, 툴팁 및 프린지 아이콘)에 여러 오버레이를 설정하는 단일 오버레이를 가질 수 있으므로 오버레이를 사용하여 속성의 "그룹"을 단일 단위로 관리 할 수 ​​있습니다. 텍스트 속성에 대한 것. 개별적으로 설정하고 개별적으로 관리합니다.

이 모든 것의 핵심은 텍스트 컨텐츠 와 별도로 오버레이를 관리 할 수 ​​있다는 것 입니다. 개념적으로는 텍스트와 독립적이지만 버퍼에 표시 할 내용에 사용합니다.

실제로 텍스트에 추가하려는 항목이 자주 변경되는 경우 오버레이를 사용하는 반면, 텍스트가 일정하면 텍스트 속성을 사용합니다.

예를 들어, Emacs는 텍스트 속성을 사용하여 M-x customize버퍼 에 버튼과 입력 위젯을 만듭니다 . 이 위젯은 한 번 생성되며 버퍼가 활성화되어있는 한 그대로 유지되므로 오버레이를 가져올 필요가 없습니다.

그러나 Flycheck 는 오버레이를 사용하여 버퍼에서 오류를 강조 표시합니다. 강조 표시를 자주 제거하고 추가해야하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.