summaryrefslogtreecommitdiff
path: root/emacs/.config/emacs-kj/lisp/kj-history.el
blob: 4119c920fcd5661736bd34ecadeb69fd6c65d1b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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)