ที่“ แก้ไขบัฟเฟอร์จริงๆ”, emacs เรียกใช้ ediff-current-file โดยอัตโนมัติหรือไม่?


12

บริบท

เมื่อ emacs ตรวจพบว่าไฟล์ถูกเปลี่ยนแปลงนอกบัฟเฟอร์การแก้ไข

ตั้งข้อสังเกต

emacs จะถาม:

ชื่อไฟล์บางส่วนเปลี่ยนไปในดิสก์; แก้ไขบัฟเฟอร์จริงเหรอ? (y, n, r หรือ Ch)

(บังเอิญบางครั้งมันเกิดขึ้นแม้ว่าจะไม่มีการเปลี่ยนแปลงจริงเช่นไฟล์ระยะไกลบนเซิร์ฟเวอร์ที่มีนาฬิกาลอย แต่คำถามนั้นน่าสนใจในทุกกรณี)

อยาก

emacs จะถาม:

ชื่อไฟล์บางส่วนเปลี่ยนไปในดิสก์; แก้ไขบัฟเฟอร์จริงเหรอ? (y, n, r, d หรือ Ch)

การกดdจะแสดงความแตกต่างระหว่างเวอร์ชันเช่นediff-current-fileที่อนุญาตให้เดินความแตกต่างแบบโต้ตอบ

ข้อมูลเพิ่มเติม

ซึ่งจะคล้ายกับสิ่งที่การจัดการแพ็คเกจ Debian ทำเมื่อตรวจพบว่าไฟล์ปรับแต่งที่ปรับแต่งในเครื่องได้รับการอัพเดตโดยแพ็คเกจที่เป็นเจ้าของเวอร์ชั่นใหม่กว่า สำหรับตัวอย่างดูไฟล์คอนฟิกูเรชัน / etc / default / grub เวอร์ชันใหม่พร้อมใช้งาน แต่เวอร์ชันที่ติดตั้งปัจจุบันถูกแก้ไขแบบโลคัล - Unix & Linux Stack Exchange

ค้นหาก่อนถาม

ฉันมักจะหาทางแก้ปัญหา (เช่นemacsclient - จากสคริปต์ภายนอกเปิดไฟล์และเรียกใช้นิพจน์อย่างง่าย ๆ ว่า emacs ทำงานอยู่หรือไม่ - Emacs Stack Exchange ) แต่หลังจากค้นหาสิ่งนี้ฉันไม่พบวิธีแก้ไขปัญหาที่มีอยู่ก่อน

ฉันจะพิจารณาปรับตัวเอง แต่ไม่เก่งพอใน emacs-lisp และ emacs internals

ร่างของการแก้ปัญหา

  • การกดปุ่มC-g'Mx ediff-current-file` จะทำงานโดยกดแป้นบางครั้ง
  • เป้าหมายที่นี่จะทำงานediff-current-fileบนปุ่มกดหนึ่งปุ่มที่พร้อมท์ด้านบน


@Gilles ขอบคุณ ใช่เกี่ยวข้องและแตกต่างกัน ลิงก์ของคุณเกี่ยวกับเวลาเปิดไฟล์ นี่เป็นเรื่องเกี่ยวกับการประหยัดเวลาไฟล์
Stéphane Gourichon

คำตอบ:


2

greppingสำหรับ "จริงๆแก้ไขบัฟเฟอร์" ในโปรแกรม emacs ผมพบว่าฟังก์ชั่นในแฟ้มask-user-about-supersession-threatuserlock.el

ดูเหมือนว่าตรงไปตรงมาเพื่อเพิ่มทางเลือกสำหรับการโทรd ediff-current-fileฉันยังไม่ได้ทดสอบสิ่งนี้อย่างกว้างขวาง แต่ (การแก้ไขที่ทำเครื่องหมายด้วย;;-ความคิดเห็น)

(defun ask-user-about-supersession-threat (fn)
  "Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
of the buffer will proceed, or it can (signal 'file-supersession (file)),
in which case the proposed buffer modification will not be made.

You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called."
  (discard-input)
  (save-window-excursion
    (let ((prompt
       (format "%s changed on disk; \
really edit the buffer? (y, n, r, d or C-h) " ;;- changed
           (file-name-nondirectory fn)))
      (choices '(?y ?n ?r ?d ?? ?\C-h))       ;;- changed
      answer)
      (while (null answer)
    (setq answer (read-char-choice prompt choices))
    (cond ((memq answer '(?? ?\C-h))
           (ask-user-about-supersession-help)
           (setq answer nil))
          ((eq answer ?r)
           ;; Ask for confirmation if buffer modified
           (revert-buffer nil (not (buffer-modified-p)))
           (signal 'file-supersession
               (list "File reverted" fn)))
          ((eq answer ?d)                     ;;- added
           (ediff-current-file))              ;;- added
          ((eq answer ?n)
           (signal 'file-supersession
               (list "File changed on disk" fn)))))
      (message
       "File on disk now will become a backup file if you save these changes.")
      (setq buffer-backed-up nil))))

ดูเหมือนว่าจะทำงานได้ดีกับ emacs 46.1 บน Ubuntu 16.04 ขอบคุณ!
Stéphane Gourichon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.