Subject: Re: Empty line after an environment & bug#35284: 12.1.1; new verbatim environment wrongly commented out

From: Ikumi Keita <[email-masked]>
Date: Tue, 24 Dec 2019 01:20:40 +0900

Hi Denis, Jean, sorry for very late response.

Each of you reported[1][2] about unsatisfactory results of
`LaTeX-insert-environmnt' (i.e., C-c C-e) before.

After taking a bit close look at the code, I came to think that the
management of the positions of the point and the mark in that function
is insufficient.  I expect the attached patch fixes the both problems.

Denis and Jean, could you please check it works on your side well? (To
Jean: revert my premature patch[3] befor trying it out)

Best regards,
Ikumi Keita

[1] https://lists.gnu.org/archive/html/auctex/2019-11/msg00009.html
[2] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35284
[3] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35284#14

diff --git a/latex.el b/latex.el
index aaa4a1f8..a877b510 100644
--- a/latex.el
+++ b/latex.el
@@ -668,41 +668,91 @@ environment just inserted, the buffer position just before
 	 (concat "^\\([ \t]*" TeX-comment-start-regexp "+\\)+[ \t]*"))
 	(setq prefix (match-string 0))))
     ;; What to do with the line containing point.
-    (cond ((save-excursion (beginning-of-line)
+    ;; - Open a new empty line for later insertion of "\begin{foo}" and
+    ;;   put the point there.
+    ;; - If there were at first any non-whitespace texts between the
+    ;;   point and EOL, send them into their new own line with possible
+    ;;   comment prefix.
+    (cond (;; When the entire line consists of whitespaces except
+	   ;; possible prefix...
+	   (save-excursion (beginning-of-line)
 			   (looking-at (concat prefix "[ \t]*$")))
+	   ;; ...make the line empty and put the point there.
 	   (delete-region (match-beginning 0) (match-end 0)))
-	  ((TeX-looking-at-backward (concat "^" prefix "[ \t]*")
+	  (;; When there are only whitespaces except possible prefix
+	   ;; between the point and BOL (including the case the mark
+	   ;; is at BOL)...
+	   (TeX-looking-at-backward (if prefix
+					(concat "^\\(" prefix "\\)?[ \t]*")
+				      "^[ \t]*")
 				    (line-beginning-position))
+	   ;; ...in this case, we have non-whitespace texts between
+	   ;; the point and EOL, so send the entire line into a new
+	   ;; next line and put the point on the empty line just
+	   ;; created.
 	   (beginning-of-line)
 	   (newline)
 	   (beginning-of-line 0))
-	  ((bolp)
+	  (;; In all other cases...
+	   t
+	   ;; ...insert a new empty line after deleting all
+	   ;; whitespaces around the point, put the point there...
 	   (delete-horizontal-space)
-	   (newline)
-	   (beginning-of-line 0))
-	  (t
-	   (delete-horizontal-space)
-	   (newline 2)
-	   (when prefix (insert prefix))
-	   (beginning-of-line 0)))
+	   (if (eolp)
+	       (newline)
+	     ;; ...and if there were at first any non-whitespace texts
+	     ;; between (the original position of) the point and EOL,
+	     ;; send them into a new next line with possible comment
+	     ;; prefix.
+	     (newline 2)
+	     (when prefix (insert prefix))
+	     (beginning-of-line 0))))
     ;; What to do with the line containing mark.
+    ;; If there is active region...
     (when active-mark
+      ;; - Open a new empty line for later insertion of "\end{foo}"
+      ;;   and put the mark there.
+      ;; - If there were at first any non-whitespace texts between the
+      ;;   mark and EOL, pass them over the empty line and put them on
+      ;;   their own line with possible comment prefix.
       (save-excursion
 	(goto-char (mark))
-	(cond ((save-excursion (beginning-of-line)
-			       (or (looking-at (concat prefix "[ \t]*$"))
-				   (looking-at "[ \t]*$")))
+	(cond (;; When the entire line consists of whitespaces except
+	       ;; possible prefix...
+	       (save-excursion (beginning-of-line)
+			       (looking-at
+				(if prefix
+				    (concat "\\(" prefix "\\)?[ \t]*$")
+				  "[ \t]*$")))
+	       ;; ...make the line empty and put the mark there.
 	       (delete-region (match-beginning 0) (match-end 0)))
-	      ((TeX-looking-at-backward (concat "^" prefix "[ \t]*")
+	      (;; When there are only whitespaces except possible prefix
+	       ;; between the mark and BOL (including the case the mark
+	       ;; is at BOL)...
+	       (TeX-looking-at-backward (if prefix
+					    (concat "^\\(" prefix "\\)?[ \t]*")
+					  "^[ \t]*")
 					(line-beginning-position))
+	       ;; ...in this case, we have non-whitespace texts
+	       ;; between the mark and EOL, so send the entire line
+	       ;; into a new next line and put the mark on the empty
+	       ;; line just created.
 	       (beginning-of-line)
-	       (newline)
-	       (beginning-of-line 0))
-	      (t
+	       (set-mark (point))
+	       (newline))
+	      (;; In all other cases...
+	       t
+	       ;; ...make a new empty line after deleting all
+	       ;; whitespaces around the mark, put the mark there...
 	       (delete-horizontal-space)
 	       (insert-before-markers "\n")
-	       (newline)
-	       (when prefix (insert prefix))))))
+	       ;; ...and if there were at first any non-whitespace
+	       ;; texts between (the original position of) the mark
+	       ;; and EOL, send them into a new next line with
+	       ;; possible comment prefix.
+	       (unless (eolp)
+		 (newline)
+		 (when prefix (insert prefix)))))))
     ;; Now insert the environment.
     (when prefix (insert prefix))
     (setq env-start (point))