[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).
- 26.0.90: mark-defun problem in c-mode, zhang cc, 2017/12/30
- Re: 26.0.90: mark-defun problem in c-mode, Eli Zaretskii, 2017/12/30
- Re: 26.0.90: mark-defun problem in c-mode, Alan Mackenzie, 2017/12/30
- beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Alan Mackenzie, 2017/12/30
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Eli Zaretskii, 2017/12/30
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Alan Mackenzie, 2017/12/30
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode],
Alan Mackenzie <=
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Stephen Leake, 2017/12/30
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Alan Mackenzie, 2017/12/31
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Stefan Monnier, 2017/12/30
- Re: beginning-of-defun-comments bug [was: Re: 26.0.90: mark-defun problem in c-mode], Alan Mackenzie, 2017/12/31