我试图定义一个函数,它将我的固定宽度的主体保持在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-hook
和remove-hook
行后,即可。但是一旦我调用add-hook
,我就会得到嵌套超过max-lisp-eval-depth 错误。
我不太了解口齿不清,所以我在调试时遇到了麻烦。
答案 0 :(得分:2)
最有可能set-window-buffer
将运行window-configuration-change-hook
。
因此,我建议您仅在set-window-buffer
或left-margin-width
实际更改时致电right-margin-width
。
但是无论如何,只要你的缓冲区显示在2个或更多不同宽度的窗口中,你就会遇到麻烦。
因此,更好的答案是不使用left-margin-width
和right-margin-width
,而是使用set-window-margins
。
不仅这不会调用window-configuration-change-hook
,因此不会受到这种无限递归问题的影响,但除此之外,它会很乐意为每个显示缓冲区的窗口调整边距,具体取决于窗口的宽度。