Set buffer-predicate to spacemacs/useful-buffer-p

Prevent next-buffer, other-buffer, etc. from choosing useless buffers.
No need for spacemacs/next-useful-buffer,
spacemacs/previous-useful-buffer anymore.

Also fix spacemacs/alternate-buffer to respect buffer-predicate.

When spacemacs-layouts is used, buffer-predicate filters useful buffer
that belong to the current layout.
This commit is contained in:
bmag 2016-07-14 11:13:55 +03:00 committed by Eivind Fonn
parent 141be7f8c2
commit fe60d0fc1e
6 changed files with 39 additions and 32 deletions

View File

@ -233,7 +233,7 @@ built-in =define-key= function is the best way to do that.
#+begin_src emacs-lisp
(define-key map new-keybinding function) ; Syntax
;; Map H to go to the previous buffer in normal mode
(define-key evil-normal-state-map (kbd "H") 'spacemacs/previous-useful-buffer)
(define-key evil-normal-state-map (kbd "H") 'previous-buffer)
;; Mapping keybinding to another keybinding
(define-key evil-normal-state-map (kbd "H") (kbd "^")) ; H goes to beginning of the line
#+end_src

View File

@ -140,6 +140,15 @@ It runs `tabulated-list-revert-hook', then calls `tabulated-list-print'."
(setq ns-use-native-fullscreen (not dotspacemacs-fullscreen-use-non-native))
;; make `next-buffer', `other-buffer', etc. ignore useless buffers (see
;; `spacemacs/useless-buffer-p')
(let ((buf-pred-entry (assq 'buffer-predicate default-frame-alist)))
(if buf-pred-entry
;; `buffer-predicate' entry exists, modify it
(setcdr buf-pred-entry #'spacemacs/useful-buffer-p)
;; `buffer-predicate' entry doesn't exist, create it
(push '(buffer-predicate . spacemacs/useful-buffer-p) default-frame-alist)))
;; ---------------------------------------------------------------------------
;; Session
;; ---------------------------------------------------------------------------

View File

@ -9,6 +9,8 @@
;;
;;; License: GPLv3
(require 'cl-lib)
;; add emacs binary helper functions
(defun spacemacs/emacsbin-path ()
(interactive)
@ -217,7 +219,7 @@ automatically applied to."
(defun spacemacs/useless-buffer-p (buffer)
"Determines if a buffer is useful."
"Determines if a buffer is useless."
(let ((buf-paren-major-mode (get (with-current-buffer buffer
major-mode)
'derived-mode-parent))
@ -232,6 +234,10 @@ automatically applied to."
(when (string-match regexp buf-name)
(return t))))))
(defun spacemacs/useful-buffer-p (buffer)
"Determines if a buffer is useful."
(not (spacemacs/useless-buffer-p buffer)))
;; from magnars modified by ffevotte for dedicated windows support
(defun spacemacs/rotate-windows (count)
"Rotate your windows.
@ -267,24 +273,6 @@ argument takes the kindows rotate backwards."
(interactive "p")
(spacemacs/rotate-windows (* -1 count)))
(defun spacemacs/next-useful-buffer ()
"Switch to the next buffer and avoid special buffers."
(interactive)
(let ((start-buffer (current-buffer)))
(next-buffer)
(while (and (spacemacs/useless-buffer-p (current-buffer))
(not (eq (current-buffer) start-buffer)))
(next-buffer))))
(defun spacemacs/previous-useful-buffer ()
"Switch to the previous buffer and avoid special buffers."
(interactive)
(let ((start-buffer (current-buffer)))
(previous-buffer)
(while (and (spacemacs/useless-buffer-p (current-buffer))
(not (eq (current-buffer) start-buffer)))
(previous-buffer))))
(defun spacemacs/rename-file (filename &optional new-filename)
"Rename FILENAME to NEW-FILENAME.
@ -706,13 +694,23 @@ The body of the advice is in BODY."
(load-file (buffer-file-name))
(ert t))
(defun spacemacs/alternate-buffer ()
(defun spacemacs/alternate-buffer (&optional window)
"Switch back and forth between current and last buffer in the
current window."
(interactive)
(if (evil-alternate-buffer)
(switch-to-buffer (car (evil-alternate-buffer)))
(switch-to-buffer (other-buffer (current-buffer) t))))
(let ((current-buffer (window-buffer window))
(buffer-predicate
(frame-parameter (window-frame window) 'buffer-predicate)))
;; switch to first buffer previously shown in this window that matches
;; frame-parameter `buffer-predicate'
(switch-to-buffer
(or (cl-find-if (lambda (buffer)
(and (not (eq buffer current-buffer))
(or (null buffer-predicate)
(funcall buffer-predicate buffer))))
(mapcar #'car (window-prev-buffers window)))
;; `other-buffer' honors `buffer-predicate' so no need to filter
(other-buffer current-buffer t)))))
(defun current-line ()
"Return the line at point as a string."

View File

@ -121,11 +121,11 @@
"be" 'spacemacs/safe-erase-buffer
"bh" 'spacemacs/home
"bk" 'spacemacs/kill-matching-buffers-rudely
"bn" 'spacemacs/next-useful-buffer
"bn" 'next-buffer
"bm" 'spacemacs/kill-other-buffers
"bN" 'spacemacs/new-empty-buffer
"bP" 'spacemacs/copy-clipboard-to-whole-buffer
"bp" 'spacemacs/previous-useful-buffer
"bp" 'previous-buffer
"bR" 'spacemacs/safe-revert-buffer
"bs" 'spacemacs/switch-to-scratch-buffer
"bY" 'spacemacs/copy-whole-buffer-to-clipboard
@ -450,9 +450,9 @@
(spacemacs|define-transient-state buffer
:title "Buffer Selection Transient State"
:bindings
("n" spacemacs/next-useful-buffer "next")
("N" spacemacs/previous-useful-buffer "previous")
("p" spacemacs/previous-useful-buffer "previous")
("n" next-buffer "next")
("N" previous-buffer "previous")
("p" previous-buffer "previous")
("K" spacemacs/kill-this-buffer "kill")
("q" nil "quit" :exit t))
(spacemacs/set-leader-keys "b." 'spacemacs/buffer-transient-state/body)

View File

@ -91,8 +91,8 @@
(define-key evil-visual-state-map (kbd "] e") ":move'>+1")
;; (define-key evil-visual-state-map (kbd "[ e") 'move-text-up)
;; (define-key evil-visual-state-map (kbd "] e") 'move-text-down)
(define-key evil-normal-state-map (kbd "[ b") 'spacemacs/previous-useful-buffer)
(define-key evil-normal-state-map (kbd "] b") 'spacemacs/next-useful-buffer)
(define-key evil-normal-state-map (kbd "[ b") 'previous-buffer)
(define-key evil-normal-state-map (kbd "] b") 'next-buffer)
(define-key evil-normal-state-map (kbd "[ f") 'evil-unimpaired/previous-file)
(define-key evil-normal-state-map (kbd "] f") 'evil-unimpaired/next-file)
(define-key evil-normal-state-map (kbd "] l") 'spacemacs/next-error)

View File

@ -77,7 +77,7 @@ This functions is aimed to be used with `spacemacs-space-doc-modificators'."
;;FIXME: Need to redesign this.. One day.
(if flag
(progn
;; HACK: Hide the original buffer from `spacemacs/previous-useful-buffer'.
;; HACK: Hide the original buffer from `spacemacs/useful-buffer-p'.
(unless (and (string-prefix-p "*" (buffer-name))
(string-suffix-p "*" (buffer-name)))
(rename-buffer (format "*%s*" (buffer-name))))