2014-07-25 193 views
5

我将所有代码都包装在80列,有时候Emacs窗口宽于80列,右侧有很多未使用的空白。窗口内的中心Emacs缓冲区

我想定位Emacs缓冲区,所以所有的文本都显示在窗口中间。

这与中心对齐文本不同(更类似于查看pdf时文本两边的空白)。

我认为这可以通过动态调整边缘模式宽度来实现,具体取决于当前的窗口大小,但我不知道从哪里开始。有任何想法吗?

+0

[writeroom-mode.el](https://github.com/joostkremers/writeroom-mode/blob/master/writeroom-mode。el)设法做到这一点;也许读源提供了一些线索。 – legoscia

回答

9

作为证明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) 
+1

对S.O.的回答应至少提供您要链接的信息的摘要 - 解决方案是什么(如何)的摘要。 – Drew

+1

我按照你的建议做了,是更好吗?或者我应该删除我的答案? – ryuslash

+0

非常好。 Upvoted。谢谢。 – Drew

2

这是一个函数,它应该做你想做的事情,使用边距而不是边缘(因为我倾向于在边缘显示缓冲区边界,如果边缘太大,我觉得它变得很难看)。

(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))) 
0

您要求在窗口的中央显示缓冲区,它将右边的一些额外空白移动到缓冲区的左侧。

如何消除多余的空白而不是解决方案?如果这是可以接受的,这里有两种方法。

  1. 如果缓冲区是独自一人在其框架,那么你就可以适应帧缓冲区,利用图书馆fit-frame.el。我将命令fit-frame绑定到C-x C-_。这不仅可以节省Emacs内部的空间,还可以节省桌面空间。 (图书馆zoom-frm.el让你也缩小/放大框增量,这样你就可以通过缩小,当你不需要看到它的详细内容框架节省空间。)

  2. 如果没有(因此缓冲区所示一个窗口有多个窗口),如果缓冲区的窗口在窗口左侧或右侧有另一个窗口,则可以执行以下操作之一:

    2a。如果缓冲区的窗口在其左侧或右侧有另一个窗口,则可以使用命令fit-window-to-buffer。但是您还需要将选项fit-window-to-buffer-horizontally设置为非nil

    2b。使用C-{shrink-window-horizontally),然后是C-x z z z...,逐渐缩小窗口宽度(删除多余的空白)。

    2c。加载库face-remap+.el。无论何时使用文本缩放(例如C-x C-C-x =),窗口大小随文本大小一起增大或缩小,因此缩小文本时不会在右侧添加额外的空白。这由用户选项text-scale-resize-window控制。