branch: master commit 0772929421b8ec7480c91e3dbe748c9467bd3e38 Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Add some rudimentary history handling * ivy.el (ivy-minibuffer-map): Bind "M-n", "M-p", and "C-g". (ivy-history): New defvar. (ivy-read): Update. (ivy--minibuffer-setup): Offer thing-at-point for "M-n". (ivy--default): New defvar. Re #16. --- ivy.el | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ivy.el b/ivy.el index ce4a610..47f3568 100644 --- a/ivy.el +++ b/ivy.el @@ -52,6 +52,7 @@ ;;* User Visible ;;** Keymap +(require 'delsel) (defvar ivy-minibuffer-map (let ((map (make-sparse-keymap))) (define-key map (kbd "C-m") 'ivy-done) @@ -63,9 +64,18 @@ (define-key map (kbd "DEL") 'ivy-backward-delete-char) (define-key map (kbd "M-<") 'ivy-beginning-of-buffer) (define-key map (kbd "M->") 'ivy-end-of-buffer) + (define-key map (kbd "M-n") 'next-history-element) + (define-key map (kbd "M-p") 'previous-history-element) + (define-key map (kbd "C-g") 'minibuffer-keyboard-quit) map) "Keymap used in the minibuffer.") +(defvar ivy-history nil + "History list of candidates entered in the minibuffer. + +Maximum length of the history list is determined by the value +of `history-length', which see.") + ;;** Commands (defun ivy-done () "Exit the minibuffer with the selected candidate." @@ -104,7 +114,6 @@ On error (read-only), quit without selecting." (condition-case nil (backward-delete-char 1) (error - (require 'delsel) (minibuffer-keyboard-quit)))) ;;** Entry Point @@ -122,10 +131,16 @@ If INDEX is non-nil select the corresponding candidate." (setq ivy--all-candidates collection) (setq ivy--update-fn update-fn) (setq ivy-exit nil) + (setq ivy--default (or (thing-at-point 'symbol) "")) (unwind-protect (minibuffer-with-setup-hook #'ivy--minibuffer-setup - (read-from-minibuffer prompt initial-input)) + (read-from-minibuffer + prompt + initial-input + ivy-minibuffer-map + nil + 'ivy-history)) (remove-hook 'post-command-hook #'ivy--exhibit))) (defvar ivy-text "" @@ -168,6 +183,9 @@ Otherwise, store nil.") (defun ivy--minibuffer-setup () "Setup ivy completion in the minibuffer." (set (make-local-variable 'completion-show-inline-help) nil) + (set (make-local-variable 'minibuffer-default-add-function) + (lambda () + (list ivy--default))) (use-local-map (make-composed-keymap ivy-minibuffer-map (current-local-map))) (setq-local max-mini-window-height ivy-height) @@ -187,6 +205,9 @@ Otherwise, store nil.") (defvar ivy--current "" "Current candidate.") +(defvar ivy--default nil + "Default initial input.") + (defvar ivy--update-fn nil "Current function to call when current candidate(s) update.")