2014-07-25 308 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控制。