Existe uma maneira de desativar o aviso "o buffer é somente leitura"?

9

Não acho esse aviso particularmente útil e bastante perturbador, pois oculta o texto atual na área de eco por um breve momento. Também parece desnecessário, porque notarei de qualquer maneira que não consigo escrever em áreas somente leitura. Há uma forma de desabilitá-lo?

Lenar Hoyt
fonte

Respostas:

9

Sim, você pode desativar essas mensagens configurando command-error-functionuma função que ignora buffer-read-onlysinais.

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

(Testado usando o GNU Emacs 24.5.1.)

Constantine
fonte
Por curiosidade, a substituição do command-error-functionvalor não afetará todos os erros, e não apenas os erros "somente leitura do buffer"? Não consigo descobrir exatamente o impacto de toda essa mudança no código-fonte.
Kaushal Modi
11
Sim, seria. É exatamente por isso que tenho o (when ...)formulário no trecho de código: dessa maneira, os sinais com os quais não nos importamos são passados ​​para o manipulador padrão e buffer-read-onlysão ignorados.
Constantine
Ah, ok, eu perdi totalmente essa ligação command-error-default-function.
Kaushal Modi
11
Doce, eu tenho procurado uma maneira fácil de me livrar desse lixo "O texto é somente leitura" apenas no minibuffer e isso faz o truque.
Whacka
11
@ MCB: Tanto quanto eu sei, não é possível separar a área de eco e mini-buffer. Acredito que a resposta philsque você ligou está correta, ou seja, precisaríamos de um novo código C para isso.
Constantine
3

Origem do erro 'buffer somente leitura'

Eu acredito que a fonte desse erro: Buffer is read-only: <#BUFFER-NAME>está no código fonte C.

Portanto, a solução para isso seria ajustar o código-fonte e criar o emacs localmente, comentando esta linha específica .

Para referência, aqui está o trecho de código que gera esse erro:

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 comentar essa xsignallinha deve fazer o truque.


Abordagem sugerida

Existe uma maneira muito mais fácil de evitar esse incômodo enquanto você estiver trabalhando em um buffer somente leitura. Você NÃO pode temporariamente torná-lo somente leitura.

  • Doing M-x read-only-mode(vinculado por padrão a C-x C-q) alterna qualquer buffer entre o modo somente leitura e o modo editável.

Portanto, se você estiver recebendo muitos desses erros, simplesmente torne o buffer temporariamente editável pressionando C-x C-q.


Uma nota de aviso: Fazer o hack da fonte C pode ser uma fonte importante de confusão no futuro. Então eu não faria isso.

Kaushal Modi
fonte
11
Até onde eu sei, (defun barf-if-buffer-read-only () nil)tem o mesmo efeito que comentar a xsignal1chamada e reconstruir o Emacs. :-)
Constantine
@ TIL constante que podemos substituir as funções C no elisp. Obrigado!
Kaushal Modi
Em relação a coisas modificando usando elisp: isso me lembra esta pergunta velha sobre nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine