デスクトップライブラリーを使用して、あるセッションから別のセッションにEmacsの状態を保存することができます。保存されるEmacsのデスクトップ構成(desktop configuration)にはバッファーとそのファイル名、メジャーモード、バッファー位置、ウィンドウおよびフレームの構成、それにいくつかの重要なグローバル変数が含まれます。
この機能を有効にするにはCustomizationバッファー(Easy Customizationインターフェースを参照)を使用してdesktop-save-mode
をt
にセットするか、initファイル(Emacs初期化ファイルを参照)に以下の行を追加します:
(desktop-save-mode 1)
initファイルでdesktop-save-mode
をオンにしていれば、Emacsが起動時にdesktop-path
(デフォルトはまずuser-emacs-directory
、次にホームディレクトリー)から保存されたデスクトップを探して、見つかった最初のデスクトップを使用します。desktop-save-mode
がオンの状態でEmacsが実行されている間は、デスクトップ構成の変更時は常にデスクトップが自動的に保存されます。Emacsがデスクトップの変更をチェックする頻度は、変数desktop-auto-save-timeout
によって決定されます。デスクトップはEmacsをexitする際にも保存されます。
保存されたデスクトップ構成をリロードしたくないときは、Emacsを実行するコマンドラインでオプション‘--no-desktop’を指定します。これはカレントセッションにたいして、desktop-save-mode
をオフにします。‘--no-init-file’オプションを指定してEmacsを開始することにより、通常desktop-save-mode
をオンにしているinitファイルをバイパスして、デスクトップのリロードを無効にすることもできます。
別のディレクトリーに別個にデスクトップ構成を保存することができます。desktop-path
にセットされているディレクトリーの前に.
(カレントディレクトリー)を追加するようカスタマイズすることによって、保存済みのデスクトップ構成のあるディレクトリーからEmacsを起動した際にその構成がリストアされるようになります。M-x
desktop-change-dirとタイプすれば、カレントのデスクトップを保存して別のディレクトリーに保存されているデスクトップをリストアできます。前にリロードしたデスクトップをリバートするにはM-x
desktop-revertとタイプしてください。
Emacsがデスクトップを保存するファイルは、他のEmacsセッションによる意図せぬ上書きを防ぐためにそのセッションの実行中はロックされます。このロックは通常はEmacsのexit時に解除されますが、Emacsまたはシステムがクラッシュするとそのロックが残ってしまい、デフォルトではEmacsの再起動時にロックされたデスクトップファイルのどちらを使用するか尋ねます。この質問は変数desktop-load-locked-desktop
をnil
(デスクトップをロードしない)、またはt
(確認なしでデスクトップをロードする)のいずれかにカスタマイズすることにより抑止できます。check-pid
という特別な値にカスタマイズすることもできます。これはローカルマシン上でそのデスクトップをロックしたEmacsが実行されていなければそのファイルをロードすることを意味します。この値はロックしたEmacsが別のマシンでまだ実行中という状況で使用するべきではありません。マルチユーザー環境において、NFS等を用いてホームディレクトリーがリモートにマウントされているのかもしれません。
Emacsがデーモンモードで起動する際にはユーザーに質問することができないので、ロックされたデスクトップが見つかってもdesktop-load-locked-desktop
がt
以外であればロードしません。デーモンモードでのデスクトップのリストアは、その他の理由により問題になりがちなことに注意してください。たとえばデーモンはGUI機能を使用できないので、フレーム位置やサイズ、装飾のようなパラメーターはリストアできません。この理由によりserver-after-make-frame-hook
にフック関数desktop-read
(下記参照)を追加して、それが呼び出されることにより最初のクライアントが接続するまで、デスクトップのリストアを遅延させたいと思うかもしれません(Creating
Frames in The Emacs Lisp Reference Manualを参照)。
カレントデスクトップを即座に強制的に保存したければ、任意のタイミングでコマンドM-x
desktop-saveを使うことができます。これはデスクトップを自動リストアしたくないのでdesktop-save-mode
をオンにしていない、あるいはデスクトップに重要な変更を施し、その構成をEmacsやシステムのクラッシュで失わないよう確実にしたい場合に役に立ちます。Emacsのカレントセッションがまだデスクトップを何もロードしていなければ、M-x
desktop-readを使用して以前に保存したデスクトップをリストアできます。
デフォルトでは、デスクトップはフレームとウィンドウの構成の保存とリストアを試みます。これを無効にするには、desktop-restore-frames
をnil
にセットしてください(この振る舞いを調整するためにマスタマイズできる関連オプションについては変数のドキュメントを参照のこと)。
desktopがフレームとウィンドウの設定をリストアするときは、フレームパラメーターの記録された値を使用します。initファイル(Emacs初期化ファイルを参照)でそれらのパラメーターに何をセットしていても無視されます。これは、リストアされたフレームにたいするフォントやフェイスのようなフレームパラメーターは、前のEmacsセッションを終了したときに保存されたdesktopファイルから取得され、initファイルでのそれらのパラメーターにたいするセッティングは無視されることを意味します。これを無効にするには、リストアしたくないフレームパラメーターを除外するように、frameset-filter-alist
の値をカスタマイズしてください。その後はinitファイルで行ったカスタマイズに応じてパラメーターがセットされる筈です。
リモートファイルをvisitしているバッファーに関する情報は、デフォルトでは保存されません。変数desktop-files-not-to-save
の変更により、これを変更することができます。この場合にはremote-file-name-access-timeout
のカスタマイズも検討したほうがよいかもしれません。これはリモートファイルのバッファーのリストアが停止されるまでの秒数です。これによりリモートファイルをvisitするセッションをリストアする際に、Emacsがブロックするのを防ぐことができます。
デフォルトでは、デスクトップのすべてのバッファーは1度に復元されます。しかし、デスクトップにたくさんのバッファーがあるときは遅くなるかもしれません。変数desktop-restore-eager
で、即座に復元するバッファーの最大数を指定できます。残りのバッファーはEmacsのアイドル時に、ゆっくり(lazily)と復元されます。
Emacsのデスクトップを空にするには、M-x desktop-clearとタイプします。これはたとえば次にM-x
desktop-readを呼び出して別のデスクトップに切り替えたい場合に役に立つかもしれません。desktop-clear
コマンドは内部バッファーを除くすべてのバッファーをkillして、desktop-globals-to-clear
にリストされたグローバル変数をクリアーします。特定のバッファーを残したい場合は、変数desktop-clear-preserve-buffers-regexp
をカスタマイズします。この変数の値には、killしないバッファーの名前にマッチする正規表現を指定します。
あるセッションから別のセッションにミニバッファーのヒストリーを保存したければ、savehist
ライブラリーを使用してください。選択されているミニバッファーヒストリーの変数をdesktop-globals-to-save
の値として追加して、desktop-save-mode
に属する変数として保存することもできます。