Enviar salida de proceso a * Mensajes * búfer, pero omitir el área de eco

9

¿Es posible enviar la salida de un filtro de proceso al *Messages*búfer y suprimir que la salida del mensaje aparezca en el área de eco, de modo que pueda usar simultáneamente comandos interactivos sin que la minibuffer-promptsalida del filtro de subpresión en curso lo borre?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

EDITAR (3 de enero de 2015): el siguiente es un enlace a una pregunta similar, sin embargo, aún no he podido hacer que funcione con una cadena de proceso donde la cadena exacta es desconocida; el título del hilo es: Emacs - Deshabilitar algunos mensajes de minibúfer :

/superuser/669701/emacs-disable-some-minibuffer-messages

lista de leyes
fuente
No creo que puedas. ¿Por qué no simplemente iniciar sesión en un búfer diferente? Eso es lo que hacen la mayoría de los modos que se ocupan de procesos ...
lunaryorn
@lunaryorn: gracias por la sugerencia: un búfer dedicado es una opción válida para resolver el problema. Hay algunas salidas de proceso que tengo una preferencia personal para ser enviadas al *Messages*búfer: uno de ellos es la sincronización de proyectos relacionados. Todavía hay un par de cosas que no he probado ( porque pensé que podría haber una solución integrada ), como hacer que el *Messages*búfer se pueda escribir temporalmente inhibit-read-onlyy usarlo inserten point-max- No sé si eso aparecerá en el área del eco también. Trabajaré en ello de nuevo esta noche. . .
leyes el
Una nota de interés es que las funciones C para la mensajería están muy separadas por preocupaciones de "eco" y "registro", pero esa distinción no está expuesta a elisp. Tal vez podría M-x report-emacs-bugy solicitar esto como una característica?
phils
@phils | @lunaryorn: pude lograr el efecto deseado mediante el uso (let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))y publiqué un borrador de respuesta, que será elegible para aceptación después de que haya transcurrido el período de espera obligatorio en la propia pregunta del usuario. Presenté una solicitud de función con report-emacs-bug: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495
lawlist el
lista de leyes: no iba a sugerir ese enfoque porque podría entrar en conflicto con la lógica para manejar mensajes duplicados, etc. (Pero también podría estar bien; en realidad no lo sé). Probablemente debería usar (messages-buffer)para obtener el búfer , si sigue con este método, y tenga en cuenta que (point-max)no siempre será el comienzo de una nueva línea (por ejemplo, uso C-g).
phils

Respuestas:

3

Puede suprimir la visualización en el minibúfer configurando minibuffer-message-timeouta 0.

Por ejemplo, uso algo como esto en algunos lugares donde quiero alternar un modo menor mientras estoy en un indicador de minibúfer (como ido find-file) sin ser interrumpido por un mensaje de 'modo habilitado':

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))
glucas
fuente
Gracias por la sugerencia; sin embargo, esto no logró el efecto deseado. La impresión de salida del proceso en curso con (let ((minibuffer-message-timeout 0)) (message "%s" string))pantallas fijas en el área de eco / minibúfer al escribir funciones interactivas como execute-extended-commando switch-to-buffer-other-window, es decir, el mensaje y las finalizaciones sugeridas se borran con los mensajes de salida del proceso.
leyes el
3

Primer borrador preliminar (3 de enero de 2015): borrador inicial revisado basado en el útil comentario de @phils sobre el uso de la función messages-bufferpara localizar o crear el búfer apropiado (y ponerlo en messages-buffer-mode); y, agregó una verificación de si point-maxestá al comienzo de la línea (si no, inserte una nueva línea antes de insertar la cadena del mensaje).

EDITAR (4 de enero de 2015): hay situaciones en las que la cadena insertada no necesariamente termina en una nueva línea, y la función messageno tiene una comprobación para asegurarse de que está al comienzo de una nueva línea, por lo que nos ocupamos de eso en esta función Por lo tanto, en cualquier punto cuando messageinserte una nueva línea, dicha línea comenzará a la izquierda del búfer.

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))
lista de leyes
fuente
2

Ir a través de la cadena de documentos messageparece que debería ser posible lograr lo que desea llamando al mensaje con un nilargumento inmediatamente después de llamar messagecon el contenido deseado. De la cadena de documentos demessage

Si el primer argumento es nulo o la cadena vacía, la función borra cualquier mensaje existente; esto permite que se muestre el contenido del minibúfer.

Entonces, modificar su función a algo como lo siguiente debería funcionar

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

Lo probé haciendo lo siguiente

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

Y parece funcionar

Iqbal Ansari
fuente
Gracias por la sugerencia. Esta idea, cuando se prueba con una salida del proceso en ejecución en el *Messages*búfer y luego se llama al comando interactivo execute-extended-command, muestra lo siguiente: el mensaje interactivo (es decir, M-xy cualquier finalización parcial) y la salida del proceso, es decir, los dos cambian y hacia adelante a la velocidad de la luz, pero el parpadeo entre los dos es perceptible. Este parece ser el caso porque el proceso particular en cuestión es escupir constantemente nuevos mensajes, y ese nuevo mensaje se muestra durante una fracción de segundo en el área de eco.
leyes el