Emacs의 창 표시 테이블과 버퍼 표시 테이블 간의 충돌

Emacs의 창 표시 테이블과 버퍼 표시 테이블 간의 충돌

이맥스에서는;

window-display-table동시에 두 가지 buffer-display-table작업을 수행할 수 있는 방법이 있습니까 ?

그 이유는 내가 사용하고 있기 때문이다.아름다운 컨트롤-L(에서Emacs 좋은 것들 El스크립트 패키지) 및공백( whitespace.el기본 Emacs 배포판에 있는 것 같지만 확실하지 않습니다.)

  • 아름다운 컨트롤-L로컬 창에 설정된 항목을 통해 ^L사용자 정의 방식으로 페이지 나누기 시각화 ( )C-lwindow-display-table.
  • 공백로컬 버퍼에 항목을 설정하여 공백, 탭 및 줄 바꿈을 시각화합니다.buffer-display-table. (또한 함수를 사용하여 font-lock).

충돌을 사용합니다(또는 충돌을 사용합니다 window-display-table) buffer-display-table. window-display-table그렇지 않은 경우 해당 창에 표시된 모든 버퍼의 내용을 nil완전히 덮어쓰게 되기 때문입니다.buffer-display-table

에서 인용이맥스 리스프수동:

38.21.2 활동 표시 테이블

각 버퍼와 마찬가지로 각 창에는 표시 테이블이 할당될 수 있습니다. 버퍼 B가 창 W에 표시될 때 창 W에 표시 테이블이 있으면 표시는 창 W의 표시 테이블을 사용합니다.그렇지 않으면, 버퍼 B의 표시 테이블(있는 경우), 그렇지 않은 경우 표준 표시 테이블(있는 경우). 선택한 디스플레이 테이블을 "활성" 디스플레이 테이블이라고 합니다.

[...]

(내 강조)

그렇다면 이것을 확고히 하는 간단한 방법은 없을까? 아니면 하나를 다시 코딩하여 다른 것과 동일한 메커니즘을 사용하는 유일한 방법입니까?

나는 빈 시각화와 호환되는, 하드코딩된 항목 ^Lbuffer-display-table. 하지만 더 간단한 대안이 있는지 궁금합니다.


편집하다:문제를 명확히 하기 위해 "Interactive Lisp" 세션(예: -buffer *scratch*)에서 발췌한 내용이 있습니다. 다음은 효과로 주석이 달린 명령과 출력을 보여줍니다.

;; Emacs is started with `-q', to not load my init-file(s).

;; First, write some sample text with tabs and line-feeds:

"A tab: and some text
A line-feed:and some text"
;; Make sure that it is a tab on the first line (input by `C-q TAB')
;; and a line-feed on the second line (input by `C-q C-l').
;; These probably won't copy properly into Stack Exchange.

;; This shows the spaces as center-dots, tabs as `>>'-glyphs and
;; new-lines as $'s (or perhaps other glyphs, depending on system
;; setup...). All of them fontified to be dimmed out on yellow/beige/white
;; background.
(whitespace-mode t)
t

