编排 Emacs 窗口
处理 Emacs 中的 windows 有点麻烦,除非 有人向你解释这背后的哲学思想 然后你再深入阅读 display-buffer
和 display-buffer-alist
的手册 。
即使是这样,软件包管理人员也不一定会遵循 Emacs 标准,而且该标准也会随着时间的推移发生变化,这些因素都使的配置软件变得困难。为了帮助别人,我把我的定制记录在此。它们摘录自 init.org 文件,该文件会在保存时自动转换成 init.el,但它本身对配置的解释解释的比较清楚。
首先,我们定义了一些函数来根据模式选择缓冲区。这是些函数不太常用傲:我只是需要它来处理那些名称并没有遵循任何规则的 buffer,其他的 buffer,display-buffer-alist 定义的方法就能搞定。
(defun jjgr-dedicated-window (fun)
(lambda (buffer &optional alist)
(let ((window (funcall fun buffer alist)))
(when window
(set-window-dedicated-p window t))
window)))
(defun jjgr-rx-mode-name (mode-regexp)
(lambda (buffer &rest optional)
(with-current-buffer buffer
(string-match mode-regexp mode-name))))
然后我开始进行配置。我基本上有三个使用 Emacs 的场景:电子邮件、编码和写作。我还有三类窗口:主动打开的(编辑的文件,新的 shell),临时窗口(capture,新邮件),提供信息的窗口(日志,错误消息,帮助窗口)。
(setq
;; Kill a frame when quitting its only window
frame-auto-hide-function 'delete-frame
;; Maximum number of side-windows to create on (left top right bottom)
window-sides-slots '(0 1 1 1)
;; Default rules
display-buffer-alist
`(;; Display *Help* buffer at the bottom-most slot
("*(Help|trace-|Backtrace|RefTeX.*)"
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-in-side-window)
(side . right)
(slot . 0)
(window-width . 0.33)
(reusable-frames . visible))
("^*info"
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-pop-up-frame)
(pop-up-frame-parameters
(width . 80)
(left . 1.0)
(fullscreen . fullheight)))
;; Open new edited messages in a right-hand frame
;; For this to close the frame, add
;; (add-hook 'wl-draft-kill-pre-hook 'quit-window)
("(*draft*|Draft/)"
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-pop-up-frame)
(pop-up-frame-parameters
(width . 80)
(left . 1.0)
(fullscreen . fullheight)))
;; TeX output buffers to bottom, with 10 lines
(,(jjgr-rx-mode-name "^(TeX Output|TeX)")
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-in-side-window)
(side . bottom)
(slot . 0)
(window-height . 10)
(reusable-frames . visible))
;; Display *BBDB* buffer on the bottom frame
("*BBDB"
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-in-side-window)
(side . bottom)
(slot . 0)
(window-height . 10)
(reusable-frames . visible))
;; Split shells at the bottom
("^*[e]shell"
(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-below-selected)
(window-min-height . 20)
(reusable-frames . visible)
)
)
)
我发现 display-buffer-alist
的语法相当容易理解。
我倾向于将辅助缓冲区放置在右侧的边窗中。除了 info
buffer 在显示 Emacs 手册时,这种情况下我一般喜欢把它放在独立的 frame 中(即操作系统中窗口)。联系人数据库 BBDB
将在屏幕底部的一个小窗口中弹出,10 行高。shell 从当前窗口的底部分离出一个新窗口,而不是覆盖原窗口的内容(默认值)。
注意我是如何修改Wanderlust(一种电子邮件客户端)的工作方式的。
我指示Emacs在新的操作系统窗口(frame)上打开电子邮件编辑缓冲区。然而这样一来写完邮件或放弃邮件后,我需要执行 quit-window
, 否则不会自动关闭 frame。这是因为 Wanderlust 的退出使用的是 delete-window
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论