2009-08-04 24 views

Respuesta

10

Utilizo esto, solo funcionará si emacs se ejecuta bajo X (como probablemente lo haría en algo como ubuntu).

(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

Funciona en Ubuntu según lo anunciado, y no requiere hacer de Emacs el centro del flujo de trabajo. –

+0

Esto es absolutamente increíble, finalmente la solución al problema y ninguna solución. – Rockiger

+0

Creo que la cadena de formato correcta debe ser "% x% 04x" - para mí (Ubuntu 12.04) los marcos secundarios de Emacs tienen ID que no funcionan con tu gancho. (Basado solo en experimentos, no se pudo encontrar ninguna documentación al respecto.) – volferine

2

No estoy seguro si esto es lo que quiere.

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

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

Desde: http://www.dribin.org/dave/blog/archives/2003/09/10/emacs/

EDIT: Sólo parece funcionar en XEmacs

+0

Sí, busqué todas las funciones -hooks y -functions, pero no encontré algo que diga seleccionar o enfocar. – Rockiger

1

Puede usar `guardado automático de intervalo' para guardar cada n caracteres escritos. El mío está establecido en 100. ¿Entonces cada 2-3 líneas de código, tal vez?

auto-save-interval es una variable definida en el 'código fuente C'. Su valor es 100

Documentación: * Número de eventos de entrada entre guardado automático. Cero significa desactivar autoguardado debido al número de caracteres tipeado.

Puede personalizar esta variable.

Esto no responde a su pregunta original; es solo una manera de lograr algo similar.

+0

Lo sé, la característica de la que hablo es de Scribes. Es muy útil al editar html y similares, ya no tiene que presionar C-x C-s, simplemente cambie la ventana y revise su navegador. – Rockiger

2

[...] la característica de la que estoy hablando es de Scribes. Es muy conveniente cuando editando html y cosas por el estilo, usted no tiene tiene que presionar C-x C-s más, simplemente cambie la ventana y verifique su navegador.

En ese caso, en lugar de cambiar a la aplicación de navegador, ordenar Emacs para cargar la aplicación de navegador (C-c C-v o M-x browse-url-of-buffer). Con este método, puede escribir su propia función que guarda la memoria intermedia y luego trae el navegador arriba, como:

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

y el gancho a una unión conveniente.

O puede seguir utilizando el html-autoview-mode que cada vez que guarda el búfer, carga automáticamente el archivo en su navegador favorito.

+0

Esto suena como una solución interesante. Voy a intentar esto. Pero todavía estoy un poco sorprendido, que Emacs no puede reaccionar en algo como cambiar el enfoque. – Rockiger

+0

@Rockiger parece que Emacs no proporciona una forma de enganchar al evento desenfocar. –

24

He añadido focus hooks a Gnu Emacs 24.4.

Se llaman focus-in-hook y focus-out-hook.

Puede añadir

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

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

a su archivo .emacs y debe guardar todos los archivos en la pérdida de concentración.

+0

Un liner: '(add-hook 'focus-out-hook (lambda() (interactivo) (save-some-buffers t)))' –

+0

los documentos parecen implicar que su primera nota ya no se aplica, ¿es así? Después de una prueba rápida, parece que 'focus-out-hook' no se ejecuta cuando el administrador de ventanas cambia el foco entre marcos de emacs (que son de la misma instancia de emacs). ¿Quizás la adición de 'handle-switch-frame' alteró el comportamiento que describiste? – ohspite

+0

@ohspite Parece que tienes razón. Gracias por la actualización. – bonkydog

Cuestiones relacionadas