A veces quiero mostrar información en el estilo del búfer de ayuda, por lo que he estado usando un código como este:
(with-help-window (help-buffer)
(princ "Type q to exit this help buffer.\n\n")
(princ result))
Esto funciona bien, pero la ventana de ayuda solo usa la mitad de mi marco. Normalmente divido mi marco horizontalmente, para dar dos ventanas altas. El búfer de ayuda que se muestra utiliza una de las dos ventanas.
Preferiría usar todo el marco en algunos casos, para mostrar más información y reducir la cantidad de veces que necesito desplazarme por la información mostrada. El problema a resolver es cómo usar temporalmente el marco completo para la with-help-window
llamada y restaurar automáticamente los tampones / tamaños de ventana originales cuando escribo "q" en la ventana de ayuda.
¿Cómo puedo lograr mejor este objetivo? Creo que estoy buscando algo como esto:
(with-FULL-FRAME-help-window (help-buffer)
...)
He examinado el modo ganador, marcadores, guardar diseños en registros, los diversos (y potentes, pero complejos) (display-buffer ...)
métodos. La mayoría de ellos parecen ligeramente desviados de mi intención deseada porque tienden a corregir / restaurar un diseño después de una operación de visualización de fotograma completo. Y me parece que muchos de ellos requieren que restaure manualmente el diseño de mi ventana (lo que preferiría no hacer).
Me pregunto si alguien ha oído hablar de una manera de resolver esto simplemente. Espero algo simple como estos posibles enfoques, donde puedo anular algo con un marco let ...
(let ((help-window-width-display-option fullwidth))
(with-help-window (help-buffer)
...))
O este tipo de enfoque, que aún no sé cómo hacer, y que parece un tanto difícil / complicado para mi nivel de habilidad actual.
(let ((save original configuration somehow)
(delete-other-windows)
(with-help-window (help-buffer)
...)
;; somehow, when I type "q" in the help buffer
;; - catch that action in code after the buffer is killed
;; - and restore the original window configuration
)
Me parece que el problema clave que debo resolver es cómo restaurar automáticamente la configuración original de la ventana cuando escribo "q" en el búfer temporal del modo de ayuda. Gracias
display-buffer-pop-up-frame
: gnu.org/software/emacs/manual/html_node/elisp/… Otra idea sería emitir unmake-frame
tiempo usandodisplay-buffer
una función personalizada para apuntar a ese nuevo marco. Si está interesado en localizar y orientar un marco existente, eche un vistazo a este ejemplo: stackoverflow.com/questions/18346785/…display-buffer-pop-up-frame
, ya que está bastante cerca de lo que busco. Pero ... el marco aparece en otro lugar (no mi marco actual), y debo enviarlo con cmd-w, no "q" en estilo de ayuda. Guardar / restaurar configuraciones de ventana no es el problema subyacente. Actualmente me estoy inclinando hacia la clonación y la modificación de la fuente de la ventana con ayuda para darle una opción que pueda vincular o envolver con un defmacro o algo así. Sonrío por lo exigentes que somos las personas de emacs que queremos exactamente lo que queremos de Emacs.help-return-method
,quit-window
elquit-restore
parámetro de ventana, y probablemente algún código personalizado para set / usar todas esas cosas para crear el efecto deseado.Respuestas:
Ejemplo # 1 : El atajo de teclado
q
en elhelp-mode
búfer proviene delspecial-mode-map
que está incorporado en elhelp-mode-map
. El valor predeterminado esquit-window
, que ofrece solo cuatro (4) acciones posibles: " De acuerdo con la información almacenada en elquit-restore
parámetro de ventana de WINDOW, (1) elimine WINDOW y su marco, (2) elimine WINDOW, (3) restaure el búfer mostrado previamente en WINDOW , o (4) hacer que WINDOW muestre algún otro búfer que el actual. Si no es nulo, restablezca elquit-restore
parámetro a nil. "[Ver doc-string:M-x describe-function RET quit-window RET
]Aquí hay un resumen de lo que hace este ejemplo:
Vincular la variable
help-window-select
at
para que*Help*
se seleccione la ventana.Enlace la configuración de la ventana actual a una variable temporal llamada
config
.Genera la
*Help*
ventana.Almacene la configuración de ventana anterior
config
- en una variable local llamadamy-stored-win-config
.Cree una asignación de clave local para la letra
q
, que está vinculadamy-restore-win-config
. [Esta asignación local triunfa / sombrea la asignación anterior dequit-window
.]Eliminar otras ventanas.
Presione la letra
q
para restaurar la configuración de la ventana anterior y elimine el*Help*
búfer.El siguiente fragmento es un uso de muestra, pero no es una función interactiva completa. Se puede evaluar en el
*scratch*
búfer para verlo en acción.Ejemplo # 2 :
Aquí hay una macro autónoma que hace todo como el ejemplo anterior, que trata con tres situaciones posibles relacionadas con los valores de enlace existentes, por ejemplo
nil
, símbolo o lista de símbolos.Y aquí está el fragmento de muestra para evaluar en el
*scratch*
búfer.fuente
my-help-quit
función, al intentar volver a vincular la clave del mapa de ayuda dentro dewith-help-window
. Pero no estaba funcionando. Ahora veo que vincula la clave dentro del búfer de Ayuda (no en la ventana de Ayuda como estaba haciendo) después de configurar el búfer. Supongo que mi enlace fue golpeado por la configuración del búfer. Una lección aprendida. Todo está funcionando ahora. Muchas gracias.*Help*
búfer antes de que finalice: eltemp-buffer-window-setup-hook
que se ejecutahelp-mode-setup
y luego cualquier otra cosa ya asignada previamente al gancho; y, luego, eltemp-buffer-window-show-hook
que se ejecutahelp-mode-finish
y todo lo que ya se haya asignado previamente al gancho.help-mode-setup
debe permanecer primero en el tiempo, pero puede agregar algo detrás uniendo cualquiera de esos ganchos antes mencionados con cosas personalizadas. En ese escenario, no lo necesitaríaswith-current-buffer
.help-mode-setup
yhelp-mode-finish
, pero ambos corrieron antes de que se mostrara el búfer. El problema clave era redirigir la combinación de teclas "q", y usted me mostró cómo hacerlo en el búfer (no en la ventana, que estaba tratando de hacer). PD. Traté de escribir una solución como(defmacro with-full-frame-help-window
, pero la macro todavía requiere una función separada para manejar la "q" y la acción de restauración de la ventana. Publicaré mis funciones completadas a continuación.... (kill-buffer (current-buffer))))))
. La macro tomó un nombre de búfer como argumento y eliminó " Ayuda ", por lo que podría haber un problema si la persona que llama utilizara un búfer cuyo nombre fuera diferente. Modifiqué mi macro para eliminar elbuffer-name
parámetro y generé / eliminé el mismo búfer dentro del defmacro.Basado en la excelente respuesta de @lawlist, aquí están mis funciones completas para el próximo tipo ...
La larga cadena de comentarios anteriores, con la ayuda continua de @lawlist, dio como resultado esta versión de una macro que no requiere un nombre de búfer, trata adecuadamente las listas de enlace de configuración / show originales, y eso no causa problemas con el "q "en otros buffers del modo Ayuda .
Use la macro de esta manera:
fuente