¿Hay alguna forma de deshabilitar la advertencia "el búfer es de solo lectura"?

9

No encuentro esta advertencia particularmente útil y bastante molesta porque oculta el texto actual en el área de eco por un breve momento. También parece innecesario, porque de todos modos notaré que no puedo escribir en áreas de solo lectura. ¿Hay alguna forma de desactivarlo?

Lenar Hoyt
fuente

Respuestas:

9

Sí, puede deshabilitar estos mensajes configurando command-error-functionuna función que ignore las buffer-read-onlyseñales.

(defun my-command-error-function (data context caller)
  "Ignore the buffer-read-only signal; pass the rest to the default handler."
  (when (not (eq (car data) 'buffer-read-only))
    (command-error-default-function data context caller)))

(setq command-error-function #'my-command-error-function)

(Probado con GNU Emacs 24.5.1.)

Constantina
fuente
Por curiosidad, ¿anular el command-error-functionvalor no afectará a todos los errores, y no solo a los errores de "solo lectura de búfer"? No puedo entender exactamente qué impacto tendrá todo este cambio del código fuente.
Kaushal Modi
1
Sí lo haría. Esa es exactamente la razón por la que tengo el (when ...)formulario en el fragmento de código: de esta manera, las señales que no nos importan se pasan al controlador predeterminado y buffer-read-onlyse ignoran.
Constantine
Ah OK, perdí totalmente esa llamada command-error-default-function.
Kaushal Modi
1
Dulce, he estado buscando una manera fácil de deshacerme de esa basura de "El texto es de solo lectura" solo en el minibúfer y esto funciona.
whacka
1
@mcb: Hasta donde yo sé, no es posible separar el área de eco y el minibúfer. Creo que la respuesta a la philsque vinculó es correcta, es decir, necesitaríamos un nuevo código C para esto.
Constantine
3

Origen del error 'solo lectura de búfer'

Creo que la fuente de ese error: Buffer is read-only: <#BUFFER-NAME>está en el código fuente C.

Entonces, la solución a esto sería ajustar el código fuente y construir emacs localmente comentando esta línea específica .

Como referencia, aquí está el fragmento de código que arroja ese error:

if (!NILP (BVAR (current_buffer, read_only))
    && NILP (Vinhibit_read_only)
    && NILP (Fget_text_property (pos, Qinhibit_read_only, Qnil)))
  xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
return Qnil;

.. y comentar esa xsignallínea debería hacer el truco.


Enfoque sugerido

Hay una manera mucho más fácil de evitar esta molestia durante el tiempo que trabaje en un búfer de solo lectura ... temporalmente NO puede hacerlo de solo lectura.

  • Hacer M-x read-only-mode(vinculado de forma predeterminada a C-x C-q) alterna cualquier búfer entre el modo de solo lectura y el modo editable.

Entonces, si está recibiendo muchos de estos errores, simplemente haga que el búfer sea editable temporalmente presionando C-x C-q.


Una nota de advertencia: Hacer el hackeo de la fuente C podría ser una fuente importante de confusión en el futuro. Entonces no lo haría.

Kaushal Modi
fuente
1
Por lo que puedo decir, (defun barf-if-buffer-read-only () nil)tiene el mismo efecto que comentar la xsignal1llamada y reconstruir Emacs. :-)
Constantine
@Constantine TIL que podemos anular las funciones de C en elisp. ¡Gracias!
Kaushal Modi
Con respecto a la modificación de cosas usando elisp: esto me recuerda a esta vieja pregunta sobre nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine