diff options
-rw-r--r-- | helm-lib.el | 8 | ||||
-rw-r--r-- | helm.el | 25 |
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))) @@ -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) |