En Emacs;
¿Hay alguna manera de que ambos window-display-table
tengan buffer-display-table
efecto al mismo tiempo?
La razón es que estoy usandoBonito-Control-L(deEmacs Goodies Elpaquete de script) yespacio en blanco(de whitespace.el
, creo que está en la distribución base de Emacs, pero no estoy seguro).
- Bonito-Control-Lvisualiza los avances de formulario (
^L
) de forma personalizada, configurando la entrada paraC-l
en la ventana localwindow-display-table
. - Espacio en blancovisualiza espacios, tabulaciones y nuevas líneas estableciendo entradas en el búfer local
buffer-display-table
. (y también mediante el uso defont-lock
la funcionalidad).
Estos usan choques (o más bien, el uso de a window-display-table
y buffer-display-table
choques) ya que, si window-display-table
no lo es, nil
anula completamente cualquiera buffer-display-table
para cualquier búfer que se muestre en esa ventana.
Cita de laEmacs Lispmanual:
38.21.2 Tabla de visualización activa
Cada ventana puede especificar una tabla de visualización, al igual que cada búfer. Cuando se muestra un búfer B en la ventana W, la visualización utiliza la tabla de visualización de la ventana W si tiene una;de lo contrario, la tabla de visualización para el búfer B si la tiene; en caso contrario, la tabla de visualización estándar, si la hubiera. La tabla de visualización elegida se denomina tabla de visualización "activa".
[...]
(énfasis mío)
Entonces, ¿existe alguna forma sencilla de consolidar esto? ¿O es la única forma de recodificar uno de ellos para utilizar el mismo mecanismo que el otro?
He estado considerando escribir una variante burda pequeña (es decir, incluso más pequeña) de la visualización de avance de formulario compatible con la visualización de espacios en blanco que solo usa algún gancho de carga de búfer (u otro) para colocar una entrada codificada en ^L
el buffer-display-table
. Pero me gustaría saber si existe alguna alternativa más sencilla.
EDITAR:Para aclarar el problema, aquí hay un extracto de una sesión "Interactive Lisp" anotada (es decir, del *scratch*
búfer). Esto muestra los comandos y su salida, y está anotado con los efectos:
;; 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.
Respuesta1
Perdón por tu problema. No veo el problema que informas, siguiendo tu receta. ¿Quizás la descripción no está completa? Puedo activar ambos pretty-control-l-mode
y whitespace-mode
y el comportamiento que veo para cada uno parece normal. ¿Quizás hay alguna configuración personalizada que utilizas whitespace-style
o algo así?
De todos modos, tal vez sería útil realizar un cambio como este en pretty-control-l-mode
. Si es así avísame y lo aplicarépp-c-l.el
. (Para probar, configure la nueva opción en 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))
ACTUALIZADO para agregar hilo de comentarios, en caso de que los comentarios se eliminen en algún momento:
Por cierto, me pregunto si la jerarquía de tablas de visualización descrita en el documento quizás no debería aplicarse mediante herencia de algún tipo. Parece un poco primitivo que un nivel (por ejemplo, ventana) sombree completamente un nivel inferior (por ejemplo, búfer). Podría considerar enviar una pregunta sobre esto a Mx report-emacs-bug. – Drew el 24 de septiembre, 2014 en el 06:36
¿Silbido? ¿Podría informarme si el cambio anterior ayuda? Gracias. – Drew el 14 de octubre, 2014 en el 08:12, el autor
Acabo de leer esta respuesta (no he estado en esta parte de Internet por un tiempo...). Lo comprobaré cuando llegue el momento, quizás dentro de unos días. Volveré con una 'Respuesta aprobada' (si funciona) o comentarios (en caso contrario), según corresponda, más tarde. – Johan E el 25 de octubre, 2014 en el 02:32, el autor Johan E.
Edité la pregunta para agregar una receta más completa para mostrar el problema. Me interesaría si obtienes los mismos resultados. --- Además, ¿hay alguna manera de copiar un archivo .el instalado en el sistema con uno proporcionado por el usuario (realmente soy solo un “usuario”, no un programador lisp...)? Realmente no tengo ganas de jugar con los archivos instalados por los paquetes deb. (Es por eso que hice la receta del problema antes de probar tu respuesta...) – Johan E 27 oct. 2014, 01:02
Cinco segundos después de escribir el último comentario me di cuenta de que podía simplemente pegar el código enrascary Cj-ejecútelo para probar. (No es necesario editar ningún archivo). Los resultados: ¡Funciona de maravilla! ¡Gracias! (=> Respuesta aceptada) Sin embargo, todavía me gustaría saber si obtienes los mismos resultados que yo con mi receta de problema (antes de parchear el código). – Johan E el 27 de octubre, 2014 en el 01:09
Simplemente seguí tu nueva receta y vi todo lo que describiste (con mucha claridad). Y luego leí el nuevo comentario que acabas de agregar. Me alegra saber que todo funciona bien. Gracias por sus comentarios. – Drew el 27 de octubre, 2014 en el 01:12