วิธีบันทึกบัฟเฟอร์อัตโนมัติเมื่อ Emacs หมดโฟกัส


26

ฉันเพิ่งมีผู้ใช้ Sublime Text ลองใช้ Emac สักพักหนึ่งและเขาก็สนใจที่จะรับพฤติกรรมการบันทึกอัตโนมัติแบบเดียวกันใน Emacs

โดยทั่วไปเขาต้องการให้บัฟเฟอร์ทั้งหมดถูกบันทึกเมื่อใดก็ตามที่เฟรมสูญเสียการโฟกัส (บันทึกไว้จริงๆไม่ใช่แค่สำรองข้อมูล) ซึ่งรวมถึงเมื่อเปลี่ยนหน้าต่างไปเป็นแอปพลิเคชันที่แตกต่างอย่างสิ้นเชิง

ฉันไม่พบเหตุการณ์ใด ๆ ที่เกิดขึ้นเมื่อเปลี่ยนเป็นแอปพลิเคชันอื่น มีเหตุการณ์ดังกล่าวหรือมีวิธีการอื่นเพื่อให้บรรลุพฤติกรรมเดียวกันได้หรือไม่

โปรดทราบว่าโซลูชันที่ใช้เวลาไม่เป็นที่พอใจและพฤติกรรมการสำรองข้อมูลอัตโนมัติเริ่มต้นก็ไม่เป็นเช่นนั้น เขาต้องการให้มีการบันทึกบัฟเฟอร์ (เช่นเดียวกับsave-buffer) สำหรับไฟล์ทั้งหมด

คำตอบ:


29

น่าเสียดายที่พฤติกรรมที่แน่นอนนี้เป็นไปไม่ได้ใน Emacs <= 24.3 แต่คุณสามารถบันทึกการเปลี่ยนแปลงของหน้าต่าง / บัฟเฟอร์โดยใช้defadvice(รายละเอียดในบล็อกของ bbatsov ):

(defadvice switch-to-buffer (before save-buffer-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))
(defadvice other-window (before other-window-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))

ใน Emacs 24.4 คุณจะสามารถบันทึกการสูญเสียการโฟกัสเฟรมได้ด้วยขอโฟกัสใหม่: (add-hook 'focus-out-hook 'save-buffer)(เพื่อบันทึกบัฟเฟอร์ที่ใช้งานอยู่) หรือ(add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(เพื่อบันทึกบัฟเฟอร์ที่เปิดอยู่ทั้งหมด)


1
คุณช่วยขยายdefadviceเวอร์ชั่นให้หน่อยได้ไหมในกรณีที่โพสต์บล็อกล่มหรืออะไรบางอย่าง? ขอบคุณ!
Tikhon Jelvis

น่าเสียดายที่โซลูชันในการบันทึกบัฟเฟอร์ที่มองเห็นในปัจจุบันไม่ใช่บัฟเฟอร์ทั้งหมด
b4hand

1
@ b4hand: ขออภัยไม่ทราบว่าเป็นสิ่งที่คุณต้องการ อัปเดตคำตอบแล้ว
shosti

1
@shosti โดยวิธีการขอบคุณที่ค้นหาลิงค์ไปยังบล็อกของ bbatsov สำหรับฉัน ฉันเคยพบวิธีแก้ปัญหานั้นมาก่อน แต่ไม่สามารถหามันได้อีก ฉันจะรวมว่าเป็นหนึ่งในโซลูชั่นที่ไม่ทำงานในคำถามของฉัน
b4hand

2
ฉันชอบทำวิธีนี้เพื่อหลีกเลี่ยงการ truffing minibuffer (ให้อภัยการจัดรูปแบบ): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas

6

นอกจากนี้focus-autosave-modeในขณะนี้ มันสามารถใช้ได้ผ่าน MELPA ทำไมไม่เปิดโอกาสให้แฮ็คข้อมูลเพื่อคุณ‽


สวัสดีมันทำงานอย่างไร ฉันติดตั้งแล้ว แต่มันใช้งานไม่ได้
Asme เพียง

@ Asme เพียงแค่ฉันไม่ได้ใช้ตอนนี้ลองถามตัวติดตามปัญหาที่นี่: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov

ปัจจุบันคุณใช้ทางเลือกหรืออะไรทำนองนั้น?
Asme เพียง

ไม่ฉันไม่ได้ใช้อะไรแบบนั้นในตอนนี้
Mark Karpov

แต่คุณยังคงใช้ Emacs อยู่ใช่ไหม?
Asme เพียง

3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

วิธีนี้จะบันทึกไฟล์การเยี่ยมชมบัฟเฟอร์ที่ไม่ได้บันทึกทั้งหมดใน emacs 24.4


2
อย่าใช้เบ็ดใช้add-to-list add-hookคำตอบของ shosti มีรูปแบบที่ถูกต้องของตัวอย่างนี้แล้ว
Gilles 'หยุดชั่วร้าย'

1

สำหรับผู้หลงทางที่สะดุดผมใช้แบบฟอร์มนี้:

(eval-when-compile (require 'cl-lib))
;; [...]
(add-hook 'focus-out-hook
  (lambda ()
    (cl-letf (((symbol-function 'message) #'format))
      (save-some-buffers t))))

การใช้งานของข้อความที่cl-letfน่ารำคาญ(No files need saving)จากการอุดตันพื้นที่เสียงสะท้อนของคุณ

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