让Emacs记住窗口的位置和大小

我的Emacs配置中有一段脚本,在关闭前保存当前的窗口位置和大小。下一次启动后恢复到原来的位置,省得用鼠标拖动调整。

(setq *geometry* (expand-file-name "last-geometry" user-emacs-directory))

(defun --normalized-frame-parameter (parameter)
  (let ((value (frame-parameter (selected-frame) parameter)))
    (if (number-or-marker-p value) (max value 0) 0)))

(defun save-framegeometry ()
  (let* ((props '(left top width height))
         (values (mapcar '--normalized-frame-parameter props)))
    (with-temp-buffer
        (cl-loop for prop in props
                 for val in values
                 do (insert (format "(add-to-list 'initial-frame-alist '(%s . %d))\n"
                                    prop val)))
      (write-file *geometry*))))

(defun load-framegeometry ()
  (when (file-exists-p *geometry*)
    (load-file *geometry*)))

(when window-system
  (add-hook 'emacs-startup-hook 'load-framegeometry)
  (add-hook 'kill-emacs-hook 'save-framegeometry))

然而上面的配置偶尔会工作不正常,启动后窗口的尺寸比上次关闭的时候要大一些。百思不得其解,似乎在我的脚本运行以后,Emacs又自己调整了大小。经过询问AI,AI建议我创建一个 ~/.emacs.d/conf/early-init.el ,把该禁用的UI控件禁用掉,以免启动后再隐藏UI造成干扰,同时再禁止Emacs 根据字体自动调整窗口尺寸:

;; 禁止根据字体/UI变化自动调整大小
(setq frame-inhibit-implied-resize t)

;; 允许像素级对齐(非必须,但推荐)
;; (setq frame-resize-pixelwise t)

;; 尽早关闭 UI 元素,防止启动时闪烁和尺寸跳变
(menu-bar-mode -1)
(tool-bar-mode -1)

问题就这么解决了。不问AI,我可能一辈子都弄不明白。

评论

暂无评论