From 3c798e391127c5ef4c1d110053381ef895488b2d Mon Sep 17 00:00:00 2001 From: roxma Date: Sun, 26 Mar 2023 11:14:04 +0800 Subject: [PATCH 1/2] Fix: Should not (evil-set-jump previous-pos) jump after evil-jump-forward Steps to reproduce the issue: - Create files `a` `b` `c` with the following content: $ head a b c ==> a <== b I'm A ==> b <== c I'm B ==> c <== I'm C - Run `emancs a` to open bufer `a` - Press `gf` to jump to bufer `b` - Press `gf` to jump to bufer `c` - Press `C-o` to jump back to bufer `b` - Press `C-o` to jump back to bufer `a` - Press `C-i` to jump foward to bufer `b` - Press `C-i` to jump foward to bufer `c`, but the window stays with buffer unexpectedly. --- evil-jumps.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/evil-jumps.el b/evil-jumps.el index 2fadb8b2..f9142149 100644 --- a/evil-jumps.el +++ b/evil-jumps.el @@ -62,7 +62,7 @@ Otherwise the jump commands act only within the current buffer." (defvar evil--jumps-jumping nil) -(defvar evil--jumps-jumping-backward nil +(defvar evil--jumps-jump-command nil "Set by `evil--jump-backward', used and cleared in the `post-command-hook' by `evil--jump-handle-buffer-crossing'") @@ -242,7 +242,7 @@ POS defaults to point." (put 'evil-set-jump 'permanent-local-hook t) (defun evil--jump-backward (count) - (setq evil--jumps-jumping-backward t) + (setq evil--jumps-jump-command t) (let ((count (or count 1))) (evil-motion-loop (nil count) (let* ((struct (evil--jumps-get-current)) @@ -255,6 +255,7 @@ POS defaults to point." (evil--jumps-jump idx 1))))) (defun evil--jump-forward (count) + (setq evil--jumps-jump-command t) (let ((count (or count 1))) (evil-motion-loop (nil count) (let* ((struct (evil--jumps-get-current)) @@ -303,8 +304,8 @@ change the current buffer." (put 'evil--jump-hook 'permanent-local-hook t) (defun evil--jump-handle-buffer-crossing () - (let ((jumping-backward evil--jumps-jumping-backward)) - (setq evil--jumps-jumping-backward nil) + (let ((jump-command evil--jumps-jump-command)) + (setq evil--jumps-jump-command nil) (dolist (frame (frame-list)) (dolist (window (window-list frame)) (let* ((struct (evil--jumps-get-current window)) @@ -312,13 +313,13 @@ change the current buffer." (when previous-pos (setf (evil-jumps-struct-previous-pos struct) nil) (if (and - ;; `evil-jump-backward' (and other backward jumping - ;; commands) needs to be handled specially. When - ;; jumping backward multiple times, calling - ;; `evil-set-jump' is always wrong: If you jump back - ;; twice and we call `evil-set-jump' after the second - ;; time, we clear the forward jump list and - ;; `evil--jump-forward' won't work. + ;; `evil-jump-backward' and 'evil-jump-forward' needs + ;; to be handled specially. When jumping backward + ;; multiple times, calling `evil-set-jump' is always + ;; wrong: If you jump back twice and we call + ;; `evil-set-jump' after the second time, we clear + ;; the forward jump list and `evil--jump-forward' + ;; won't work. ;; The first time you jump backward, setting a jump ;; point is sometimes correct. But we don't do it @@ -326,7 +327,7 @@ change the current buffer." ;; `evil--jump-backward' has updated our position in ;; the jump list so, again, `evil-set-jump' would ;; break `evil--jump-forward'. - (not jumping-backward) + (not jump-command) (let ((previous-buffer (marker-buffer previous-pos))) (and previous-buffer (not (eq previous-buffer (window-buffer window)))))) From e3530b9bcc93643a4229de0b5d1bba62edfd1a4d Mon Sep 17 00:00:00 2001 From: Tom Dalziel Date: Sat, 13 Jul 2024 00:03:29 +0200 Subject: [PATCH 2/2] Add tests for multi-jump --- evil-jumps.el | 2 +- evil-tests.el | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/evil-jumps.el b/evil-jumps.el index f9142149..a5ad8ba3 100644 --- a/evil-jumps.el +++ b/evil-jumps.el @@ -313,7 +313,7 @@ change the current buffer." (when previous-pos (setf (evil-jumps-struct-previous-pos struct) nil) (if (and - ;; `evil-jump-backward' and 'evil-jump-forward' needs + ;; `evil-jump-backward' and 'evil-jump-forward' need ;; to be handled specially. When jumping backward ;; multiple times, calling `evil-set-jump' is always ;; wrong: If you jump back twice and we call diff --git a/evil-tests.el b/evil-tests.el index 7ccef732..96bf2a63 100644 --- a/evil-tests.el +++ b/evil-tests.el @@ -9722,8 +9722,7 @@ parameter set." ("3\C-i") ;; even after jumping forward 3 times it can't get past the 3rd z "z z [z] z z z z z")) (ert-info ("Jump across files") - (let ((temp-file "evil-test-")) - (make-temp-file "evil-test-") + (let ((temp-file (make-temp-file "evil-test-"))) (unwind-protect (evil-test-buffer "[z] z z z z z z" @@ -9734,9 +9733,27 @@ parameter set." ("\C-i") "new buffe[r]") (delete-file temp-file) - (with-current-buffer (get-file-buffer temp-file) - (set-buffer-modified-p nil)) - (kill-buffer (get-file-buffer temp-file))))))) + (let ((buf (file-name-nondirectory temp-file))) + (when (get-buffer buf) (kill-buffer buf)))))) + (ert-info ("Jump multiple times between files") + (let ((a (make-temp-file "evil-aa-" nil nil "evil-bb\n\nthis is a")) + (b (make-temp-file "evil-bb-" nil nil "evil-cc\n\nthis is b")) + (c (make-temp-file "evil-cc-" nil nil "this is c"))) + (unwind-protect + (evil-test-buffer + (find-file a) + ("gf" [return]) + "evil-cc\n\nthis is b" + ("gf" [return]) + "this is c" + ("\C-o" "\C-o") + "evil-bb\n\nthis is a" + ("\C-i" "\C-i") + "this is c") + (dolist (f (list a b c)) + (let ((buf (file-name-nondirectory f))) + (when (get-buffer buf) (kill-buffer buf))) + (delete-file f))))))) (ert-deftest evil-test-find-file () :tags '(evil jumps)