Table of Contents
基础设置
;; 设置默认为左右分屏 (setq split-width-threshold 1)
(evil-leader/set-key "ws" 'split-window-below ;; 上下分屏 "wv" 'split-window-right) ;; 左右分屏
使用shackle管理窗口
当设置了 (setq split-width-threshold 1)
后所有的窗口都会变成左右分屏,所以需要 shackle 或 popwin 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"))))