我将所有代码包装在 80 列中,有时 Emacs 窗口比 80 列宽,并且右侧有很多未使用的空白。
我想定位 Emacs 缓冲区,以便所有文本都显示在窗口中间。
这与居中对齐文本不同(更类似于查看 pdf 时文本两侧的空白)。
我认为这可以通过根据当前窗口大小动态调整边缘模式宽度来实现,但我不知道从哪里开始。有什么想法吗?
正如here所示,这确实是可能的:
(set-fringe-mode
(/ (- (frame-pixel-width)
(* 80 (frame-char-width)))
2))
但是,当我测试这个时,我似乎在使用边距方面更幸运,至少在调整框架大小时是这样:
(defun my-resize-margins ()
(let ((margin-size (/ (- (frame-width) 80) 2)))
(set-window-margins nil margin-size margin-size)))
(add-hook 'window-configuration-change-hook #'my-resize-margins)
(my-resize-margins)
这是一个应该做你想做的事情的函数,使用边距而不是边缘(因为我倾向于在边缘显示缓冲区边界,并且我发现如果边缘太大它会变得丑陋)。
(defun my/center (width)
(interactive "nBuffer width: ")
(let* ((adj (- (window-text-width)
width))
(total-margin (+ adj
left-margin-width
right-margin-width)))
(setq left-margin-width (/ total-margin 2))
(setq right-margin-width (- total-margin left-margin-width)))
(set-window-buffer (selected-window) (current-buffer)))
现代答案是 olivetti、visual-vill-column 或 writeroom-mode。
所有这些都是开箱即用的,尽管 writeroom-mode 还包括其他钩子。
您要求在窗口中央显示缓冲区,这只是将一些额外的空白从右侧移动到缓冲区的左侧。
有一个解决方案可以消除多余的空白吗? 如果可以接受,这里有两种方法。
fit-frame.el
将框架适合缓冲区。 我将命令 fit-frame
绑定到 C-x C-_
。 这不仅节省了 Emacs 内的空间,还节省了桌面空间。 (Library zoom-frm.el
还允许您逐步缩小/放大框架,因此当您不需要详细查看其内容时,可以通过缩小框架来节省空间。)如果没有(因此缓冲区显示在有多个窗口的帧中),并且如果缓冲区的窗口在其左侧或右侧有另一个窗口,则您可以执行以下操作之一:
2a。如果缓冲区的窗口左侧或右侧有另一个窗口,则可以使用命令
fit-window-to-buffer
。 但您还需要将选项 fit-window-to-buffer-horizontally
设置为非 nil
。
2b。使用
C-{
(shrink-window-horizontally
),然后使用 C-x z z z...
,逐渐缩小窗口宽度(删除多余的空白)。
face-remap+.el
。每当您使用文本缩放(例如 C-x C-
或 C-x =
)时,窗口大小都会随着文本大小而增大或缩小,因此当您缩小文本时,不会在右侧添加额外的空白。 这是由用户选项控制的text-scale-resize-window
。中心窗口模式
https://github.com/anler/centered-window-mode
使窗口文本居中的全局次要模式。
如果另一个窗口可见,并且其宽度小于“cwm-centered-window-width”,则文本将恢复正常。