質問
ラメと呼んでも、私は無意識の C-x C-s
の緊張感にうんざりしています。バッファを頻繁に切り替えているので、別のバッファに切り替えるとすぐに特定のバッファを保存したいと思います。 Emacs-Lispの基本を学ぶ時間はまだありません。
これを行う方法のヒント、またはより良い解決策はありますか?
(関連するメモで、現在のバッファを一定時間アイドル状態になるとすぐに。)
解決
(defadvice switch-to-buffer (before save-buffer-now activate)
(when buffer-file-name (save-buffer)))
(defadvice other-window (before other-window-now activate)
(when buffer-file-name (save-buffer)))
(defadvice other-frame (before other-frame-now activate)
(when buffer-file-name (save-buffer)))
buffer-file-name
のチェックは、ファイルなしのバッファの保存を回避します。気になるバッファの切り替えに使用するすべてのエントリポイントを把握する必要があります( other-window
もお勧めします)。
他のヒント
私はemacs Lispを初めて使用しますが、これはテストで機能します:
(defadvice switch-to-buffer (before save-buffer-now)
(save-buffer))
(ad-activate 'switch-to-buffer)
すべてのバッファ( scratch など)の後に呼び出されるため、これはいらいらします。したがって、この回答をヒントと考えてください。
無効にする場合は、以下を呼び出す必要があります。
(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now)
(ad-activate 'switch-to-buffer)
いくつかのアイデア。
まず、十分に高い頻度でsaveなどのコマンドを呼び出していることに気付いた場合、コマンドのキーバインドを短くすることを検討してください。たとえば、同じ「けいれん」を抱えていることにも気付きました。編集を保存するために C-x C-s
の代わりに f2
を使用するようになりました。
f2
にバインドする関数は、保存されていないすべてのバッファーを無条件に保存します。役に立つかもしれません:
(defun force-save-all ()
"Unconditionally saves all unsaved buffers."
(interactive)
(save-some-buffers t))
(global-set-key [f2] 'force-save-all)
今、主な問題について。次のようなものを試すことができます( force-save-all
が呼び出されることに注意してください):
(defun my-switch-to-buffer (buffer)
(interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil)))
(force-save-all)
(switch-to-buffer buffer))
(global-set-key "\C-xb" 'my-switch-to-buffer)
もちろん、スイッチバッファ機能をファンクションキーなどの別のキーにバインドして、ワンプレス操作にすることもできます。
@seth はアドバイスの使用について素晴らしいアイデアを持っていると思っていましたが、ELispマニュアルでは< a href = "http://www.gnu.org/software/emacs/manual/html_mono/elisp.html.gz#Advising-Functions" rel = "nofollow noreferrer">キーバインディングにアドバイスを使用しない 。なぜそうなのかはよくわかりませんが、マニュアルでは参考になっています。