Existe-t-il un mode de paragraphe de remplissage entièrement automatique pour les commentaires de code?

18

Je recherche un mode mineur pour garder les paragraphes remplis à tout moment lors de la frappe (similaire à ce que aggressive-indent-modefait pour l'indentation). Il doit également être suffisamment intelligent pour ne remplir que les commentaires (et peut-être des chaînes en fonction de la langue).

Certaines choses que j'ai essayées sont:

  • auto-fill-mode se remplit automatiquement lorsque vous tapez de nouveaux paragraphes mais ne se remplit pas lorsque vous modifiez des paragraphes.

  • refill-mode remplit constamment les paragraphes, mais il essaie d'encapsuler le code dans les paragraphes ainsi que dans les commentaires.

  • J'ai essayé d'ajouter fill-paragraphau after-change-functionscrochet, mais il se défait et beaucoup d'autres choses (c'est probablement tout réparable mais cela prendrait un certain effort).

De meilleures idées?

dshepherd
la source
6
En plus: le chapitre 7 de Glickstein's Writing GNU Emacs Extensions explique comment vous pouvez implémenter les fonctionnalités que vous recherchez. Cela pourrait être une excellente occasion d'apprendre / pratiquer avec elisp.
Dan
Je regarde le paragraphe de remplissage automatique (avec le remplissage automatique activé) org-mode, mais vous pouvez essayer rebox2
CodyChan

Réponses:

4

J'ai trouvé une façon minimale d'implémenter cette fonctionnalité: il suffit de lier la barre d'espace pour appeler aussi (fill-paragraph)!

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

Il y a quelques mises en garde que j'ai rencontrées jusqu'à présent:

  1. elisp-mode(peut-être d'autres) remplit un peu de code lorsque vous appelez fill-paragraph, cela peut ou non être ce que vous voulez. Peut probablement être corrigé en testant si le point est dans un commentaire ou une docstring mais je ne sais pas comment faire.

  2. Vous ne pouvez parfois pas facilement entrer dans plusieurs espaces (car le fill-paragraphtue tous les espaces de fin). Étant donné que la barre d'espace agit maintenant comme just-one-spaceil est probablement correct de remplacer cette liaison par (insert " ").

J'ai créé un mode mineur contenant cette fonctionnalité, il est disponible sur github ou dans le package melpa aggressive-fill-paragraph.

dshepherd
la source
Je trouve ironique ce qui aggressive-fill-paragraphest beaucoup moins agressif que refill-mode, ce qui est agressif jusqu'à être assez inutile (car vous ne pouvez même pas citer quelqu'un avec > sans truc de réarrangement en mode de recharge: même si vous utilisez des expressions régulières pour le remplacement) .
Hi-Angel
1

Si vous aimez le comportement du mode recharge (je n'aime pas: p) mais pas quand il se comporte, il devrait être relativement facile à corriger en l'inhibant chaque fois que vous n'êtes pas dans les bonnes conditions

Par exemple

(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)

Fondamentalement, il supprime la fonction qui déclenche la recharge after-change-functionset la remplace par une fonction qui vérifiera en outre que nous sommes dans un commentaire avant de faire exactement la même chose.

Sigma
la source
Cela semble être un bon début, mais pas tout à fait correct: si une recharge est déclenchée lors de la modification d'un commentaire, elle remplit tout le paragraphe, y compris le code environnant. C'est peut-être la faute du mode environnant pour ne pas définir correctement les limites de paragraphe, mais j'en doute: j'ai essayé en mode Emacs Lisp, que je suppose faire les choses par le livre.
Gilles 'SO- arrête d'être méchant'
eh bien, c'est pourquoi j'ai dit que je n'aime pas refill-mode:) Le problème est refill-modequ'utilise fill-regionau lieu de fill-paragraph, perdant ainsi la capacité d'honorer fill-paragraph-functionet de rendre les choses potentiellement désordonnées
Sigma