Чи існує повністю автоматичний режим заповнення абзацу для коментарів до коду?


18

Я шукаю другорядний режим, щоб постійно вводити абзаци під час введення тексту (подібно до того, що aggressive-indent-modeробиться для відступу). Він також повинен бути досить розумним, щоб лише заповнювати коментарі (а може й рядки залежно від мови).

Я намагався:

  • auto-fill-mode автоматично заповнюється під час введення нових абзаців, але не редагується під час редагування абзаців.

  • refill-mode постійно поповнює абзаци, але намагається вкласти код в абзаци, а також коментарі.

  • Я спробував додати fill-paragraphйого до after-change-functionsгака, але він відкручує і багато інших речей (це, мабуть, все, що можна виправити, але потрібно буде докласти певних зусиль).

Якісь кращі ідеї?


6
Убік: глава 7 розділу Glickstein's Writing GNU Emacs розглядає питання про те, як ви могли реалізувати функціонал, який вам потрібно. Можливо, це буде чудовою можливістю вчитися / практикувати за допомогою elisp.
Дан

Я шукаю абзац з автозаповненням (з увімкненою функцією автозаповнення) org-mode, але ви можете спробувати rebox2
CodyChan

Відповіді:


4

Я придумав мінімальний спосіб реалізації цієї функціональності: просто прив’яжіть пробіл до дзвінка (fill-paragraph)!

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

Є кілька застережень, про які я до цього часу натрапив:

  1. elisp-mode(можливо, інші) робить якесь фантазійне заповнення коду, коли ви телефонуєте fill-paragraph, це може бути, а може і не бути тим, що ви хочете. Можливо, це можна виправити за допомогою тестування, якщо точка знаходиться в коментарі чи docstring, але я не знаю, як це зробити.

  2. Іноді ви не можете легко ввести кілька просторів (тому що fill-paragraphвбиває будь-які пробіли). Оскільки пробіл тепер діє так, just-one-spaceщо, мабуть, нормально замінити цю прив'язку на (insert " ").

Я створив мінорний режим, що містить цю функціональність, вона доступна в github або в пакеті melpa aggressive-fill-paragraph.


Я вважаю іронічним те, що aggressive-fill-paragraphце набагато менш агресивно, ніж те refill-mode, що є агресивним, аж до досить марного (так як ви навіть не можете процитувати когось > без реорганізації в режимі поповнення: навіть якщо для заміни використовуєте регулярні вирази) .
Привіт-Ангел

1

Якщо вам подобається, як поводиться режим заправки (я не: p), але не тоді, коли він веде себе, це слід виправити відносно легко, гальмуючи його, коли ви не знаходитесь у правильних умовах

Наприклад

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

В основному він видаляє функцію, яка запускає заправку, after-change-functionsі замінює її на ту, яка додатково перевірить, що ми в коментарі, перш ніж робити саме те саме.


Виглядає як вдалий початок, але все ж не зовсім правильно: якщо поправка запускається під час редагування коментаря, вона заправляє весь абзац, включаючи навколишній код. Це може бути виною оточуючого режиму в неправильному визначенні меж абзацу, але я сумніваюсь у цьому: я спробував у режимі Emacs Lisp, який, я вважаю, виконує справи з книги.
Жил "ТАК - перестань бути злим"

ну, тому я сказав, що мені не подобається refill-mode:) Проблема в тому, що refill-modeвикористовуєfill-region замість цього fill-paragraph, втрачаючи таким чином здатність вшановувати fill-paragraph-functionта робити речі потенційно безладними
Sigma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.