+(setq my-skippable-buffers '("*Messages*" "*scratch*" "*Help*" "*Completions*"))
+
+(defun my-change-buffer (change-buffer)
+ "Call CHANGE-BUFFER until current buffer is not in `my-skippable-buffers'."
+ (let ((initial (current-buffer)))
+ (funcall change-buffer)
+ (let ((first-change (current-buffer)))
+ (catch 'loop
+ (while (member (buffer-name) my-skippable-buffers)
+ (funcall change-buffer)
+ (when (eq (current-buffer) first-change)
+ (switch-to-buffer initial)
+ (throw 'loop t)))))))
+
+(defun my-next-buffer ()
+ "`next-buffer' that skips `my-skippable-buffers'."
+ (interactive)
+ (my-change-buffer 'next-buffer))
+
+(defun my-previous-buffer ()
+ "`previous-buffer' that skips `my-skippable-buffers'."
+ (interactive)
+ (my-change-buffer 'previous-buffer))
+