Emacs中視窗顯示表和緩衝區顯示表衝突

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功能)。

這些使用衝突(或更確切地說,使用 awindow-display-tablebuffer-display-table衝突),因為如果window-display-table不是,nil則它完全覆蓋buffer-display-table該視窗中顯示的任何緩衝區的任何內容。

引用自Emacs Lisp手動的:

38.21.2 活動顯示表

每個視窗都可以指定一個顯示表,每個緩衝區也可以。當緩衝區B在視窗W中顯示時,如果視窗W有顯示表,則display使用視窗W的顯示表;否則, 緩衝區 B 的顯示表(如果有的話);否則,標準顯示表(如果有)。所選的顯示表稱為「活動」顯示表。

[...]

(我強調的)

那麼,有沒有什麼簡單的方法可以鞏固這一點呢?或者是重新編碼其中一個以使用與另一個相同的機制的唯一方法?

我一直在考慮編寫一個與空白可視化兼容的換頁可視化的小型(即更小)原始變體,該變體僅使用一些緩衝區加載鉤子(或其他鉤子)將硬編碼條目^L放入buffer-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-modewhitespace-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 發送有關此問題的問題。 – 德魯 2014 年 9 月 24 日 16:36

平?您能否告訴我上述變更是否有幫助?謝謝。 – 德魯 2014-10-14 18:12

我剛剛讀了這個答案(我有一段時間沒有接觸過互聯網的這一部分......)。當我有時間的時候,也許幾天左右,我會檢查一下。稍後我會酌情回覆「答案已核准」(如果有效)或評論(否則)。 – Johan E 2014 年 10 月 25 日 22:32

我編輯了這個問題,並添加了一個更具體的方法來顯示問題。我很有興趣你是否能得到相同的結果。 --- 另外,有沒有一種方法可以用用戶提供的檔案來隱藏系統安裝的 .el 檔案(我實際上只是一個“用戶”,而不是 lisp 程式設計師...)?我真的不想弄亂 deb-packages 安裝的檔案。 (這就是為什麼我在測試你的答案之前做了問題食譜...) – Johan E 2014-10-27 1:02

在我寫完最後一條評論五秒鐘後,我意識到我可以將程式碼貼到刮痕然後 Cj 運行它進行測試。 (無需編輯任何文件。) 結果:它很有魅力!謝謝你! (=> 答案已接受)但是,我仍然想知道您是否從我的問題配方中得到與我相同的結果(在修補程式碼之前)。 – Johan E 2014 年 10 月 27 日 1:09

我剛剛遵循了你的新食譜,我看到了你描述的一切(如此清晰)。然後我讀到了你剛剛添加的新評論。很高興知道一切正常。感謝您的回饋。 – 德魯 2014-10-27 1:12

相關內容