Hi, Guillaume!
On Tue, Oct 14, 2008 at 07:26:41PM +1000, Guillaume Salagnac wrote:
> Hi,
> I have a strange problem with uncomment-region eating my lines of
> code. I can reproduce it deterministically by:
> - starting emacs (with -Q)
> - changing to java-mode (in the scratch buffer, for example)
> - typing a two line c-style comment :
> /* first line
> second line */
> - selecting all the buffer (or just the two lines)
> - M-x uncomment region
> I end up with the following text
> first lin
> (which is kinda scary, and has already caused me problems with lines
> of code silentely disappearing, not causing a compile-time error but a
> strange run-time behaviour instead. but I'm getting off-topic :-)
> BTW, this is emacs 22.1.1 (CC Mode version 5.31.4), I get the same
> behaviour with emacs 23.0.60.1 (CC Mode version 5.31.5), but it works
> fine in emacs 21 (CC Mode version 5.28). I'm on ubuntu hardy.
> Is this a known bug, or am I doing something wrong ?
Yes, it was indeed a known bug: A `save-excursion' had been omitted from
the function `comment-enter-backward' in ..../lisp/newcomment.el.
I would recommend you to upgrade your emacs to 22.3. You can download
the tarball from <http://ftp.gnu.org/pub/gnu/emacs/emacs-22.3.tar.gz>.
It is easy indeed to build, especially on a system as common as Ubuntu.
Or you might be able to download it as a Ubuntu style package from
somewhere, which would be even easier.
Alternatively, if you really don't want to upgrade your emacs, apply this
patch to ...../lisp/newcomment.el, and byte-compile it, replacing the
existing newcomment.elc. If you need any help applying the patch or
byte-compiling, feel free to send me a personal Email.
*** /usr/local/share/emacs/22.1/lisp/newcomment.el 2007-05-14 14:56:29.000000000 +0000
--- /home/acm/emacs/emacs/lisp/newcomment.el 2008-05-29 18:19:55.000000000 +0000
***************
*** 486,506 ****
;; comment-end = ""
(progn (backward-char) (skip-syntax-backward " "))
(cond
! ((save-restriction
! (narrow-to-region (line-beginning-position) (point))
! (goto-char (point-min))
! (re-search-forward (concat comment-end-skip "\\'") nil t))
(goto-char (match-beginning 0)))
! ;; comment-end-skip not found. Maybe we're at EOB which implicitly
! ;; closes the comment.
! ((eobp) (skip-syntax-backward " "))
! (t
! ;; else comment-end-skip was not found probably because it was not
! ;; set right. Since \\s> should catch the single-char case, we'll
! ;; blindly assume we're at the end of a two-char comment-end.
(backward-char 2)
(skip-chars-backward (string (char-after)))
! (skip-syntax-backward " ")))))
;;;;
;;;; Commands
--- 490,519 ----
;; comment-end = ""
(progn (backward-char) (skip-syntax-backward " "))
(cond
! ((save-excursion
! (save-restriction
! (narrow-to-region (line-beginning-position) (point))
! (goto-char (point-min))
! (re-search-forward (concat comment-end-skip "\\'") nil t)))
(goto-char (match-beginning 0)))
! ;; comment-end-skip not found probably because it was not set
! ;; right. Since \\s> should catch the single-char case, let's
! ;; check that we're looking at a two-char comment ender.
! ((not (or (<= (- (point-max) (line-beginning-position)) 1)
! (zerop (logand (car (syntax-after (- (point) 1)))
! ;; Here we take advantage of the fact that
! ;; the syntax class " " is encoded to 0,
! ;; so " 4" gives us just the 4 bit.
! (car (string-to-syntax " 4"))))
! (zerop (logand (car (syntax-after (- (point) 2)))
! (car (string-to-syntax " 3"))))))
(backward-char 2)
(skip-chars-backward (string (char-after)))
! (skip-syntax-backward " "))
! ;; No clue what's going on: maybe we're really not right after the
! ;; end of a comment. Maybe we're at the "end" because of EOB rather
! ;; than because of a marker.
! (t (skip-syntax-backward " ")))))
;;;;
;;;; Commands
> Cheers,
> -Guillaume
--
Alan Mackenzie (Nuremberg, Germany).
|