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

View File

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