En Emacs, hay algunos casos en los que me gustaría evitar que aparezcan mensajes en el minibúfer, principalmente relacionados con "Principio / Fin del búfer" y "El texto es de solo lectura".
¿Hay alguna forma de evitar que estos mensajes aparezcan en el minibúfer?
Además, ¿hay alguna razón importante por la que no quiera deshabilitarlos? A primera vista, puedo ver fácilmente el número de fila y el estado de escritura del búfer en la línea de modo.
Respuestas:
En Emacs 25, puede suprimir los mensajes del minibúfer al vincular
inhibit-message
a un valor que no sea nulo:fuente
message1
llama la función Cmessage3
, respetar esta variable.(let ((inhibit-message t)) (message make-progress-reporter))
message
devuelve la cadena del mensaje, por lo que tal vez esté viendo la cadena devuelta al evaluar el código. Si evalúa este código en una combinación de teclas, no se imprimirá ningún mensaje (excepto en el búfer de Mensajes ).Puede especie de hacerlo desde el código Lisp. ¿Por qué "tipo de"? Debido a que MESSAGE es una primitiva, definida en C, en lugar de una función Lisp, y, según el manual de referencia de Emacs Lisp , las llamadas a primitivas desde el código C ignoran el consejo.
Por lo tanto, para realmente hacer un trabajo adecuado de implementación de la funcionalidad que desea, necesitaría redefinir la primitiva MENSAJE como una función Lisp; una vez que lo haya hecho, puede aconsejarlo con un código que obtenga la cadena que MENSAJE haría eco en el minibúfer, lo compara con una lista de mensajes que no desea ver y luego llama o no llama MENSAJE dependiendo en el resultado En teoría, esto podría lograrse, por ejemplo
(defvar *message-prim* (symbol-function 'message))
, y luego(defun message (format &rest args) ... (funcall *message-prim* format args))
, pero SYMBOL-FUNCTION dado un argumento primitivo devuelve algo que en realidad no es invocable, por lo que FUNCALL señala una condición de VOID-FUNCTION.Sin embargo, incluso si eso funcionara, todavía no funcionaría, porque redefinir una primitiva solo garantiza que la redefinición se utilizará cuando la función se llame desde el código Lisp; las llamadas en código C aún pueden usar la definición primitiva . (Es posible que el código C llame a Emacs Lisp, y tales casos verán la redefinición; también es posible, por supuesto, que el código C llame al código C, y estos casos verán la definición original).
Estoy contemplando vagamente parchear el código C y recompilar Emacs para proporcionar la funcionalidad adecuada de supresión de mensajes; Realmente no necesito esa funcionalidad, pero podría resultar un ejercicio interesante, especialmente porque no soy un hacker de C. Mientras tanto, he aquí algo que preparé y que, cuando lo coloco en un archivo, incluido en uno de sus archivos de inicio y personalizado a su gusto, suprimirá los mensajes que se originan en el código Lisp que coinciden exactamente con las cadenas que enumera para supresión. Mientras la supresión esté habilitada, estos mensajes nunca aparecerán en el minibúfer; también tiene la opción de suprimirlos del
*Messages*
búfer.He probado esto para que funcione con mensajes que en realidad se generan a partir del código Lisp, por ejemplo, la queja "No especificó una función" reflejada por DESCRIBE-FUNCTION cuando le da un argumento de cadena vacía. Desafortunadamente, los mensajes que menciona que desea suprimir, como "Inicio del búfer", "Fin del búfer" y "El texto es de solo lectura", parecen originarse en el código C, lo que significa que no podrá suprimirlos por este método.
Si alguna vez llego al parche de origen, (probablemente) estará en contra de Emacs 24.3 , y actualizaré esta respuesta con información sobre cómo usarlo.
fuente
En Emacs 25 y probablemente en algunas versiones anteriores, la forma más limpia de hacerlo es la siguiente:
Primero defina:
Luego, si desea suprimir todos los mensajes producidos por
some-function
usted, haga lo siguiente:Por ejemplo, suprimo el mensaje "Proceso de Ispell eliminado" producido por la función
ispell-kill-ispell
(enispell.el.gz
) escribiendo:Si alguna vez necesita volver a habilitar los mensajes, ejecute:
Algunas cosas a tener en cuenta:
1) Todos los mensajes producidos por
some-function
serán suprimidos al igual que todos los mensajes producidos por cualquier función de lisp a la que llame la función.2) Los mensajes producidos por el código C no se suprimirán, pero eso probablemente sea todo lo mejor.
3) Debe asegurarse de que
-*- lexical-binding: t -*-
esté contenido en la primera línea de su.el
archivo.Pero, ¿cómo saber qué función llama
message
? Podrías revisar el código como alguien más sugirió, pero es más fácil dejar que Emacs haga el trabajo por ti.Si define:
y luego hacer:
obtendrá una traza inversa agregada al mensaje. A partir de esto, puede ver fácilmente dónde se generó el mensaje.
Puedes revertir esto con:
Un enfoque alternativo sería aconsejar la
message
función y la prueba para ver si desea imprimir el mensaje o no. Esto es simple si el mensaje en cuestión es una cadena fija. Por ejemplo, para suprimir el "proceso de Ispell eliminado", podría definir:y luego hacer:
Este enfoque pronto se vuelve muy complicado si el mensaje es algo complicado.
fuente
Aparentemente, está solicitando una forma de inhibir selectivamente ciertos mensajes. La respuesta para eso es que necesitaría redefinir o aconsejar el código que emite esos mensajes en particular .
Para evitar todos los mensajes, por ejemplo, durante la duración de algún código, puede usar
flet
ocl-flet
redefinir la funciónmessage
localmente en (función)ignore
. O utilice la técnica utilizada enedt-electric-helpify
: guardar la definición original demessage
,fset
paraignore
,fset
volver a la definición original (aunque es mejor usarlaunwind-protect
si lo hace).fuente
grep
oA
en Dired. Busque el texto del mensaje de error en los archivos de origen de Emacs Lisp (y posiblemente también en los archivos de Emacs C, si los tiene disponibles). HTHEsto funciona para suprimir "Inicio del búfer" y "Fin del búfer" y no requiere emacs 25.
Inspirado en https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html pero usa "defadvice" para mayor compatibilidad.
fuente