C'è un modo per disabilitare l'avviso "buffer è di sola lettura"?


9

Non trovo questo avviso particolarmente utile e piuttosto distratto perché nasconde il testo corrente nell'area dell'eco per un breve momento. Sembra anche inutile, perché noterò comunque che non riesco a scrivere in aree di sola lettura. C'è un modo per disabilitarlo?

Risposte:


9

Sì, è possibile disabilitare questi messaggi impostando command-error-functionuna funzione che ignora i buffer-read-onlysegnali.

(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)

(Testato usando GNU Emacs 24.5.1.)


Per curiosità, l'override del command-error-functionvalore non influirà su tutti gli errori e non solo sugli errori "buffer di sola lettura"? Non riesco a capire esattamente quale impatto avrà questo cambiamento sul codice sorgente.
Kaushal Modi,

1
Sì, lo sarebbe. Questo è esattamente il motivo per cui ho il (when ...)modulo nello snippet di codice: in questo modo i segnali che non ci interessano vengono passati al gestore predefinito e buffer-read-onlyvengono ignorati.
Costantino,

Ah OK, ho perso totalmente quella chiamata command-error-default-function.
Kaushal Modi,

1
Dolce, ho cercato un modo semplice per sbarazzarmi di quella spazzatura "Il testo è di sola lettura" solo nel minibuffer e questo fa il trucco.
whacka,

1
@mcb: per quanto ne so non è possibile separare l'area di eco e il mini-buffer. Credo che la risposta a philscui ti sei collegato sia corretta, cioè avremmo bisogno di un nuovo codice C per questo.
Costantino,

3

Origine dell'errore "sola lettura buffer"

Credo che la fonte di quell'errore: Buffer is read-only: <#BUFFER-NAME>sia nel codice sorgente C.

Quindi la soluzione sarebbe quella di modificare il codice sorgente e creare emacs localmente commentando questa riga specifica .

Per riferimento, ecco lo snippet di codice che genera quell'errore:

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;

.. e commentare quella xsignalriga dovrebbe fare il trucco.


Approccio suggerito

C'è un modo molto più semplice per evitare questo fastidio per la durata in cui lavori in un buffer di sola lettura. Non puoi temporaneamente NON renderlo di sola lettura.

  • Doing M-x read-only-mode(associato per impostazione predefinita a C-x C-q) attiva o disattiva qualsiasi buffer tra la modalità di sola lettura e la modalità modificabile.

Quindi, se si verificano molti di questi errori, è sufficiente rendere temporaneamente modificabile il buffer premendo C-x C-q.


Una nota di avvertimento: fare l'hack della fonte C potrebbe essere una fonte di grande confusione in futuro. Quindi non lo farei.


1
Per quanto ne so, (defun barf-if-buffer-read-only () nil)ha lo stesso effetto di commentare la xsignal1chiamata e ricostruire Emacs. :-)
Costantino,

@Constantine TIL che possiamo ignorare le funzioni C in elisp. Grazie!
Kaushal Modi,

Per quanto riguarda la modifica delle cose usando elisp: questo mi ricorda questa vecchia domanda su nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Costantino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.