GNU bug report logs - #67462
30.0.50; prog-fill-reindent-defun does not respect buffer-local fill-paragraph-function

Previous Next

Package: emacs;

Reported by: Jens Schmidt <jschmidt4gnu <at> vodafonemail.de>

Date: Sun, 26 Nov 2023 21:10:02 UTC

Severity: normal

Found in version 30.0.50

Full log


Message #26 received at 67462 <at> debbugs.gnu.org (full text, mbox):

From: Jens Schmidt <jschmidt4gnu <at> vodafonemail.de>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 67462 <at> debbugs.gnu.org, dmitry <at> gutov.dev
Subject: Re: bug#67462: 30.0.50; prog-fill-reindent-defun does not respect
 buffer-local fill-paragraph-function
Date: Mon, 27 Nov 2023 21:08:32 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

>> Cc: 67462 <at> debbugs.gnu.org
>> Date: Sun, 26 Nov 2023 23:52:00 +0100
>> From:  Jens Schmidt via "Bug reports for GNU Emacs,
>>  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
>>
>> Dmitry Gutov <dmitry <at> gutov.dev> writes:
>>
>> > Maybe makefile-mode-map should simply rebind "M-q" back to 'fill-paragraph'.
>>
>> I tried a cursory grep '(defun .*-fill-paragraph' in lisp/progmodes/.el.
>> The following functions all seem to work outside of comments:
>>
>>   cfengine-fill-paragraph
>>   f90-fill-paragraph
>>   fortran-fill-paragraph
>>   makefile-fill-paragraph
>>   octave-fill-paragraph
>>
>> I could be wrong with that list, though, and I cannot tell how useful
>> these functions are outside of comments.  I just looked at docstrings or
>> for a prominent
>>
>>   (or (fill-comment-paragraph justify)
>>       (do-something ...))
>>
>> pattern.
>
> What would it take to teach prog-fill-reindent-defun to DTRT outside
> comments and strings?

IMO the problem here is that some modes already have an idea of what
could be TRT outside comments and strings, implemented in a
mode-specific fill-paragraph-function.  prog-fill-reindent-defun per se
doesn't have that knowledge, since it currently always just reindents
outside comments and strings.


A very conservative aproach to keep that knowledge of such modes would
be something along the following lines:

diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el
index 37c54a90f42..df5aa845ae3 100644
--- a/lisp/progmodes/prog-mode.el
+++ b/lisp/progmodes/prog-mode.el
@@ -163,7 +163,13 @@ prog-fill-reindent-defun
                 (treesit-parser-list)
                 (treesit-node-match-p
                  (treesit-node-at (point)) 'text t))))
-      (if (or treesit-text-node
+      (if (or ;; Use `fill-paragraph-function' if bound locally,
+              ;; unless its declares to work on comments only.
+              (and (local-variable-p 'fill-paragraph-function)
+                   (or (not (symbolp fill-paragraph-function))
+                       (not (get fill-paragraph-function
+                                 'fills-only-comments))))
+              treesit-text-node
               (nth 8 (syntax-ppss))
               (re-search-forward "\\s-*\\s<" (line-end-position) t))
           (fill-paragraph argument (region-active-p))

That is, a mode using a specific fill-paragraph-function has to
explicitly declare (with property `fills-only-comments') that its
fill-paragraph-function only fills comments.  Only then that mode would
use the new default indentation of prog-fill-reindent-defun outside
comments and strings.


So for javascript mode, for example, we would also need:

diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 5a669fdbd42..5c1c1845378 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -2975,6 +2975,8 @@ js-fill-paragraph
         (fill-paragraph-function #'c-fill-paragraph))
     (c-fill-paragraph justify)))
 
+(put 'js-fill-paragraph 'fills-only-comments t)
+
 (defun js-do-auto-fill ()
   (let ((js--filling-paragraph t))
     (c-do-auto-fill)))




This bug report was last modified 1 year and 199 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.