雑文発散

«前の日記(2014-07-31) 最新 次の日記(2014-08-02)» 編集
過去の日記

2014-08-01 [長年日記]

[Emacs] Emacs 24.4 の新機能「マルチモニタ・サポート」について調べてみた

昨日の「Emacs 24.4 (HEAD) で起動時のフレームサイズを調整する initial-frame-alist が効かなくなった?」で悩んでいた「バグなのか仕様変更なのか?」のうち、仕様変更があったのかどうかを調べるために、Emacs 24.4.50.1 (HEAD) に付属していた NEWS ファイルを読み始めた。

すると、Emacs 24.4 での新機能情報が出てくる出てくる。本来調べたかったこととは違うのだけど、wktk しながら読み進めてしまった。

その中でもオレ的にいくつか気になった新機能があったので、手元で動作チェックしつつ、日記のネタとして書いていこうと思う(予定)。

今日は「マルチモニタ・サポート」について調べてみる。新規追加された関数として、次の2つが上げられていた。

  • (display-monitor-attributes-list)
  • (frame-monitor-attributes)

これを追ってみる。

MacBook Air へ外部ディスプレイを接続し、「システム環境設定」「ディスプレイ」で、本体ディスプレイの右側に設置している。

システム環境設定

この状態のとき、*scratch* バッファで (display-monitor-attributes-list) を実行してみると、次のようなリストが返ってきた。

(((geometry 0 0 1440 900) (workarea 0 22 1440 874) (mm-size 290 179) (frames #) (source . "NS")) ((geometry 1440 0 1920 1080) (workarea 1440 0 1920 1058) (mm-size 530 298) (frames) (source . "NS")))

見やすいように加工すると、2つのリストが存在することが分かる。

(
 ((geometry 0 0 1440 900)
  (workarea 0 22 1440 874)
  (mm-size 290 179)
  (frames #<frame *scratch* 0x102843190>)
  (source . "NS"))

 ((geometry 1440 0 1920 1080)
  (workarea 1440 0 1920 1058)
  (mm-size 530 298)
  (frames)
  (source . "NS"))
 )

この MacBook Air は 13 インチなので、ディスプレイのピクセル数は 1440 x 900 になっている。そこを踏まえて、(geometry 0 0 1440 900)(geometry 1440 0 1920 1080) をみると、ちょっと何か見えてくるよね。

つまり「2つのリスト=2つのディスプレイ」という関係になっているようだ。

(workarea 0 22 1440 874) というのは、ディスプレイのピクセルサイズから、ちょうど OS X のツールバーを除いたサイズのようだ。フルスクリーンモードにすると、(geometry 0 0 1440 900) (workarea 0 0 1440 900) という値になった。

また、ひとつめのリストには、(frames #<frame *scratch* 0x102843190>) とあって、次のリストには (frames) とある。これはひとつめ、つまり MacBook Air 本体のディスプレイに Emacs のフレーム(一般的用語だとウインドウ)が存在している状態を表している。

mm-size はディスプレイの物理サイズ(ミリメーターサイズ)という情報を見かけたので、そういうことかな。だいたい合っていそう。

source"NS" ってのは、NextStep の NS かな。

ちなみに外部ディスプレイを外してみると、このように1つのリストになった(加工済)。

(
 ((geometry 0 0 1440 900)
  (workarea 0 22 1440 874)
  (mm-size 285 178)
  (frames #<frame *scratch* 0x102033398>)
  (source . "NS"))
 )

次に (frame-monitor-attributes) も同じように *scratch* バッファで試してみたところ、(display-monitor-attributes-list) で得られた結果と似たような情報が返ってきた。

((geometry 0 0 1440 900) (workarea 0 22 1440 874) (mm-size 285 178) (frames #) (source . "NS"))

(display-monitor-attributes-list) では、全てのディスプレイの情報が返ってくるのに対し、(frame-monitor-attributes) では、それを実行したフレームがどのディスプレイに存在するのか、などの情報が得られるようだ。

これだけだと、まぁ、面白くもないのだけど、desktop-save-mode も同時に拡張されたので、「Emacs 起動時に前回終了時のフレーム(一般用語でのウインドウ)位置に復帰」ということができるようになった。

「Emacs はいつもあっちのディスプレイで開いていて欲しい」みたいな要件は、これでクリアできそうだ。

手動でやるなら M-x desktop-save で現在のデスクトップ情報を保存し、M-x desktop-read で保存したファイルを読み込んでやると、元の位置に復帰する。

M-x desktop-save は他にもいろいろな「現在の情報」を保存するようだ。ついでに言うと、Emacs 24.4 から、desktop-save-mode は自動保存に対応したらしく、一定時間(desktop-auto-save-timeout)が経過すると、勝手に保存してくれるそうだ。

オレは今まで利用していなかったので、使い勝手はよく分からないけど、まぁ、便利にはなったんじゃないかな。