home

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 8c465e7a46a0347b3cb0c911f3ed1a77b1fb390c
parent f2b3fd5fc74852b4825cc4f1c923e24a53ff1124
Author: Vincent Demeester <vincent@sbr.pm>
Date:   Fri, 30 Jul 2021 17:07:16 +0200

tools/emacs: re-work completions…

Disabling icomplete, relying on default completion from emacs. *But*
we are enabling orderless (as before), marginalia and vertico.

This is nice, quick and works well with `projects` for example, less
with projectile, but I gotta remove that dependency at some point.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Diffstat:
Mtools/emacs/config/config-completion.el | 174++++++++++++++++++++-----------------------------------------------------------
Mtools/emacs/foo.el | 17++++++++++++++++-
Musers/vincent/dev/emacs.nix | 4+---
3 files changed, 61 insertions(+), 134 deletions(-)

diff --git a/tools/emacs/config/config-completion.el b/tools/emacs/config/config-completion.el @@ -8,24 +8,38 @@ :config (setq orderless-regexp-separator " +") (setq orderless-matching-styles - '(orderless-strict-leading-initialism + '(orderless-prefixes + orderless-literal + orderless-strict-leading-initialism orderless-regexp - orderless-prefixes - orderless-literal)) + orderless-flex)) - (defun prot/orderless-literal-dispatcher (pattern _index _total) + (defun vde/orderless-literal-dispatcher (pattern _index _total) + "Literal style dispatcher using the equals sign as a suffix. +It matches PATTERN _INDEX and _TOTAL according to how Orderless +parses its input." (when (string-suffix-p "=" pattern) `(orderless-literal . ,(substring pattern 0 -1)))) - (defun prot/orderless-initialism-dispatcher (pattern _index _total) + (defun vde/orderless-initialism-dispatcher (pattern _index _total) + "Leading initialism dispatcher using the comma suffix. +It matches PATTERN _INDEX and _TOTAL according to how Orderless +parses its input." (when (string-suffix-p "," pattern) `(orderless-strict-leading-initialism . ,(substring pattern 0 -1)))) - (setq orderless-style-dispatchers '(prot/orderless-literal-dispatcher - prot/orderless-initialism-dispatcher)) + (setq orderless-style-dispatchers '(vde/orderless-literal-dispatcher + vde/orderless-initialism-dispatcher)) :bind (:map minibuffer-local-completion-map ("SPC" . nil))) ; space should never complete +(use-package marginalia + :config + (setq marginalia-max-relative-age 0) ; time is absolute here! + (setq marginalia-annotators '(marginalia-annotators-heavy + marginalia-annotators-light)) + (marginalia-mode 1)) + (use-package minibuffer :unless noninteractive :config @@ -33,19 +47,35 @@ (setq completion-flex-nospace nil) (setq completion-pcm-complete-word-inserts-delimiters t) (setq completion-pcm-word-delimiters "-_./:| ") + (setq completion-ignore-case t) + (setq-default case-fold-search nil) ; For general regexp ;; NOTE: flex completion is introduced in Emacs 27 (setq completion-show-help nil) - (setq completion-styles '(orderless partial-completion substring initials flex)) + (setq completion-styles + '(substring initials flex partial-completion orderless)) (setq completion-category-overrides - '((file (styles initials basic)) - (buffer (styles initials basic)) - (info-menu (styles basic)))) - (setq completions-format 'vertical) ; *Completions* buffer + '((file (styles . (partial-completion orderless))))) + ;; The following two are updated in Emacs 28. They concern the + ;; *Completions* buffer. + (setq completions-format 'one-column) + (setq completions-detailed t) + + ;; Grouping of completions for Emacs 28 + (setq completions-group t) + (setq completions-group-sort nil) + (setq completions-group-format + (concat + (propertize " " 'face 'completions-group-separator) + (propertize " %s " 'face 'completions-group-title) + (propertize " " 'face 'completions-group-separator + 'display '(space :align-to right)))) + (setq enable-recursive-minibuffers t) (setq read-answer-short t) (setq read-buffer-completion-ignore-case t) (setq read-file-name-completion-ignore-case t) (setq resize-mini-windows t) + (setq minibuffer-eldef-shorten-default t) (file-name-shadow-mode 1) (minibuffer-depth-indicate-mode 1) @@ -115,126 +145,10 @@ instead." ("f" . next-completion) ("b" . previous-completion) ("M-v" . vde/focus-minibuffer))) - -(use-package icomplete - :demand +(use-package vertico :unless noninteractive - :after minibuffer ; Read that section as well :config - (setq icomplete-delay-completions-threshold 0) - (setq icomplete-max-delay-chars 2) - (setq icomplete-compute-delay 0) - (setq icomplete-show-matches-on-no-input t) - (setq icomplete-hide-common-prefix nil) - (setq icomplete-prospects-height 1) - (setq icomplete-separator " · ") ; mid dot, not full stop - (setq icomplete-in-buffer nil) - (setq icomplete-with-completion-tables t) - - (fido-mode -1) ; Emacs 27.1 - (icomplete-mode 1) - - (defun vde/icomplete-force-complete-and-exit () - "Complete the current `icomplete' match and exit the minibuffer. - -Contrary to `icomplete-force-complete-and-exit', this will -confirm your choice without complaining about incomplete matches. - -Those incomplete matches can block you from performing legitimate -actions, such as defining a new tag in an `org-capture' prompt. - -In my testing, this is necessary when the variable -`icomplete-with-completion-tables' is non-nil, because then -`icomplete' will be activated practically everywhere it can." - (interactive) - (icomplete-force-complete) - (exit-minibuffer)) - - (defun vde/icomplete-toggle-completion-styles (&optional arg) - "Toggle between flex and prefix matching. - -With pregix ARG use basic completion instead. These styles are -described in `completion-styles-alist'. - -Bind this function in `icomplete-minibuffer-map'." - (interactive "*P") - (when (and (minibufferp) - (bound-and-true-p icomplete-mode)) - (let* ((completion-styles-original completion-styles) - (basic '(emacs22 basic)) - (flex '(flex initials substring partial-completion)) - (prefix '(partial-completion substring initials flex))) - (if current-prefix-arg - (progn - (setq-local completion-styles basic) - (message "%s" (propertize "Prioritising BASIC matching" 'face 'highlight))) - (if (not (eq (car completion-styles) 'flex)) - (progn - (setq-local completion-styles flex) - (message "%s" (propertize "Prioritising FLEX matching" 'face 'highlight))) - (setq-local completion-styles prefix) - (message "%s" (propertize "Prioritising PREFIX matching" 'face 'highlight))))))) - - (defun vde/switch-buffer (arg) - "Custom switch to buffer. -With universal argument ARG or when not in project, rely on -`switch-to-buffer'. -Otherwise, use `projectile-switch-to-project'." - (interactive "P") - (if (or arg (not (projectile-project-p))) - (call-interactively 'switch-to-buffer) - (projectile-switch-to-buffer))) - - :bind (("C-x b" . vde/switch-buffer) - ("C-x B" . switch-to-buffer) - :map icomplete-minibuffer-map - ("C-j" . exit-minibuffer) ; force input unconditionally - ("C-m" . minibuffer-complete-and-exit) ; force current input - ("C-n" . icomplete-forward-completions) - ("<right>" . icomplete-forward-completions) - ("<down>" . icomplete-forward-completions) - ("C-p" . icomplete-backward-completions) - ("<left>" . icomplete-backward-completions) - ("<up>" . icomplete-backward-completions) - ("<return>" . vde/icomplete-force-complete-and-exit) - ("C-M-," . vde/icomplete-toggle-completion-styles) - ("C-M-." . (lambda () - (interactive) - (let ((current-prefix-arg t)) - (vde/icomplete-toggle-completion-styles)))))) - -(use-package icomplete-vertical - :unless noninteractive - :demand - :after (minibuffer icomplete) ; do not forget to check those as well - :config - (setq icomplete-vertical-prospects-height (/ (frame-height) 6)) - (icomplete-vertical-mode -1) - - (defun vde/icomplete-yank-kill-ring () - "Insert the selected `kill-ring' item directly at point. -When region is active, `delete-region'. - -Sorting of the `kill-ring' is disabled. Items appear as they -normally would when calling `yank' followed by `yank-pop'." - (interactive) - (let ((kills ; do not sort items - (lambda (string pred action) - (if (eq action 'metadata) - '(metadata (display-sort-function . identity) - (cycle-sort-function . identity)) - (complete-with-action - action kill-ring string pred))))) - (icomplete-vertical-do - (:separator 'dotted-line :height (/ (frame-height) 4)) - (when (use-region-p) - (delete-region (region-beginning) (region-end))) - (insert - (completing-read "Yank from kill ring: " kills nil t))))) - - :bind (("C-M-y" . vde/icomplete-yank-kill-ring) - :map icomplete-minibuffer-map - ("C-v" . icomplete-vertical-toggle))) + (vertico-mode)) (use-package company :unless noninteractive diff --git a/tools/emacs/foo.el b/tools/emacs/foo.el @@ -133,6 +133,10 @@ STYLES is a list of pattern matching methods that is passed to (use-package minibuffer :config + (setq completion-styles + '(substring initials flex partial-completion orderless)) + (setq completion-category-overrides + '((file (styles . (partial-completion orderless))))) (setq completion-styles '(orderless partial-completion)) (setq completion-category-defaults nil) (setq completion-cycle-threshold 3) @@ -147,7 +151,17 @@ STYLES is a list of pattern matching methods that is passed to ;; *Completions* buffer. (setq completions-format 'one-column) (setq completions-detailed t) - + + ;; Grouping of completions for Emacs 28 + (setq completions-group t) + (setq completions-group-sort nil) + (setq completions-group-format + (concat + (propertize " " 'face 'completions-group-separator) + (propertize " %s " 'face 'completions-group-title) + (propertize " " 'face 'completions-group-separator + 'display '(space :align-to right)))) + (setq read-buffer-completion-ignore-case t) (setq read-file-name-completion-ignore-case t) @@ -175,6 +189,7 @@ STYLES is a list of pattern matching methods that is passed to ("p" . previous-line) ("f" . next-completion) ("b" . previous-completion))) + (use-package consult :config (setq consult-line-numbers-widen t) diff --git a/users/vincent/dev/emacs.nix b/users/vincent/dev/emacs.nix @@ -76,9 +76,6 @@ let marginalia markdown-mode minions - # FIXME(vdemeester) once it is fixed, re-add - # modus-themes - # modus-operandi-theme moody multi-vterm mwim @@ -118,6 +115,7 @@ let try undo-tree use-package + vertico visual-fill-column visual-regexp vterm