about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMicah Chalmer <micah@micahchalmer.net>2014-03-11 20:23:32 -0400
committerAlex Crichton <alex@alexcrichton.com>2014-03-12 15:01:25 -0700
commitd28d5b7fb4ee11d29260b477b70ac32c25f61cff (patch)
tree47fb8b08d1d9870306b1e7f257c796c44b78bb5c
parentaac6e317639140a149d97116d43e66b5bd76bce3 (diff)
Emacs: always jump the cursor if needed on indent
The rust-mode-indent-line function had a check, which ran after all the
calculations for how to indent had already happened, that skipped
actually performing the indent if the line was already at the right
indentation.

Because of that, the cursor did not jump to the indentation if the line
wasn't changing.  This was particularly annoying if there was nothing
but spaces on the line and you were at the beginning of it--it looked
like the indent just wasn't working.

This removes the check and adds test cases to cover this.
-rw-r--r--src/etc/emacs/rust-mode-tests.el43
-rw-r--r--src/etc/emacs/rust-mode.el16
2 files changed, 50 insertions, 9 deletions
diff --git a/src/etc/emacs/rust-mode-tests.el b/src/etc/emacs/rust-mode-tests.el
index 63c1a077c8c..a4e837958c9 100644
--- a/src/etc/emacs/rust-mode-tests.el
+++ b/src/etc/emacs/rust-mode-tests.el
@@ -570,6 +570,11 @@ fn indenting_middle_of_line() {
                pull_me_back_in();
 }
 }
+
+fn indented_already() {
+    
+    // The previous line already has its spaces
+}
 "
 
       ;; Symbol -> (line column)
@@ -596,7 +601,15 @@ fn indenting_middle_of_line() {
                                   (after-whitespace-indent-start (13 1))
                                   (after-whitespace-indent-target (13 8))
                                   (middle-pull-indent-start (15 19))
-                                  (middle-pull-indent-target (15 12))))
+                                  (middle-pull-indent-target (15 12))
+                                  (blank-line-indented-already-bol-start (20 0))
+                                  (blank-line-indented-already-bol-target (20 4))
+                                  (blank-line-indented-already-middle-start (20 2))
+                                  (blank-line-indented-already-middle-target (20 4))
+                                  (nonblank-line-indented-already-bol-start (21 0))
+                                  (nonblank-line-indented-already-bol-target (21 4))
+                                  (nonblank-line-indented-already-middle-start (21 2))
+                                  (nonblank-line-indented-already-middle-target (21 4))))
 
 (defun rust-get-buffer-pos (pos-symbol)
   "Get buffer position from POS-SYMBOL.
@@ -793,3 +806,31 @@ All positions are position symbols found in `rust-test-positions-alist'."
    'middle-pull-indent-start
    'middle-pull-indent-target
    #'indent-for-tab-command))
+
+(ert-deftest indent-line-blank-line-indented-already-bol ()
+  (rust-test-motion
+   rust-test-indent-motion-string
+   'blank-line-indented-already-bol-start
+   'blank-line-indented-already-bol-target
+   #'indent-for-tab-command))
+
+(ert-deftest indent-line-blank-line-indented-already-middle ()
+  (rust-test-motion
+   rust-test-indent-motion-string
+   'blank-line-indented-already-middle-start
+   'blank-line-indented-already-middle-target
+   #'indent-for-tab-command))
+
+(ert-deftest indent-line-nonblank-line-indented-already-bol ()
+  (rust-test-motion
+   rust-test-indent-motion-string
+   'nonblank-line-indented-already-bol-start
+   'nonblank-line-indented-already-bol-target
+   #'indent-for-tab-command))
+
+(ert-deftest indent-line-nonblank-line-indented-already-middle ()
+  (rust-test-motion
+   rust-test-indent-motion-string
+   'nonblank-line-indented-already-middle-start
+   'nonblank-line-indented-already-middle-target
+   #'indent-for-tab-command))
diff --git a/src/etc/emacs/rust-mode.el b/src/etc/emacs/rust-mode.el
index b304df8f14c..3a99af3446c 100644
--- a/src/etc/emacs/rust-mode.el
+++ b/src/etc/emacs/rust-mode.el
@@ -140,14 +140,14 @@
                     ;; Otherwise, we are continuing the same expression from the previous line,
                     ;; so add one additional indent level
                     (+ baseline rust-indent-offset))))))))))
-    (when (not (eq (current-indentation) indent))
-      ;; If we're at the beginning of the line (before or at the current
-      ;; indentation), jump with the indentation change.  Otherwise, save the
-      ;; excursion so that adding the indentations will leave us at the
-      ;; equivalent position within the line to where we were before.
-      (if (<= (current-column) (current-indentation))
-          (indent-line-to indent)
-        (save-excursion (indent-line-to indent))))))
+
+    ;; If we're at the beginning of the line (before or at the current
+    ;; indentation), jump with the indentation change.  Otherwise, save the
+    ;; excursion so that adding the indentations will leave us at the
+    ;; equivalent position within the line to where we were before.
+    (if (<= (current-column) (current-indentation))
+        (indent-line-to indent)
+      (save-excursion (indent-line-to indent)))))
 
 
 ;; Font-locking definitions and helpers