From 309bc2a611b68aabc7bc4cb8a6145b370af8caca Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Tue, 18 Jan 2022 00:38:43 +0000 Subject: [PATCH] feat(editor/vertico): improve extension setup Override default straight recipe for vertico to expose extensions as packages. Also create hacky vertico-directory-mode to easily toggle vertico-directory features on and off. vertico-directory-mode is then used by a projectile advice to temporarily disable vertico-directory features while completing results from projectile. This is required to avoid breaking the projectile-switch-project and related commands, as the project list is not a set of files, but vertico-directory-enter thinks it is. --- core/siren-core-package-overrides.el | 16 +++++++- modules/editor/siren-vertico.el | 60 +++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/core/siren-core-package-overrides.el b/core/siren-core-package-overrides.el index e740f6b..16f0523 100644 --- a/core/siren-core-package-overrides.el +++ b/core/siren-core-package-overrides.el @@ -12,7 +12,21 @@ ;; package on elpa.gnu.org is quite old. (undo-tree :type git :host gitlab :repo "tsc25/undo-tree" - :branch "master"))))) + :branch "master") + ;; Override vertico recipe to fix issues with extensions. + (vertico :type git :host github :repo "minad/vertico" + :files (:defaults "extensions/*") + :includes (vertico-buffer + vertico-directory + vertico-flat + vertico-grid + vertico-indexed + vertico-mouse + vertico-multiform + vertico-quick + vertico-repeat + vertico-reverse + vertico-unobtrusive)))))) (provide 'siren-core-package-overrides) ;;; siren-core-packages.el ends here diff --git a/modules/editor/siren-vertico.el b/modules/editor/siren-vertico.el index 54dc794..290081a 100644 --- a/modules/editor/siren-vertico.el +++ b/modules/editor/siren-vertico.el @@ -23,18 +23,60 @@ (vertico-mode +1) (advice-add #'completing-read-multiple :filter-args #'siren-crm-indicator)) -(use-package vertico-extensions - :straight (:type git :host github :repo "emacs-straight/vertico" - :files ("extensions/*.el")) +(use-package vertico-mouse + :after vertico + :config + (vertico-mouse-mode +1)) + +(use-package vertico-repeat :after vertico - :hook (rfn-eshadow-update-overlay . vertico-directory-tidy) :bind - ("C-c C-v" . vertico-restore) + ("C-c C-v" . vertico-repeat)) + +(use-package vertico-directory + :after vertico + :demand t + :bind (:map vertico-map - ("RET" . vertico-directory-enter) - ("DEL" . vertico-directory-delete-char) - ("M-DEL" . vertico-directory-delete-word) - ("C-l" . vertico-directory-up))) + ("C-l" . vertico-directory-up)) + + :init + ;; Hacky minor-mode to toggle vertico-directory features on and off. + (define-minor-mode vertico-directory-mode + "Remap vertico keybindings to handle files/folders better." + :global t + (let ((map vertico-map)) + (if vertico-directory-mode + (progn + (add-hook 'rfn-eshadow-update-overlay-hook + 'vertico-directory-tidy) + (define-key map (kbd "RET") 'vertico-directory-enter) + (define-key map (kbd "DEL") 'vertico-directory-delete-char) + (define-key map (kbd "M-DEL") 'vertico-directory-delete-word)) + (progn + (remove-hook 'rfn-eshadow-update-overlay-hook + 'vertico-directory-tidy) + (define-key map (kbd "RET") 'vertico-exit) + (define-key map (kbd "DEL") 'backward-delete-char) + (define-key map (kbd "M-DEL") 'backward-kill-word))))) + + :config + (vertico-directory-mode +1) + + (with-eval-after-load 'projectile + ;; Hackily disable vertico-directory-mode when completing things for + ;; projectile. This avoids breaking projectile-switch-project command. + (defun siren-vertico-projectile-completing-read (orig-fun &rest args) + (if vertico-directory-mode + (progn + (vertico-directory-mode -1) + (let ((result (apply orig-fun args))) + (vertico-directory-mode +1) + result)) + (apply orig-fun args))) + + (advice-add 'projectile-completing-read :around + 'siren-vertico-projectile-completing-read))) (provide 'siren-vertico) ;;; siren-vertico.el ends here