Czy istnieje sposób na wyłączenie ostrzeżenia „bufor jest tylko do odczytu”?

9

Nie uważam tego ostrzeżenia za szczególnie pomocne i dość rozpraszające, ponieważ ukrywa na chwilę bieżący tekst w obszarze echa. Wydaje się również niepotrzebne, ponieważ i tak zauważę, że nie mogę pisać w obszarach tylko do odczytu. Czy istnieje sposób, aby to wyłączyć?

Lenar Hoyt
źródło

Odpowiedzi:

9

Tak, możesz wyłączyć te komunikaty, ustawiając command-error-functionfunkcję ignorującą buffer-read-onlysygnały.

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

(Testowane przy użyciu GNU Emacs 24.5.1.)

Konstantyn
źródło
Z ciekawości, czy nadpisanie command-error-functionwartości nie wpłynie na wszystkie błędy, a nie tylko na błędy „tylko do odczytu”? Nie mogę dokładnie ustalić, na co ta zmiana wpłynie z kodu źródłowego.
Kaushal Modi
1
Tak, to by było. Właśnie dlatego mam (when ...)formularz we fragmencie kodu: w ten sposób sygnały, które nas nie obchodzą, są przekazywane do domyślnego modułu obsługi i buffer-read-onlysą ignorowane.
Constantine
Ach OK, całkowicie przegapiłem to połączenie z command-error-default-function.
Kaushal Modi
1
Słodko, szukałem łatwego sposobu na pozbycie się śmieci „Tekst tylko do odczytu” tylko w minibuforze i to załatwia sprawę.
whacka
1
@mcb: O ile mi wiadomo, nie można oddzielić obszaru echa od mini-bufora. Uważam, że odpowiedź, philsktórą podałeś, jest poprawna, tzn. Potrzebowalibyśmy do tego nowego kodu C.
Constantine
3

Źródło błędu „bufor tylko do odczytu”

Uważam, że źródło tego błędu: Buffer is read-only: <#BUFFER-NAME>znajduje się w kodzie źródłowym C.

Rozwiązaniem tego byłoby ulepszenie kodu źródłowego i zbudowanie emacsa lokalnie, komentując ten konkretny wiersz .

W celach informacyjnych fragment kodu generujący ten błąd:

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;

.. i komentowanie tej xsignallinii powinno załatwić sprawę.


Sugerowane podejście

Jest o wiele łatwiejszy sposób na uniknięcie tego rozdrażnienia na czas pracy w buforze tylko do odczytu. Nie możesz tymczasowo ustawić go jako tylko do odczytu.

  • Wykonanie M-x read-only-mode(domyślnie ograniczone do C-x C-q) przełącza dowolny bufor między trybem tylko do odczytu a trybem edytowalnym.

Więc jeśli otrzymujesz wiele tych błędów, po prostu włącz tymczasową edycję bufora, naciskając C-x C-q.


Uwaga: Wykonanie włamania do źródła C może być poważnym źródłem zamieszania w przyszłości. Więc nie zrobiłbym tego.

Kaushal Modi
źródło
1
O ile mi wiadomo, (defun barf-if-buffer-read-only () nil)ma taki sam efekt jak skomentowanie xsignal1połączenia i przebudowanie Emacsa. :-)
Constantine
@ Constantine TIL, że możemy przesłonić funkcje C w elisp. Dzięki!
Kaushal Modi
Jeśli chodzi o modyfikowanie rzeczy za pomocą elisp: przypomina mi to stare pytanie na temat nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine