เมื่อทำงานในโครงการภายใต้การควบคุมเวอร์ชันด้วย git ฉันมักจะต้องการทำบางสิ่งในเชลล์ที่ส่งผลกระทบต่อไฟล์ที่เปิดอยู่ของฉันหลาย ๆ ครั้งจากนั้นย้อนกลับบัฟเฟอร์ทุกอันที่ฉันเปิดไว้เพื่อให้แน่ใจว่าฉันจะไม่ปิดบังเวอร์ชันใหม่โดยไม่ตั้งใจ ด้วยสิ่งที่ฉันได้เปิด ฉันรู้ว่าmagit
มีประโยชน์ที่นี่ แต่ฉันคุ้นเคยกับเวิร์กโฟลว์ของฉันในเชลล์และฉันต้องการเก็บไว้ใช้ตอนนี้ ดังนั้นฉันต้องการที่จะคืนค่าบัฟเฟอร์ที่เปิดอยู่ทั้งหมดและอาจปิดรายการที่หยุดอยู่แล้ว (เช่นเนื่องจากgit checkout
สาขาที่ไม่มีไฟล์นั้นอีกต่อไป)
ฉันมีตัวอย่างของ elisp ต่อไปนี้ที่ฉันคว้ามาจากการค้นหาของ Google:
(defun revert-all-buffers ()
"Refreshes all open buffers from their respective files"
(interactive)
(let* ((list (buffer-list))
(buffer (car list)))
(while buffer
(when (and (buffer-file-name buffer)
(not (buffer-modified-p buffer)))
(set-buffer buffer)
(revert-buffer t t t))
(setq list (cdr list))
(setq buffer (car list))))
(message "Refreshed open files"))
แต่พักนี้ถ้ามันจะกระทบข้อผิดพลาดในหนึ่งเปิดไฟล์ของฉันคือเมื่อย้อนกลับB1
, B2
, B3
, ... , Bn
ข้อผิดพลาดขณะพยายามที่จะย้อนกลับไปB2
ป้องกันB3
- Bn
จากการหวนกลับ
ฉันจะบอก emac ให้ละเว้นข้อผิดพลาดที่ปรากฏขึ้นในกรณีนี้ได้อย่างไร ฉันไม่ต้องการใช้global-auto-revert-mode
เพราะการย้อนกลับแต่ละครั้งก่อให้เกิดสิ่งที่หนักหน่วงเช่นตัวตรวจสอบการเติมข้อมูลอัตโนมัติและตัวตรวจสอบไวยากรณ์ของฉันทำการแยกวิเคราะห์ไฟล์อีกครั้งการแขวน emacs เป็นครั้งที่สอง
C-x s
"file no longer exists"
.. aha! เวอร์ชันของฉันแก้ไขได้ที่ :) จะโพสต์ในไม่ช้า
B2
บัฟเฟอร์ในตัวอย่างของคุณ ฉันใช้ฟังก์ชั่นที่คล้ายกันมาก (น่าจะมาจากตัวอย่างนี้) และใช้งานได้ดี