2014-10-01 224 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