基础设置
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) 后所有的窗口都会变成左右分屏,所以需要 shackle 或 popwin 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"))))
知识共享署名-非商业性使用-相同方式共享4.0国际许可协议