emacs窗口管理


init-window.el

基础设置

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

使用shackle管理窗口

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

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

设置默认的参数

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

窗口黄金分割zoom

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

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

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

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

1(defun maple/balance-windows(func &optional window-or-frame)
2  (unless (zoom--window-ignored-p)
3    (funcall func window-or-frame)))
4
5(advice-add 'balance-windows :around 'maple/balance-windows)

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

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

1(defmacro with-zoom-disable(body)
2  (declare (indent defun))
3  (let ((zoom-mode-p (when (featurep 'zoom) zoom-mode))
4        res)
5    (when zoom-mode-p (zoom-mode -1))
6    (setq res `,@body)
7    (when zoom-mode-p (zoom-mode zoom-mode-p))
8    res))

比如:

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

window-numbering显示当前窗口号

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

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

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

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

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

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

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

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

加载评论