読者です 読者をやめる 読者になる 読者になる

cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

『終了時のフレームサイズを記憶する』をsession.elを考慮

タイトルの通りMeadow/Emacs memo: ウィンドウ/フレーム関連 ― 分割・サイズ変更で紹介している『終了時のフレームサイズを記憶する』をsession.elを考慮した設定を紹介します。

session.elとは

開いたファイルや実行したコマンドの履歴を保存してくれるsession.el Session Management for Emacsを使っている設定向けに、最適化するというものです。

『終了時のフレームサイズを記憶する』とは

終了時に.framesize.elというファイルにフレームサイズと位置を保存して、起動時にそれを読み込んで設定するということをしています

何が問題なのか?(リスペクト)

.framesize.elというファイルを"開いた"という履歴がsession.elによって保存されてしまうため、C-x C-fで前回開いたファイルを開こうとすると開いた覚えのない.framesize.elが一番最初に出てきて邪魔

解決法

session.elで定義している、session-set-file-name-exclude-regexpという開いたファイルの履歴として保存しないファイル名を正規表現で規定する変数(session.el内で定義されている)に.framesize.elを付け足してあげる事で解決します。

;; フレームサイズと位置を記憶
(defvar framesize-file (concat rootpath "/.framesize.el"))
(defvar framesize-file-regexp "[/\\]\\.framesize\\.el")
(defun my-window-size-save ()
  (let* ((rlist (frame-parameters (selected-frame)))
         (ilist initial-frame-alist)
         (nCHeight (frame-height))
         (nCWidth (frame-width))
         (tMargin (if (integerp (cdr (assoc 'top rlist)))
                      (cdr (assoc 'top rlist)) 0))
         (lMargin (if (integerp (cdr (assoc 'left rlist)))
                      (cdr (assoc 'left rlist)) 0))
         buf
         (file framesize-file))
    (if (get-file-buffer (expand-file-name file))
        (setq buf (get-file-buffer (expand-file-name file)))
      (setq buf (find-file-noselect file)))
    (set-buffer buf)
    (erase-buffer)
    (insert (concat
             ;; 初期値をいじるよりも modify-frame-parameters
             ;; で変えるだけの方がいい?
             "(delete 'width initial-frame-alist)\n"
             "(delete 'height initial-frame-alist)\n"
             "(delete 'top initial-frame-alist)\n"
             "(delete 'left initial-frame-alist)\n"
             "(setq initial-frame-alist (append (list\n"
             "'(width . " (int-to-string nCWidth) ")\n"
             "'(height . " (int-to-string nCHeight) ")\n"
             "'(top . " (int-to-string tMargin) ")\n"
             "'(left . " (int-to-string lMargin) "))\n"
             "initial-frame-alist))\n"
             ;;"(setq default-frame-alist initial-frame-alist)"
             ))
    (save-buffer)
    ))
(defun my-window-size-load ()
  (let* ((file framesize-file))
    (if (file-exists-p file)
        (load file))))
(my-window-size-load)
;; Call the function above at C-x C-c.
(defadvice save-buffers-kill-emacs
  (before save-frame-size activate)
  (my-window-size-save))
;; .framesize.elを.sessionに保存しない
(when (require 'session nil t)
  (custom-set-variables
   '(session-set-file-name-exclude-regexp
     (concat session-set-file-name-exclude-regexp "\\|" framesize-file-regexp))))

自分用メモ

session-set-file-name-exclude-regexpの初期値は

"[/\\]\\.overview\\|[/\\]\\.session\\|News[/\\]"

正規表現の意味
1. \\|は選択
2. \\.は.
3. [/\\]はファイルのセパレーターを表していて、WindowsでもUnixでも動作するように、スラッシュ/とバックスラッシュ\を表している

[ ]

の中では\が特別な文字でなくなるのに、どうして2つつなげて書いているのか疑問だったが、引数を評価してから関数に渡す際に\\が\になるからだ。

Emacs Lispとかが参考になった。

その時の自分のTweet