diff options
| author | Vasilij Schneidermann <mail@vasilij.de> | 2017-07-13 08:50:35 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-07-13 08:50:35 +0200 |
| commit | dc936936666595afdbdbb4cc44c1f82e74c6802c (patch) | |
| tree | 03a69e0dbb2067d6fdb8bea87f19ca5d78149f7b /evil-jumps.el | |
| parent | eb97029bef3639a0887407e844d61c3795860e47 (diff) | |
| parent | 5b293d3ef73251d2d6d841762f8d0d26290997e4 (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.el | 58 |
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)) |
