diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 1bbe3cff0..0d74fee1b 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -34,6 +34,13 @@ it if it doesn't exist).") ;; Functions ;; +;;;###autoload +(defun doom-buffer-frame-predicate (buf) + "To be used as the default frame buffer-predicate parameter. Returns nil if +BUF should be skipped over by functions like `next-buffer' and `other-buffer'." + (or (doom-real-buffer-p buf) + (eq buf (doom-fallback-buffer)))) + ;;;###autoload (defun doom-fallback-buffer () "Returns the fallback buffer, creating it if necessary. By default this is the @@ -279,17 +286,3 @@ processes killed." (delete-process p) (cl-incf n)))) n)) - -;;;###autoload -(defun doom/next-buffer () - "Switch to the next real buffer, skipping non-real buffers. See -`doom-real-buffer-p' for what 'real' means." - (interactive) - (doom--cycle-real-buffers +1)) - -;;;###autoload -(defun doom/previous-buffer () - "Switch to the previous real buffer, skipping non-real buffers. See -`doom-real-buffer-p' for what 'real' means." - (interactive) - (doom--cycle-real-buffers -1)) diff --git a/core/core-ui.el b/core/core-ui.el index 269765f83..3d08dcdea 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -481,6 +481,8 @@ character that looks like a space that `whitespace-mode' won't affect.") (global-eldoc-mode -1) ;; simple name in frame title (setq-default frame-title-format '("DOOM Emacs")) +;; make `next-buffer', `other-buffer', etc. ignore unreal buffers +(push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only (menu-bar-mode -1) @@ -538,9 +540,8 @@ instead)." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) - ((eq buf (doom-fallback-buffer)) - (doom--cycle-real-buffers -1)) ((doom-real-buffer-p buf) + (previous-buffer) (doom--cycle-real-buffers (if (delq buf (doom-real-buffer-list)) -1)) (kill-buffer buf)) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 241993512..8e463ef53 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -48,6 +48,12 @@ "Return non-nil if buffer is in workspace (defaults to current workspace)." (persp-contain-buffer-p buffer (or workspace (+workspace-current)) nil)) +;;;###autoload +(defun +workspace-alien-buffer-p (buffer) + "Return non-nil if BUFFER isn't a member of the current workspace." + (and (get-buffer-window buffer) + (not (+workspace-contains-buffer-p buffer)))) + ;; --- Getters ---------------------------- diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 02cb7d6ec..a1c3c9023 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -70,10 +70,9 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-set-last-persp-for-new-frames t persp-switch-to-added-buffer nil persp-remove-buffers-from-nil-persp-behaviour nil - ;; Don't auto-load on startup - persp-auto-resume-time -1 - ;; auto-save on kill - persp-auto-save-opt (if noninteractive 0 1)) + persp-set-frame-buffer-predicate #'doom-buffer-frame-predicate + persp-auto-resume-time -1 ; Don't auto-load on startup + persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) ;; Modify `delete-window' to close the workspace if used on the last window @@ -100,6 +99,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; (defun +workspaces|init-persp-mode () (cond (persp-mode + (add-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) ;; Ensure `persp-kill-buffer-query-function' is last in ;; kill-buffer-query-functions (remove-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function) @@ -111,6 +111,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t + (remove-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 4051e5049..b8a894889 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -94,7 +94,7 @@ (:desc "previous..." :prefix "[" :desc "Text size" :nv "[" #'text-scale-decrease - :desc "Buffer" :nv "b" #'doom/previous-buffer + :desc "Buffer" :nv "b" #'previous-buffer :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk :desc "Todo" :nv "t" #'hl-todo-previous :desc "Error" :nv "e" #'previous-error @@ -105,7 +105,7 @@ (:desc "next..." :prefix "]" :desc "Text size" :nv "]" #'text-scale-increase - :desc "Buffer" :nv "b" #'doom/next-buffer + :desc "Buffer" :nv "b" #'next-buffer :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk :desc "Todo" :nv "t" #'hl-todo-next :desc "Error" :nv "e" #'next-error @@ -154,8 +154,8 @@ :desc "Save buffer" :n "s" #'save-buffer :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer :desc "Bury buffer" :n "z" #'bury-buffer - :desc "Next buffer" :n "]" #'doom/next-buffer - :desc "Previous buffer" :n "[" #'doom/previous-buffer + :desc "Next buffer" :n "]" #'next-buffer + :desc "Previous buffer" :n "[" #'previous-buffer :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) (:desc "code" :prefix "c" @@ -298,8 +298,8 @@ ;; --- Personal vim-esque bindings ------------------ :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer - :n "]b" #'doom/next-buffer - :n "[b" #'doom/previous-buffer + :n "]b" #'next-buffer + :n "[b" #'previous-buffer :n "]w" #'+workspace/switch-right :n "[w" #'+workspace/switch-left :m "gt" #'+workspace/switch-right