Emacs: Next/Previous User Buffer ๐Ÿ’ 

By Xah Lee. Date: . Last updated: .

emacs has commands to switch to prev/next buffer.

next-buffer ใ€Ctrl+x Ctrl+โ†’ใ€‘
switch to next buffer.
previous-buffer ใ€Ctrl+x Ctrl+โ†ใ€‘
switch to previous buffer.

one problem is that they will go thru many buffers user are not interested in cycling thru.

Examples of emacs generated buffers:

Prev / Next User Buffers

here's commands that just cycle thru user buffers, or emacs buffers.

(defvar xah-fly-switch-buffer-map nil "repeat key map for `xah-next-user-buffer' etc.")
(setq xah-fly-switch-buffer-map
      (let ((xkmap (make-sparse-keymap)))
        (define-key xkmap (kbd "<up>") 'xah-previous-emacs-buffer)
        (define-key xkmap (kbd "<down>") 'xah-next-emacs-buffer)
        (define-key xkmap (kbd "<left>") 'xah-previous-user-buffer)
        (define-key xkmap (kbd "<right>") 'xah-next-user-buffer)
        xkmap))

(defun xah-user-buffer-p ()
  "Return t if current buffer is a user buffer, else nil.
A user buffer has buffer name NOT starts with * or space, and is not dired mode, help mode, etc.
This function is used by buffer switching command and close buffer command, so that next buffer shown is a user buffer.
You can override this function to get your idea of โ€œuser bufferโ€.
Created: 2016-06-18
Version: 2024-09-23"
  (interactive)
  (cond
   ((string-match "^\*" (buffer-name)) nil)
   ((eq major-mode 'dired-mode) nil)
   ((eq major-mode 'eww-mode) nil)
   ((eq major-mode 'help-mode) nil)
   (t t)))

(defun xah-next-user-buffer ()
  "Switch to the next user buffer.
User Buffer here is determined by `xah-user-buffer-p'.

Press left or right arrow key to switch to prev next user.
Press up or down arrow to switch to prev next emacs buffer.
Any other key to exit.

URL `http://xahlee.info/emacs/emacs/elisp_next_prev_user_buffer.html'
Created: 2016-06-19
Version: 2024-09-23"
  (interactive)
  (next-buffer)
  (let ((i 0))
    (while (< i 30)
      (if (not (xah-user-buffer-p))
          (progn (next-buffer)
                 (setq i (1+ i)))
        (progn (setq i 100)))))
  (set-transient-map xah-fly-switch-buffer-map))

(defun xah-previous-user-buffer ()
  "Switch to the previous user buffer.
User Buffer here is determined by `xah-user-buffer-p'.

Press left or right arrow key to switch to prev next user.
Press up or down arrow to switch to prev next emacs buffer.
Any other key to exit.

URL `http://xahlee.info/emacs/emacs/elisp_next_prev_user_buffer.html'
Created: 2016-06-19
Version: 2024-05-01"
  (interactive)
  (previous-buffer)
  (let ((i 0))
    (while (< i 29)
      (if (not (xah-user-buffer-p))
          (progn (previous-buffer)
                 (setq i (1+ i)))
        (progn (setq i 100)))))
  (set-transient-map xah-fly-switch-buffer-map))

(defun xah-next-emacs-buffer ()
  "Switch to the next emacs buffer.
Emacs buffer here means `xah-user-buffer-p' return nil.

Press left or right arrow key to switch to prev next user.
Press up or down arrow to switch to prev next emacs buffer.
Any other key to exit.

URL `http://xahlee.info/emacs/emacs/elisp_next_prev_user_buffer.html'
Created: 2013-05-22
Version: 2024-09-16"
  (interactive)
  (next-buffer)
  (let ((i 0))
    (while (and (xah-user-buffer-p) (< i 20))
      (setq i (1+ i)) (next-buffer)))
  (set-transient-map xah-fly-switch-buffer-map))

(defun xah-previous-emacs-buffer ()
  "Switch to the previous emacs buffer.
Emacs buffer here means `xah-user-buffer-p' return nil.

Press left or right arrow key to switch to prev next user.
Press up or down arrow to switch to prev next emacs buffer.
Any other key to exit.

URL `http://xahlee.info/emacs/emacs/elisp_next_prev_user_buffer.html'
Created: 2013-05-22
Version: 2024-09-16"
  (interactive)
  (previous-buffer)
  (let ((i 0))
    (while (and (xah-user-buffer-p) (< i 20))
      (setq i (1+ i)) (previous-buffer)))
  (set-transient-map xah-fly-switch-buffer-map))

Latest code in Emacs: Xah Fly Keys ๐Ÿ“ฆ

Be sure to set a easy key for them, such as F11 F12 ใ€”see Emacs Keys: Define Keyใ€•