2009-08-04 16 views

risposta

10

Io lo uso, funzionerà solo se emacs è in esecuzione in X (come probabilmente sarebbe in qualcosa come 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

Funziona su Ubuntu come pubblicizzato e non richiede che Emacs sia al centro del proprio flusso di lavoro. –

+0

Questo è assolutamente fantastico, finalmente la soluzione al problema e nessuna soluzione alternativa. – Rockiger

+0

Credo che la stringa di formato corretta dovrebbe essere "% x% 04x" - per me (Ubuntu 12.04) i frame Emacs secondari hanno ID che non funzionano con il tuo hook. (Basandosi solo su esperimenti, non è stato possibile trovare alcuna documentazione al riguardo.) – volferine

2

Non so se questo è quello che vuoi.

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

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

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

EDIT: sembra solo a lavorare in XEmacs

+0

Sì, ho cercato tutti gli "stronzi" e le "funzioni", ma non ho trovato qualcosa che dicesse selezionare o mettere a fuoco. – Rockiger

1

È possibile utilizzare `auto-save-intervallo' per salvare ogni n caratteri digitati. Il mio è impostato su 100. Quindi circa ogni 2-3 righe di codice, forse?

auto-save-interval è una variabile definita in `codice sorgente C '. Il suo valore è 100

Documentazione: * Numero di eventi di input tra i salvataggi automatici. Zero significa disabilitare il salvataggio automatico a causa del numero di caratteri digitato.

È possibile personalizzare questa variabile.

Questo non risponde alla domanda originale; è solo un modo per ottenere qualcosa di simile.

+0

Lo so, la funzione di cui sto parlando è di Scribes. È molto conveniente quando si modifica html e simili, non è necessario premere C-x C-s, basta cambiare la finestra e controllare il browser. – Rockiger

2

[...] la funzione di cui sto parlando è da Scribes. È molto conveniente quando si modifica l'html e simili, non è necessario premere C-x C-s, si basta cambiare la finestra e controllare il tuo browser .

In questo caso, invece di passare alla applicazione browser, ordina Emacs per caricare l'applicazione browser (C-c C-v o M-x browse-url-of-buffer). Con questo metodo, è possibile scrivere la propria funzione che salva il buffer e quindi porta il browser su, come:

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

e agganciarlo ad una vantaggiosa vincolante.

Oppure è ancora possibile utilizzare lo html-autoview-mode che ogni volta che si salva il buffer, carica automaticamente il file nel browser preferito.

+0

Sembra una soluzione interessante. Ci proverò. Ma sono ancora un po 'sorpreso, che Emacs non possa reagire a qualcosa come cambiare messa a fuoco. – Rockiger

+0

@Rockiger sembra che Emacs non fornisca un modo per agganciare l'evento unfocus. –

24

Ho aggiunto hook di messa a fuoco su Gnu Emacs 24.4.

Si chiamano focus-in-hook e focus-out-hook.

È possibile aggiungere

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

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

al file .emacs e dovrebbe salvare tutti i file sulla perdita di messa a fuoco.

+0

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

+0

The i documenti sembrano implicare che la tua prima nota non si applica più - è vero? Dopo un rapido test, sembra che 'focus-out-hook' non venga eseguito quando il gestore delle finestre cambia focus tra i frame emacs (che provengono dalla stessa istanza di emacs). Forse l'aggiunta di 'handle-switch-frame' ha alterato il comportamento che hai descritto? – ohspite

+0

@ohspite Sembra che tu abbia ragione. Grazie per l'aggiornamento. – bonkydog

Problemi correlati