2014-10-01 5 views
1

Emacs에서 고정 너비 본문을 왼쪽에 정렬하지 않고 버퍼 중앙에 유지하는 함수를 정의하려고합니다. 특히 이것을 버퍼 로컬로하고 싶습니다. 그리고 왼쪽 여백과 오른쪽 여백을 로컬로 설정하여이 작업을 수행하려고합니다.Emacs 버퍼에 텍스트 가운데 맞추기

이것은 잘 작동하지만 창 크기가 바뀌면 여백을 조정하여 문제가 발생합니다. add-hookremove-hook 라인이 제거

(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))) 

, 모든게의 확인 : 여기 (https://stackoverflow.com/a/23731757/3822233에서 적응) 코드입니다. 그러나 내가 add-hook라고 부르면 중첩이 max-lisp-eval-depth 오류를 초과합니다.

나는 이것을 디버깅하는 데 어려움을 겪고있어서 lisp을 정말로 모른다.

답변

2

set-window-buffer 일 가능성이 높습니다. window-configuration-change-hook이 종료됩니다. 따라서 left-margin-width 또는 right-margin-width이 실제로 변경되면 set-window-buffer으로 전화하는 것이 좋습니다.

그러나 버퍼가 다른 너비의 2 개 이상의 창에 표시되면 즉시 문제가 발생합니다. 더 좋은 대답은 left-margin-widthright-margin-width을 사용하지 않고 대신 set-window-margins을 사용하는 것입니다. 이 옵션은 window-configuration-change-hook을 호출하지 않으므로이 무한 재귀 문제가 발생하지 않지만 그 위에는 해당 창 너비에 따라 버퍼를 표시하는 모든 창마다 다르게 여백을 조정합니다.

+0

감사합니다. 'set-window-margins'와 함께 가고 일이 잘 작동하고 있습니다. – Arpon

관련 문제