aboutsummaryrefslogtreecommitdiff
path: root/evil-jumps.el
diff options
context:
space:
mode:
authorVasilij Schneidermann <mail@vasilij.de>2017-07-13 08:50:35 +0200
committerGitHub <noreply@github.com>2017-07-13 08:50:35 +0200
commitdc936936666595afdbdbb4cc44c1f82e74c6802c (patch)
tree03a69e0dbb2067d6fdb8bea87f19ca5d78149f7b /evil-jumps.el
parenteb97029bef3639a0887407e844d61c3795860e47 (diff)
parent5b293d3ef73251d2d6d841762f8d0d26290997e4 (diff)
Merge pull request #749 from c4eater/master
Implement a flag for prohibiting the jump commands to switch buffers
Diffstat (limited to 'evil-jumps.el')
-rw-r--r--evil-jumps.el58
1 files changed, 39 insertions, 19 deletions
diff --git a/evil-jumps.el b/evil-jumps.el
index e3734e4..857210b 100644
--- a/evil-jumps.el
+++ b/evil-jumps.el
@@ -35,6 +35,11 @@
:prefix "evil-jumps"
:group 'evil)
+(defcustom evil-jumps-cross-buffers t
+ "When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer."
+ :type 'boolean
+ :group 'evil-jumps)
+
(defcustom evil-jumps-max-length 100
"The maximum number of jumps to keep track of."
:type 'integer
@@ -128,24 +133,35 @@
nil)))
(ring-elements (evil--jumps-get-window-jump-list))))))
-(defun evil--jumps-jump-to-index (idx)
+(defun evil--jumps-jump (idx shift)
(let ((target-list (evil--jumps-get-window-jump-list)))
- (evil--jumps-message "jumping to %s" idx)
+ (evil--jumps-message "jumping from %s by %s" idx shift)
(evil--jumps-message "target list = %s" target-list)
- (when (and (< idx (ring-length target-list))
- (>= idx 0))
- (run-hooks 'evil-jumps-pre-jump-hook)
- (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx)
- (let* ((place (ring-ref target-list idx))
- (pos (car place))
- (file-name (cadr place)))
- (setq evil--jumps-jumping t)
- (if (string-match-p evil--jumps-buffer-targets file-name)
- (switch-to-buffer file-name)
- (find-file file-name))
- (setq evil--jumps-jumping nil)
- (goto-char pos)
- (run-hooks 'evil-jumps-post-jump-hook)))))
+ (setq idx (+ idx shift))
+ (let* ((current-file-name (or (buffer-file-name) (buffer-name)))
+ (size (ring-length target-list)))
+ (unless evil-jumps-cross-buffers
+ ;; skip jump marks pointing to other buffers
+ (while (and (< idx size) (>= idx 0)
+ (not (string= current-file-name
+ (let* ((place (ring-ref target-list idx))
+ (pos (car place)))
+ (cadr place)))))
+ (setq idx (+ idx shift))))
+ (when (and (< idx size) (>= idx 0))
+ ;; actual jump
+ (run-hooks 'evil-jumps-pre-jump-hook)
+ (let* ((place (ring-ref target-list idx))
+ (pos (car place))
+ (file-name (cadr place)))
+ (setq evil--jumps-jumping t)
+ (if (string-match-p evil--jumps-buffer-targets file-name)
+ (switch-to-buffer file-name)
+ (find-file file-name))
+ (setq evil--jumps-jumping nil)
+ (goto-char pos)
+ (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx)
+ (run-hooks 'evil-jumps-post-jump-hook))))))
(defun evil--jumps-push ()
"Pushes the current cursor/file position to the jump list."
@@ -223,17 +239,21 @@ POS defaults to point."
(idx (evil-jumps-struct-idx struct)))
(evil--jumps-message "jumping back %s" idx)
(when (= idx -1)
- (setq idx (+ idx 1))
+ (setq idx 0)
(setf (evil-jumps-struct-idx struct) 0)
(evil--jumps-push))
- (evil--jumps-jump-to-index (+ idx 1))))))
+ (evil--jumps-jump idx 1)))))
(defun evil--jump-forward (count)
(let ((count (or count 1)))
(evil-motion-loop (nil count)
(let* ((struct (evil--jumps-get-current))
(idx (evil-jumps-struct-idx struct)))
- (evil--jumps-jump-to-index (- idx 1))))))
+ (when (= idx -1)
+ (setq idx 0)
+ (setf (evil-jumps-struct-idx struct) 0)
+ (evil--jumps-push))
+ (evil--jumps-jump idx -1)))))
(defun evil--jumps-window-configuration-hook (&rest args)
(let* ((window-list (window-list-1 nil nil t))