emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/rust-mode f73f321 264/486: Merge pull request #163 from Wi


From: ELPA Syncer
Subject: [nongnu] elpa/rust-mode f73f321 264/486: Merge pull request #163 from Wilfred/preserve_point_rustfmt
Date: Sat, 7 Aug 2021 09:25:32 -0400 (EDT)

branch: elpa/rust-mode
commit f73f3217b24f0fb261d09c4e58a0416a42c82c77
Merge: ba5ff90 2540d7e
Author: Niko Matsakis <niko@alum.mit.edu>
Commit: GitHub <noreply@github.com>

    Merge pull request #163 from Wilfred/preserve_point_rustfmt
    
    Correctly restore point position after running rustfmt
---
 rust-mode-tests.el | 12 ++++++++++++
 rust-mode.el       | 17 ++++++++++++-----
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/rust-mode-tests.el b/rust-mode-tests.el
index 1e60768..3c3ba03 100644
--- a/rust-mode-tests.el
+++ b/rust-mode-tests.el
@@ -2561,6 +2561,18 @@ Fontification needs to include this whole string or none 
of it.
     )
   )
 
+(ert-deftest rust-test-revert-hook-preserves-point ()
+  (with-temp-buffer
+    ;; Insert some code, and put point in the middle.
+    (insert "fn foo() {}\n")
+    (insert "fn bar() {}\n")
+    (insert "fn baz() {}\n")
+    (goto-char (point-min))
+    (forward-line 1)
+    (let ((initial-point (point)))
+      (rust--after-revert-hook)
+      (should (equal initial-point (point))))))
+
 ;; If electric-pair-mode is available, load it and run the tests that use it.  
If not,
 ;; no error--the tests will be skipped.
 (require 'elec-pair nil t)
diff --git a/rust-mode.el b/rust-mode.el
index 6259b48..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
@@ -1365,9 +1371,10 @@ This is written mainly to be used as 
`end-of-defun-function' for Rust."
   ;; to use `font-lock-ensure', which doesn't exist in Emacs 24 and earlier.
   ;; If it's not available, fall back to calling `font-lock-fontify-region'
   ;; on the whole buffer.
-  (if (fboundp 'font-lock-ensure)
-      (font-lock-ensure)
-    (font-lock-fontify-region (point-min) (point-max))))
+  (save-excursion
+    (if (fboundp 'font-lock-ensure)
+        (font-lock-ensure)
+      (font-lock-fontify-region (point-min) (point-max)))))
 
 (defun rust--before-save-hook ()
   (when rust-format-on-save (rust-format-buffer)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]