2009-08-04 4 views

답변

10

필자는이 버전을 emacs가 X에서 실행 중일 때만 사용할 수 있습니다 (아마도 우분투와 비슷할 것 같습니다).

(when 
    (and (featurep 'x) window-system) 
(defvar on-blur--saved-window-id 0 "Last known focused window.") 
(defvar on-blur--timer nil "Timer refreshing known focused window.") 
(defun on-blur--refresh() 
    "Runs on-blur-hook if emacs has lost focus." 
    (let* ((active-window (x-window-property 
          "_NET_ACTIVE_WINDOW" nil "WINDOW" 0 nil t)) 
      (active-window-id (if (numberp active-window) 
           active-window 
           (string-to-number 
           (format "%x00%x" 
             (car active-window) 
             (cdr active-window)) 16))) 
      (emacs-window-id (string-to-number 
          (frame-parameter nil 'outer-window-id)))) 
    (when (and 
      (= emacs-window-id on-blur--saved-window-id) 
      (not (= active-window-id on-blur--saved-window-id))) 
     (run-hooks 'on-blur-hook)) 
    (setq on-blur--saved-window-id active-window-id) 
    (run-with-timer 1 nil 'on-blur--refresh))) 
(add-hook 'on-blur-hook #'(lambda() (save-some-buffers t))) 
(on-blur--refresh)) 
+0

우분투에서 광고하는 것처럼 작동하며 이맥스를 워크 플로우의 중심으로 만들 필요가 없습니다. –

+0

이것은 절대적으로 훌륭합니다. 마침내 문제를 해결하고 해결 방법이 없습니다. – Rockiger

+0

필자는 올바른 형식 문자열이 "% x % 04x"이어야한다고 생각합니다. 제 2의 Emacs 프레임에는 사용자의 훅에서 작동하지 않는 ID가 있습니다 (Ubuntu 12.04). (실험에 의해서만 이것에 대한 문서를 찾을 수 없었다.) – volferine

2

원하는지 확실하지 않습니다. http://www.dribin.org/dave/blog/archives/2003/09/10/emacs/

편집 :에서

(defun dld-deselect-frame-hook() 
    (save-some-buffers 1)) 

(add-hook 'deselect-frame-hook 'dld-deselect-frame-hook) 

단지 당신이 입력 한 모든 n 개의 문자를 저장하는 '자동 저장 간격'사용할 수 있습니다 이맥스

+0

그래, 나는 모든 훅과 함수를 보았지만 선택이나 집중을 말하는 것을 찾지 못했습니다. – Rockiger

1

을 작동하는 것 같다. 광산은 100으로 설정되어 있습니다. 따라서 약 2-3 줄의 코드가 필요합니까?

자동 저장 간격은 'C 소스 코드'에 정의 된 변수 입니다. 해당 값 은 100

입니다. 문서 : * 자동 저장 사이의 입력 이벤트 수입니다. 0은 문자 수 을 입력하여 자동 저장을 비활성화하는 것을 의미합니다.

이 변수를 사용자 정의 할 수 있습니다.

이것은 원래 질문에 대한 대답이 아닙니다. 비슷한 것을 이루기위한 방법 일뿐입니다.

+0

내가 아는 바로는 필자가 필자가 말하고자하는 특징은 서기관에게서 온 것이다. html 등을 편집 할 때 매우 편리합니다. 더 이상 C-x C-s를 누를 필요가 없습니다. 창을 변경하고 브라우저를 확인하십시오. – Rockiger

2

[...] 내가 말하는 기능은 서기관입니다. html 등을 편집 할 때 매우 편리합니다. 브라우저를 으로 변경하면 더 이상 C-x C-s를 눌러야합니다. 이 경우

대신 브라우저 애플리케이션으로 전환하는, 브라우저 애플리케이션 (또는 M-x browse-url-of-buffer C-c C-v)을로드 이맥스 주문.

(defun my-browse-url-of-buffer() 
    "Save current buffer and view its content in browser." 
    (interactive) 
    (save-buffer) 
    (browse-url-of-buffer)) 

그리고 편리한 바인딩에 훅 :이 방법을 사용하면 같이, 최대 브라우저를 제공 한 후 버퍼와 를 저장하는 함수를 직접 작성할 수 있습니다.

또는 버퍼를 저장할 때마다 항상 html-autoview-mode을 사용하여 파일을 즐겨 찾는 브라우저에 자동으로로드 할 수 있습니다.

+0

이것은 흥미로운 솔루션처럼 들립니다. 나는 이것을 시도 할 것이다. 그러나 나는 아직도 약간 놀랐다. Emacs는 포커스를 바꾸는 것과 같은 것에 반응 할 수 없다. – Rockiger

+0

@Rockiger Emacs가 unfocus 이벤트에 연결하는 방법을 제공하지 않는 것 같습니다. –

24

Gnu Emacs 24.4에 포커스 후크를 추가했습니다.

이들을 focus-in-hookfocus-out-hook이라고합니다.

당신은 당신의 .emacs 파일에

(defun save-all() 
    (interactive) 
    (save-some-buffers t)) 

(add-hook 'focus-out-hook 'save-all) 

을 추가 할 수 있으며 초점의 손실에있는 모든 파일을 저장해야합니다.

+0

하나의 라이너 :'(add-hook 'focus-out-hook (lambda() (interactive) (save-some-buffers t)))' –

+0

문서는 첫 번째 메모가 더 이상 적용되지 않는다는 것을 암시하는 것처럼 보입니다. 맞습니까? 빠른 테스트 후에 창 관리자가 (이맥스 인스턴스가 같은) 이맥스 프레임간에 포커스가 바뀌면 '포커스 아웃 훅'이 실행되지 않는 것 같습니다. 어쩌면'handle-switch-frame'의 추가로 당신이 묘사 한 행동이 바뀌었을까요? – ohspite

+0

@ohspite 당신이 옳은 것처럼 보입니다. 업데이트 주셔서 감사합니다. – bonkydog

관련 문제