Подавить автоматическое заполнение emacs в выбранном регионе - PullRequest
6 голосов
/ 05 января 2010

Я использую emacs для редактирования всего. В некоторых моих латексных документах я хотел бы автоматически отключить режим автозаполнения при редактировании таблиц и кода. По сути, я хотел бы иметь два тега, например:

   %%% BEGIN NO FILL
   %%% END NO FILL

и между ними ничего не будет заполнено.

Кто-нибудь может придумать, как это сделать? Мне нужно выяснить, находится ли курсор внутри области, а затем переключить режим, и нужно будет делать это каждый раз, когда курсор перемещается. Или есть лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 08 января 2010

Если вы используете AUCTeX (так и должно быть), вы можете проверить LaTeX-indent-environment-list. Добавление окружения к этой переменной сделает так, чтобы (среди прочего) M-q не пополнял абзац. К сожалению, это не работает для режима автозаполнения. Следующий в значительной степени непроверенный код, добавленный к LaTeX-mode-hook, может сделать то, что вы хотите.

(setq auto-fill-function
  (lambda ()
    (unless (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0))
               (save-excursion (or (search-backward "%%% END NO FILL"   (point-min) t) 0)))
      (do-auto-fill))))

Это очень глупо и неэффективно, но, кажется, достаточно быстро на моей машине. Он не допускает вложения и требует, чтобы вы вручную отмечали все разделы, которые вы не хотите заполнять. То, что я думаю добавить в мой .emacs (пока я не прочитал твой вопрос, я не понимал, насколько это меня беспокоило), ниже того, какие ключи от текущей среды, поэтому нет необходимости в специальной разметке (хотя она только смотрит на самая внутренняя среда (я не уверен, сколько проблем возникнет на практике)). Объединение этих двух вопросов оставлено заинтересованным читателем в качестве упражнения.

;; You can use the following to unset the variables and play around with them
;; (makunbound 'auto-fill-ignore-environments)
;; (makunbound 'auto-fill-ignore-environments-regexp)
(defcustom auto-fill-ignore-environments
  (mapcar 'car LaTeX-indent-environment-list)
  "List of environments for which `auto-fill-mode' should be
disabled.  Used to generate `auto-fill-ignore-environments-regexp'."
  :type '(sexp)
  )
(defcustom auto-fill-ignore-environments-regexp
  (regexp-opt auto-fill-ignore-environments)
  "Regexp matching LaTeX environments for which `auto-fill-mode'
should be disabled.  If not set, automatically generated from
`auto-fill-ignore-environments'"
  :type '(string)
  :set-after '(auto-fill-ignore-environments)
  )
(add-hook 'LaTeX-mode-hook
          (lambda ()
            (setq auto-fill-function
                  (lambda ()
                    (unless (string-match auto-fill-ignore-environments-regexp
                                          (LaTeX-current-environment))
                      (do-auto-fill))))))

Я никогда не использовал defcustom раньше, поэтому я уверен, что часть может быть улучшена немного.

1 голос
/ 20 января 2010

Понял. Проверьте это:

(defun in-no-auto-fill-region ()
  (> (save-excursion (or (search-backward "%%% BEGIN NO FILL" (point-min) t) 0))
     (save-excursion (or (search-backward "%%% END NO FILL"   (point-min) t) 0))
     ))

(defun previous-line-checking-auto-fill (arg)
  (interactive "P")
  (previous-line arg)
  (if (in-no-auto-fill-region)
      (turn-off-auto-fill)
    (turn-on-auto-fill)))

(defun next-line-checking-auto-fill (arg)
  (interactive "P")
  (next-line arg)
  (if (in-no-auto-fill-region)
      (turn-off-auto-fill)
    (turn-on-auto-fill)))

(add-hook 'LaTeX-mode-hook
      '(lambda nil
     (local-set-key "C-p" 'previous-line-checking-auto-fill)
     (local-set-key "C-n" 'next-line-checking-auto-fill)
     (auto-fill-mode 1)
     ))
0 голосов
/ 21 января 2010

Если вы хотите пойти по пути советов / переопределения всех функций движения, это должно помочь:

(defmacro movement-advice (func)
  `(defadvice ,func (after ; run this after the original function is done (and point has moved)
                     ;; Give it a unique name
                     ,(intern (concat (symbol-name func) "-auto-fill-auto-off"))
                     ;; Hopefully this satisfies the arguments of any function we can throw at it
                     (&rest args)
                     ;; turn it on
                     activate
                     )
     "Turn auto-fill-mode on or off automatically."
     (auto-fill-mode (not (in-no-auto-fill-region)))))

(dolist (func '(next-line
                previous-line
                forward-paragraph
                backward-paragraph
                mouse-drag-region
                ;; Whatever you use
                ))
  (eval `(movement-advice ,func)))
0 голосов
/ 09 января 2010

Кроме того, вы можете отключить режим автозаполнения и использовать M-q для форматирования абзацев. Я не люблю прыгуны автозаполнения, поэтому я использую это в каждом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...