Emacs odağını kaybettiğinde arabellekleri otomatik olarak nasıl kaydeder?


26

Geçenlerde Sublime Text kullanıcısı bir süre Emacs'ı denedim ve Emacs'ta aynı otomatik kaydetme davranışını elde etmekle ilgilendi.

Temel olarak, çerçevenin odağını kaybettiği zaman tüm tamponların kaydedilmesini istedi (gerçekten kaydedildi, sadece yedeklenmedi). Bu, pencereleri tamamen farklı bir uygulamaya geçirirken de geçerlidir.

Farklı bir uygulamaya geçerken tetiklenen hiçbir olay bulamadım. Böyle bir olay mı var yoksa aynı davranışı elde etmenin başka bir yolu var mı?

Zamana dayalı bir çözümün tatmin edici olmadığını ve varsayılan otomatik yedekleme davranışının da olmadığını unutmayın. Özellikle save-buffertüm dosyalar için arabelleklerin kaydedilmesini istedi .

Yanıtlar:


29

Ne yazık ki, bu kesin davranış Emacs <= 24.3'te mümkün değildir, ancak defadvice( bbatsov'un blogunda detaylı olarak gösterildiği gibi) kullanarak pencere / tampon değişikliğinden tasarruf edebilirsiniz :

(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'te yeni odak kancası sayesinde çerçeve odak kaybından da tasarruf edebilirsiniz : (add-hook 'focus-out-hook 'save-buffer)(aktif tamponu kaydetmek için) veya (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(tüm açık tamponları kaydetmek için).


1
defadviceBlog postasının düşmesi durumunda bir şeyler sürümünde biraz genişleyebilir misiniz ? Teşekkürler!
Tikhon Jelvis

Ne yazık ki, bu çözüm açık arabellekleri kaydeder, tüm arabellekleri kaydetmez .
b4hand

1
@ b4hand: Üzgünüm, istediğin şeyin bu olduğunu anlamadım. Cevap güncellendi.
shosti

1
@shosti Bu arada, bbatsov'un benim için bloguna bu bağlantıyı bulduğun için teşekkürler. Bu çözümü daha önce bulmuştum, ancak bir daha bulamadım. Bunu soruma çalışmayan çözümlerden biri olarak ekleyecektim.
b4hand

2
Mini arabayı bozmamak için bu şekilde yapmaktan hoşlanıyorum (biçimlendirme affet): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas

6

Orada focus-autosave-modeşimdi. MELPA aracılığıyla kullanılabilir. Neden sana hackleme şansı vermiyorsun?


Merhaba nasıl çalışır? Yükledim ama işe yaramadı.
Asme sadece

@AsmeJust, şu anda kullanmıyorum, burada sorun izleyicisini sormaya çalışın: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov

Şu anda böyle bir alternatif kullanıyor musunuz?
Asme sadece

Hayır, şu anda böyle bir şey kullanmıyorum.
Mark Karpov

Ama yine de Emacs kullanıyorsun, değil mi?
Asme Sadece

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

Bu işlem, kaydedilmemiş tüm arabellekleri dosyayı ziyaret eder,


2
Kullanmayın add-to-listbir kanca, kullanımına add-hook. shosti'nin cevabı zaten bu pasajın doğru şeklini içeriyor.
Gilles 'SO- kötülükten

1

Buna rastlayan gezginler için bu formu kullanıyorum:

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

Kullanımı cl-letfcan sıkıcı tutar (No files need saving)sizin yankı alanı tıkanma gelen mesajları.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.