From a86bdee66c4b58469bd2c6308ce67fada9539d94 Mon Sep 17 00:00:00 2001 From: Oleh Krehel Date: Fri, 7 Aug 2015 15:04:08 +0200 Subject: [PATCH] avy.el (avy-pop-mark): use own history for points and windows * avy.el (avy-action-goto): Don't save mark here, since the window was already changed. (avy--process): Set mark here. (avy-ring): New defvar. (avy-push-mark): New defun. (avy-pop-mark): Use `avy-ring' unless it's empty. Then use the mark ring. Fixes #88 Re #69 Re #81 --- avy.el | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/avy.el b/avy.el index 0057396..4f09aea 100644 --- a/avy.el +++ b/avy.el @@ -47,6 +47,7 @@ ;;; Code: (require 'cl-lib) +(require 'ring) ;;* Customization (defgroup avy nil @@ -452,9 +453,6 @@ Set `avy-style' according to COMMMAND as well." (defun avy-action-goto (pt) "Goto PT." - (unless (or (= pt (point)) - (region-active-p)) - (push-mark)) (goto-char pt)) (defun avy-action-mark (pt) @@ -506,6 +504,7 @@ Use OVERLAY-FN to visualize the decision overlay." ;; ignore exit from `avy-handler-function' ((eq res 'exit)) (t + (avy-push-mark) (when (and (consp res) (windowp (cdr res))) (let* ((window (cdr res)) @@ -944,7 +943,7 @@ The window scope is determined by `avy-all-windows' (ARG negates it)." (let ((line (read-from-minibuffer "Goto line: " (string char)))) (when line - (push-mark) + (avy-push-mark) (goto-char (point-min)) (forward-line (1- (string-to-number line))) (throw 'done 'exit)))))) @@ -1028,10 +1027,26 @@ The window scope is determined by `avy-all-windows' (ARG negates it)." arg avy-style)))) +(defvar avy-ring (make-ring 20) + "Hold the window and point history.") + +(defun avy-push-mark () + "Store the current point and window." + (ring-insert avy-ring + (cons (point) (selected-window)))) + (defun avy-pop-mark () - "Jump back to the last location of `push-mark'." + "Jump back to the last location of `avy-push-mark'." (interactive) - (set-mark-command 4)) + (let (res) + (condition-case nil + (progn + (while (not (window-live-p + (cdr (setq res (ring-remove avy-ring 0)))))) + (select-window (cdr res)) + (goto-char (car res))) + (error + (set-mark-command 4))))) (define-obsolete-function-alias 'avy--goto 'identity "0.3.0"