Subject: [PATCH] 24.3.50; subword-capitalize at the end of a buffer jumps to the beginning

From: Dima Kogan <[email-masked]>
Date: Thu, 10 Oct 2013 00:01:22 -0700

Hi.

I'm observing subword-capitalize get confused when called near the end
of a buffer. Instead of doing nothing like capitalize-word does,
subword-capitalize jumps to around the beginning of the buffer and
capitalizes something there.

The cause is simple. subword-capitalize does

(re-search-forward "[[:alpha:]]" ....)

and uses the results of this search even if it failed. The attached
patch explicitly checks for search failure and exits the function in
that case.

>From 3329a22e633ce345d727ebceb81d3183bd74372f Mon Sep 17 00:00:00 2001
From: Dima Kogan <[email-masked]>
Date: Wed, 9 Oct 2013 23:57:25 -0700
Subject: [PATCH] subword-capitalize now fails gracefully at end-of-buffer

---
 lisp/progmodes/subword.el | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/lisp/progmodes/subword.el b/lisp/progmodes/subword.el
index 8cf4feb..1866ad9 100644
--- a/lisp/progmodes/subword.el
+++ b/lisp/progmodes/subword.el
@@ -260,21 +260,25 @@ Optional argument ARG is the same as for `capitalize-word'."
   (let ((count (abs arg))
 	(start (point))
 	(advance (if (< arg 0) nil t)))
-    (dotimes (i count)
-      (if advance
-	  (progn (re-search-forward
-		  (concat "[[:alpha:]]")
-		  nil t)
-		 (goto-char (match-beginning 0)))
-	(subword-backward))
-      (let* ((p (point))
-	     (pp (1+ p))
-	     (np (subword-forward)))
-	(upcase-region p pp)
-	(downcase-region pp np)
-	(goto-char (if advance np p))))
-    (unless advance
-      (goto-char start))))
+
+    (catch 'search-failed
+      (dotimes (i count)
+        (if advance
+            (progn
+              (when (not (re-search-forward
+                          (concat "[[:alpha:]]")
+                          nil t))
+                (throw 'search-failed "search failed"))
+              (goto-char (match-beginning 0)))
+          (subword-backward))
+        (let* ((p (point))
+               (pp (1+ p))
+               (np (subword-forward)))
+          (upcase-region p pp)
+          (downcase-region pp np)
+          (goto-char (if advance np p))))
+      (unless advance
+        (goto-char start)))))
 
 
 
-- 
1.8.3.2