summaryrefslogtreecommitdiffhomepage
path: root/consult.org
diff options
context:
space:
mode:
Diffstat (limited to 'consult.org')
-rw-r--r--consult.org353
1 files changed, 353 insertions, 0 deletions
diff --git a/consult.org b/consult.org
new file mode 100644
index 0000000..c4bcc88
--- /dev/null
+++ b/consult.org
@@ -0,0 +1,353 @@
+#+title: Completion configuration using selectrum, consult and friends
+
+* completion styles
+ #+begin_src emacs-lisp
+ (setq completion-styles '(substring flex initials))
+ ;; '(basic partial-completion emacs22)
+ #+end_src
+* prescient
+ #+begin_src emacs-lisp
+ (use-package prescient :ensure t)
+ #+end_src
+* selectrum
+ #+begin_src emacs-lisp
+ (use-package selectrum
+ :ensure t
+ :custom ((selectrum-extend-current-candidate-highlight nil)
+ (selectrum-fix-minibuffer-height nil)
+ (selectrum-num-candidates-displayed 15)
+ (selectrum-show-indices nil)
+ (selectrum-count-style 'current/matches)) ;; 'matches
+ :bind (("C-R" . selectrum-repeat)))
+
+ (use-package selectrum-prescient :ensure t)
+ #+end_src
+* marginalia
+ #+begin_src emacs-lisp
+ (use-package marginalia
+ :ensure t
+ :bind (:map minibuffer-local-map ("C-M-a" . marginalia-cycle))
+
+ :custom (marginalia-annotators
+ '(marginalia-annotators-heavy marginalia-annotators-light nil))
+ :config
+ (with-eval-after-load "selectrum"
+ (advice-add #'marginalia-cycle
+ :after
+ (lambda ()
+ (when (bound-and-true-p selectrum-mode)
+ (selectrum-exhibit))))))
+ #+end_src
+* consult
+ #+begin_src emacs-lisp
+ (use-package consult
+ :ensure t
+ :bind (("C-x M-:" . consult-complex-command)
+ ("C-x b" . consult-buffer)
+ ("C-x 4 b" . consult-buffer-other-window)
+ ("C-x 5 b" . consult-buffer-other-frame)
+ ("C-c b" . consult-bookmark)
+ ("C-c B" . bookmark-set)
+ ("C-c h" . consult-history)
+ ("C-c i" . consult-imenu)
+ ("C-c k" . consult-ripgrep)
+ ("C-c K" . consult-git-grep)
+ ("C-c l" . consult-locate)
+ ("C-c m" . consult-mode-command)
+ ("C-c s" . consult-line)
+ ("C-x r x" . consult-register)
+ ("C-x r b" . consult-bookmark)
+ ("M-g b" . consult-bookmark)
+ ("M-g g" . consult-goto-line)
+ ("M-g M-g" . consult-goto-line)
+ ("M-g o" . consult-outline)
+ ("M-g s" . consult-line)
+ ("M-g m" . consult-man)
+ ("M-g M" . consult-mark)
+ ("M-g K" . consult-git-grep)
+ ("M-g k" . consult-ripgrep)
+ ("M-g i" . consult-imenu)
+ ("M-g I" . consult-project-imenu)
+ ("M-g e" . consult-error)
+ ("M-s m" . consult-multi-occur)
+ ("M-s o" . consult-outline)
+ ("M-y" . consult-yank-pop)
+ ("C-s" . isearch-forward)
+ ("<help> a" . consult-apropos))
+
+ :custom ((completion-in-region-function #'consult-completion-in-region)
+ (consult-locate-command '("locate" "--ignore-case" "--regexp"))
+ (consult-preview-key (kbd "`"))
+ (consult-config '((consult-mark :preview-key any)))
+ (consult-narrow-key (kbd "<"))
+ (consult-widen-key (kbd ">")))
+
+ :init
+ (fset 'multi-occur #'consult-multi-occur)
+
+ :config
+ (defun jao-consult-project-root ()
+ (expand-file-name (or (jao-compilation-root) (vc-root-dir) "")))
+
+ (setq consult-project-root-function #'jao-consult-project-root)
+
+ (define-key consult-narrow-map (vconcat consult-narrow-key "?")
+ #'consult-narrow-help))
+ #+end_src
+* consultors
+*** dh-diff hunks
+ #+begin_src emacs-lisp
+ (defun jao-consult--diff-lines (&optional backward)
+ (let ((candidates)
+ (width (length (number-to-string
+ (line-number-at-pos (point-max)
+ consult-line-numbers-widen)))))
+ (save-excursion
+ (while (ignore-errors (diff-hl-next-hunk backward))
+ (let* ((str (buffer-substring (line-beginning-position)
+ (line-end-position)))
+ (no (line-number-at-pos (point)))
+ (no (consult--line-number-prefix (point-marker) no width)))
+ (push (concat no str) candidates))))
+ (if backward candidates (nreverse candidates))))
+
+ (defun jao-consult-hunks ()
+ (interactive)
+ (let ((candidates (append (jao-consult--diff-lines)
+ (jao-consult--diff-lines t))))
+ (unless candidates (error "No changes!"))
+ (consult--jump
+ (consult--read "Go to hunk: " candidates
+ :category 'consult--encode-location
+ :sort nil
+ :require-match t
+ :lookup #'consult--line-match
+ :preview (consult--preview-position)))))
+
+ (with-eval-after-load "consult"
+ (add-to-list 'consult-config '(jao-consult-hunks :preview-key any)))
+ #+end_src
+* embark
+*** packages
+ #+begin_src emacs-lisp
+ (use-package embark
+ :ensure t
+ :custom ((embark-quit-after-action nil))
+ :bind (("C-;" . embark-act)
+ (:map minibuffer-local-map
+ (("C-," . embark-become)
+ ("C-o" . embark-export)))))
+
+ (use-package embark-consult
+ :ensure t
+ :after (embark consult))
+
+ (with-eval-after-load 'consult
+ (with-eval-after-load 'embark
+ (require 'embark-consult)))
+ (require 'embark)
+ #+end_src
+*** embark action indicator
+ #+begin_src emacs-lisp
+ (defvar jao-embark--actions-buffer "*Embark Actions*")
+
+ (defvar jao-embark--default-display
+ `((,(regexp-quote jao-embark--actions-buffer)
+ (display-buffer-at-bottom)
+ (window-parameters (mode-line-format . none))
+ (window-height . fit-window-to-buffer))))
+
+ (setq jao-embark--excluded
+ '(embark-collect-snapshot embark-collect-live embark-export
+ embark-become embark-isearch))
+
+ (defun jao-embark--bind-desc (descs x)
+ (let ((k (car x)) (c (cdr x)))
+ (cond ((memq c jao-embark--excluded) descs)
+ ((symbolp c)
+ (let* ((desc (if (numberp k)
+ (single-key-description k)
+ (key-description k)))
+ (desc (format "%s" desc))
+ (doc (car (split-string
+ (or (ignore-errors (documentation c)) "")
+ "\n")))
+ (fun (symbol-name c)))
+ (cons (max (length desc) (car descs))
+ (cons (max (length fun) (cadr descs))
+ (cons (list desc fun doc) (cddr descs))))))
+ (t descs))))
+
+ (defun jao-embark--keymap-descs (k)
+ (seq-reduce #'jao-embark--bind-desc (cdr (keymap-canonicalize k)) '(0 0)))
+
+ (defun jao-embark--dstr (d)
+ (let ((s (cadr d))) (if (string-prefix-p "embark" s) "" s)))
+
+ (defun jao-embark--show-keymap (keymap &optional target)
+ (with-current-buffer (get-buffer-create jao-embark--actions-buffer)
+ (read-only-mode -1)
+ (setq-local cursor-type nil)
+ (delete-region (point-min) (point-max))
+ (let* ((descs (jao-embark--keymap-descs keymap))
+ (fmt (format "%%-%ds %%-%ds %%s\n" (cadr descs) (car descs))))
+ (seq-each (lambda (desc)
+ (insert (format fmt
+ (propertize (cadr desc) 'face 'jao-themes-f00)
+ (propertize (car desc) 'face 'embark-keybinding)
+ (propertize (caddr desc) 'face 'italic))))
+ (seq-sort-by 'jao-embark--dstr 'string-greaterp (cddr descs))))
+ (if target (insert (format "Action for '%s'" target)) (delete-char -1))
+ (read-only-mode 1)
+ (let ((display-buffer-alist
+ (append display-buffer-alist jao-embark--default-display)))
+ (pop-to-buffer (current-buffer) nil t))
+ (lambda () (embark-kill-buffer-and-window jao-embark--actions-buffer))))
+
+ (setq embark-action-indicator #'jao-embark--show-keymap
+ embark-become-indicator embark-action-indicator)
+
+ #+end_src
+*** org targets
+ #+begin_src emacs-lisp
+ (declare-function org-link-any-re "ol")
+ (declare-function org-open-link-from-string "ol")
+ (declare-function org-in-regexp "org-macs")
+
+ (defun jao-embark-targets--org-link ()
+ (when (derived-mode-p 'org-mode)
+ (when (org-in-regexp org-link-any-re)
+ (let ((lnk (match-string-no-properties 2)))
+ (if (string-match-p "https?://.+" lnk)
+ (cons 'url lnk)
+ (cons 'org-link (match-string-no-properties 0)))))))
+
+ (embark-define-keymap jao-embark-targets-org-link-map
+ "Actions for org links"
+ ((kbd "RET") org-open-link-from-string))
+
+ (add-to-list 'embark-target-finders #'jao-embark-targets--org-link)
+ (add-to-list 'embark-keymap-alist '(org-link . jao-embark-targets-org-link-map))
+ #+end_src
+*** w3m targets
+ #+begin_src emacs-lisp
+ (declare-function w3m-anchor "w3m")
+
+ (defun jao-embark-targets--w3m-anchor ()
+ (when (not (region-active-p))
+ (when-let ((url (or (w3m-anchor) w3m-current-url)))
+ (when (string-match-p "^https?.*" url)
+ (cons 'url url)))))
+
+ (add-to-list 'embark-target-finders #'jao-embark-targets--w3m-anchor)
+ (define-key embark-url-map (kbd "f") #'browse-url-firefox)
+ #+end_src
+*** video url targets
+ #+begin_src emacs-lisp
+ (defvar jao-embark-targets-video-url-rx
+ (format "^https?://\\(?:www\\.\\)?%s/.+"
+ (regexp-opt '("youtu.be"
+ "youtube.com"
+ "blip.tv"
+ "vimeo.com"
+ "infoq.com")
+ t))
+ "A regular expression matching URLs that point to video streams")
+
+ (defun jao-embark-targets--refine-url (url)
+ (if (string-match-p jao-embark-targets-video-url-rx url)
+ (cons 'video-url url)
+ (cons 'url url)))
+
+ (defun jao-embark-targets--play-video (player url)
+ (interactive "sURL: ")
+ (let ((cmd (format "%s %s" player (shell-quote-argument url))))
+ (start-process-shell-command player nil cmd)))
+
+ (defun jao-embark-targets-mpv (&optional url)
+ "Play video stream with mpv"
+ (interactive "sURL: ")
+ (jao-embark-targets--play-video "mpv" url))
+
+ (defun jao-embark-targets-vlc (&optional url)
+ "Play video stream with vlc"
+ (interactive "sURL: ")
+ (jao-embark-targets--play-video "vlc" url))
+
+ (embark-define-keymap jao-embark-targets-video-url-map
+ "Actions on URLs pointing to remote video streams."
+ :parent embark-url-map
+ ("v" jao-embark-targets-vlc)
+ ("m" jao-embark-targets-mpv))
+
+ (add-to-list 'embark-transformer-alist '(url . jao-embark-targets--refine-url))
+ (add-to-list 'embark-keymap-alist '(video-url . jao-embark-targets-video-url-map))
+ #+end_src
+*** embark as selectrum lite
+ #+begin_src emacs-lisp
+ (defun jao-embark--shrink-selectrum ()
+ (when (eq embark-collect--kind :live)
+ (with-selected-window (active-minibuffer-window)
+ (when (bound-and-true-p selectrum-active-p)
+ (setq-local selectrum-num-candidates-displayed 1)))))
+
+ (add-to-list 'display-buffer-alist
+ '("\\`\\*Embark Collect.*\\*"
+ (display-buffer-below-selected)
+ (window-height . 0.25)
+ (window-parameters (mode-line-format . none))))
+
+ (defun jao-embark-select-first-completion ()
+ (interactive)
+ (embark-switch-to-collect-completions)
+ (push-button))
+
+ (defun jao-embark-prescient-candidates ()
+ (prescient-sort (cdr (embark-minibuffer-candidates))))
+
+ (defun jao-remember-candidate-on-exit ()
+ (prescient-remember (minibuffer-contents)))
+
+ (defun jao-embark-remember-target (_action target &optional _exit)
+ (prescient-remember target))
+
+ (defun jao-embark-compui-enable ()
+ (interactive)
+ (setq completion-styles '(flex initials substring))
+
+ (when (bound-and-true-p selectrum-mode)
+ (selectrum-mode -1))
+ (push #'jao-embark-prescient-candidates
+ embark-candidate-collectors)
+ (defalias 'switch-to-completions
+ 'embark-switch-to-collect-completions)
+ (add-hook 'minibuffer-exit-hook
+ #'jao-remember-candidate-on-exit)
+ (advice-add 'embark--act :before #'jao-embark-remember-target)
+ (define-key minibuffer-local-map (kbd "C-SPC")
+ #'embark-collect-completions)
+ (define-key minibuffer-local-map (kbd "M-SPC")
+ #'embark-collect-completions)
+ (define-key minibuffer-local-map (kbd "C-n")
+ #'embark-switch-to-collect-completions)
+ (define-key minibuffer-local-map (kbd "RET")
+ #'jao-embark-select-first-completion))
+
+ (defun jao-embark-compui-disable ()
+ (interactive)
+ (setq completion-styles '(basic partial-completion emacs22))
+ (remove-hook 'minibuffer-exit-hook
+ #'jao-remember-candidate-on-exit)
+ (advice-remove 'embark--act #'jao-embark-remember-target)
+ (when (boundp selectrum-mode)
+ (define-key minibuffer-local-map (kbd "C-n")
+ 'selectrum-next-candidate)
+ (selectrum-mode 1)))
+ #+end_src
+* startup
+ #+begin_src emacs-lisp
+ (selectrum-mode 1)
+ (selectrum-prescient-mode 1)
+ (prescient-persist-mode 1)
+ (marginalia-mode 1)
+ #+end_src