换了两天时间,总是摸到点头绪了,看了下面的文档,又一步步调试了doom的popup module。
- https://www.simplify.ba/articles/2016/01/25/display-buffer-alist/
- https://github.com/hlissner/doom-emacs/blob/develop/modules/ui/popup/autoload/popup.el
- https://www.gnu.org/software/emacs/manual/html_node/elisp/Choosing-Window.html
- https://www.gnu.org/software/emacs/manual/html_node/elisp/Frame-Layouts-with-Side-Windows.html
- https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Parameters.html
- https://www.gnu.org/software/emacs/manual/html_node/elisp/Displaying-Buffers-in-Side-Windows.html
- https://github.com/emacs-mirror/emacs/blob/master/lisp/window.el
基本上就是就是这种感觉:
(setq
display-buffer-alist
'(("^\\*[Hh]elp" ;正则匹配buffer name
(display-buffer-reuse-window ;入口函数,一个个调用直到有返回值,参数是:1.buffer 2.剩下的这些alist
display-buffer-in-side-window)
(side . bottom) ;参数alist从这里开始。这个side会被display-buffer-in-side-window使用
(window-width . 0.5) ;emacs会自动把这个设置到window-parameter里
(window-height . 0.35) ;同上
(slot . 1) ;这个会被display-buffer-in-side-window使用,控制window位置
(reusable-frames . visible) ;这个参数看第三个链接的display-buffer
(haha . whatever) ;当然随你放什么
(window-parameters ;emacs 26及以上会自动把下面的设置到window-parameter里
(select . t) ;自定义的param
(quit . t) ;同上
(popup . t) ;同上
(mode-line-format . none) ;emacs version > 25, none会隐藏mode line,nil会显示...
(no-other-window . t) ;随你设置其他的window-parameter,看文档
))))
doom就是写了个辅助函数,把自定义的plist结合默认参数翻译成上面的东西,比如:
(set-popup-rules!
'(("^\\*[Hh]elp" :slot 2 :vslot -2 :size 0.35 :select t)))
还有就是doom自己写了个类似display-buffer-in-side-window的函数,多了个支持vslot的功能,看文档是能更好的控制popup的位置。
基本上就这样,我现在是和doom一样自定义入口函数,在入口函数里调用display-buffer-in-side-window啥的,并附带处理所有的自定义参数,就这样了。
白花了这么多时间,希望有帮助 …