プログラム系統備忘録ブログ

記事中のコードは自己責任の下でご自由にどうぞ。

Emacsでフレーム位置と大きさを記憶し再起動時に復元する

環境は、Windows7での"GNU Emacs 24.1.1 (i386-mingw-nt6.1.7601) of 2012-07-16 on GNUPACK"。

フレーム位置や大きさを毎回変えるのが面倒くさくなってきたので何とかしてやろうと。
ググると、http://www.bookshelf.jp/soft/meadow_30.html#SEC419Emacs 終了時のフレームサイズと位置を復元する elisp を書いてみた - あじーん-0.0.2-SNAPSHOTの二つが出てきました。自分の環境では単純にコピペするだけでは上手く動きませんでしたが、これらのページを参考に合わせてみると上手く動いてくれました。

(defconst my-save-frame-file
  "~/.emacs.d/.framesize"
  "フレームの位置、大きさを保存するファイルのパス")
(defun my-save-frame-size()
  "現在のフレームの位置、大きさを`my-save-frame-file'に保存します"
  (interactive)
  (let* ((param (frame-parameters (selected-frame)))
         (current-height (frame-height))
         (current-width (frame-width))
         (current-top-margin (if (integerp (cdr (assoc 'top param)))
                                 (cdr (assoc 'top param))
                                 0))
         (current-left-margin (if (integerp (cdr (assoc 'left param)))
                                  (cdr (assoc 'left param))
                                  0))
         (buf nil)
         (file my-save-frame-file)
         )
    ;; ファイルと関連付けられたバッファ作成
    (unless (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect (expand-file-name file))))
    (set-buffer buf)
    (erase-buffer)
    ;; ファイル読み込み時に直接評価させる内容を記述
    (insert
     (concat
      "(set-frame-size (selected-frame) "(int-to-string current-width)" "(int-to-string current-height)")\n"
      "(set-frame-position (selected-frame) "(int-to-string current-left-margin)" "(int-to-string current-top-margin)")\n"
      ))
    (save-buffer)))
(defun my-load-frame-size()
  "`my-save-frame-file'に保存されたフレームの位置、大きさを復元します"
  (interactive)
  (let ((file my-save-frame-file))
    (when (file-exists-p file)
        (load-file file))))

(add-hook 'emacs-startup-hook 'my-load-frame-size)
(add-hook 'kill-emacs-hook 'my-save-frame-size)
(run-with-idle-timer 60 t 'my-save-frame-size)

「Lispファイルを生成する」部分はもっとスマートに書けそうな気はします。