|
From: Alan M. <ac...@mu...> - 2008-10-15 22:22:57
|
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). |