Do a bunch of cursed ibuffer stuff (it works now)

This commit is contained in:
knit 2024-04-29 13:43:46 +02:00
parent d536800d43
commit 4cada38f4b
1 changed files with 58 additions and 31 deletions

View File

@ -14,6 +14,9 @@
;; - Prettify "~/.config/emacs" to a symbol.
;; - Hide filter groups except when in a certain set.
;; Groups to hide entirely.
(defvar hidden-groups '("Hidden"))
(defun ibuffer-toggle-all ()
"Collapse / expand ALL filters in ibuffer."
(interactive)
@ -27,15 +30,15 @@
"Collapse / expand the current filter group. If point is on a buffer name, expand the group it is in."
(interactive)
(unless (char-equal (char-after) ?\[)
(ibuffer-backward-filter-group))
(ibuffer-backward-filter-group))
(ibuffer-toggle-filter-group))
;; Main package declaration
(use-package ibuffer
:bind (("C-c i" . ibuffer)
:map ibuffer-mode-map
("M-<RET>" . ibuffer-toggle-all)
("h" . ibuffer-toggle-current))
("M-<RET>" . ibuffer-toggle-all)
("h" . ibuffer-toggle-current))
:config
(setq
ibuffer-expert t
@ -43,36 +46,60 @@
ibuffer-old-time 12)
(setq ibuffer-saved-filter-groups
'(("home"
("Mail" (or (derived-mode rmail-mode)
(mode . message-mode)))
("Gnus" (or (derived-mode . gnus-mode)
(saved . "gnus")))
("Net" (or (mode . eww-mode)
(mode . rcirc-mode)
(mode . elpher-mode)))
("Music" (name . "*MPC"))
("proc" (process . "*"))
("Dired" (mode . dired-mode))
("Org" (filename . ".org"))
("prog" (filename . "/lin/prog*"))
("Stars" (name . "[*]"))
("emacs" (filename . "config/emacs*")))))
'(("home"
("Emacs" (and (filename . "config/emacs*")
(visiting-file)))
("Prog" (and (filename . "/lin/prog*")
(visiting-file)))
("Org" (or (file-extension . "org")
(derived-mode . org-mode)
(derived-mode . org-agenda-mode)))
("Mail" (or (derived-mode . rmail-mode)
(derived-mode . message-mode)))
("Gnus" (or (derived-mode . gnus-mode)
(saved . "gnus")))
("Net" (or (mode . eww-mode)
(derived-mode . rcirc-mode)
(mode . elpher-mode)))
("Music" (name . "*MPC"))
("Dired" (or (derived-mode . dired-mode)
(derived-mode . image-mode)))
("Proc" (process))
("Stars" (name . "[*]")))))
;; starred-name does not catch all starred buffers, uh ok
:hook (ibuffer-mode . (lambda ()
(ibuffer-auto-mode 1)
(ibuffer-switch-to-saved-filter-groups "home")
(setq ibuffer-never-show-predicates '("*async-native\\|*Completion"))
(setq ibuffer-hidden-filter-groups '("Stars"))
(add-to-list 'ibuffer-saved-filters
'("modified" (and (modified)
(ibuffer-auto-mode 1)
(ibuffer-switch-to-saved-filter-groups "home")
(setq ibuffer-never-show-predicates '("*async-native" "*Completion"))
(setq ibuffer-hidden-filter-groups '("Stars"))
(add-to-list 'ibuffer-saved-filters
'("modified" (and (modified)
(not (starred-name))))))))
(defun hide-this-buffer ()
(interactive)
(add-to-list 'ibuffer-never-show-predicates
(buffer-name (ibuffer-current-buffer)))
(ibuffer-update nil))
;; Reverse order of groups, so that "Default" is the topmost.
(defadvice ibuffer-generate-filter-groups
(after reverse-ibuffer-groups ()
activate)
(setq ad-return-value (nreverse ad-return-value)))
(keymap-global-set "C-c h" 'hide-this-buffer)
;; Move the first element of a list to the last position.
(defun car-to-last (lst)
(append (cdr lst) (list (car lst))))
(defun omit-hidden-groups (lst)
"Remove all items in hidden-groups from LST"
(dolist (i hidden-groups)
(setq lst (assoc-delete-all i lst)))
lst)
;; Apply the function ibuffer's list generator
(advice-add 'ibuffer-generate-filter-groups
:filter-return #'omit-hidden-groups)
;; Make 'Default' the topmost.
(advice-add 'ibuffer-generate-filter-groups
:filter-return #'car-to-last)
(provide 'ibuffer-conf)