Emacs

Emacs フレーム(Frame) のサイズ設定関連の整理

More than 1 year has passed since last update.

環境

  • OS: Windows 7
  • Emacs: GNU Emacs 25.3.1 (i686-w64-mingw32)

はじめに

  • フレームのサイズ指定は表示文字数(表示行数、表示桁数)が基本だが、 モニタサイズは画素数で表す。
  • モニタサイズに合わせて、フレームサイズを指定する場合、フォントの画素数を基準に文字数を算出するか 画素数で指定する関数を利用する。

モニタの画素数、解像度を調べる

  • x-display-pixel-height
  • x-display-pixel-width
  • display-pixel-height
  • dispaly-pixel-width

調べた環境では 'x-' 有り、無しの違いは不明
マルチモニタ環境での解像度は合計値になるため、そのままでは利用できない。

フォントサイズを得る

  • frame-char-height: 一行の画素数
  • frame-char-width : フレームのデフォルトフォントの標準フォント幅の画素数

set-frame-* を利用したフレームサイズの設定

文字数指定

(set-frame-size (selected-frame) 80 25)

画素数指定

(setq frame-resize-pixelwise t) を設定するかオプション指定する

(set-frame-size (selected-frame) 1024 600 nil t)
; (set-frame-position (selected-frame) 0 0)

initial-frame-alist, default-frame-alistによるフレームサイズの設定(画素数指定は未確認)

文字数指定

(setq default-frame-alist
  '(
    (width . 80)
    (height . 25)
   ))

画素数指定

(setq default-frame-alist
  '(
    (width . (text-pixels . 1024))
    (height . (text-pixels . 600))
   ))

モニタ毎に解像度を調べる

(display-monitor-attributes-list)

(display-monitor-attributes-list)
(((geometry 0 0 1680 1050) (workarea 0 0 1680 1020) (mm-size 593 370) (name . "\\\\.\\DISPLAY1") (frames #<frame emacs@hostname 05428d80>)) 
 ((geometry 1680 150 1600 900) (workarea 1680 150 1600 900) (mm-size 564 318) (name . "\\\\.\\DISPLAY2") (frames)))

※ frames に frame 情報が含まれている方の geometory 情報を取り出せばモニタに合わせたフレームサイズに設定できそうだけれど、綺麗なやり方が思いつかない。

(setq my:current-workarea (loop for x in (display-monitor-attributes-list)
      when (> (length (assoc 'frames x)) 1) return (assoc 'workarea x)))

その他

  • emacs のマニュアルにおける display は X Window System における display なので 表示装置はモニタと表現する。マニュアルにある Multiple Display はマルチモニタとは異なる。
  • 自分の環境では、リファレンスマニュアルにある 'frame-monitor-attributes は describe-symbol で出てこない。