diff options
author | bd <bdunahu@operationnull.com> | 2024-11-16 20:30:01 -0500 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2024-11-16 20:30:01 -0500 |
commit | 2e5f4dcc65e14517e5a194cc94da3c2b493fae63 (patch) | |
tree | 412ea7266b133fb24125d73dfcf683e6b103dcc2 /.config/emacs | |
parent | e4237b8c41c43fa39b2d4cda68c6ae757047053d (diff) |
Selector provides completions
Diffstat (limited to '.config/emacs')
-rw-r--r-- | .config/emacs/modules/bd--minibuffer.el | 295 |
1 files changed, 151 insertions, 144 deletions
diff --git a/.config/emacs/modules/bd--minibuffer.el b/.config/emacs/modules/bd--minibuffer.el index 9ae4dbb..51e3637 100644 --- a/.config/emacs/modules/bd--minibuffer.el +++ b/.config/emacs/modules/bd--minibuffer.el @@ -6,152 +6,159 @@ (require 'f) -(defvar bd/navigate-recent-display-number 6 - "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" - "\\*eldoc" - "\\*server\\*" - ) - "Buffers that should not show up in buffer-related +(use-package selector + :demand t + :bind (("M-x" . 'selector-M-x)) + :custom + (completing-read-function #'selector-completing-read) + (read-file-name-function #'selector-read-file-name) + (defvar bd/navigate-recent-display-number 6 + "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" + "\\*eldoc" + "\\*server\\*" + ) + "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-scratch-p (buf) - "Return non-nil if BUF is a scratch buffer." - (buffer-local-value 'scratch-buffer (get-buffer buf))) - -(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-scratch-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 "Scratch" #'bd/buffer-scratch-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) - -(defun bd/get-directory-dwim () - "Returns the directory you always wanted." - (or (when (project-current) - (project-root (project-current))) ;; git - (locate-dominating-file "." "Makefile") ;; make - (locate-dominating-file "." "manifest.scm") ;; guix - default-directory)) - -(defun bd/selector-rg () - "Sources for lines found via grep (or a clone)." - (interactive) - (let ((query (read-string "rg: "))) - (defun conv (x) - (cons (car x) (cons (- (string-to-number (cadr x)) 1) (caddr x)))) - (defun all-in-file (key list) - (--map (to-candidate (cdr it)) (--filter (s-equals? key (car it)) list))) - (defun to-candidate (x) - (selector-candidate-create (cdr x) :value (car x))) - (let* ((dir (expand-file-name (bd/get-directory-dwim))) - (result (with-temp-buffer - (call-process "rg" nil t nil "-n" "-." query dir) - (buffer-string))) - (lines (--map (conv (s-split-up-to ":" it 2)) (--filter (not (s-blank? it)) (s-split "\n" result)))) - (files (-uniq (-map #'car lines))) - (sources (--map (selector-source-create - it - :candidates (all-in-file it lines) - :actions (selector-file-contents-actions it)) - files))) - (when (not (null sources)) - (selector sources))))) -(keymap-global-set "C-z s" 'bd/selector-rg) -(keymap-global-set "M-x" 'selector-M-x) + (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-scratch-p (buf) + "Return non-nil if BUF is a scratch buffer." + (buffer-local-value 'scratch-buffer (get-buffer buf))) + + (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-scratch-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 "Scratch" #'bd/buffer-scratch-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) + + (defun bd/get-directory-dwim () + "Returns the directory you always wanted." + (or (when (project-current) + (project-root (project-current))) ;; git + (locate-dominating-file "." "Makefile") ;; make + (locate-dominating-file "." "manifest.scm") ;; guix + default-directory)) + + (defun bd/selector-rg () + "Sources for lines found via grep (or a clone)." + (interactive) + (let ((query (read-string "rg: "))) + (defun conv (x) + (cons (car x) (cons (- (string-to-number (cadr x)) 1) (caddr x)))) + (defun all-in-file (key list) + (--map (to-candidate (cdr it)) (--filter (s-equals? key (car it)) list))) + (defun to-candidate (x) + (selector-candidate-create (cdr x) :value (car x))) + (let* ((dir (expand-file-name (bd/get-directory-dwim))) + (result (with-temp-buffer + (call-process "rg" nil t nil "-n" "-." query dir) + (buffer-string))) + (lines (--map (conv (s-split-up-to ":" it 2)) (--filter (not (s-blank? it)) (s-split "\n" result)))) + (files (-uniq (-map #'car lines))) + (sources (--map (selector-source-create + it + :candidates (all-in-file it lines) + :actions (selector-file-contents-actions it)) + files))) + (when (not (null sources)) + (selector sources))))) + (keymap-global-set "C-z s" 'bd/selector-rg)) + + (provide 'bd--minibuffer) |