在Emacs缓冲区中居中文本
问题描述:
我正在尝试定义一个函数,它将Emacs中的固定宽度主体保持在缓冲区中居中,而不是与左侧对齐。特别是我希望这是缓冲区本地化,我试图通过本地设置左右边距宽度来实现。在Emacs缓冲区中居中文本
这本身很好,但我也想要一个钩子来调整窗口大小更改时的边距,这对我造成了问题。下面的代码(改编自https://*.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
我得到一个嵌套超过最大lisp评估深度错误。
我不太了解lisp,所以我在调试时遇到了麻烦。
答
最可能的set-window-buffer
将最终运行window-configuration-change-hook
。 因此,我建议你只有在left-margin-width
或right-margin-width
实际发生变化时才拨打set-window-buffer
。
但无论如何,只要您的缓冲区显示在2个或多个不同宽度的窗口中,就会遇到麻烦。 所以更好的答案是不使用left-margin-width
和right-margin-width
,而是使用set-window-margins
。 不仅这不会调用window-configuration-change-hook
,因此不会遇到这种无限递归问题,但最重要的是,它将愉快地调整显示缓冲区的每个窗口的边距,这取决于这些窗口的宽度。
谢谢!用'set-window-margins'去了,事情正常。 – Arpon 2014-10-01 02:33:02