summaryrefslogtreecommitdiff
path: root/.config/emacs/modules/bd--minibuffer.el
diff options
context:
space:
mode:
Diffstat (limited to '.config/emacs/modules/bd--minibuffer.el')
-rw-r--r--.config/emacs/modules/bd--minibuffer.el127
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)