diff options
Diffstat (limited to 'emacs/.config/emacs-kj/lisp/kj-history.el')
-rw-r--r-- | emacs/.config/emacs-kj/lisp/kj-history.el | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/emacs/.config/emacs-kj/lisp/kj-history.el b/emacs/.config/emacs-kj/lisp/kj-history.el new file mode 100644 index 0000000..4119c92 --- /dev/null +++ b/emacs/.config/emacs-kj/lisp/kj-history.el @@ -0,0 +1,47 @@ +(defvar kj/history-command "fc -R $HISTFILE && fc -l 1" + "History command used to get shell history.") + +(defvar kj/history-regexp + (rx bol (* " ") + ;; Index + (* digit) + (* " ") + ;; Command + (group (1+ (not "\n"))))) + +(defun kj/get-shell-history () + (with-temp-buffer + (unless (process-file + "zsh" + nil + (current-buffer) + nil + "-c" + kj/history-command) + (error "Getting history failed: %s" (buffer-string))) + (goto-char (point-min)) + (let ((result)) + (save-match-data + (while (re-search-forward kj/history-regexp nil t) + (push (match-string-no-properties 1) result))) + result))) + +(defun kj/consult-history () + (interactive) + (if (not + (or (and (minibufferp) + (eq minibuffer-history-variable 'shell-command-history)) + (derived-mode-p '(term-mode shell-mode)) + )) + (call-interactively 'consult-history) + (consult--read + (kj/get-shell-history) + :prompt "Shell history: " + :history t + :sort nil + :initial (if (minibufferp) + (buffer-substring-no-properties + (minibuffer-prompt-end) (point-max)) + nil)))) + +(provide 'kj-history) |