emacs窗口管理


init-window.el

基础设置

;; 设置默认为左右分屏
(setq split-width-threshold 1)
(evil-leader/set-key
  "ws"  'split-window-below  ;; 上下分屏
  "wv"  'split-window-right) ;; 左右分屏

使用shackle管理窗口

当设置了 (setq split-width-threshold 1) 后所有的窗口都会变成左右分屏,所以需要 shacklepopwin package对窗口进行管理, 对一些特殊的窗口或 buffer 比如 *Help*flycheck error list 需要设置为显示在下方,并且默认选中

(setq shackle-rules
      '(("*Help*" :select t :align 'below :autoclose t)
        (flycheck-error-list-mode :select t :align 'below :autoclose t)))

设置默认的参数

(setq shackle-default-size 0.3
      shackle-default-alignment 'below
      shackle-default-rule nil)

窗口黄金分割zoom

窗口黄金分割是一个非常有用的效果,当选中某个buffer时,这个buffer的window会自动按比例放大,这样就不用手动对窗口进行调整, 之前一直使用 golden-ratio 这个package, 但看github上最近一次提交已经是两年前,加上使用需要定义很多的 golden-ratio-extra-commands, 所以切换到了 zoom

zoom 这个 package也有一些问题,比如我定义了

(setq zoom-size '(0.618 . 0.618)
      zoom-ignored-major-modes '(term-mode flycheck-error-list-mode))

但使用 flycheck-list-errors 时还是会自动缩放窗口大小,后来翻看源码时发现新建 window 是都会调用 balance-windows ,所以我稍微修改了一下

(defun maple/balance-windows(func &optional window-or-frame)
  (unless (zoom--window-ignored-p)
    (funcall func window-or-frame)))

(advice-add 'balance-windows :around 'maple/balance-windows)

这样在调用 flycheck-list-errors 就不会再自动缩放窗口大小了

另外有一些命令需要临时关闭 zoom-mode ,所以有添加了一个 marco 临时关闭 zoom-mode

(defmacro with-zoom-disable(body)
  (declare (indent defun))
  (let ((zoom-mode-p (when (featurep 'zoom) zoom-mode))
        res)
    (when zoom-mode-p (zoom-mode -1))
    (setq res `,@body)
    (when zoom-mode-p (zoom-mode zoom-mode-p))
    res))

比如:

(with-zoom-disable
  (maple-imenu))

window-numbering显示当前窗口号

为了更方便的在窗口间进行跳转,避免重复使用 evil-window-down, evil-window-right等命令

(use-package window-numbering
  :hook (maple-theme . window-numbering-mode))

maple-theme-hook: 加载 theme 后执行hook

然后设置(这里只设置到5,因为我大概不会开10个窗口的)

(evil-leader/set-key
  "w0"  'select-window-0
  "w1"  'select-window-1
  "w2"  'select-window-2
  "w3"  'select-window-3
  "w4"  'select-window-4
  "w5"  'select-window-5)

这样就可以使用leader + w + {window number}或者 alt + {window number}跳转

另外window-number的显示需要mode-line的支持,比如在maple-modeline里可以这样定义

(maple-modeline-define window-number
  :if (bound-and-true-p window-numbering-mode)
  :format
  (let ((color (face-attribute 'cursor :background)))
    (maple-modeline--add-text-property
     (maple-modeline--unicode-number
      (int-to-string (window-numbering-get-number)))
     'face `(:foreground ,color :distant-foreground "white"))))
作者: honmaple
链接: https://honmaple.me/articles/2019/01/emacs窗口管理.html
版权: 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat