diff options
Diffstat (limited to 'attic/org/completion.org')
-rw-r--r-- | attic/org/completion.org | 657 |
1 files changed, 657 insertions, 0 deletions
diff --git a/attic/org/completion.org b/attic/org/completion.org new file mode 100644 index 0000000..3a4049a --- /dev/null +++ b/attic/org/completion.org @@ -0,0 +1,657 @@ +#+property: header-args :lexical t :tangle yes :comments yes :results silent :shebang ";; -*- lexical-binding: t -*-" :tangle-mode (identity #o644) +#+title: Completion configuration +#+auto_tangle: t + +* imenu + #+begin_src emacs-lisp + (use-package imenu + :init (setq org-imenu-depth 7) + :config + (defun jao-imenu-hook () + (cond ((derived-mode-p 'org-mode) (org-reveal t)) + (outline-minor-mode (outline-show-entry)))) + (add-hook 'imenu-after-jump-hook #'jao-imenu-hook)) + #+end_src +* completion styles +*** completion configuration + #+begin_src emacs-lisp + (setq tab-always-indent 'complete + read-extended-command-predicate #'command-completion-default-include-p + completion-category-defaults nil + completion-cycle-threshold nil + completions-detailed t + completion-show-help nil + completion-show-inline-help nil + completion-ignore-case t + completion-wrap-movement t + completion-auto-select nil + completions-format 'one-column + completion-styles '(basic substring partial-completion emacs22) + completion-category-overrides + '((file (styles partial-completion)) + (command (styles initials substring partial-completion)) + (symbol (styles initials substring partial-completion)) + (variable (styles initials substring partial-completion)))) + + ;; (setq completions-sort #'jao-completion--sort-by-length-alpha) + (setq completions-sort #'jao-completion--sort-by-history) + + (defun jao-completion--sort-by-alpha-length (elems) + (sort elems (lambda (c1 c2) + (or (string-version-lessp c1 c2) + (< (length c1) (length c2)))))) + + (defun jao-completion--sort-by-history (elems) + (let ((hist (and (not (eq minibuffer-history-variable t)) + (symbol-value minibuffer-history-variable)))) + (if hist + (minibuffer--sort-by-position hist elems) + (jao-completion--sort-by-alpha-length elems)))) + + #+end_src +*** crm indicator + #+begin_src emacs-lisp + (defun jao-completion--crm-indicator (args) + "Add prompt indicator to `completing-read-multiple' filter ARGS." + (cons (concat "[CRM] " (car args)) (cdr args))) + (advice-add #'completing-read-multiple + :filter-args #'jao-completion--crm-indicator) + #+end_src +*** directory navigation + #+begin_src emacs-lisp + (defun jao-completion-backward-updir () + "Delete char before point or go up a directory." + (interactive nil mct-minibuffer-mode) + (cond ((and (eq (char-before) ?/) + (eq (mct--completion-category) 'file)) + (when (string-equal (minibuffer-contents) "~/") + (delete-minibuffer-contents) + (insert (expand-file-name "~/")) + (goto-char (line-end-position))) + (save-excursion + (goto-char (1- (point))) + (when (search-backward "/" (minibuffer-prompt-end) t) + (delete-region (1+ (point)) (point-max))))) + (t (call-interactively 'backward-delete-char)))) + + (define-key minibuffer-local-filename-completion-map (kbd "DEL") + #'jao-completion-backward-updir) + #+end_src +* orderless + #+begin_src emacs-lisp + (use-package orderless + :ensure t + :init + :config + (orderless-define-completion-style orderless+initialism + (orderless-matching-styles '(orderless-initialism + orderless-prefixes + orderless-literal + orderless-regexp))) + + (defun jao-orderless--set-locally () + (setq-local completion-styles + '(substring partial-completion orderless) + + completion-category-overrides + '((file (styles partial-completion orderless)) + (command (styles orderless+initialism))) + orderless-matching-styles + '(orderless-literal orderless-regexp orderless-prefixes))) + (add-hook 'minibuffer-setup-hook #'jao-orderless--set-locally)) + + #+end_src +* marginalia + #+begin_src emacs-lisp + (use-package marginalia + :ensure t + :bind (:map minibuffer-local-map ("C-M-a" . marginalia-cycle)) + + :custom ((marginalia-align 'left) + (marginalia-align-offset 1) + (marginalia-field-width 200) + (marginalia-annotators + '(marginalia-annotators-heavy marginalia-annotators-light nil)) + (marginalia-separator " "))) + + (marginalia-mode 1) + #+end_src +* company + #+begin_src emacs-lisp + (use-package company + :ensure t + :custom ((company-backends '(company-capf + ;; company-bbdb + company-files + company-dabbrev + company-keywords)) + (company-global-modes '(not slack-message-buffer-mode + circe-channel-mode + telega-chat-mode)) + (company-format-margin-function nil) ;; #'company-text-icons-margin + (company-idle-delay 0.2) + (company-lighter "") + (company-lighter-base "") + (company-show-numbers nil) + (company-selection-wrap-around t) + (company-tooltip-limit 15) + (company-tooltip-align-annotations t) + (company-tooltip-offset-display 'lines)) ;; 'scrollbar + + :config + (defun jao-complete-at-point () + "Complete using company unless we're in the minibuffer." + (interactive) + (if (or (not company-mode) (window-minibuffer-p)) + (completion-at-point) + (company-manual-begin))) + + (defun jao-company-use-in-tab () + (global-set-key [remap completion-at-point] #'jao-complete-at-point) + (global-set-key [remap completion-symbol] #'jao-complete-at-point) + (global-set-key (kbd "M-TAB") #'jao-complete-at-point)) + + (jao-company-use-in-tab) + + :bind (:map company-active-map + + ("<tab>" . company-complete-common-or-cycle) + ("TAB" . company-complete-common-or-cycle) + + ("C-h" . company-show-doc-buffer) + ("M-." . company-show-location) + ("C-<return>" . company-complete-selection) + ([remap return] . company-abort) + ("RET" . company-abort) + + :filter (or (not (derived-mode-p 'eshell-mode)) + (company-explicit-action-p)) + ("<return>" . company-complete-selection) + ("RET" . company-complete-selection)) + :diminish) + + (unless (display-graphic-p) (global-company-mode 1)) + #+end_src +* vertico + #+begin_src emacs-lisp + (use-package vertico + :ensure t + :init + (setq vertico-count 20 + vertico-cycle t + vertico-resize t + org-refile-use-outline-path t) + + :config + + ;; (setq completion-in-region-function + ;; (lambda (&rest args) + ;; (apply (if (and (not window-system) vertico-mode) + ;; #'consult-completion-in-region + ;; #'completion--in-region) + ;; args))) + + (defun jao-vertico--display-candidates (lines) + (move-overlay vertico--candidates-ov (point-min) (point-min)) + (overlay-put vertico--candidates-ov 'after-string (apply #'concat lines)) + (vertico--resize-window (length lines))) + + (advice-add 'vertico--display-candidates + :override #'jao-vertico--display-candidates)) + + (use-package vertico-directory + :after vertico + :bind (:map vertico-map (("RET" . vertico-directory-enter) + ("M-<backspace>" . vertico-directory-delete-word) + ("<backspace>" . vertico-directory-delete-char)))) + + (vertico-mode) + + #+end_src +* consult +*** package + #+begin_src emacs-lisp + (use-package consult + :ensure t + :bind (("C-x M-:" . consult-complex-command) + ("C-x b" . consult-buffer) + ("C-x C-b" . consult-buffer) + ("C-x 4 b" . consult-buffer-other-window) + ("C-c b" . project-find-file) + ("C-c h" . consult-history) + ("C-c i" . consult-imenu) + ("C-c I" . consult-project-imenu) + ("C-c k" . consult-ripgrep) + ("C-c K" . consult-git-grep) + ("C-c L" . consult-locate) + ;; ("C-h m" . consult-mode-command) + ("C-c s" . consult-line) + ("C-x r x" . consult-register) + ("C-x r b" . consult-bookmark) + ("C-x C-f" . jao-find-file) + ("M-g b" . consult-bookmark) + ("M-g m" . consult-mark) + ("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) + ("C-S-s" . consult-line) + ("<help> a" . consult-apropos)) + + :custom ((consult-preview-key (kbd "`"))) + + :init + (fset 'multi-occur #'consult-multi-occur) + + :config + + (defun jao-find-file (arg) + (interactive "P") + (call-interactively (if arg 'consult-file-externally 'find-file))) + + (define-key consult-narrow-map (vconcat consult-narrow-key "?") + #'consult-narrow-help) + + (consult-customize consult-mark :preview-key 'any) + (add-hook 'completion-list-mode-hook #'consult-preview-at-point-mode)) + + #+end_src +*** consult-dir + #+begin_src emacs-lisp + (use-package consult-dir + :ensure t + :bind (("C-x C-d" . consult-dir) + :map minibuffer-local-completion-map + (("C-x C-d" . consult-dir) + ("C-x C-j" . consult-dir-jump-file)))) + #+end_src +*** 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 candidates + :prompt "Go to hunk: " + :category 'consult--encode-location + :sort nil + :require-match t + :lookup #'consult--line-match + :state (consult--jump-state))))) + + (with-eval-after-load "consult" + (consult-customize '((jao-consult-hunks :preview-key any))) + (global-set-key (kbd "C-x v c") #'jao-consult-hunks)) + #+end_src +*** narrow helpers + #+begin_src emacs-lisp + (defvar jao-consult-narrow nil) + + (defun jao-consult-initial-narrow () + (when-let (c (cond ((eq this-command #'consult-buffer) + (cdr (assoc (jao-afio-current-frame) + jao-consult-narrow))) + ((eq this-command #'consult-mode-command) ?m))) + (setq unread-command-events (append unread-command-events `(,c 32))))) + + (add-hook 'minibuffer-setup-hook #'jao-consult-initial-narrow) + + (defmacro jao-consult--mode-buffers (&rest modes) + `(lambda () + (seq-map #'buffer-name + (seq-filter (lambda (b) + (with-current-buffer b + (derived-mode-p ,@modes))) + (buffer-list))))) + + (defun jao-consult-add-buffer-source (src &optional aframe key) + (add-to-list 'consult-buffer-sources src t) + (when (and aframe key) + (add-to-list 'jao-consult-narrow (cons aframe key)))) + #+end_src +*** narrowing chats + #+begin_src emacs-lisp + (defvar jao-chat-buffer-source + (list :name "chats" + :category 'buffer + :action #'pop-to-buffer + :hidden t + :narrow (cons ?c "chats") + :items (jao-consult--mode-buffers 'erc-mode + 'circe-channel-mode + 'circe-query-mode + 'signel-chat-mode + 'slack-message-buffer-mode + 'slack-thread-message-buffer-mode + 'telega-root-mode + 'telega-chat-mode))) + (with-eval-after-load "consult" + (jao-consult-add-buffer-source 'jao-chat-buffer-source)) + #+end_src + +*** exwm + #+begin_src emacs-lisp :tangle no + (with-eval-after-load "exwm" + (defun consult-exwm-preview-fix (&rest _args) + "Kludge to stop EXWM buffers from stealing focus during Consult previews." + (when-let ((mini (active-minibuffer-window))) + (select-window (active-minibuffer-window)))) + + (advice-add #'consult--buffer-action :after #'consult-exwm-preview-fix)) + + #+end_src +* embark +*** package + #+begin_src emacs-lisp + (use-package embark + :ensure t + :demand t + :init + (setq embark-quit-after-action nil + embark-indicator #'embark-mixed-indicator + embark-verbose-indicator-buffer-sections '(bindings) + embark-mixed-indicator-both t + embark-verbose-indicator-excluded-commands + '(embark-become embark-export embark-collect) + embark-verbose-indicator-nested t + embark-verbose-indicator-display-action + '((display-buffer-at-bottom) + (window-parameters (mode-line-format . none)) + (window-height . fit-window-to-buffer))) + + :bind (("C-;" . embark-act) + ("C-c ;" . embark-act) + ("C-'" . embark-dwim) + ("C-c '" . embark-dwim) + (:map minibuffer-local-map + (("C-'" . embark-dwim) + ("C-c '" . embark-dwim) + ("C-," . embark-become) + ("C-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))) + + #+end_src +*** randomsig + #+begin_src emacs-lisp + (defun jao-random-sig-read (_ignored) + "Import region as signature and edit it." + (randomsig-message-read-sig t)) + + (define-key embark-region-map "m" #'jao-random-sig-read) + (define-key embark-region-map "M" #'apply-macro-to-region-lines) + #+end_src +*** dict/say + #+begin_src emacs-lisp + (defun jao-say (&optional word) + "Isn't it nice to have a computer that can talk to you?" + (interactive "sWhat? ") + (shell-command-to-string (format "say %s" word)) + "") + + (define-key embark-identifier-map "D" #'dictionary-search) + (define-key embark-identifier-map "S" #'jao-say) + #+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-bracket-re) + (let ((lnk (match-string-no-properties 1))) + (if (string-match-p "https?://.+" (or 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)) + + (defun jao-embark-targets--gl-org-link () + (when (org-in-regexp org-link-bracket-re) + (cons 'gl-org-link (match-string-no-properties 0)))) + + (embark-define-keymap jao-embark-targets-gl-org-link-map + "Actions for exteranl org links" + ((kbd "RET") org-open-at-point-global)) + + (add-to-list 'embark-target-finders #'jao-embark-targets--gl-org-link) + (add-to-list 'embark-keymap-alist + '(gl-org-link . jao-embark-targets-gl-org-link-map)) + + (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 +*** url 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 (jao-url-around-point) + (thing-at-point 'url) + (and (derived-mode-p 'w3m-mode) + (or (w3m-anchor) w3m-current-url)) + (and (derived-mode-p 'eww-mode) + (eww-current-url))))) + (when (string-match-p "^https?.*" url) + (cons 'url url))))) + + (add-to-list 'embark-target-finders #'jao-embark-targets--w3m-anchor) + + (defun jao-embark-url (url) + "Browse URL, externally if we're already in an emacs browser." + (if (derived-mode-p 'w3m-mode 'eww-mode) + (jao-browse-with-external-browser url) + (browse-url url))) + + (define-key embark-url-map (kbd "RET") #'jao-embark-url) + (define-key embark-url-map (kbd "f") #'browse-url-firefox) + (define-key embark-url-map (kbd "x") #'jao-rss-subscribe) + (define-key embark-url-map (kbd "m") 'jao-browse-with-external-browser) + (define-key embark-url-map (kbd "p") 'jao-browse-add-url-to-mpc) + + #+end_src +*** video url targets + #+begin_src emacs-lisp + (defvar jao-embark-targets-video-sites + '("youtu.be" "youtube.com" "blip.tv" "vimeo.com" "infoq.com")) + + (defun jao-embark--video-url-rx (&optional sites) + (format "^https?://\\(?:www\\.\\)?%s/.+" + (regexp-opt (or sites jao-embark-targets-video-sites) t))) + + (defvar jao-embark-targets-video-url-rx (jao-embark--video-url-rx) + "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)))) + (jao-afio--goto-www) + (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) + ("RET" 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)) + (define-key embark-url-map "v" #'jao-embark-targets-vlc) + (define-key embark-url-map "V" #'jao-embark-targets-vlc) + + #+end_src +*** spotify + #+begin_src emacs-lisp + (with-eval-after-load "consult-spotify" + (defun jao-consult-spt-play (candidate) + (when-let (url (espotify-candidate-url candidate)) + (jao-spt-play-uri url))) + + (embark-define-keymap spotify-item-keymap + "Actions for Spotify search results" + ("s" jao-consult-spt-play) + ("y" espotify-yank-candidate-url) + ("a" espotify-play-candidate-album) + ("h" espotify-show-candidate-info)) + + (add-to-list 'embark-keymap-alist + '(spotify-search-item . spotify-item-keymap))) + #+end_src +* avy and link hints + [[https://karthinks.com/software/avy-can-do-anything/][Avy can do anything | Karthinks]] + #+begin_src emacs-lisp + (use-package avy + :ensure t + :init (setq avy-style 'pre + avy-background t + avy-timeout-seconds 0.6 + avy-single-candidate-jump t) + + :config + + (defun avy-embark-act (pt) + "Use Embark to act on the completion at PT." + (save-excursion + (goto-char pt) + (embark-act))) + (add-to-list 'avy-dispatch-alist '(?\; . avy-embark-act)) + + :bind (("s-j" . avy-goto-char-timer) + ("C-M-j" . avy-goto-char-timer))) + + (use-package link-hint + :ensure t + :init (setq link-hint-avy-style 'pre) + + :config + (defun jao-link-hint-open-link-ext () + (interactive) + (let ((jao-browse-url-function jao-browse-url-external-function)) + (link-hint-open-link))) + + :bind (("C-l" . link-hint-open-link) + ("C-M-l" . jao-link-hint-open-link-ext) + ("C-S-l" . jao-link-hint-open-link-ext) + ("C-x C-l" . recenter-top-bottom))) + + #+end_src +* recoll + #+begin_src emacs-lisp + (jao-load-path "consult-recoll") + + (defun jao-recoll-format (title url mtype) + (let* ((u (replace-regexp-in-string "/home/jao/" "" url)) + (u (replace-regexp-in-string + "\\(doc\\|org/doc\\|.emacs.d/gnus/Mail\\|var/mail\\)/" "" u))) + (format "%s (%s, %s)" + title + (propertize u 'face 'jao-themes-f00) + (propertize mtype 'face 'jao-themes-f01)))) + + (defun jao-recoll-open-html (file) + (jao-afio--goto-www) + (eww-open-file file)) + + (defun jao-recoll-consult-messages () + (interactive) + (consult-recoll "mime:message ")) + + (defun jao-recoll-consult-docs () + (interactive) + (consult-recoll (format "dir:%s/doc " jao-org-dir))) + + (defun jao-recoll-messages () + (interactive) + (jao-recoll "mime:message ")) + + (defun jao-recoll-docs () + (interactive) + (jao-recoll (format "dir:%s/doc " jao-org-dir))) + + (defun jao-recoll-notes () + (interactive) + (jao-recoll (format "dir:%s " jao-org-notes-dir))) + + (defun jao-recoll-consult-notes () + "Use consult-recoll to search notes." + (interactive) + (consult-recoll (format "dir:%s " jao-org-notes-dir))) + + (defun jao-recoll-open-with-notmuch (fname) + (let ((id (with-temp-buffer + (insert-file fname) + (goto-char (point-min)) + (when (re-search-forward "[Mm]essage-[Ii][Dd]: <?\\([^><]+\\)>?" + nil t) + (match-string 1))))) + (when id (notmuch-show (concat "id:" id))))) + + (use-package consult-recoll + :init (setq consult-recoll-open-fns + '(("application/pdf" . jao-open-doc) + ("message/rfc822" . jao-recoll-open-with-notmuch) + ("text/html" . jao-recoll-open-html)) + consult-recoll-search-flags nil + consult-recoll-format-candidate #'jao-recoll-format) + :config + (transient-define-prefix jao-recoll-transient () + [["Consult recoll queries" + ("r" "consult recoll query" consult-recoll) + ("n" "consult recoll on notes" jao-recoll-consult-notes) + ("d" "consult recoll on docs" jao-recoll-consult-docs) + ("m" "consult recoll on messages" jao-recoll-consult-messages)] + ["Recoll queries" + ("R" "recoll query" jao-recoll) + ("N" "recoll on notes" jao-recoll-notes) + ("D" "consult recoll on docs" jao-recoll-docs) + ("M" "consult recoll on messages" jao-recoll-messages)]]) + + :bind (("s-r" . #'jao-recoll-transient))) + + #+end_src |