emacs-devel
[Top][All Lists]
Advanced

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

Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun proble


From: Alan Mackenzie
Subject: Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode]
Date: Sat, 30 Dec 2017 15:43:05 +0000
User-agent: Mutt/1.7.2 (2016-11-26)

Hello, Eli.

On Sat, Dec 30, 2017 at 14:53:27 +0200, Eli Zaretskii wrote:
> > Date: Sat, 30 Dec 2017 12:01:36 +0000
> > Cc: address@hidden, zhang cc <address@hidden>,
> >   Noam Postavsky <address@hidden>
> > From: Alan Mackenzie <address@hidden>

> > > I see the error, with point anywhere in the body of the second function.
> > > Critical seems to be there being no blank line between the functions.

> > > I think there's a bug in beginning-of-defun-comments, which I'm in the
> > > middle of edebugging.  It moves point into the first function.

> > beginning-of-defun-comments has a bug.  On doing M-x
> > beginning-of-defun-comments from the inside of a function, when there's
> > no blank lines between it and the previous function, point ends up
> > inside that previous function, not at the comments which may separate
> > them.

> > Perhaps this bug should be fixed before the next Emacs-26 pretest.

> How old is this problem?  It looks like it's new in Emacs 26?  If so,
> we should try fixing it on the release branch.

OK.  I've hacked together the following, which seems to work, but I'm not
altogether happy with it.  non-syntactic-ws-in-line should not be so hard
to write; ideally, it should be available directly from
parse-partial-sexp, possibly by enhancing the meaning of argument
STOPBEFORE.

Also, non-syntactic-ws-in-line doesn't really seem to belong in this file.
Possibly it should be in syntax.el.

I also think somebody else should eyeball non-syntactic-ws-in-line to try
and catch some wierd case I've missed.

The following is based on the emacs-26 branch.



diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 6952ef4cf4..251db2cb08 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -412,6 +412,35 @@ beginning-of-defun--in-emptyish-line-p
          (forward-comment (point-max))
          (point)))))
 
+(defun non-syntactic-ws-in-line ()
+  "Is there a non-whitespace, non-comment character in the current line?
+If so, return the position of the first such character, otherwise return
+ nil."
+  (save-excursion
+    (forward-line 0)                    ; to BOL.
+    (let ((ppss (syntax-ppss))
+          (eol (save-excursion (end-of-line) (point)))
+          (start (point))
+          end
+          )
+      (if (nth 3 ppss)                  ; in a string
+          start
+        (when (nth 4 ppss)              ; in a comment
+          (setq ppss
+                (parse-partial-sexp (point) eol nil nil ppss 'syntax-table)))
+        (catch 'got-it
+          (while (< (point) eol)
+            (setq start (point))
+            (setq ppss (parse-partial-sexp (point) eol nil nil ppss t))
+            (setq end (if (nth 4 ppss) (nth 8 ppss) eol))
+            (goto-char start)
+            (skip-syntax-forward "-" end)
+            (when (< (point) end)
+              (throw 'got-it (point)))
+            (unless (forward-comment 1) ; comment straddles line break.
+              (throw 'got-it nil))
+            (setq ppss (syntax-ppss))))))))
+
 (defun beginning-of-defun-comments (&optional arg)
   "Move to the beginning of ARGth defun, including comments."
   (interactive "^p")
@@ -428,10 +457,7 @@ beginning-of-defun-comments
                   (progn (skip-syntax-backward
                           "-" (line-beginning-position))
                          (not (bolp))) ; Check for blank line.
-                  (progn (parse-partial-sexp
-                          (line-beginning-position) (line-end-position)
-                          nil t (syntax-ppss (line-beginning-position)))
-                         (eolp))))) ; Check for non-comment text.
+                  (not (non-syntactic-ws-in-line))))) ; Check for non-comment 
text.
     (forward-line (if first-line-p 0 1))))
 
 (defvar end-of-defun-function


-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

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