7

Projectile has a function to close all buffers related to a project (projectile-kill-buffers). Normally I also open non project related files during the day or emacs opens them when I'm stepping through compiler errors. Is there a way to close all buffers except project and special buffers?

kain88
  • 835
  • 7
  • 19

1 Answers1

6

Save the below function to your emacs init and call it via M-x.

By default this function will kill all buffers except the ones that belong to a projectile project or are special.

The same function will also kill special buffers (except *scratch* and *Messages*) if called with a prefix like C-u.

(defun modi/kill-non-project-buffers (&optional kill-special)
  "Kill buffers that do not belong to a `projectile' project.

With prefix argument (`C-u'), also kill the special buffers."
  (interactive "P")
  (let ((bufs (buffer-list (selected-frame))))
    (dolist (buf bufs)
      (with-current-buffer buf
        (let ((buf-name (buffer-name buf)))
          (when (or (null (projectile-project-p))
                    (and kill-special
                         (string-match "^\*" buf-name)))
            ;; Preserve buffers with names starting with *scratch or *Messages
            (unless (string-match "^\\*\\(\\scratch\\|Messages\\)" buf-name)
              (message "Killing buffer %s" buf-name)
              (kill-buffer buf))))))))
Kaushal Modi
  • 25,651
  • 4
  • 80
  • 183