Emacs가 포커스를 잃을 때 버퍼를 자동 저장하는 방법은 무엇입니까?


26

최근에 Sublime Text 사용자가 Emacs를 잠시 사용해 보았으며 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)))

이맥스 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
나는 미니 버퍼를 휴지통에 버리지 않기 위해 이런 식으로하는 것을 좋아한다 (포맷을 용서한다) : (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas

6

focus-autosave-mode지금. MELPA를 통해 이용할 수 있습니다. 해킹을 할 수있는 기회를 가지십시오


안녕하세요, 어떻게 작동합니까? 설치했지만 작동하지 않는 것 같습니다.
Asme Just

@AsmeJust, 나는 지금 사용하지 않고, 여기에 이슈 트래커를 물어보십시오 : github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov

현재 그와 같은 대안이나 무언가를 사용하고 있습니까?
Asme Just

아니요, 지금은 그런 것을 사용하지 않습니다.
Mark Karpov

하지만 여전히 Emacs를 사용하고 있습니까?
Asme Just

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

이것은 모든 저장되지 않은 버퍼 방문 파일을 emacs 24.4에 저장합니다.


2
add-to-list후크에 사용 하지 마십시오 add-hook. shosti의 답변에는 이미이 스 니펫의 올바른 형식이 포함되어 있습니다.
Gilles 'SO- 악마 그만해

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.