dotfiles/emacs/.emacs.d/config/init-buffers.el
2021-05-12 11:02:13 -04:00

62 lines
2.0 KiB
EmacsLisp

;; -*- 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)