Чи є спосіб відключити попередження "буфер лише для читання"?


9

Я не вважаю це попередження особливо корисним та досить відволікаючим, оскільки воно ненадовго приховує поточний текст у зоні ехо. Це також видається непотрібним, тому що я все-таки помічу, що я не можу писати в областях лише для читання. Чи є спосіб її відключити?

Відповіді:


9

Так, ви можете відключити ці повідомлення, встановивши command-error-functionфункцію, яка ігнорує buffer-read-onlyсигнали.

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

(Випробувано за допомогою GNU Emacs 24.5.1.)


З цікавості, чи не змінить command-error-functionзначення вплине на всі помилки, і не лише на помилки "буфера лише для читання"? Я не можу точно зрозуміти, що все це зміни вплине на вихідний код.
Каушал Моді

1
Так, було б. Саме тому я маю (when ...)форму в фрагменті коду: таким чином сигнали, які нас не цікавлять, передаються до обробника за замовчуванням і buffer-read-onlyігноруються.
Костянтин

Ну добре, я зовсім пропустив цей дзвінок command-error-default-function.
Каушал Моді

1
Солодко, я шукав простий спосіб позбутися від сміття "Текст лише для читання" лише у minibuffer, і це робить трюк.
whacka

1
@mcb: Наскільки я знаю, розділити область ехо та міні-буфер неможливо. Я вважаю, що відповідь, на philsяку ви посилалися, є правильною, тобто для цього нам знадобиться новий код C.
Костянтин

3

Джерело помилки "буфер лише для читання"

Я вважаю, що джерело цієї помилки: Buffer is read-only: <#BUFFER-NAME>у вихідному коді С.

Тож рішенням цього було б налаштувати вихідний код та створити emacs локально, коментуючи цей конкретний рядок .

Для довідки, ось фрагмент коду, який видаляє цю помилку:

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;

.. і коментуючи, що ця xsignalлінія повинна зробити трюк.


Запропонований підхід

Існує набагато простіший спосіб запобігти цьому роздратування протягом тривалості роботи в буфері лише для читання. Ви можете тимчасово НЕ робити його лише для читання.

  • Виконання M-x read-only-mode(зв'язане за замовчуванням до C-x C-q) перемикає будь-який буфер між режимом лише для читання та режимом для редагування.

Тож якщо у вас виникає багато цих помилок, просто зробіть буфер тимчасово редагованим, натискаючи C-x C-q.


Примітка попередження: Здійснення злому джерела C може стати головним джерелом плутанини в майбутньому. Тож я б цього не робив.


1
Наскільки я можу сказати, (defun barf-if-buffer-read-only () nil)має такий же ефект, як коментування xsignal1дзвінка та відновлення Emacs. :-)
Костянтин

@ Константин TIL, що ми можемо перекрити C функції в elisp. Дякую!
Каушал Моді

Щодо модифікації речей за допомогою elisp: це нагадує мені старе питання про nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Костянтин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.