diff --git a/.emacs.d/desktop.el b/.emacs.d/desktop.el index 743781c..e479519 100644 --- a/.emacs.d/desktop.el +++ b/.emacs.d/desktop.el @@ -321,34 +321,19 @@ DIR is either 'left or 'right." (advice-add #'posframe--create-posframe :after #'my/setup-posframe) (advice-add #'ivy-posframe-cleanup :after #'my/restore-posframe)) -(defun my/counsel-linux-app-format-function (name comment _exec) - (format "% -45s%s" - (propertize - (ivy--truncate-string name 45) - 'face 'counsel-application-name) - (if comment - (concat ": " (ivy--truncate-string comment 100)) - ""))) +(use-package app-launcher + :straight '(app-launcher :host github :repo "SebastienWae/app-launcher")) -(setq counsel-linux-app-format-function #'my/counsel-linux-app-format-function) - -(use-package password-store-ivy - :straight (:host github :repo "SqrtMinusOne/password-store-ivy") - :after (exwm)) +(use-package password-store-completion + :straight (:host github :repo "SqrtMinusOne/password-store-completion") + :after (exwm) + :config + (require 'password-store-embark) + (password-store-embark-mode)) (use-package emojify :straight t) -(defun my/emojify-type () - "Type an emoji." - (interactive) - (let ((emoji (emojify-completing-read "Type emoji: "))) - (kill-new emoji) - (password-store-ivy--async-commands - (list - (password-store-ivy--get-wait-command 10) - "xdotool key Shift+Insert")))) - (defun my/exwm-quit () (interactive) (when (or (not (eq (selected-window) (next-window))) @@ -629,7 +614,7 @@ _d_: Discord "" (my/app-command "flameshot gui") " s-" #'perspective-exwm-cycle-all-buffers-backward " s-" #'perspective-exwm-cycle-all-buffers-forward - "M-x" #'counsel-M-x + "M-x" #'execute-extended-command "M-SPC" (general-key "SPC")) (setq exwm-input-simulation-keys `((,(kbd "M-w") . ,(kbd "C-w")) (,(kbd "M-c") . ,(kbd "C-c")))) @@ -671,17 +656,17 @@ _d_: Discord (,(kbd "s-.") . persp-next) ;; Switch buffers - (,(kbd "s-e") . persp-ivy-switch-buffer) - (,(kbd "s-E") . my/persp-ivy-switch-buffer-other-window) + (,(kbd "s-e") . persp-switch-to-buffer*) + ;; (,(kbd "s-E") . my/persp-ivy-switch-buffer-other-window) ;; Resize windows (,(kbd "s-r") . my/exwm-resize-hydra/body) ;; Apps & stuff - (,(kbd "s-p") . counsel-linux-app) + (,(kbd "s-p") . app-launcher-run-app) (,(kbd "s-P") . async-shell-command) (,(kbd "s-;") . my/exwm-apps-hydra/body) - (,(kbd "s--") . password-store-ivy) + (,(kbd "s--") . password-store-completion) (,(kbd "s-=") . my/emojify-type) (,(kbd "s-i") . ,(my/app-command "copyq menu")) diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 8fdbedc..36f715e 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -230,7 +230,7 @@ :after evil :config (evil-collection-init - '(eww devdocs proced emms pass calendar dired ivy debug guix calc + '(eww devdocs proced emms pass calendar dired debug guix calc docker ibuffer geiser pdf info elfeed edebug bookmark company vterm flycheck profiler cider explain-pause-mode notmuch custom xref eshell helpful compile comint git-timemachine magit prodigy @@ -345,7 +345,8 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." "l" 'next-buffer "h" 'previous-buffer "k" 'kill-buffer - "b" 'persp-ivy-switch-buffer + ;; "b" 'persp-ivy-switch-buffer + "b" #'persp-switch-to-buffer* "r" 'revert-buffer "u" 'ibuffer) @@ -620,16 +621,15 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." :straight t :config (projectile-mode +1) - (setq projectile-project-search-path '("~/Code" "~/Documents"))) - -(use-package counsel-projectile - :after (counsel projectile) - :straight t) + (setq projectile-project-search-path '("~/Code" "~/Documents")) + (general-define-key + :keymaps 'projectile-command-map + "b" #'consult-project-buffer)) (my-leader-def "p" '(:keymap projectile-command-map :which-key "projectile")) -(general-nmap "C-p" 'counsel-projectile-find-file) +(general-nmap "C-p" #'projectile-find-file) (use-package magit :straight t @@ -788,7 +788,7 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." "o" #'point-to-register "c" #'my/register-clear "r" #'jump-to-register - "R" #'counsel-register + "R" #'consult-register "w" #'window-configuration-to-register) (defun my/push-mark-no-activate () @@ -802,22 +802,10 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer." (interactive) (setq mark-ring nil)) -(defun my/counsel-global-mark-ring () - "Browse `mark-ring' interactively. -Obeys `widen-automatically', which see." - (interactive) - (let* ((counsel--mark-ring-calling-point (point)) - (marks (copy-sequence global-mark-ring)) - (marks (delete-dups marks)) - (candidates (counsel-mark--get-candidates marks))) - (if candidates - (counsel-mark--ivy-read "Mark: " candidates 'my/counsel-global-mark-ring) - (message "Mark ring is empty")))) - (my-leader-def :infix "g" - "g" #'counsel-mark-ring - "G" #'my/counsel-global-mark-ring + "G" #'consult-global-mark + "g" #'consult-mark "C" #'my/mark-ring-clear "m" #'my/push-mark-no-activate) @@ -841,104 +829,163 @@ Obeys `widen-automatically', which see." :straight t :commands (ace-link-info ace-link-help ace-link-woman ace-link-eww)) -(use-package ivy +(use-package vertico :straight t :config - (setq ivy-use-virtual-buffers t) - (ivy-mode)) + (setq enable-recursive-minibuffers t) + (general-define-key + :keymaps '(vertico-map) + "M-j" #'vertico-next + "M-k" #'vertico-previous + "TAB" #'minibuffer-complete) + (vertico-mode)) -(use-package counsel - :straight t - :after ivy +(defun crm-indicator (args) + (cons (format "[CRM%s] %s" + (replace-regexp-in-string + "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" "" + crm-separator) + (car args)) + (cdr args))) +(with-eval-after-load 'crm + (advice-add #'completing-read-multiple :filter-args #'crm-indicator)) + +(use-package savehist + :init + (savehist-mode)) + +(use-package vertico-directory + :after (vertico) :config - (counsel-mode)) + (general-define-key + :keymaps '(vertico-map) + "RET" #'vertico-directory-enter + "DEL" #'vertico-directory-delete-char) + (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy)) -(use-package swiper - :defer t +(use-package vertico-grid + :after (vertico)) + +(defun my/sort-directories-first (files) + (setq files (vertico-sort-alpha files)) + (nconc (seq-filter (lambda (x) (string-suffix-p "/" x)) files) + (seq-remove (lambda (x) (string-suffix-p "/" x)) files))) + +(use-package vertico-multiform + :after vertico + :config + (vertico-multiform-mode) + (general-define-key + :keymap 'vertico-multiform-map + "M-b" #'vertico-multiform-buffer + "M-g" #'vertico-multiform-grid) + (setq vertico-multiform-categories + '((file (vertico-sort-function . my/sort-directories-first)) + (password-store-pass grid))) + (setq vertico-multiform-commands + '((eshell-atuin-history (vertico-sort-function . nil)) + (my/index-nav (vertico-sort-function . nil)) + (org-ql-view (vertico-sort-function . nil)) + (my/consult-line (vertico-sort-function . nil))))) + +(use-package orderless + :straight t + :config + (setq completion-styles '(orderless basic)) + (setq completion-category-defaults nil) + (setq completion-category-overrides + '((file (styles partial-completion)))) + (setq orderless-matching-styles + '(orderless-literal orderless-initialism orderless-regexp))) + +(defun company-completion-styles (capf-fn &rest args) + (let ((completion-styles '(basic partial-completion))) + (apply capf-fn args))) + +(with-eval-after-load 'company + (advice-add 'company-capf :around #'company-completion-styles)) + +(use-package consult :straight t) -(use-package ivy-rich +(use-package marginalia :straight t - :after ivy :config - (ivy-rich-mode 1) - (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line)) + (marginalia-mode) + (push '(projectile-find-file . file) + marginalia-command-categories)) -(use-package ivy-prescient +(use-package embark :straight t - :after counsel + :commands (embark-act embark-dwim embark-bindings) + :init + (general-define-key + "M-e" #'embark-act)) + +(use-package embark-consult + :straight t + :after (embark) :config - (ivy-prescient-mode +1) - (setq ivy-prescient-retain-classic-highlighting t) - (prescient-persist-mode 1) - (setq ivy-prescient-sort-commands - '(:not swiper - swiper-isearch - ivy-switch-buffer - ;; ivy-resume - ;; ivy--restore-session - lsp-ivy-workspace-symbol - dap-switch-stack-frame - my/dap-switch-stack-frame - dap-switch-session - dap-switch-thread - counsel-grep - ;; counsel-find-file - counsel-git-grep - counsel-rg - counsel-ag - counsel-ack - counsel-fzf - counsel-pt - counsel-imenu - counsel-yank-pop - counsel-recentf - counsel-buffer-or-recentf - proced-filter-interactive - proced-sort-interactive - perspective-exwm-switch-perspective - my/persp-ivy-switch-buffer-other-window - lsp-execute-code-action - dired-recent-open - org-ql-view - my/index-nav - org-set-effort - eshell-atuin-history)) - ;; Do not use prescient in find-file - (ivy--alist-set 'ivy-sort-functions-alist #'read-file-name-internal #'ivy-sort-file-function-default)) + (add-hook 'embark-collect-mode #'consult-preview-at-point-mode)) + +(defun embark-which-key-indicator () + "An embark indicator that displays keymaps using which-key. +The which-key help message will show the type and value of the +current target followed by an ellipsis if there are further +targets." + (lambda (&optional keymap targets prefix) + (if (null keymap) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap + (if (eq (plist-get (car targets) :type) 'embark-become) + "Become" + (format "Act on %s '%s'%s" + (plist-get (car targets) :type) + (embark--truncate-target (plist-get (car targets) :target)) + (if (cdr targets) "…" ""))) + (if prefix + (pcase (lookup-key keymap prefix 'accept-default) + ((and (pred keymapp) km) km) + (_ (key-binding prefix 'accept-default))) + keymap) + nil nil t (lambda (binding) + (not (string-suffix-p "-argument" (cdr binding)))))))) + +(defun embark-hide-which-key-indicator (fn &rest args) + "Hide the which-key indicator immediately when using the completing-read prompter." + (which-key--hide-popup-ignore-command) + (let ((embark-indicators + (remq #'embark-which-key-indicator embark-indicators))) + (apply fn args))) + +(with-eval-after-load 'embark + (advice-add #'embark-completing-read-prompter + :around #'embark-hide-which-key-indicator) + (setq embark-indicators (delq #'embark-mixed-indicator embark-indicators)) + (push #'embark-which-key-indicator embark-indicators)) (my-leader-def :infix "f" "" '(:which-key "various completions")' - ;; "b" 'counsel-switch-buffer - "b" 'persp-ivy-switch-buffer + "b" #'persp-switch-to-buffer* "e" 'micromamba-activate "f" 'project-find-file - "c" 'counsel-yank-pop - "a" 'counsel-rg - "d" 'deadgrep - "A" 'counsel-ag) + "c" 'consult-yank-pop + "a" 'consult-ripgrep + "d" 'deadgrep) (general-define-key :states '(insert normal) - "C-y" 'counsel-yank-pop) + "C-y" 'consult-yank-pop) -(defun my/swiper-isearch () +(defun my/consult-line () (interactive) (if current-prefix-arg - (swiper-all) - (swiper-isearch))) + (call-interactively #'consult-line-multi) + (consult-line nil t))) -(my-leader-def "SPC SPC" 'ivy-resume) -(my-leader-def "s" 'my/swiper-isearch) - -(general-define-key - :keymaps '(ivy-minibuffer-map swiper-map) - "M-j" 'ivy-next-line - "M-k" 'ivy-previous-line - "" 'ivy-call - "M-RET" 'ivy-immediate-done - [escape] 'minibuffer-keyboard-quit) +;; (my-leader-def "SPC SPC" 'ivy-resume) +(my-leader-def "s" 'my/consult-line) (use-package company :straight t @@ -1399,8 +1446,7 @@ Obeys `widen-automatically', which see." "//" "///" "/*" "*/" "/=" "//=" "/==" "@_" "__")) (global-ligature-mode t)) -(use-package all-the-icons - :if (display-graphic-p) +(use-package nerd-icons :straight t) (use-package highlight-indent-guides @@ -1521,8 +1567,8 @@ Obeys `widen-automatically', which see." "gN" 'persp-kill) (general-define-key :keymaps 'perspective-map - "b" 'persp-ivy-switch-buffer - "x" 'persp-ivy-switch-buffer + "b" 'persp-switch-to-buffer + "x" 'persp-switch-to-buffer* "u" 'persp-ibuffer)) (defun my/persp-move-window-and-switch () @@ -1539,19 +1585,6 @@ Obeys `widen-automatically', which see." (persp-add-buffer (buffer-name buffer)) (switch-to-buffer buffer))) -(defun my/persp-ivy-switch-buffer-other-window (arg) - (interactive "P") - (declare-function ivy-switch-buffer-other-window "ivy.el") - (persp--switch-buffer-ivy-counsel-helper - arg - (lambda () - (ivy-read "Switch to buffer in other window: " #'internal-complete-buffer - :keymap ivy-switch-buffer-map - :preselect (buffer-name (other-buffer (current-buffer))) - :action #'ivy--switch-buffer-other-window-action - :matcher #'ivy--switch-buffer-matcher - :caller 'ivy-switch-buffer)))) - (with-eval-after-load 'perspective (general-define-key :keymaps 'perspective-map @@ -4020,7 +4053,7 @@ TYPE may be `ts', `ts-active', `ts-inactive', `clocked', or (set-keymap-parent map crm-local-completion-map) (define-key map " " 'self-insert-command) map)) - (ivy-prescient-sort-commands nil) + (vertico-sort-function nil) (categories (completing-read-multiple "Categories: " '("TEACH" "EDU" "JOB" "LIFE" "COMP")))) @@ -4615,7 +4648,7 @@ KEYS is a list of cons cells like (