Конфликт таблицы отображения окна и таблицы отображения буфера в Emacs

Конфликт таблицы отображения окна и таблицы отображения буфера в Emacs

В Emacs;

Есть ли способ сделать так, чтобы оба варианта window-display-tableимели buffer-display-tableэффект одновременно?

Причина в том, что я используюPretty-Control-L(отEmacs Goodies Elпакет скриптов) ипробел(по- whitespace.elмоему, он есть в базовом дистрибутиве Emacs, но я не уверен).

  • Pretty-Control-Lвизуализирует формы-подачи ( ^L) в индивидуальном порядке, устанавливая запись C-lв локальном окнеwindow-display-table.
  • Пробелывизуализирует пробелы, табуляции и переводы строк, устанавливая записи в буфере-localbuffer-display-table. (а также с помощью font-lockфункциональности).

Здесь используются конфликты (или, скорее, использование window-display-tableи buffer-display-tableконфликтов), поскольку, если это window-display-tableне так, nilон полностью переопределяет любой buffer-display-tableдля любого буфера, отображаемого в этом окне.

Цитата изEmacs Лиспруководство:

38.21.2 Таблица активного отображения

Каждое окно может указать таблицу отображения, и каждый буфер тоже. Когда буфер B отображается в окне 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-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 24 сен '14 в 16:36

Ping? Не могли бы вы сообщить мне, помогло ли изменение выше? Спасибо. – Drew Oct 14 '14 at 18:12

Я только что прочитал этот ответ (я давно не заходил в эту часть Интернета...). Я проверю это, когда доберусь до него, возможно, через несколько дней. Я вернусь с «Ответ одобрен» (если он сработает) или комментариями (в противном случае), если это уместно, позже. – Johan E 25 окт. 2014 в 22:32

Я отредактировал вопрос, чтобы добавить более развернутый рецепт для демонстрации проблемы. Мне было бы интересно, получите ли вы те же результаты. --- Кроме того, есть ли способ скрыть установленный в системе .el-файл с помощью предоставленного пользователем (я на самом деле просто «пользователь», а не программист lisp...)? Мне не очень хочется возиться с файлами, установленными deb-пакетами. (Вот почему я сделал problem-recipe перед проверкой вашего ответа...) – Johan E 27 окт. 2014 в 1:02

Через пять секунд после того, как я написал последний комментарий, я понял, что могу просто вставить код вцарапатьи Cj-запустите его для проверки. (Не нужно редактировать файлы.) Результаты: Работает просто чудесно! Спасибо! (=> Ответ принят) Однако, я все равно хотел бы знать, получили ли вы те же результаты, что и я, от моего рецепта решения проблемы (до исправления кода). – Johan E 27 окт. 2014 в 1:09

Я только что следовал твоему новому рецепту и увидел все, что ты описал (так ясно). А потом я прочитал новый комментарий, который ты только что добавил. Рад узнать, что все работает нормально. Спасибо за твой отзыв. – Drew Oct 27 '14 at 1:12

Связанный контент