В 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
. - Пробелывизуализирует пробелы, табуляции и переводы строк, устанавливая записи в буфере-local
buffer-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