Skip to content

Commit

Permalink
Emacs: always jump the cursor if needed on indent
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
MicahChalmer authored and alexcrichton committed Mar 12, 2014
1 parent aac6e31 commit d28d5b7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
43 changes: 42 additions & 1 deletion src/etc/emacs/rust-mode-tests.el
Expand Up @@ -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)
Expand All @@ -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.
Expand Down Expand Up @@ -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))
16 changes: 8 additions & 8 deletions src/etc/emacs/rust-mode.el
Expand Up @@ -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
Expand Down

0 comments on commit d28d5b7

Please sign in to comment.