;; This turns on pretty-control-l mode. The `^L' above will be
;; prettified...  Since this sets the window display table, the glyphs
;; for the spaces/tabs/new-lines will disappear, but the background of
;; spaces/tabs will still be yellow/beige (since that's done with
;; fontification, not display tables).
(pretty-control-l-mode t)
t

;; This turns pretty-control-l mode OFF again. The form-feed will
;; revert to displaying as `^L'. However, the glyphs for the
;; spaces/tabs/new-lines will not re-appear, since this only removes
;; the `C-l'-entry in the window-display-list, not the entire list.
(pretty-control-l-mode 0)
nil

;; Nil the window-display-table, to verify that is the culprit.  This
;; will re-enable the glyphs defined by whitespace-mode (since they
;; are still in the buffer display-table).
(set-window-display-table nil nil)
nil

;; To round of; this is my Emacs-version:
(emacs-version)
"GNU Emacs 23.4.1 (i686-pc-linux-gnu, GTK+ Version 2.24.12)
 of 2012-09-22 on akateko, modified by Debian"

;;End.

답변1

문제를 일으켜서 미안 해요. 귀하의 레시피에 따르면 귀하가 보고한 문제가 보이지 않습니다. 설명이 불완전한 것 아닐까요? pretty-control-l-mode과 을 모두 켤 수 있으며 whitespace-mode, 제가 보는 모든 동작은 정상적으로 보입니다. 어쩌면 사용자 정의 설정 whitespace-style등을 사용했습니까 ?

어쨌든, 이와 같은 변화에 관심이 있다면 도움이 될 것입니다 pretty-control-l-mode. 그렇다면 알려주시면 적용해보겠습니다.pp-c-l.el. (테스트하려면 새 옵션을 로 설정하세요 nil.)

 (defcustom pp^L-use-window-display-table-flag t
   "Non-nil: use `window-display-table'; nil: use `buffer-display-table`."
   :type 'boolean :group 'Pretty-Control-L)

 (define-minor-mode pretty-control-l-mode
     "Toggle pretty display of Control-l (`^L') characters.
 With ARG, turn pretty display of `^L' on if and only if ARG is positive."
   :init-value nil :global t :group 'Pretty-Control-L
   (if pretty-control-l-mode
       (add-hook 'window-configuration-change-hook 'refresh-pretty-control-l)
     (remove-hook 'window-configuration-change-hook 'refresh-pretty-control-l))
   (walk-windows
    (lambda (window)
      (let ((display-table  (if pp^L-use-window-display-table-flag ; <=========
                                (or (window-display-table window)
                                    (make-display-table))
                              (if buffer-display-table
                                  (copy-sequence buffer-display-table)
                                (make-display-table)))))
        (aset display-table ?\014 (and pretty-control-l-mode
                                       (pp^L-^L-display-table-entry window)))
        (if pp^L-use-window-display-table-flag                     ; <=========
            (set-window-display-table window display-table)
          (setq buffer-display-table display-table))))
    'no-minibuf
    'visible))

댓글 스레드를 추가하도록 업데이트되었습니다., 어느 시점에 댓글이 삭제된 경우:

그런데 문서에 설명된 표시 테이블의 계층 구조가 일종의 상속을 사용하여 적용되어서는 안 되는지 궁금합니다. 한 수준(예: 창)이 하위 수준(예: 버퍼)을 완전히 가리는 것은 약간 원시적인 것처럼 보입니다. 이 문제에 대한 질문을 Mx Report-emacs-bug에 보내는 것을 고려할 수 있습니다. – Drew 2014년 9월 24일 16:36

평평한? 위의 변경 사항이 도움이 되는지 알려주실 수 있나요? 감사해요. – 드류 2014-10-14 18:12

방금 이 답변을 읽었습니다(한동안 인터넷의 이 부분에 가본 적이 없습니다...). 시간이 나면 며칠 정도 확인해 봐야겠습니다. 나중에 내 재량에 따라 "답변 승인"(유효한 경우) 또는 의견(그렇지 않은 경우)으로 회신하겠습니다. – 요한 E 2014-10-25 22:32

문제를 표시하는 보다 구체적인 방법을 추가하기 위해 질문을 편집했습니다. 동일한 결과를 얻을 수 있다면 관심이 있을 것입니다. ---또한 사용자 제공 파일로 시스템에 설치된 .el 파일을 숨길 수 있는 방법이 있습니까? (저는 실제로 lisp 프로그래머가 아닌 "사용자"입니다...) 저는 deb-packages로 설치된 파일을 엉망으로 만들고 싶지 않습니다. (그래서 답변을 테스트하기 전에 문제 레시피를 만들어 놓았습니다...) – Johan E 2014-10-27 1:02

마지막 댓글을 쓴 지 5초 후에 코드를 붙여넣기만 하면 된다는 것을 깨달았습니다.긁힌 자국그런 다음 Cj는 테스트를 위해 이를 실행합니다. (파일을 편집할 필요가 없습니다.) 결과: 정말 매력적이었습니다! 감사합니다! (=> 답변 허용) 그러나 문제의 레시피에서 나와 동일한 결과를 얻을 수 있는지(코드를 패치하기 전) 알고 싶습니다. – Johan E 2014년 10월 27일 1:09

나는 방금 당신의 새로운 레시피를 따랐고 당신이 설명하는 모든 것을 (매우 명확하게) 봅니다. 그러다가 방금 추가한 새 댓글을 읽었습니다. 모든 것이 잘 작동하고 있다는 것을 알게 되어 기쁩니다. 피드백을 보내주셔서 감사합니다. – 드류 2014-10-27 1:12

관련 정보