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機能を使用することによっても)。

これらは衝突します (または、window-display-tableとの使用がbuffer-display-table衝突します)。 がwindow-display-tableでない場合、そのウィンドウに表示されるすべてのバッファの のnilいずれかが完全に上書きされるからです。buffer-display-table

引用元エマックスリスプマニュアル:

38.21.2 アクティブ表示テーブル

各ウィンドウは表示テーブルを指定でき、各バッファも同様に指定できます。バッファ B がウィンドウ W に表示されるとき、ウィンドウ 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-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))

コメントスレッドを追加して更新しましたコメントが削除された場合に備えて:

ところで、ドキュメントで説明されている表示テーブルの階層は、なんらかの継承を使用して適用すべきではないでしょうか。1 つのレベル (たとえばウィンドウ) が下位レベル (たとえばバッファ) を完全に隠蔽するのは、少し原始的すぎるように思われます。この件について、Mx report-emacs-bug に質問を送ることを検討してください。 – Drew Sep 24 '14 at 16:36

Ping? 上記の変更が役立つかどうか教えてください。ありがとうございます。 – Drew 2014 年 10 月 14 日 18:12

私はこの回答を読みました (しばらくインターネットのこの部分にアクセスしていませんでした...)。時間ができたら、おそらく数日後に確認します。後ほど、必要に応じて「回答承認」(うまくいけば) またはコメント (うまくいかなければ) を返信します。 – Johan E 2014 年 10 月 25 日 22:32

問題を示すためのより詳細なレシピを追加するために質問を編集しました。同じ結果が得られるかどうか興味があります。 --- また、システムによってインストールされた .el ファイルをユーザー提供のファイルでシャドウする方法はありますか (私は実際には単なる「ユーザー」であり、Lisp プログラマーではありません...)? deb パッケージによってインストールされたファイルをいじりたくないのです。 (そのため、あなたの回答をテストする前に問題のレシピを実行しました...) – Johan E 2014 年 10 月 27 日 1:02

最後のコメントを書いた5秒後に、コードを貼り付けるだけでいいことに気付きました。そして、Cj 実行してテストします。(ファイルを編集する必要はありません。) 結果: うまくいきました! ありがとうございます! (=> 回答が承認されました) ただし、問題解決方法 (コードにパッチを適用する前) から私と同じ結果が得られるかどうかは、まだ知りたいです。 – Johan E 2014 年 10 月 27 日 1:09

私はあなたの新しいレシピに従って、あなたが説明したことをすべて見ました(とても明確です)。そして、あなたが追加した新しいコメントを読みました。うまくいったと知ってうれしいです。フィードバックをありがとう。 – Drew 2014年10月27日1:12

関連情報