diff options
Diffstat (limited to '.config/emacs/modules/bd--minibuffer.el')
-rw-r--r-- | .config/emacs/modules/bd--minibuffer.el | 127 |
1 files changed, 105 insertions, 22 deletions
diff --git a/.config/emacs/modules/bd--minibuffer.el b/.config/emacs/modules/bd--minibuffer.el index 02451bb..1426528 100644 --- a/.config/emacs/modules/bd--minibuffer.el +++ b/.config/emacs/modules/bd--minibuffer.el @@ -3,11 +3,110 @@ ;;; Code: -(setopt use-short-answers t - vc-follow-symlinks t - completion-ignore-case t - read-buffer-completion-ignore-case t) -(minibuffer-depth-indicate-mode 1) +(defvar bd/navigate-recent-display-number 3 + "The number of recent buffers that show up in bd/navigate.") +(defvar bd/blacklisted-buffer-regexp-list + '( + "\\*Async Shell Command\\*" + "\\*http" + "\\magit-process" + "\\*Minibuf" + "\\*Echo Area" + "\\*newsticker" + "\\*Org Preview LaTeX Output\\*" + "\\*Shell Command Output\\*" + "\\*tramp" + ) + "Buffers that should not show up in buffer-related +selection commands.") + +(defun bd/buffer-exwm-p (buf) + "Return non-nil if BUF is an `exwm-mode' buffer." + (member + (buffer-local-value 'major-mode (get-buffer buf)) + '(exwm-mode))) + +(defun bd/buffer-text-p (buf) + "Return non-nil if BUF derives from `text-mode'." + (provided-mode-derived-p (buffer-local-value 'major-mode (get-buffer buf)) 'text-mode)) + +(defun bd/buffer-prog-p (buf) + "Return non-nil if BUF derives from `prog-mode'." + (provided-mode-derived-p (buffer-local-value 'major-mode (get-buffer buf)) 'prog-mode)) + +(defun bd/buffer-dired-p (buf) + "Return non-nil if BUF is a `dired-mode' buffer." + (member + (buffer-local-value 'major-mode (get-buffer buf)) + '(dired-mode))) + +(defun bd/buffer-erc-p (buf) + "Return non-nil if BUF is an `erc-mode' buffer." + (member + (buffer-local-value 'major-mode (get-buffer buf)) + '(erc-mode))) + +(defun bd/buffer-blacklisted-p (buf) + "Return non-nil if BUF is blacklisted." + (cl-reduce (lambda (x y) (or x y)) (mapcar (lambda (r) (string-match r buf)) + bd/blacklisted-buffer-regexp-list))) + +(defun bd/buffer-ordinary-p (buf) + "Return non-nil if BUF does not fit into known categories." + (not (or (bd/buffer-exwm-p buf) + (bd/buffer-text-p buf) + (bd/buffer-prog-p buf) + (bd/buffer-dired-p buf) + (bd/buffer-erc-p buf)))) + +(defun bd/buffer-list () + "Return a list of non-blacklisted buffers." + (cl-remove-if #'bd/buffer-blacklisted-p (mapcar 'buffer-name (buffer-list)))) + +(defun bd/selector-recent-buffers () + (selector-source-create + "Recent" + :candidates + (take bd/navigate-recent-display-number + (cl-remove-if (lambda (b) + (get-buffer-window b 'visible)) + (bd/buffer-list))) + :actions + selector-buffer-actions)) + +(defun bd/selector-project-files () + (selector-source-create + "Project Files" + :candidates + (let ((proj (project-current))) + (when proj + (project-files proj))) + :actions + selector-file-actions)) + +(defmacro bd/selector-buffer-type (name c) + `(selector-source-create + ,name + :candidates + (cl-remove-if-not ,c (bd/buffer-list)) + :actions + selector-buffer-actions)) + +(defun bd/navigate () + (interactive) + (selector + (list + (bd/selector-recent-buffers) + (bd/selector-buffer-type "EXWM" #'bd/buffer-exwm-p) + (bd/selector-buffer-type "Text" #'bd/buffer-text-p) + (bd/selector-buffer-type "Source" #'bd/buffer-prog-p) + (bd/selector-buffer-type "Directories" #'bd/buffer-dired-p) + (bd/selector-buffer-type "IRC" #'bd/buffer-erc-p) + (bd/selector-buffer-type "Ordinary" #'bd/buffer-ordinary-p) + (bd/selector-project-files) + (bd/selector-bookmarks) + (selector-recentf-source)))) +(keymap-global-set "C-x b" 'bd/navigate) (use-package vertico :init @@ -16,24 +115,8 @@ (vertico-reverse-mode) (vertico-cycle t)) -(use-package marginalia - :init - (marginalia-mode)) - -(use-package orderless - :custom - ;; order to try completions - (completion-styles '(basic - substring - initials - flex - orderless)) - (completion-category-defaults nil) - (completion-category-overrides '((file (styles partial-completion))))) - (use-package consult - :bind (("C-x b" . consult-buffer) - ("H-s d" . consult-find) + :bind (("H-s d" . consult-find) ("H-s c" . consult-locate) ("H-s g" . consult-grep) ("H-s G" . consult-git-grep) |