2014-10-01 216 views
1

我正在嘗試定義一個函數,它將Emacs中的固定寬度主體保持在緩衝區中居中,而不是與左側對齊。特別是我希望這是緩衝區本地化,我試圖通過本地設置左右邊距寬度來實現。在Emacs緩衝區中居中文本

這本身很好,但我也想要一個鉤子來調整窗口大小更改時的邊距,這對我造成了問題。下面的代碼(改編自https://stackoverflow.com/a/23731757/3822233):

(defun center-body() 
    (let* ((max-text-width 70) 
     (margin (max 0 (/ (- (window-width) max-text-width) 2)))) 
    (setq-local left-margin-width margin) 
    (setq-local right-margin-width margin) 
    (set-window-buffer nil (current-buffer)))) 

(defun uncenter-body() 
    (setq-local left-margin-width 0) 
    (setq-local right-margin-width 0) 
    (set-window-buffer nil (current-buffer))) 

(defun body-center-mode() 
    (interactive) 
    (if (= left-margin-width 0) 
     (progn 
     (center-body)) 
     (add-hook 'window-configuration-change-hook 'center-body nil 1))               
    (uncenter-body) 
    (remove-hook 'window-configuration-change-hook 'center-body 1))) 

add-hookremove-hook線被除去,寄託都沒關係。但只要我打電話給add-hook我得到一個嵌套超過最大lisp評估深度錯誤。

我不太瞭解lisp,所以我在調試時遇到了麻煩。

回答

2

最可能的set-window-buffer將最終運行window-configuration-change-hook。 因此,我建議你只有在left-margin-widthright-margin-width實際發生變化時才撥打set-window-buffer

但無論如何,只要您的緩衝區顯示在2個或多個不同寬度的窗口中,就會遇到麻煩。 所以更好的答案是不使用left-margin-widthright-margin-width,而是使用set-window-margins。 不僅這不會調用window-configuration-change-hook,因此不會遇到這種無限遞歸問題,但最重要的是,它將愉快地調整顯示緩衝區的每個窗口的邊距,這取決於這些窗口的寬度。

+0

謝謝!用'set-window-margins'去了,事情正常。 – Arpon 2014-10-01 02:33:02