emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: adaptive-fill-mode and auto-fill-mode


From: martin rudalics
Subject: Re: adaptive-fill-mode and auto-fill-mode
Date: Mon, 09 Oct 2006 14:35:31 +0200
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

> Then how 'bout the 100% guaranteed untested
> patch below.

Neat.  I attached a 50% unguaranteed tested revision.

>>... but the string at compos is ";; >" ...
>
>
> Not necessarily.  I may compute this in adaptive-fill-function straight from
> the first line, (when using auto-fill on the first line).

... no matter what you compute in `adaptive-fill-function' the string at
compos is the string at compos is the ...

>>... if compos is not at line beginning the prefix is rejected.
>
>
> Where?  Why?

In my first patch.  The current one doesn't reject it any more.

>>I fail to understand you here.  If the comment at compos doesn't match
>>the prefix why should I want to insert the prefix on the next line?
>
>
> Why not?

Your own patch might impede you.  If you manually change the
comment-start sequence at compos or the whitespace preceding it, the
prefix won't match the comment at compos any more and hence won't be
used.

>>>Have you tried
>>>comment-auto-fill-only-comments?
>
>
>>It doesn't fill doc-strings.
>
>
> But maybe it's the right place to introduce such a feature.
> Basically extend this var so you can say "fill in FOO" where FOO is the list
> of possible contexts, such as `comment', `string', `doc', `code'?

If someone is interested I'll write it.
*** newcomment.el.~1.96.~       Mon Aug 21 14:35:24 2006
--- newcomment.el       Mon Oct  9 11:23:40 2006
***************
*** 238,244 ****
  (defcustom comment-empty-lines nil
    "If nil, `comment-region' does not comment out empty lines.
  If t, it always comments out empty lines.
! if `eol' it only comments out empty lines if comments are
  terminated by the end of line (i.e. `comment-end' is empty)."
    :type '(choice (const :tag "Never" nil)
          (const :tag "Always" t)
--- 238,244 ----
  (defcustom comment-empty-lines nil
    "If nil, `comment-region' does not comment out empty lines.
  If t, it always comments out empty lines.
! If `eol' it only comments out empty lines if comments are
  terminated by the end of line (i.e. `comment-end' is empty)."
    :type '(choice (const :tag "Never" nil)
          (const :tag "Always" t)
***************
*** 1124,1135 ****
    :group 'comment)

  (defun comment-valid-prefix-p (prefix compos)
!   (or
!    ;; Accept any prefix if the current comment is not EOL-terminated.
!    (save-excursion (goto-char compos) (comment-forward) (not (bolp)))
!    ;; Accept any prefix that starts with a comment-start marker.
!    (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)")
!                prefix)))

  ;;;###autoload
  (defun comment-indent-new-line (&optional soft)
--- 1124,1169 ----
    :group 'comment)

  (defun comment-valid-prefix-p (prefix compos)
!     "Check that the adaptive-fill-prefix is consistent with the context.
! PREFIX is the prefix (presumably guessed by `adaptive-fill-mode').
! COMPOS is the position of the beginning of the comment we're in, or nil
! if we're not inside a comment."
!   ;; This consistency checking is mostly needed to workaround the limitation
!   ;; of auto-fill-mode whose paragraph-determination doesn't pay attention
!   ;; to comment boundaries.
!   (if (null compos)
!       ;; We're not inside a comment: the prefix shouldn't match
!       ;; a comment-starter.
!       (not (and comment-start comment-start-skip
!                 (string-match comment-start-skip prefix)))
!     (or
!      ;; Accept any prefix if the current comment is not EOL-terminated.
!      (save-excursion (goto-char compos) (comment-forward) (not (bolp)))
!      ;; Accept any prefix that starts with the same comment-start marker
!      ;; as the current one.
!      (when (string-match (concat "\\`[ \t]*\\(?:" comment-start-skip "\\)")
!                          prefix)
!        (let ((prefix-com (comment-string-strip (match-string 0 prefix) nil 
t)))
!          (string-match "\\`[ \t]*" prefix-com)
!          (let* ((prefix-space (match-string 0 prefix-com))
!                 (prefix-indent (string-width prefix-space))
!                 (prefix-comstart (substring prefix-com (match-end 0))))
!            (save-excursion
!              (goto-char compos)
!              ;; The comstart marker is the same.
!              (and (looking-at comment-start-skip)
!                 (string-equal
!                  prefix-comstart
!                  (comment-string-strip (match-string 0) nil t))
!                   ;; The indentation as well.
!                   (or (= prefix-indent
!                          (- (current-column) (current-left-margin)))
!                       ;; Check the indentation in two different ways, just
!                       ;; to try and avoid most of the potential funny cases.
!                       (equal prefix-space
!                              (buffer-substring (point)
!                                                (progn (move-to-left-margin)
!                                                       (point)))))))))))))

  ;;;###autoload
  (defun comment-indent-new-line (&optional soft)
***************
*** 1179,1189 ****
            (setq comin (point))))

        (cond
!        ;; If there's an adaptive prefix, use it unless we're inside
!        ;; a comment and the prefix is not a comment starter.
!        ((and fill-prefix
!              (or (not compos)
!                  (comment-valid-prefix-p fill-prefix compos)))
          (indent-to-left-margin)
          (insert-and-inherit fill-prefix))
         ;; If we're not inside a comment, just try to indent.
--- 1213,1220 ----
            (setq comin (point))))

        (cond
!        ;; If there's an adaptive prefix, use it provided it's valid.
!        ((and fill-prefix (comment-valid-prefix-p fill-prefix compos))
          (indent-to-left-margin)
          (insert-and-inherit fill-prefix))
         ;; If we're not inside a comment, just try to indent.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]