编排 Emacs 窗口

发布于 2023-05-04 13:32:58 字数 3626 浏览 69 评论 0

处理 Emacs 中的 windows 有点麻烦,除非 有人向你解释这背后的哲学思想 然后你再深入阅读 display-bufferdisplay-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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

qq_eQNo9e

文章 0 评论 0

内心旳酸楚

文章 0 评论 0

mb_BlPo2I8v

文章 0 评论 0

alipaysp_ZRaVhH1Dn

文章 0 评论 0

alipaysp_VP2a8Q4rgx

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文