2016-08-22 4 views
1

Я историк, пытающийся настроить Emacs для эффективной работы академических работ. С этой целью я решил добавить поля в буфер Emacs. Конечный результат выглядит this, и было достигнуто с помощью этого кода:Emacs: как установить поля для автоматической настройки в режиме разделения экрана?

;; Margins function 

(defun my-set-margins() 
    "Set margins in current buffer." 
    (setq left-margin-width 26) 
    (setq right-margin-width 26)) 

;; Add margins by default to a mode 

(add-hook 'org-mode-hook 'my-set-margins) 

Проблема заключается в том, что, когда я разделить экран по вертикали, поля сделать текст нечитаемым. Итак, я пришел к выводу, что необходимо либо (1), чтобы Emacs автоматически удалял поля автоматически во время вертикального разделения экрана и откладывал их обратно на одном экране; или (2) создать комбинацию клавиш для переключения полей. Любые идеи о том, как это сделать? Заранее спасибо!

+0

Слишком много возможностей, возникающих при разбиении окон на то, чтобы написать на их основе решение * general *, поэтому я выбрал второй вариант, который является простым переключением. Вы могли бы просто написать свою собственную функцию, которая разбивает окно в указанном направлении, а затем устанавливает поля и другую функцию «delete-other-windows», а затем задает поля. – lawlist

+0

Например: '(defun foo()« Doc-string. »(Интерактивный) (delete-other-windows) (setq left-margin-width 0) (setq right-margin-width 0) (set-window-buffer (selected-window) (current-buffer))) – lawlist

+0

Как вы обнаружили, настройка статического значения для конкретной геометрии окна плохо работает, когда геометрия фактически является динамической. Я предлагаю вам удалить привязку с крючка и вызвать его вручную, когда вы находитесь в ситуации, когда вы хотите этого поведения. Возможно, добавьте вторую функцию, чтобы вернуть ее обратно по умолчанию, когда вы хотите изменить размер своего окна. – tripleee

ответ

0

В документации указано, что установка left-margin-width или right-margin-width не влияет на окно. Эти переменные проверяются, когда в окне отображается новый буфер. Таким образом, вы можете вносить изменения в силу, вызывая set-window-buffer. https://www.gnu.org/software/emacs/manual/html_node/elisp/Display-Margins.html

Следующая функция проверяет, имеет ли край значение больше 0, и переключается либо на него, либо на нем. Я связал интерактивную функцию с global-map ключом f5.

(defun my-toggle-margins() 
"Set margins in current buffer." 
(interactive) 
    (if (or (> left-margin-width 0) (> right-margin-width 0)) 
    (progn 
     (setq left-margin-width 0) 
     (setq right-margin-width 0) 
     (set-window-buffer (selected-window) (current-buffer))) 
    (setq left-margin-width 26) 
    (setq right-margin-width 26) 
    (set-window-buffer (selected-window) (current-buffer)))) 

(global-set-key [f5] 'my-toggle-margins) 
+0

Большое спасибо за ваш ответ! Я использую ваше решение в течение некоторого времени, и он отлично интегрируется в мой рабочий процесс! –

+0

Я вижу, что мы можем перемещать '(set-window-buffer (selected-window) (current-buffer))' после оператора ** IF/THEN **, так как он вызывается в любом случае. Таким образом, он должен появляться только один раз. Это не нужно делать, но это выглядело бы лучше. – lawlist