]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow comment-indent-functions to specify exact indentation (Bug#385)
authorNoam Postavsky <npostavs@gmail.com>
Wed, 14 Jun 2017 04:08:15 +0000 (00:08 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Thu, 6 Jul 2017 02:52:35 +0000 (22:52 -0400)
* lisp/newcomment.el (comment-choose-indent): Interpret a cons of two
integers as indicating a range of acceptable indentation.
(comment-indent): Don't apply `comment-inline-offset',
`comment-choose-indent' already does that.
(comment-indent-function):
* doc/emacs/programs.texi (Options for Comments): Document new
acceptable return values.
* etc/NEWS: Announce it.

doc/emacs/programs.texi
etc/NEWS
lisp/newcomment.el

index 222d1c2a4defb5d0d4908d02d12e309086baa0cb..27ac0eb64008d835526ed2d59a5bc6a8aeaf7481 100644 (file)
@@ -1146,9 +1146,12 @@ comment or for aligning an existing comment.  It is set differently by
 various major modes.  The function is called with no arguments, but with
 point at the beginning of the comment, or at the end of a line if a new
 comment is to be inserted.  It should return the column in which the
-comment ought to start.  For example, in Lisp mode, the indent hook
-function bases its decision on how many semicolons begin an existing
-comment, and on the code in the preceding lines.
+comment ought to start.  For example, the default hook function bases
+its decision on how many comment characters begin an existing comment.
+
+Emacs also tries to align comments on adjacent lines.  To override
+this, the function may return a cons of two (possibly equal) integers
+to indicate an acceptable range of indentation.
 
 @node Documentation
 @section Documentation Lookup
index 83cb73f4a986cdece2b03564741350ac29c864d5..13805ce0da77c2f01595078b9b7bef2a65f5066a 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -405,6 +405,10 @@ display of raw bytes from octal to hex.
 ** You can now provide explicit field numbers in format specifiers.
 For example, '(format "%2$s %1$s" "X" "Y")' produces "Y X".
 
++++
+** 'comment-indent-function' values may now return a cons to specify a
+range of indentation.
+
 \f
 * Editing Changes in Emacs 26.1
 
index 118549f421ce24324eec9ad992f34f0e704e4199..8772b52376da761068f6af08eb2e698212591a08 100644 (file)
@@ -142,9 +142,10 @@ Should be an empty string if comments are terminated by end-of-line.")
 ;;;###autoload
 (defvar comment-indent-function 'comment-indent-default
   "Function to compute desired indentation for a comment.
-This function is called with no args with point at the beginning of
-the comment's starting delimiter and should return either the desired
-column indentation or nil.
+This function is called with no args with point at the beginning
+of the comment's starting delimiter and should return either the
+desired column indentation, a range of acceptable
+indentation (MIN . MAX), or nil.
 If nil is returned, indentation is delegated to `indent-according-to-mode'.")
 
 ;;;###autoload
@@ -649,13 +650,20 @@ The criteria are (in this order):
 - prefer INDENT (or `comment-column' if nil).
 Point is expected to be at the start of the comment."
   (unless indent (setq indent comment-column))
-  ;; Avoid moving comments past the fill-column.
-  (let ((max (+ (current-column)
-                (- (or comment-fill-column fill-column)
-                   (save-excursion (end-of-line) (current-column)))))
-        (other nil)
-        (min (save-excursion (skip-chars-backward " \t")
-                             (if (bolp) 0 (+ comment-inline-offset (current-column))))))
+  (let ((other nil)
+        min max)
+    (pcase indent
+      (`(,lo . ,hi) (setq min lo) (setq max hi)
+       (setq indent comment-column))
+      (_ ;; Avoid moving comments past the fill-column.
+       (setq max (+ (current-column)
+                    (- (or comment-fill-column fill-column)
+                       (save-excursion (end-of-line) (current-column)))))
+       (setq min (save-excursion
+                   (skip-chars-backward " \t")
+                   ;; Leave at least `comment-inline-offset' space after
+                   ;; other nonwhite text on the line.
+                   (if (bolp) 0 (+ comment-inline-offset (current-column)))))))
     ;; Fix up the range.
     (if (< max min) (setq max min))
     ;; Don't move past the fill column.
@@ -750,13 +758,6 @@ If CONTINUE is non-nil, use the `comment-continue' markers if any."
          ;; If the comment is at the right of code, adjust the indentation.
          (unless (save-excursion (skip-chars-backward " \t") (bolp))
            (setq indent (comment-choose-indent indent)))
-         ;; Update INDENT to leave at least one space
-         ;; after other nonwhite text on the line.
-         (save-excursion
-           (skip-chars-backward " \t")
-           (unless (bolp)
-             (setq indent (max indent
-                                (+ (current-column) comment-inline-offset)))))
          ;; If that's different from comment's current position, change it.
          (unless (= (current-column) indent)
            (delete-region (point) (progn (skip-chars-backward " \t") (point)))