2014-10-01 2 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-hook и remove-hook строки будут удалены, Everthing нормально. Но как только я вызываю add-hook, я получаю . Вложенность превышает max-lisp-eval-depth.

Я действительно не понимаю lisp, поэтому мне трудно отладить это.

ответ

2

Скорее всего set-window-buffer закончится пробежком window-configuration-change-hook. Так что я бы рекомендовал вам позвонить только set-window-buffer, когда left-margin-width или right-margin-width на самом деле меняется.

Но в любом случае вы попадете в беду, как только ваш буфер будет отображаться в двух или более окнах разной ширины. Итак, лучший ответ - не использовать left-margin-width и right-margin-width, а вместо этого использовать set-window-margins. Не только это не вызовет window-configuration-change-hook и, следовательно, не будет страдать от этой проблемы с бесконечной рекурсией, но, кроме того, она будет с радостью корректировать поля по-разному для каждого окна, отображающего буфер, в зависимости от ширины этих окон.

+0

спасибо! пошел с 'set-window-margins', и все работает нормально. – Arpon

Смежные вопросы