summaryrefslogtreecommitdiff
path: root/emacs
diff options
context:
space:
mode:
Diffstat (limited to 'emacs')
-rw-r--r--emacs/.config/emacs-kj/init.el6
-rw-r--r--emacs/.config/emacs-kj/lisp/kj-history.el47
2 files changed, 50 insertions, 3 deletions
diff --git a/emacs/.config/emacs-kj/init.el b/emacs/.config/emacs-kj/init.el
index 1168cc5..b596c39 100644
--- a/emacs/.config/emacs-kj/init.el
+++ b/emacs/.config/emacs-kj/init.el
@@ -254,7 +254,7 @@
(use-package consult
;; Replace bindings. Lazily loaded due by `use-package'.
:bind (;; C-c bindings (mode-specific-map)
- ("C-c h" . consult-history)
+ ("C-c h" . kj/consult-history)
;;("C-c m" . consult-mode-command)
("C-c k" . consult-kmacro)
;; C-x bindings (ctl-x-map)
@@ -303,8 +303,8 @@
("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch
;; Minibuffer history
:map minibuffer-local-map
- ("M-s" . consult-history) ;; orig. next-matching-history-element
- ("M-r" . consult-history)) ;; orig. previous-matching-history-element
+ ("M-s" . kj/consult-history) ;; orig. next-matching-history-element
+ ("M-r" . kj/consult-history)) ;; orig. previous-matching-history-element
;; Enable automatic preview at point in the *Completions* buffer. This is
;; relevant when you use the default completion UI.
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)