デスクトップライブラリを使用すると、あるセッションから別のセッションへEmacsの状態を保存できます。保存されたEmacsのデスクトップ設定には、バッファとそのファイル名、メジャーモード、バッファ位置、ウィンドウおよびフレームの設定、そしていくつかの重要なグローバル変数が含まれます。
この機能を有効にするには、カスタマイズバッファ(Easy
Customization Interfaceを参照)を使用して、次回以降のセッション向けに desktop-save-mode を t
に設定するか、initファイル(The Emacs
Initialization Fileを参照)に以下の行を追加してください:
(desktop-save-mode 1)
initファイルでdesktop-save-modeを有効にすると、Emacsの起動時にdesktop-path(デフォルトはuser-emacs-directory、次いでホームディレクトリ)に保存済みのデスクトップがあるかを確認し、最初に見つかったデスクトップを使用します。desktop-save-modeを有効にしてEmacsを実行している間は、デスクトップ設定に変更があるたびにデフォルトでデスクトップが自動保存されます。変数desktop-auto-save-timeoutは、Emacsがデスクトップの変更を確認する頻度を決定します。また、Emacsを終了する際にもデスクトップは保存されます。
保存済みのデスクトップ設定を再読み込みしたくない場合は、Emacsのコマンドラインでオプション ‘--no-desktop’ を指定してください。これにより、現在のセッションでは desktop-save-mode が無効になります。また、‘--no-init-file’ オプションを指定してEmacsを起動した場合も、通常は desktop-save-mode
が有効になっている初期化ファイルをバイパスするため、デスクトップの再読み込みが無効になります。
異なるディレクトリに、それぞれ個別の保存済みデスクトップ設定を保持できます。保存済みデスクトップ設定があるディレクトリからEmacsを起動すると、desktop-pathをカスタマイズして他のディレクトリに.(カレントディレクトリ)を先頭に付加するように設定していれば、その設定が復元されます。M-x
desktop-change-dirと入力することで、現在のデスクトップを保存し、別のディレクトリに保存されていたものを再読み込みできます。M-x desktop-revertと入力すると、直前に再読み込みしたデスクトップに戻ります。
Emacsがデスクトップを保存するファイルは、別のEmacsセッションによって意図せず上書きされるのを防ぐため、セッションの実行中はロックされます。通常、このロックはEmacsの終了時に解除されますが、Emacsやシステムがクラッシュした場合はロックが残り、Emacsを再起動する際に、デフォルトではロックされたデスクトップファイルを使用するかどうかの確認が求められます。この確認を回避するには、変数
desktop-load-locked-desktop
を、この場合は決してデスクトップを読み込まないことを意味する nil
か、確認なしにデスクトップを読み込むことを意味する t
のいずれかにカスタマイズしてください。また、変数を特殊な値 check-pid
にカスタマイズすることも可能です。これは、デスクトップをロックしているEmacsプロセスがローカルマシン上で動作していない場合に、ファイルを読み込むことを意味します。ホームディレクトリがNFSなどでリモートにマウントされているマルチユーザー環境など、ロックしているEmacsが別のマシンで動作している可能性がある状況では、この設定は使用しないでください。
Emacsがデーモンモードで起動すると、ユーザーに質問を行うことができないため、デスクトップファイルがロックされている場合、desktop-load-locked-desktop が t
でない限り、そのファイルを読み込むことはありません。なお、デーモンモードでのデスクトップ復元は、他の理由から少々問題があります。例えば、デーモンはGUI機能を使用できないため、フレームの位置、サイズ、装飾などのパラメータを復元することができません。そのため、server-after-make-frame-hook(The
Emacs Lisp Reference Manual の Creating
Frames を参照)に追加するフック関数内で desktop-read(後述)を呼び出すことで、デーモンモードでのデスクトップ復元を最初のクライアントが接続するまで遅延させたい場合があります。
いつでも、コマンド M-x desktop-save
を使用して、現在のデスクトップを強制的に即座に保存できます。これは、自動デスクトップ復元機能を使いたくないため desktop-save-mode を有効にしていない場合や、デスクトップに大幅な変更を加えたため、Emacs
やシステムがクラッシュしても設定が失われないようにしたい場合に便利です。また、現在の Emacs
セッションでまだどのデスクトップも読み込まれていない場合は、M-x desktop-read
を使用して以前に保存したデスクトップを復元できます。
デフォルトでは、デスクトップはフレームとウィンドウの設定を保存および復元しようとします。33 これを無効または有効にするには、desktop-restore-frames を nil
に、または nil
以外の任意の値にそれぞれ設定してください。(この動作を微調整するためにカスタマイズ可能な関連オプションについては、当該変数のドキュメントを参照してください。)
デスクトップがフレームとウィンドウの構成を復元する際、initファイルで設定したパラメータの値は無視され、記録されたフレームパラメータの値が使用されます(Emacs初期化ファイルを参照)。つまり、復元されるフレームのフォントやフェイスなどのフレームパラメータは、前回のEmacsセッション終了時に保存されたデスクトップファイルから取得され、initファイルでの設定は無視されます。これを無効にするには、frameset-filter-alistの値をカスタマイズして、復元したくないフレームパラメータを除外してください。これにより、それらのパラメータはinitファイルでのカスタマイズ内容に従って設定されるようになります。
リモートファイルを参照したバッファに関する情報は、デフォルトでは保存されません。この設定を変更するには、変数 desktop-files-not-to-save
をカスタマイズしてください。この際、リモートファイルのバッファ復元が停止するまでの秒数を指定する remote-file-name-access-timeout
のカスタマイズも検討してください。これにより、リモートファイルを参照したセッションを復元する際に Emacs がブロックされるのを防ぐことができます。
デフォルトでは、デスクトップ内のすべてのバッファが一括して復元されます。ただし、デスクトップに大量のバッファがある場合、この処理に時間がかかることがあります。変数
desktop-restore-eager
を指定することで、即座に復元するバッファの最大数を設定でき、残りのバッファは Emacs がアイドル状態のときに遅延的に復元されます。
M-x desktop-clear と入力すると Emacs
デスクトップが空になります。これは、例えば次に M-x desktop-read
を呼び出して別のデスクトップに切り替えたい場合などに便利です。desktop-clear
コマンドは、内部バッファ以外のすべてのバッファを破棄し、desktop-globals-to-clear
に列挙されているグローバル変数をクリアします。特定のバッファを保持したい場合は、変数 desktop-clear-preserve-buffers
をカスタマイズしてください。この変数の値は、破棄しないバッファ名に一致する正規表現のリストです。
あるセッションから別のセッションへミニバッファ履歴を保存したい場合は、savehist
ライブラリを使用してください。また、選択したミニバッファ履歴変数を desktop-globals-to-save の値に追加すれば、desktop-save-mode の一部として保存することも可能です。
ただし、Androidでは、ウィンドウマネージャ(Androidウィンドウシステムを参照)の制約が厳しすぎてフレーム構成の復元ができないため、このオプションの既定値はnilとなっています。