2009-08-04 7 views

答えて

10

私はemacsがXの下で動作している場合にのみ動作します(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

広告としてUbuntuで動作し、Emacsをワークフローの中心にする必要はありません。 –

+0

これは絶対に素晴らしいです、最後に問題の解決策と回避策はありません。 – Rockiger

+0

私は正しい形式の文字列は "%x%04x"でなければならないと思います。私の場合(Ubuntu 12.04)、セカンダリEmacsフレームにはあなたのフックで動作しないIDがあります。 – volferine

2

これが望ましいかどうかわかりません。

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

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

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

EDIT:唯一のあなたは、あなたが入力し、すべてのn文字を保存するために「自動保存間隔 `使用することができますXEmacsの

+0

ええと、私はすべてのフックやファンクションを見ていましたが、選択やフォーカスというものは見つかりませんでした。 – Rockiger

1

で動作しているようです。鉱山は100に設定されています。

自動保存間隔は変数 'Cソースコード'に定義された変数 です。その値 は100

です。ドキュメント: *自動保存間の入力イベント数。 「ゼロ」とは、 の文字数のために、 自動保存を無効にすることを意味します。

この変数はカスタマイズできます。

これはあなたの元の質問には答えません。それは似たようなものを達成する単なる方法です。

+0

私が知っているのは、私が話している機能はScribesです。 htmlなどを編集するときはとても便利ですが、C-x C-sを押す必要はありません。ウィンドウを変更してブラウザを確認するだけです。 – Rockiger

2

[...]私が話している機能は、 からです。 htmlなどの編集時には、 をもう一度押す必要があります。 ブラウザを に変更するだけで、C-X C-sをもう一度押す必要があります。その場合

、代わりにブラウザアプリケーションに切り替える、ブラウザアプリケーション(C-c C-v又はM-x browse-url-of-buffer)をロードするためにEmacsを注文します。

(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

1つのライナー: '(add-hook 'focus-out-hook(lambda()(対話型)(save-some-buffers t)))' –

+0

これは、実験に基づいています。ドキュメントは、あなたの最初のメモがもう適用されないことを暗示しているようです - そうですか?クイックテストの後、ウィンドウマネージャーが(同じemacsインスタンスからの)emacsフレーム間のフォーカスを変更すると、 'focus-out-hook'が実行されないようです。おそらく、 'handle-switch-frame'を追加すると、あなたが記述した振る舞いが変わったでしょうか? – ohspite

+0

@ohspiteあなたが正しいように見えます。更新していただきありがとうございます。 – bonkydog

関連する問題