;; -*- lexical-binding: t; -*- ;; Buffer-related configuration (defun kill-other-buffers () "Kill all other buffers." (interactive) (mapc 'kill-buffer (delq (current-buffer) (buffer-list)))) (defun switch-to-previous-buffer () "Switch to previously open buffer. Repeated invocations toggle between the two most recently open buffers." (interactive) (switch-to-buffer (other-buffer (current-buffer) 1))) (defun get-buffers-matching-mode (mode) "Returns a list of buffers where their major-mode is equal to MODE" (let ((buffer-mode-matches '())) (dolist (buf (buffer-list)) (with-current-buffer buf (if (eq mode major-mode) (add-to-list 'buffer-mode-matches buf)))) buffer-mode-matches)) (defun get-buffer-modes () "Returns a list of all major modes in currenctly open buffers." (delete-dups (cl-loop for buf in (buffer-list) collect (with-current-buffer buf major-mode)))) (defun multi-occur-in-mode (mode regexp) "Show all lines matching REGEXP in buffers with this major mode." (interactive (list (completing-read "List lines from buffers with mode: " (get-buffer-modes) nil 'confirm nil nil major-mode) (read-string "List lines matching regexp: "))) (multi-occur (get-buffers-matching-mode mode) regexp)) (defun occur-all (regexp) "Show all lines matching REGEXP in all open buffers." (interactive "MList lines matching regexp: ") (multi-occur-in-matching-buffers ".*" regexp t)) (leader-def-key "TAB" #'switch-to-previous-buffer "b" '(nil :which-key "buffer") "bb" #'switch-to-buffer "bd" #'kill-buffer "bm" #'kill-other-buffers "br" #'rename-buffer "bg" #'revert-buffer "bo" #'occur-all) ;; A library that provides a hook called on switching buffers (use-package switch-buffer-functions :demand t) (provide 'init-buffers)