branch: elpa/rust-mode
commit 2540d7eff0faa7e966b6c4391e53617800275f85
Author: Wilfred Hughes <[email protected]>
Commit: Wilfred Hughes <[email protected]>

    Go back to the current line and column after formatting.
    
    The previous approach simply moved to the same character offset. This is
    unlikely to preserve the position of point, as rustfmt often changes
    whitespace, changing the number of characters before point.
    
    Instead, we go back to the line number and column number we were on
    before. Provided that rustfmt has not radically changed the number of
    lines, this will typically put point back to its previous position, or
    at least close.
    
    Improves, but doesn't completely solve, issue #162.
---
 rust-mode.el | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/rust-mode.el b/rust-mode.el
index 1fbc3e8..99e4bb4 100644
--- a/rust-mode.el
+++ b/rust-mode.el
@@ -1270,10 +1270,16 @@ This is written mainly to be used as 
`end-of-defun-function' for Rust."
   (unless (executable-find rust-rustfmt-bin)
     (error "Could not locate executable \"%s\"" rust-rustfmt-bin))
 
-  (let ((cur-point (point))
+  (let ((cur-line (line-number-at-pos))
+        (cur-column (current-column))
         (cur-win-start (window-start)))
     (rust--format-call (current-buffer))
-    (goto-char cur-point)
+    ;; Move to the same line and column as before.  This is best
+    ;; effort: if rustfmt inserted lines before point, we end up in
+    ;; the wrong place. See issue #162.
+    (goto-char (point-min))
+    (forward-line (1- cur-line))
+    (forward-char cur-column)
     (set-window-start (selected-window) cur-win-start))
 
   ;; Issue #127: Running this on a buffer acts like a revert, and could cause

Reply via email to