更改emacs文本模式的边距

时间:2014-03-10 23:02:33

标签: emacs elisp hook margins

我发现将emacs中的边距改为我喜欢的唯一方法就是这样:

(add-hook 'window-configuration-change-hook
          (lambda ()
            (set-window-margins (car (get-buffer-window-list (current-buffer) nil t)) 24 24)))

我希望仅在文本模式下调用此设置,并在更改为其他模式时更改回来。有点天真,我试过这个:

(add-hook 'text-mode-hook
          (lambda ()
            (set-window-margins (car (get-buffer-window-list (current-buffer) nil t)) 24 24)))

但它没有用。在文本模式下,仅为缓冲区更改边距的正确代码是什么?

4 个答案:

答案 0 :(得分:6)

即使您可以使用set-window-margins设置边距,但只要您以任何方式更改窗口,它们就会丢失。更好的解决方案是设置变量left-margin-widthright-margin-width。例如:

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

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

答案 1 :(得分:2)

这里有一些代码可以将您的降价和文本文件置于80个字符以内。这会自动调整所有帧的边距。

;; Add left and right margins, when file is markdown or text.
(defun center-window (window) ""
  (let* ((current-extension (file-name-extension (or (buffer-file-name) "foo.unknown")))
         (max-text-width 80)
         (margin (max 0 (/ (- (window-width window) max-text-width) 2))))
    (if (and (not (string= current-extension "md"))
             (not (string= current-extension "txt")))
        ;; Do nothing if this isn't an .md or .txt file.
        ()
      (set-window-margins window margin margin))))

;; Adjust margins of all windows.
(defun center-windows () ""
  (walk-windows (lambda (window) (center-window window)) nil 1))

;; Listen to window changes.
(add-hook 'window-configuration-change-hook 'center-windows)

答案 2 :(得分:1)

这样的事情怎么样?您的问题可能源于许多主要模式继承text-mode的事实。您可以删除window-configuration-change-hook,也可以使用新功能major-briggs - 我个人只需将text-mode-hookmajor-briggs功能一起使用。

  
(add-hook 'text-mode-hook (lambda ()
  (major-briggs)
  ;; insert additional stuff if so desired
  ))

(defun major-briggs ()
  (when (eq major-mode 'text-mode)
    (set-window-margins
      (car (get-buffer-window-list (current-buffer) nil t)) 24 24) ))

答案 3 :(得分:0)

使用以下代码:

(defvar-local my-text-width nil
  "Text area width for current buffer, or nil if no attention needed.")
(put 'my-text-width 'safe-local-variable #'integerp)

(defun my--margin-setup ()
  "Handle settings of `my-text-width'."
  (walk-windows
   (lambda (window)
     (with-current-buffer (window-buffer window)
       (let ((margin (and my-text-width
                          (/ (max 0 (- (window-total-width)
                                       my-text-width))
                             2))))
         (when (or (not (equal margin left-margin-width))
                   (not (equal margin right-margin-width)))
           (setq left-margin-width margin)
           (setq right-margin-width margin)
           (set-window-buffer window (current-buffer))))))))

(add-hook 'window-configuration-change-hook #'my--margin-setup)

您可以在文件本地变量或目录本地变量中设置my-text-width,Emacs将相应地自动设置边距以获取该文本宽度。即使您调整框架大小或引入分割,它也可以工作。