dev: merging from main

This commit is contained in:
Matt Nish-Lapidus 2024-04-07 13:47:02 -04:00
commit e14e30df50
20 changed files with 255 additions and 130 deletions

View file

@ -250,8 +250,7 @@ tell you about it. Very annoying. This prevents that."
auto-mode-alist
'(("/LICENSE\\'" . text-mode)
("\\.log\\'" . text-mode)
("rc\\'" . conf-mode)
("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode)))
("rc\\'" . conf-mode)))
;;

View file

@ -143,14 +143,8 @@
(setq selection-coding-system 'utf-8))
;;; Support for more file extensions
;; Add support for additional file extensions.
(dolist (entry '(("/\\.doom\\(?:rc\\|project\\|module\\|profile\\)\\'" . emacs-lisp-mode)
("/LICENSE\\'" . text-mode)
("\\.log\\'" . text-mode)
("rc\\'" . conf-mode)
("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode)))
(push entry auto-mode-alist))
;;; Support for Doom-specific file extensions
(add-to-list 'auto-mode-alist '("/\\.doom\\(?:rc\\|project\\|module\\|profile\\)\\'" . emacs-lisp-mode))
;;

View file

@ -484,17 +484,50 @@ If FORCE-P, overwrite the destination file if it exists, without confirmation."
file))))
;;;###autoload
(defun doom/sudo-find-file (file)
"Open FILE as root."
(interactive "FOpen file as root: ")
;; HACK: Disable auto-save in temporary tramp buffers because it could trigger
;; processes that hang silently in the background, making those buffers
;; inoperable for the rest of that session (Tramp caches them).
(let ((auto-save-default nil)
;; REVIEW: use only these when we drop 28 support
(remote-file-name-inhibit-auto-save t)
(remote-file-name-inhibit-auto-save-visited t))
(find-file (doom--sudo-file-path (expand-file-name file)))))
(defun doom/sudo-find-file (file &optional arg)
"Open FILE as root.
This will prompt you to save the current buffer, unless prefix ARG is given, in
which case it will save it without prompting."
(interactive
(list (read-file-name "Open file as root: ")
current-prefix-arg))
;; HACK: Teach `save-place' to treat the new "remote" buffer as if it were
;; visiting the same local file (because it is), and preserve the cursor
;; position as usual.
(letf! ((defun remote-local-name (path)
(if path (or (file-remote-p path 'localname) path)))
(defmacro with-local-name (&rest body)
`(when save-place-mode
(let ((buffer-file-name (remote-local-name buffer-file-name))
(default-directory (remote-local-name default-directory)))
,@body))))
(let ((window-start (window-start))
(buffer (current-buffer)))
(when (and buffer-file-name (file-equal-p buffer-file-name file))
(when (buffer-modified-p)
(save-some-buffers arg (lambda () (eq (current-buffer) buffer))))
(with-local-name (save-place-to-alist)))
(prog1
;; HACK: Disable auto-save in temporary tramp buffers because it could
;; trigger processes that hang silently in the background, making
;; those buffers inoperable for the rest of that session (Tramp
;; caches them).
(let ((auto-save-default nil)
;; REVIEW: use only these when we drop 28 support
(remote-file-name-inhibit-auto-save t)
(remote-file-name-inhibit-auto-save-visited t)
;; Prevent redundant work
save-place-mode)
(find-file (doom--sudo-file-path (expand-file-name file))))
;; Record of the cursor's old position if it isn't at BOB (indicating
;; this buffer was already open), in case the user wishes to go to it.
(unless (bobp)
(doom-set-jump-h)
;; save-place-find-file-hook requires point be a BOB to do its thang.
(goto-char (point-min)))
(with-local-name (save-place-find-file-hook))
(set-window-start nil window-start)))))
;;;###autoload
(defun doom/sudo-this-file ()
@ -528,9 +561,17 @@ If FORCE-P, overwrite the destination file if it exists, without confirmation."
(defun doom/remove-recent-file (file)
"Remove FILE from your recently-opened-files list."
(interactive
(list (completing-read "Remove recent file: " recentf-list
(list (completing-read "Remove recent file: "
(lambda (string predicate action)
(if (eq action 'metadata)
'(metadata
(display-sort-function . identity)
(cycle-sort-function . identity)
(category . file))
(complete-with-action
action recentf-list string predicate)))
nil t)))
(setq recentf-list (delete file recentf-list))
(setq recentf-list (delete (recentf-expand-file-name file) recentf-list))
(recentf-save-list)
(message "Removed %S from `recentf-list'" (abbreviate-file-name file)))

View file

@ -220,6 +220,14 @@ To disable idle (as-you-type) completion, unset ~corfu-auto~:
(setq corfu-auto nil))
#+end_src
** Turning off auto-completion
To disable idle (as-you-type) completion, unset ~corfu-auto~:
#+begin_src emacs-lisp
;;; in $DOOMDIR/config.el
(after! corfu
(setq corfu-auto nil))
#+end_src
** Adding CAPFs to a mode
To add other CAPFs on a mode-per-mode basis, put either of the following in your
~config.el~:

View file

@ -40,7 +40,8 @@ TAB/S-TAB.")
('aggressive
(not (or (bound-and-true-p mct--active)
(bound-and-true-p vertico--input)
(eq (current-local-map) read-passwd-map)
(and (featurep 'auth-source)
(eq (current-local-map) read-passwd-map))
(and (featurep 'helm-core) (helm--alive-p))
(and (featurep 'ido) (ido-active))
(where-is-internal 'minibuffer-complete
@ -114,10 +115,10 @@ TAB/S-TAB.")
(use-package! cape
:defer t
:init
(add-hook! prog-mode
(add-hook! 'prog-mode-hook
(defun +corfu-add-cape-file-h ()
(add-hook 'completion-at-point-functions #'cape-file -10 t)))
(add-hook! (org-mode markdown-mode)
(add-hook! '(org-mode-hook markdown-mode-hook)
(defun +corfu-add-cape-elisp-block-h ()
(add-hook 'completion-at-point-functions #'cape-elisp-block 0 t)))
;; Enable Dabbrev completion basically everywhere as a fallback.
@ -126,8 +127,12 @@ TAB/S-TAB.")
;; Set up `cape-dabbrev' options.
(defun +dabbrev-friend-buffer-p (other-buffer)
(< (buffer-size other-buffer) +corfu-buffer-scanning-size-limit))
(add-hook! (prog-mode text-mode conf-mode comint-mode minibuffer-setup
eshell-mode)
(add-hook! '(prog-mode-hook
text-mode-hook
conf-mode-hook
comint-mode-hook
minibuffer-setup-hook
eshell-mode-hook)
(defun +corfu-add-cape-dabbrev-h ()
(add-hook 'completion-at-point-functions #'cape-dabbrev 20 t)))
(after! dabbrev

View file

@ -161,13 +161,16 @@ orderless."
(consult-customize
consult-ripgrep consult-git-grep consult-grep
consult-bookmark consult-recent-file
+default/search-project +default/search-other-project
+default/search-project-for-symbol-at-point
+default/search-cwd +default/search-other-cwd
+default/search-notes-for-symbol-at-point
+default/search-emacsd
consult--source-recent-file consult--source-project-recent-file consult--source-bookmark
:preview-key "C-SPC")
(when (modulep! :config default)
(consult-customize
+default/search-project +default/search-other-project
+default/search-project-for-symbol-at-point
+default/search-cwd +default/search-other-cwd
+default/search-notes-for-symbol-at-point
+default/search-emacsd
:preview-key "C-SPC"))
(consult-customize
consult-theme
:preview-key (list "C-SPC" :debounce 0.5 'any))

View file

@ -1,7 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; editor/evil/packages.el
(package! evil :pin "88d073c9d03ca223564e7e8589f44ecc87c98153")
(package! evil :pin "0251080640e0da6f0eec2b7d8dd70e9c9b9915d7")
(package! evil-args :pin "a8151556f63c9d45d0c44c8a7ef9e5a542f3cdc7")
(package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9")
(package! evil-embrace :pin "3081d37811b6a3dfaaf01d578c7ab7a746c6064d")
@ -35,4 +35,4 @@
(package! neotree)
(autoload 'neotree-make-executor "neotree" nil nil 'macro))
(package! evil-collection :pin "e0982fcbb6f1694b27074565553fac0e736a30b4"))
(package! evil-collection :pin "ca977acb83c0dd01fc57dbc6f3d3111e89f4ec9d"))

View file

@ -28,10 +28,13 @@
"k" #'log-view-msg-prev))
(after! vc-annotate
(after! vc
(set-popup-rules!
'(("^\\*vc-diff" :select nil) ; *vc-diff*
("^\\*vc-change" :select t))) ; *vc-change-log*
'(("^\\*vc-diff" :select nil :size '+popup-shrink-to-fit)
("^\\*vc-change-log" :select t))))
(after! vc-annotate
(set-evil-initial-state! 'vc-annotate-mode 'normal)
;; Clean up after itself

View file

@ -33,8 +33,11 @@ default/fallback account."
:enter-func
(lambda () (mu4e-message "Switched to %s" label))
:leave-func
(lambda () (progn (setq +mu4e-personal-addresses nil)
(mu4e-clear-caches)))
(lambda ()
(setq +mu4e-personal-addresses nil)
;; REVIEW: `mu4e-clear-caches' was removed in 1.12.2, but
;; may still be useful to users on older versions.
(if (fboundp 'mu4e-clear-caches) (mu4e-clear-caches)))
:match-func
(lambda (msg)
(when msg

View file

@ -0,0 +1,8 @@
;;; lang/factor/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(defun +factor/open-repl ()
"Open the Factor Listener."
(interactive)
(call-interactively #'run-factor)
(current-buffer))

View file

@ -5,73 +5,79 @@
:init
(after! factor-mode
(set-eval-handler! 'factor-mode #'fuel-eval-region)
(set-repl-handler! 'factor-mode #'run-factor))
(set-repl-handler! 'factor-mode #'+factor/open-repl
:persist t
:send-region #'fuel-eval-region
:send-buffer #'fuel-run-file)
(set-lookup-handlers! 'factor-mode
:definition #'fuel-edit-word-at-point
:references #'fuel-show-callers
:documentation #'fuel-help)
(map! :map factor-mode-map
:localleader
"t" #'fuel-test-vocab
"F" #'fuel-run-file
"f" #'run-factor
"a" #'fuel-refresh-all
"L" #'fuel-load-usings
"u" #'fuel-vocab-usage
"U" #'fuel-vocab-uses
(:prefix ("c" . "change")
"w" #'fuel-edit-word-at-point
"d" #'fuel-edit-word-doc-at-point
"v" #'fuel-edit-vocabulary)
(:prefix ("e" . "eval")
"d" #'fuel-eval-definition
"R" #'fuel-eval-extended-region
"r" #'fuel-eval-region)
(:prefix ("h" . "help")
"p" #'fuel-apropos
"h" #'fuel-help
"b" #'fuel-help-display-bookmarks
"v" #'fuel-help-vocab
"w" #'fuel-show-file-words
"c" #'fuel-show-callees
"e" #'fuel-stack-effect-region
"s" #'fuel-stack-effect-sexp)
(:prefix ("s" . "scaffold")
"v" #'fuel-scaffold-vocab
"h" #'fuel-scaffold-help
"t" #'fuel-scaffold-tests)
(:prefix ("r" . "refactor")
"s" #'fuel-refactor-extract-sexp
"w" #'fuel-refactor-extract-region
"v" #'fuel-refactor-extract-vocab
"i" #'fuel-refactor-inline-word
"g" #'fuel-refactor-make-generic
"u" #'fuel-update-usings
"r" #'fuel-refactor-rename-word)))
:config
(set-lookup-handlers! 'factor-mode
:definition #'fuel-edit-word-at-point
:references #'fuel-show-callers
:documentation #'fuel-help))
(set-popup-rules!
'(("^\\*fuel \\(debug\\|xref\\|messages\\)\\*$" :slot 1 :vslot -1)
("^\\*fuel help\\*$" :slot 2 :vslot 2 :select t :size 0.35)
("^\\*fuel listener\\*$" :size 0.3 :quit nil :ttl nil)))
(map! :after fuel-help
:map fuel-help-mode-map
:localleader
"e" #'fuel-help-edit
"d" #'fuel-help-delete-bookmark
"B" #'fuel-help-display-bookmarks
"n" #'fuel-help-next
"d" #'fuel-help-kill-page
"p" #'fuel-help-previous
"b" #'fuel-help-bookmark-page
"e" #'fuel-help-edit)
(map! :after fuel-help
:map fuel-help-mode-map
:localleader
"e" #'fuel-help-edit
"d" #'fuel-help-delete-bookmark
"B" #'fuel-help-display-bookmarks
"n" #'fuel-help-next
"d" #'fuel-help-kill-page
"p" #'fuel-help-previous
"b" #'fuel-help-bookmark-page
"e" #'fuel-help-edit)
(map! :after factor-mode
:map factor-mode-map
:localleader
"t" #'fuel-test-vocab
"F" #'fuel-run-file
"f" #'run-factor
"a" #'fuel-refresh-all
"L" #'fuel-load-usings
"u" #'fuel-vocab-usage
"U" #'fuel-vocab-uses
(:prefix ("c" . "change")
"w" #'fuel-edit-word-at-point
"d" #'fuel-edit-word-doc-at-point
"v" #'fuel-edit-vocabulary)
(:prefix ("e" . "eval")
"d" #'fuel-eval-definition
"R" #'fuel-eval-extended-region
"r" #'fuel-eval-region)
(:prefix ("h" . "help")
"p" #'fuel-apropos
"h" #'fuel-help
"b" #'fuel-help-display-bookmarks
"v" #'fuel-help-vocab
"w" #'fuel-show-file-words
"c" #'fuel-show-callees
"e" #'fuel-stack-effect-region
"s" #'fuel-stack-effect-sexp)
(:prefix ("s" . "scaffold")
"v" #'fuel-scaffold-vocab
"h" #'fuel-scaffold-help
"t" #'fuel-scaffold-tests)
(:prefix ("r" . "refactor")
"s" #'fuel-refactor-extract-sexp
"w" #'fuel-refactor-extract-region
"v" #'fuel-refactor-extract-vocab
"i" #'fuel-refactor-inline-word
"g" #'fuel-refactor-make-generic
"u" #'fuel-update-usings
"r" #'fuel-refactor-rename-word))
(map! :after fuel-listener
:map fuel-listener-mode-map
:localleader
"b" #'fuel-switch-to-buffer
"w" #'fuel-switch-to-buffer-other-window
"f" #'fuel-switch-to-buffer-other-frame
"e" #'fuel-edit-vocabulary
"r" #'fuel-refresh-all
"i" #'fuel-stack-mode
"h" #'fuel-help
"s" #'fuel-scaffold-vocab))
(map! :after fuel-listener
:map fuel-listener-mode-map
:localleader
"b" #'fuel-switch-to-buffer
"w" #'fuel-switch-to-buffer-other-window
"f" #'fuel-switch-to-buffer-other-frame
"e" #'fuel-edit-vocabulary
"r" #'fuel-refresh-all
"i" #'fuel-stack-mode
"h" #'fuel-help
"s" #'fuel-scaffold-vocab)

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/factor/packages.el
(package! fuel :pin "23fcfc70753abbbdc0e86af06330d63da6e4ea64")
(package! fuel :pin "12fc9d5071e46cac7b558204db5f4f09ea56e9c7")

View file

@ -20,22 +20,23 @@ This module adds support for [[https://julialang.org/][the Julia language]] to D
- +tree-sitter ::
Leverages tree-sitter for better syntax highlighting and structural text
editing. Requires [[doom-module::tools tree-sitter]].
- +snail :: Use Snail, a development environment and REPL interaction package
for Julia in the spirit of Common Lisps SLIME and Clojures CIDER. It enables
convenient and dynamic REPL-driven development.
- +snail ::
Use Snail, a development environment and REPL interaction package for Julia in
the spirit of Common Lisps SLIME and Clojures CIDER. It enables convenient
and dynamic REPL-driven development.
** Packages
- [[doom-package:julia-mode]]
- [[doom-package:julia-repl]]
- if [[doom-package:+lsp]]
- if [[doom-module:+lsp]]
- if [[doom-module::tools lsp]]
- [[doom-package:lsp-julia]]
- [[doom-package:lsp]]
- if [[doom-module::tools lsp +eglot]]
- [[doom-package:eglot-jl]]
- [[doom-package:eglot]]
- if [[doom-package:][+snail]]
- [[doom-package:][julia-snail]]
- if [[doom-module:+snail]]
- [[doom-package:julia-snail]]
** Hacks
/No hacks documented for this module./
@ -63,8 +64,8 @@ Pkg.add("LanguageServer")
Pkg.add("SymbolServer")
#+end_src
Then configure [[doom-package:lsp-julia]] or [[doom-package:eglot-jl]] depending on whether you have enabled
[[doom-module::tools lsp]] or [[doom-module::tools lsp +eglot]], respectively:
Then configure [[doom-package:lsp-julia]] or [[doom-package:eglot-jl]] depending on whether you have enabled [[doom-module::tools
lsp]] or [[doom-module::tools lsp +eglot]], respectively:
*** =lsp-julia=
To instruct [[doom-package:lsp-julia]] not to use the built-in package:

View file

@ -53,7 +53,8 @@
:hook (+julia-repl-start . +julia-override-repl-escape-char-h)
:hook (+julia-repl-start . julia-repl-use-emacsclient)
:config
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil)
(unless (modulep! +snail)
(set-popup-rule! "^\\*julia.*\\*$" :ttl nil))
(when (modulep! :ui workspaces)
(defadvice! +julia--namespace-repl-buffer-to-workspace-a (&optional executable-key suffix)

View file

@ -48,7 +48,36 @@
(if (modulep! :tools lsp +eglot)
'eglot
'lsp-mode))
(add-hook 'rustic-mode-local-vars-hook #'rustic-setup-lsp 'append))
(add-hook 'rustic-mode-local-vars-hook #'rustic-setup-lsp 'append)
;; HACK: Add @scturtle fix for signatures on hover on LSP mode. This code
;; has not been upstreamed because it depends on the exact format of the
;; response of Rust Analyzer, which is not stable enough for `lsp-mode'
;; maintainers (see emacs-lsp/lsp-mode#1740).
(unless (modulep! :tools lsp +eglot)
(defadvice! +rust--dont-cache-results-from-ra-a (fn &rest args)
:after #'lsp-eldoc-function
(when (derived-mode-p 'rust-mode 'rust-ts-mode)
(setq lsp--hover-saved-bounds nil)))
;; extract and show short signature for rust-analyzer
(cl-defmethod lsp-clients-extract-signature-on-hover (contents (_server-id (eql rust-analyzer)))
(let* ((value (if lsp-use-plists (plist-get contents :value) (gethash "value" contents)))
(groups (--partition-by (s-blank? it) (s-lines (s-trim value))))
(mod-group (cond ((s-equals? "```rust" (car (-fifth-item groups))) (-third-item groups))
((s-equals? "```rust" (car (-third-item groups))) (-first-item groups))
(t nil)))
(cmt (if (null mod-group) "" (concat " // " (cadr mod-group))))
(sig-group (cond ((s-equals? "```rust" (car (-fifth-item groups))) (-fifth-item groups))
((s-equals? "```rust" (car (-third-item groups))) (-third-item groups))
(t (-first-item groups))))
(sig (->> sig-group
(--drop-while (s-equals? "```rust" it))
(--take-while (not (s-equals? "```" it)))
(--map (s-replace-regexp "//.*" "" it))
(--map (s-trim it))
(s-join " "))))
(lsp--render-element (concat "```rust\n" sig cmt "\n```"))))))
(when (modulep! +tree-sitter)
(add-hook 'rustic-mode-local-vars-hook #'tree-sitter! 'append))

View file

@ -1,7 +1,7 @@
;; -*- no-byte-compile: t; -*-
;;; lang/scala/packages.el
(package! sbt-mode :pin "bcf8d6040021013430b39d6f6766ce1aab0b691a")
(package! sbt-mode :pin "cc68728a6ef0600aad369157b3a2d0ce56afba9b")
(package! scala-mode :pin "4c6d636b86e3bb1d95de819dc48dda92abdfbcf4")
(when (and (modulep! +lsp)

View file

@ -50,7 +50,9 @@
(defun +eval-repl-known-repls ()
"Yield the available repl functions as a list of symbols."
(seq-uniq (mapcar (pcase-lambda (`(,mode ,fn . _)) (list mode fn)) +eval-repls)))
(cl-delete-duplicates
(mapcar (lambda! ((mode fn &rest _)) (list mode fn))
+eval-repls)))
(defun +doom-pretty-mode-name (mode)
"Convert a mode name into a variant nicer for human eyes."
@ -82,15 +84,15 @@ human-readable variant of its associated major mode name."
(defun +eval-repl-prompt ()
"Prompt the user for the choice of a repl to open."
(let* ((knowns (mapcar (pcase-lambda (`(,mode ,fn)) (list (+doom-pretty-mode-name mode) fn))
(let* ((knowns (mapcar (lambda! ((mode fn)) (list (+doom-pretty-mode-name mode) fn))
(+eval-repl-known-repls)))
(founds (mapcar (lambda (fn) (list (+eval-pretty-mode-name-from-fn fn) fn))
(+eval-repl-found-repls)))
(repls (seq-uniq (append knowns founds)))
(names (mapcar #'cl-first repls))
(repls (cl-delete-duplicates (append knowns founds)))
(names (mapcar #'car repls))
(choice (or (completing-read "Open a REPL for: " names)
(user-error "Aborting"))))
(cl-second (assoc choice repls))))
(cadr (assoc choice repls))))
(defun +eval-repl-from-major-mode ()
"Fetch the repl associated with the current major mode, if there
@ -103,8 +105,7 @@ is one."
prompted for a repl choice, even if the major mode they're in
already has a known one."
(pcase-let* ((`(,fn ,plist) (+eval-repl-from-major-mode))
(fn (cond ((or prompt-p (not fn)) (+eval-repl-prompt))
(t fn)))
(fn (if (or prompt-p (not fn)) (+eval-repl-prompt) fn))
(region (when (use-region-p)
(buffer-substring-no-properties (region-beginning)
(region-end)))))

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; tools/pdf/packages.el
(package! pdf-tools :pin "93e74924517d39483b432d6c3c9b8f8b8f0eb50c")
(package! pdf-tools :pin "a1048bceb2bd3f635437b0f2bfac27cae8c2dabc")
(package! saveplace-pdf-view :pin "ee95460cd934080338f03a16f95b549577425216")

View file

@ -1,5 +1,14 @@
;;; ui/tabs/config.el -*- lexical-binding: t; -*-
(defcustom +tabs-buffer-update-groups-delay 0.1
"Minimum wait time (in seconds) before tab groups are recalculated."
:type 'float
:group 'doom)
;;
;;; Packages
(use-package! centaur-tabs
:hook (doom-first-file . centaur-tabs-mode)
:init
@ -20,7 +29,20 @@
(defun +tabs-disable-centaur-tabs-mode-maybe-h ()
"Disable `centaur-tabs-mode' in current buffer."
(when (centaur-tabs-mode-on-p)
(centaur-tabs-local-mode)))))
(centaur-tabs-local-mode))))
;; HACK: `centaur-tabs-buffer-update-groups' is both expensive and called too
;; frequently. There really is no reason to call it more than 10 times per
;; second, as buffers rarely change groups more frequently than that.
(let ((time (float-time)))
(defadvice! +tabs--rate-limit-buffer-update-groups-a (fn)
:around #'centaur-tabs-buffer-update-groups
(let ((now (float-time)))
(if-let ((buf (and (< now (+ time +tabs-buffer-update-groups-delay))
(assq (current-buffer) centaur-tabs--buffers))))
(car (nth 2 buf))
(setq time now)
(funcall fn))))))
;; TODO tab-bar-mode (emacs 27)

View file

@ -84,9 +84,10 @@ stored in `persp-save-dir'.")
;; HACK Fix #319: the warnings buffer gets swallowed when creating
;; `+workspaces-main', so display it ourselves, if it exists.
(when-let (warnings (get-buffer "*Warnings*"))
(save-excursion
(display-buffer-in-side-window
warnings '((window-height . shrink-window-if-larger-than-buffer))))))))
(unless (get-buffer-window warnings)
(save-excursion
(display-buffer-in-side-window
warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))
(defun +workspaces-init-persp-mode-h ()
(cond (persp-mode
;; `uniquify' breaks persp-mode. It renames old buffers, which causes