summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helm-lib.el8
-rw-r--r--helm.el25
2 files changed, 33 insertions, 0 deletions
diff --git a/helm-lib.el b/helm-lib.el
index 582f087c..f30c6ae6 100644
--- a/helm-lib.el
+++ b/helm-lib.el
@@ -158,6 +158,14 @@ and not `exit-minibuffer' or other unwanted functions."
(setq lis (pcase lis (`(,_ . ,ll) (or ll seq))))
elm))))
+(cl-defun helm-iter-sub-next-circular (seq elm &key (test 'eq))
+ "Infinite iteration of SEQ starting at ELM."
+ (let* ((pos (1+ (helm-position elm seq :test test)))
+ (sub (append (nthcdr pos seq) (cl-subseq seq 0 pos)))
+ (iterator (helm-iter-circular sub)))
+ (lambda ()
+ (helm-iter-next iterator))))
+
(defun helm-iter-next (iterator)
"Return next elm of ITERATOR."
(and iterator (funcall iterator)))
diff --git a/helm.el b/helm.el
index 5d8ad28f..a73b91b7 100644
--- a/helm.el
+++ b/helm.el
@@ -235,6 +235,7 @@ vectors, so don't use strings to define them."
(define-key map (kbd "C-!") 'helm-toggle-suspend-update)
(define-key map (kbd "C-x b") 'helm-resume-previous-session-after-quit)
(define-key map (kbd "C-x C-b") 'helm-resume-list-buffers-after-quit)
+ (define-key map (kbd "<S-f1>") 'helm-run-cycle-resume)
;; Disable `file-cache-minibuffer-complete'.
(define-key map (kbd "<C-tab>") 'undefined)
;; Multi keys
@@ -1247,6 +1248,7 @@ You should not modify this yourself unless you know what you are doing.")
Should be set in candidates functions if needed, will be restored
at end of session.")
(defvar helm--action-prompt "Select action: ")
+(defvar helm--cycle-resume-iterator nil)
;; Utility: logging
(defun helm-log (format-string &rest args)
@@ -2220,6 +2222,29 @@ Return nil if no `helm-buffer' found."
:buffer "*helm resume*")
(keyboard-quit))))
+;;;###autoload
+(defun helm-cycle-resume ()
+ (interactive)
+ (cl-assert helm-buffers nil "No helm buffers to resume")
+ (setq helm--cycle-resume-iterator
+ (helm-iter-sub-next-circular
+ helm-buffers helm-last-buffer :test 'equal))
+ (message "Resuming helm buffer `%s'" helm-last-buffer)
+ (if (sit-for 1.2)
+ (helm-resume helm-last-buffer)
+ (message "Resuming helm buffer `%s'"
+ (setq helm-last-buffer
+ (helm-iter-next helm--cycle-resume-iterator)))
+ (sit-for 1)))
+
+(defun helm-run-cycle-resume ()
+ (interactive)
+ (when (cdr helm-buffers)
+ (setq helm-last-buffer
+ (helm-iter-next helm--cycle-resume-iterator)))
+ (helm-run-after-exit 'helm-cycle-resume))
+(put 'helm-run-cycle-resume 'helm-only t)
+
;;;###autoload
(defun helm-other-buffer (any-sources any-buffer)