Apakah ada cara untuk menonaktifkan peringatan "buffer is read-only"?

9

Saya tidak menemukan peringatan ini sangat membantu dan sangat mengganggu karena menyembunyikan teks saat ini di area gema sejenak. Tampaknya juga tidak perlu, karena bagaimanapun saya akan melihat bahwa saya tidak dapat menulis di area baca-saja. Apakah ada cara untuk menonaktifkannya?

Lenar Hoyt
sumber

Jawaban:

9

Ya, Anda dapat menonaktifkan pesan ini dengan mengatur command-error-functionke fungsi yang mengabaikan buffer-read-onlysinyal.

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

(Diuji menggunakan GNU Emacs 24.5.1.)

Constantine
sumber
Karena penasaran, bukankah mengganti command-error-functionnilai akan memengaruhi semua kesalahan, dan bukan hanya kesalahan "baca-saja buffer"? Saya tidak tahu persis apa dampak semua perubahan ini dari kode sumber.
Kaushal Modi
1
Ya tentu saja. Itulah mengapa saya memiliki (when ...)formulir dalam cuplikan kode: dengan cara ini sinyal yang tidak kami pedulikan diteruskan ke penangan default dan buffer-read-onlydiabaikan.
Constantine
Ah, saya benar-benar merindukan panggilan itu command-error-default-function.
Kaushal Modi
1
Manis, saya sudah mencari cara mudah untuk membuang sampah "Text-read-only" hanya di minibuffer dan ini yang berhasil.
whacka
1
@ mcb: Sejauh yang saya tahu tidak mungkin memisahkan area echo dan mini-buffer. Saya percaya bahwa jawaban philsyang Anda tautkan sudah benar, yaitu kita akan membutuhkan kode C baru untuk ini.
Constantine
3

Sumber kesalahan 'baca-saja buffer'

Saya percaya bahwa sumber kesalahan itu: Buffer is read-only: <#BUFFER-NAME>ada dalam kode sumber C.

Jadi solusi untuk ini adalah dengan mengubah kode sumber dan membangun emacs secara lokal dengan mengomentari baris khusus ini .

Untuk referensi, berikut adalah cuplikan kode yang menampilkan kesalahan itu:

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;

.. dan mengomentari xsignalkalimat itu harus melakukan trik.


Pendekatan yang Disarankan

Ada cara yang jauh lebih mudah untuk mencegah gangguan ini selama Anda bekerja di buffer read-only .. Anda untuk sementara waktu TIDAK membuatnya hanya-baca.

  • Melakukan M-x read-only-mode(terikat secara default ke C-x C-q) mengaktifkan buffer apa pun antara mode hanya baca dan mode yang dapat diedit.

Jadi jika Anda mendapatkan banyak kesalahan ini, cukup buat buffer untuk sementara dapat diedit dengan menekan C-x C-q.


Catatan peringatan: Melakukan peretasan sumber C bisa menjadi sumber utama kebingungan di masa depan. Jadi saya tidak akan melakukannya.

Kaushal Modi
sumber
1
Sejauh yang saya tahu (defun barf-if-buffer-read-only () nil)memiliki efek yang sama seperti mengomentari xsignal1panggilan dan membangun kembali Emacs. :-)
Constantine
@Constantine TIL yang kita dapat menimpa fungsi C di elisp. Terima kasih!
Kaushal Modi
Mengenai memodifikasi hal-hal menggunakan elisp: ini mengingatkan saya pada pertanyaan lama ini tentang nil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
Constantine