summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.config/emacs/modules/bd--minibuffer.el295
-rw-r--r--.config/guix/modules/emacs.scm1
2 files changed, 152 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)
diff --git a/.config/guix/modules/emacs.scm b/.config/guix/modules/emacs.scm
index 0bbade1..f49b182 100644
--- a/.config/guix/modules/emacs.scm
+++ b/.config/guix/modules/emacs.scm
@@ -35,6 +35,7 @@
emacs-exwm
emacs-f
emacs-guix
+ emacs-hydra
emacs-lua-mode
emacs-magit
emacs-paredit