수정 / 오버레이 할 텍스트가없는 창 위치의 임시 텍스트?


9

Q : 수정 / 오버레이 할 텍스트가없는 화면 위치의 창에 텍스트를 일시적으로 표시하려면 어떻게해야합니까?

나는 텍스트 속성오버레이 ( 이 스레드 참조) 의 기본 개념에 익숙 하고 몇 번 사용했지만 결코 익숙하지 않습니다. 제한된 이해는 텍스트를 수정하거나 오버레이 할 텍스트가 필요하다는 것입니다. 그러나 텍스트가없는 창의 섹션을 사용하는 방법이 궁금합니다.

다음은 예제 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

스크린 샷의 빨간색 상자 중 하나, 즉 텍스트 오른쪽의 빈 공간이나 버퍼의 마지막 줄 아래에 텍스트를 (일시적으로) 넣을 수 있습니까?


즉, display 속성을 사용하여 존재하지 않는 텍스트를 표시 할 수 있습니다. 집에 가기 전에 누군가가 완전한 답을 줄 수도 있습니다.
Malabarba

회사 모드는 display 속성에 충분한 after 또는 before 포인트가있는 경우 텍스트에 오버레이를 배치하거나, ​​after-string 속성을 사용하여 버퍼 끝 아래에 무언가를 표시합니다. 측면에 무언가를 표시하는 것에 대해서는 확신이 없지만 오버레이의 올바른 너비와 위치로 가능합니다.
wasamasa

당신은 단지 insert버퍼에 문자를 보내고 그것을 수정할 수 있습니까?
rekado

답변:


6

문자열을 가져 와서 버퍼 텍스트 다음에 시간 초과로 일시적으로 표시하는 함수의 실제 예제를 작성했습니다.

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

다음의 주문은 아래의 빨간색 상자 예입니다.

(my-momentarily-display-after-buffer-end "Nothing to see here...")

이것이 작동하는 이유는 오버레이가 마커를 표시 할 위치로 사용하기 때문입니다. 오버레이의 시작과 끝으로 가장 바깥 쪽 위치를 사용하면 속성 을 사용하여 그 다음에 텍스트를 표시 할 수 있습니다 after-string. 오버레이는 적절한 텍스트를 포함 할 수 있기 때문에 들여 쓰기와 그 주변에 공백이 나타나도록 설정했습니다.

다른 예제는 같은 아이디어를 사용하여 줄 끝 뒤에 텍스트를 표시 할 수 있습니다.

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

다음과 같은 호출로 오른쪽 빨간색 상자 예제가 나타납니다.

(my-momentarily-display-after-line-end "annotation")

버퍼 텍스트와 이러한 오버레이를 구별하고, 시간 초과보다 더 길게 표시하고, 위치를 조정하고, 빈 공간이 없을 때를 감지하고, 일반 텍스트의 일반 오버레이를 사용하는 등의 방법으로 훨씬 더 미친 얼굴을 추가 할 수 있습니다. 회사 모드 의 소스 코드는 매우 읽기 쉽고 제안 된 기능을 가진 유연한 팝업 메뉴를 만들기 위해보다 정교하고 (대부분 버그가없는) 오버레이 사용을 보여주기 때문입니다.


2

함수를 사용하여 텍스트를 버퍼에 임시로 표시 할 수 있습니다 momentary-string-display. 표시 할 메시지와 버퍼의 위치가 필요합니다.

이:

(momentary-string-display "hello there" 200)

"hello there"라는 문자열을 버퍼의 200 위치에 배치합니다. "hello world"를위한 공간을 만들기 위해이 시점에서 다른 모든 텍스트를 옆으로 이동하지만 모든 키를 누르면 원래 위치로 복원됩니다.

텍스트 속성에 대한 요구 사항이지만 오버레이를 만들기 위해 버퍼에 텍스트가 필요하지 않습니다. 너비가 0 인 오버레이는 다음과 같이 추가 텍스트가 표시됩니다.

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

이 오버레이는 버퍼 텍스트를 밀어냅니다. 주어진 위치에서 텍스트를 다루지 않습니다.

point-max/ 보다 큰 버퍼의 어느 위치 에나 오버레이를 배치 할 수없는 것 같습니다 buffer-size. 즉,이 제한을 해킹하지 않으면 버퍼 텍스트 아래의 특정 위치에 텍스트를 배치 할 수 없습니다. 물론 위치에 after-string고정 된 오버레이 의 속성을 사용하여 버퍼 텍스트 바로 뒤에 텍스트를 배치 할 수 있습니다 point-max.

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