在Emacs缓冲区中居中文本

时间:2014-10-01 00:21:40

标签: emacs elisp

我试图定义一个函数,它将我的固定宽度的主体保持在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,我就会得到嵌套超过max-lisp-eval-depth 错误。

我不太了解口齿不清,所以我在调试时遇到了麻烦。

1 个答案:

答案 0 :(得分:2)

最有可能set-window-buffer将运行window-configuration-change-hook。 因此,我建议您仅在set-window-bufferleft-margin-width实际更改时致电right-margin-width

但是无论如何,只要你的缓冲区显示在2个或更多不同宽度的窗口中,你就会遇到麻烦。 因此,更好的答案是不使用left-margin-widthright-margin-width,而是使用set-window-margins。 不仅这不会调用window-configuration-change-hook,因此不会受到这种无限递归问题的影响,但除此之外,它会很乐意为每个显示缓冲区的窗口调整边距,具体取决于窗口的宽度。