Bagaimana cara menyimpan buffer secara otomatis saat Emacs kehilangan fokus?

26

Baru-baru ini saya memiliki pengguna Teks Sublime mencoba Emacs untuk sementara waktu, dan dia tertarik untuk mendapatkan perilaku simpan otomatis yang sama di Emacs.

Pada dasarnya, dia ingin semua buffer diselamatkan setiap kali frame kehilangan fokus (benar-benar disimpan, bukan hanya didukung). Ini termasuk ketika beralih windows ke aplikasi yang sama sekali berbeda.

Saya tidak dapat menemukan peristiwa apa pun yang dipicu saat beralih ke aplikasi lain. Apakah ada kejadian seperti itu atau ada cara lain untuk mencapai perilaku yang sama?

Catatan solusi berbasis waktu tidak memuaskan, dan tidak juga perilaku cadangan otomatis default. Dia secara khusus ingin buffer disimpan (seperti dalam save-buffer) untuk semua file.

B4 tangan
sumber

Jawaban:

29

Sayangnya, perilaku pasti ini tidak dimungkinkan di Emacs <= 24.3, tetapi Anda dapat menghemat menggunakan perubahan jendela / buffer defadvice(seperti yang dijelaskan di blog 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)))

Di Emacs 24.4, Anda juga dapat menghemat kehilangan fokus bingkai berkat kait fokus baru : (add-hook 'focus-out-hook 'save-buffer)(untuk menyimpan buffer aktif) atau (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(untuk menyimpan semua buffer terbuka).

shosti
sumber
1
Bisakah Anda memperluas sedikit pada defadviceversi, kalau-kalau posting blog turun atau sesuatu? Terima kasih!
Tikhon Jelvis
Sayangnya, solusi itu menyimpan buffer yang saat ini terlihat, tidak semua buffer.
b4hand
1
@ b4hand: Maaf, tidak menyadari itu yang Anda inginkan. Jawaban diperbarui.
shosti
1
@shosti Ngomong-ngomong, terima kasih telah menemukan tautan itu ke blog bbatsov untukku. Saya sebenarnya telah menemukan solusi itu sebelumnya, tetapi tidak dapat menemukannya lagi. Saya akan memasukkan itu sebagai salah satu solusi tidak berfungsi dalam pertanyaan saya.
b4hand
2
Saya suka melakukannya dengan cara ini untuk menghindari mencemari minibuffer (maafkan formatnya): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas
6

Ada focus-autosave-modesekarang. Ini tersedia melalui MELPA. Mengapa tidak memberikannya kesempatan untuk melakukan peretasan untuk Anda‽

Mark Karpov
sumber
Hai, Bagaimana cara kerjanya? Saya sudah menginstalnya tetapi sepertinya tidak berhasil.
Asme Just
@ AsmeJust, saya tidak menggunakan saat ini, cobalah untuk bertanya pada pelacak masalah di sini: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov
Apakah Anda saat ini menggunakan alternatif atau semacamnya?
Asme Just
Tidak, saya tidak menggunakan hal seperti itu sekarang.
Mark Karpov
Tapi Anda masih menggunakan Emacs, kan?
Asme Just
3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

Ini akan menyimpan semua file kunjungan buffer yang belum disimpan, di emacs 24.4

Łukasz Gruner
sumber
2
Jangan gunakan add-to-listpada kail, gunakan add-hook. Jawaban shosti sudah berisi bentuk potongan ini dengan benar.
Gilles 'SANGAT berhenti menjadi jahat'
1

Untuk pengembara yang tersandung pada ini, saya menggunakan formulir ini:

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

Penggunaan cl-letfmencegah (No files need saving)pesan-pesan yang mengganggu menyumbat area gema Anda.

PythonNut
sumber