มีวิธีปิดใช้งานคำเตือน“ บัฟเฟอร์เป็นแบบอ่านอย่างเดียว” หรือไม่?


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ค่าจะส่งผลกระทบต่อข้อผิดพลาดทั้งหมดและไม่ใช่เพียงข้อผิดพลาด "บัฟเฟอร์อ่านอย่างเดียว"? ฉันไม่สามารถทราบได้อย่างชัดเจนว่าการเปลี่ยนแปลงนี้จะมีผลกระทบอะไรกับซอร์สโค้ด
Kaushal Modi

1
ใช่มันจะ นั่นเป็นสาเหตุที่ฉันมี(when ...)แบบฟอร์มในโค้ดขนาดสั้น: วิธีนี้สัญญาณที่เราไม่สนใจจะถูกส่งผ่านไปยังตัวจัดการเริ่มต้นและbuffer-read-onlyถูกละเว้น
Constantine

Ah command-error-default-functionตกลงฉันทั้งหมดไม่ได้รับสายที่
Kaushal Modi

1
น่ารักฉันกำลังมองหาวิธีที่ง่ายในการกำจัดขยะ "ข้อความเป็นแบบอ่านอย่างเดียว" ในรถมินิบัสเท่านั้นและนี่เป็นกลอุบาย
whacka

1
@mcb: เท่าที่ฉันรู้ว่ามันเป็นไปไม่ได้ที่จะแยกพื้นที่ echo และ mini-buffer ฉันเชื่อว่าคำตอบphilsที่คุณเชื่อมโยงนั้นถูกต้องคือเราต้องการรหัส C ใหม่สำหรับสิ่งนี้
Constantine

3

แหล่งที่มาของข้อผิดพลาด 'บัฟเฟอร์อ่านอย่างเดียว'

ฉันเชื่อว่าแหล่งที่มาของข้อผิดพลาดนั้น: Buffer is read-only: <#BUFFER-NAME>อยู่ในรหัสที่มา C

ดังนั้นวิธีการนี้จะเป็นแหล่งที่มาของการปรับแต่งรหัสและสร้าง 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 ใหม่ :-)
Constantine

@Constantine TIL ที่เราสามารถแทนที่ฟังก์ชัน C ใน elisp ขอบคุณ!
Kaushal Modi

เกี่ยวกับสิ่งที่ปรับเปลี่ยนการใช้ Elisp: นี้ทำให้ผมนึกถึงคำถามเดิมเกี่ยวกับnil: emacs.stackexchange.com/questions/2935/how-can-i-bring-back-nil
คอนสแตนติ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.