Tabela de exibição de janela e conflito de tabela de exibição de buffer no Emacs

Tabela de exibição de janela e conflito de tabela de exibição de buffer no Emacs

No Emacs;

Existe uma maneira de ambos window-display-tableterem buffer-display-tableefeito ao mesmo tempo?

A razão é que estou usandoPretty-Control-L(deEmacs Goodies Elpacote de scripts) eespaço em branco(de whitespace.el, acho que está na distribuição base do Emacs, mas não tenho certeza).

  • Pretty-Control-Lvisualiza feeds de formulário ( ^L) de maneira personalizada, definindo a entrada para C-lna janela localwindow-display-table.
  • Espaço em brancovisualiza espaços, tabulações e novas linhas definindo entradas no buffer-localbuffer-display-table. (e também usando font-lockfuncionalidade).

Estes usam conflitos (ou melhor, o uso de conflitos a window-display-tablee buffer-display-table), pois, se window-display-tablenão for, nilsubstitui completamente any buffer-display-tablepor qualquer buffer exibido naquela janela.

Citação doEmacs Lispmanual:

38.21.2 Tabela de Exibição Ativa

Cada janela pode especificar uma tabela de exibição, assim como cada buffer. Quando um buffer B é exibido na janela W, o display usa a tabela de exibição da janela W, se houver;de outra forma, a tabela de exibição do buffer B, se houver; caso contrário, a tabela de exibição padrão, se houver. A tabela de exibição escolhida é chamada de tabela de exibição "ativa".

[...]

(ênfase minha)

Então, existe alguma maneira fácil de consolidar isso? Ou a única maneira de recodificar um deles é usar o mesmo mecanismo do outro?

Estou pensando em escrever uma variante pequena (ou seja, ainda menor) da visualização de feed de formulário compatível com a visualização de espaço em branco que apenas usa algum gancho de carregamento de buffer (ou outro) para colocar uma entrada codificada ^Lno buffer-display-table. Mas gostaria de saber se existe alguma alternativa mais simples.


EDITAR:Para esclarecer o problema, aqui está um trecho de uma sessão anotada do "Interactive Lisp" (ou seja, do *scratch*-buffer). Isso mostra os comandos e suas saídas, e anotados com os efeitos:

;; 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.

Responder1

Desculpe pelo seu problema. Não vejo o problema que você relata, seguindo sua receita. Talvez a descrição não esteja completa? Posso ativar ambos pretty-control-l-modee whitespace-mode, e o comportamento que vejo para cada um parece normal. Talvez haja alguma configuração personalizada que você usa whitespace-styleou algo assim?

De qualquer forma, talvez ajude se você fizer uma alteração como essa em pretty-control-l-mode. Se sim, me avise e eu aplicareipp-c-l.el. (Para testar, defina a nova opção como 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))

ATUALIZADO para adicionar tópico de comentários, caso os comentários sejam excluídos em algum momento:

Aliás, eu me pergunto se a hierarquia de tabelas de exibição descrita no documento talvez não deva ser aplicada usando algum tipo de herança. Parece um pouco primitivo para um nível (por exemplo, janela) sombrear completamente um nível inferior (por exemplo, buffer). Você pode considerar enviar uma pergunta sobre isso para Mx report-emacs-bug. – Drew 24/09/2014 às 16:36

Pingue? Você poderia me informar se a alteração acima ajuda? THX. – Drew 14/10/2014 às 18:12

Acabei de ler esta resposta (faz um tempo que não entro nesta parte da Internet...). Vou verificar isso quando tiver oportunidade, talvez daqui a alguns dias ou mais. Voltarei com uma 'Resposta aprovada' (se funcionar) ou comentários (caso contrário), conforme apropriado, mais tarde. – Johan E 25/10/14 às 22:32

Editei a pergunta para adicionar uma receita mais detalhada para mostrar o problema. Eu estaria interessado se você obtivesse os mesmos resultados. --- Além disso, existe uma maneira de ocultar um arquivo .el instalado no sistema com um arquivo fornecido pelo usuário (sou apenas um “usuário”, não um programador lisp ...)? Eu realmente não estou com vontade de mexer nos arquivos instalados pelos pacotes deb. (É por isso que fiz a receita do problema antes de testar sua resposta...)

Cinco segundos depois de escrever o último comentário, percebi que poderia simplesmente colar o código emarranhare Cj execute-o para testar. (Não há necessidade de editar nenhum arquivo.) Os resultados: Funciona perfeitamente! Obrigado! (=> Resposta aceita) No entanto, ainda gostaria de saber se você obteve os mesmos resultados que obtive na minha receita do problema (antes de corrigir o código). –Johan E 27/10/14 às 1:09

Acabei de seguir sua nova receita e vi tudo que você descreveu (de forma tão clara). E então li o novo comentário que você acabou de adicionar. Fico feliz em saber que as coisas funcionam bem. Obrigado pelo seu feedback. – Drew 27/10/14 às 1:12

informação relacionada