Przeglądaj źródła

BUG: Fix cmake-mode.el indentation cursor motion

This makes cursor motion in the indent function consistent with emacs
conventions.  Patch from Mike Wittman.  See issue #8625.
Brad King 17 lat temu
rodzic
commit
8597f01acd
1 zmienionych plików z 45 dodań i 29 usunięć
  1. 45 29
      Docs/cmake-mode.el

+ 45 - 29
Docs/cmake-mode.el

@@ -102,54 +102,70 @@
 (defun cmake-indent ()
   "Indent current line as CMAKE code."
   (interactive)
-  (beginning-of-line)
   (if (cmake-line-starts-inside-string)
       ()
     (if (bobp)
-        (indent-line-to 0)
-      (let ((point-start (point))
-            token cur-indent)
+        (cmake-indent-line-to 0)
+      (let (cur-indent)
 
         (save-excursion
-          ; Search back for the last indented line.
-          (cmake-find-last-indented-line)
-
-          ; Start with the indentation on this line.
-          (setq cur-indent (current-indentation))
-
-          ; Search forward counting tokens that adjust indentation.
-          (while (re-search-forward cmake-regex-token point-start t)
-            (setq token (match-string 0))
-            (if (string-match (concat "^" cmake-regex-paren-left "$") token)
-                (setq cur-indent (+ cur-indent cmake-tab-width))
+          (beginning-of-line)
+
+          (let ((point-start (point))
+                token)
+
+            ; Search back for the last indented line.
+            (cmake-find-last-indented-line)
+
+            ; Start with the indentation on this line.
+            (setq cur-indent (current-indentation))
+
+            ; Search forward counting tokens that adjust indentation.
+            (while (re-search-forward cmake-regex-token point-start t)
+              (setq token (match-string 0))
+              (if (string-match (concat "^" cmake-regex-paren-left "$") token)
+                  (setq cur-indent (+ cur-indent cmake-tab-width))
+                )
+              (if (string-match (concat "^" cmake-regex-paren-right "$") token)
+                  (setq cur-indent (- cur-indent cmake-tab-width))
+                )
+              (if (and
+                   (string-match cmake-regex-block-open token)
+                   (looking-at (concat "[ \t]*" cmake-regex-paren-left))
+                   )
+                  (setq cur-indent (+ cur-indent cmake-tab-width))
+                )
               )
-            (if (string-match (concat "^" cmake-regex-paren-right "$") token)
+            (goto-char point-start)
+
+            ; If this is the end of a block, decrease indentation.
+            (if (looking-at cmake-regex-block-close)
                 (setq cur-indent (- cur-indent cmake-tab-width))
               )
-            (if (and
-                 (string-match cmake-regex-block-open token)
-                 (looking-at (concat "[ \t]*" cmake-regex-paren-left))
-                 )
-                (setq cur-indent (+ cur-indent cmake-tab-width))
-              )
             )
           )
 
-        ; If this is the end of a block, decrease indentation.
-        (if (looking-at cmake-regex-block-close)
-            (setq cur-indent (- cur-indent cmake-tab-width))
-          )
-
         ; Indent this line by the amount selected.
         (if (< cur-indent 0)
-            (indent-line-to 0)
-          (indent-line-to cur-indent)
+            (cmake-indent-line-to 0)
+          (cmake-indent-line-to cur-indent)
           )
         )
       )
     )
   )
 
+(defun cmake-point-in-indendation ()
+  (string-match "^[ \\t]*$" (buffer-substring (point-at-bol) (point))))
+
+(defun cmake-indent-line-to (column)
+  "Indent the current line to COLUMN.
+If point is within the existing indentation it is moved to the end of
+the indentation.  Otherwise it retains the same position on the line"
+  (if (cmake-point-in-indendation)
+      (indent-line-to column)
+    (save-excursion (indent-line-to column))))
+
 ;------------------------------------------------------------------------------
 
 ;;