diff --git a/lisp/doom-editor.el b/lisp/doom-editor.el index 2df2cbb66..80696ac35 100644 --- a/lisp/doom-editor.el +++ b/lisp/doom-editor.el @@ -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))) ;; diff --git a/lisp/doom-start.el b/lisp/doom-start.el index c5b1d46b2..ce022d7cd 100644 --- a/lisp/doom-start.el +++ b/lisp/doom-start.el @@ -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)) ;; diff --git a/lisp/lib/files.el b/lisp/lib/files.el index 8f03b4abe..6690820dc 100644 --- a/lisp/lib/files.el +++ b/lisp/lib/files.el @@ -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))) diff --git a/modules/completion/corfu/README.org b/modules/completion/corfu/README.org index 68539e0c3..23e039487 100644 --- a/modules/completion/corfu/README.org +++ b/modules/completion/corfu/README.org @@ -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~: diff --git a/modules/completion/corfu/config.el b/modules/completion/corfu/config.el index 0ac23185f..465f271e1 100644 --- a/modules/completion/corfu/config.el +++ b/modules/completion/corfu/config.el @@ -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 diff --git a/modules/completion/vertico/config.el b/modules/completion/vertico/config.el index a33944a38..a75d2c4eb 100644 --- a/modules/completion/vertico/config.el +++ b/modules/completion/vertico/config.el @@ -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)) diff --git a/modules/editor/evil/packages.el b/modules/editor/evil/packages.el index d4afb505e..bb6a67e7c 100644 --- a/modules/editor/evil/packages.el +++ b/modules/editor/evil/packages.el @@ -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")) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 3ea79365c..d0a4f2190 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -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 diff --git a/modules/email/mu4e/autoload/email.el b/modules/email/mu4e/autoload/email.el index 336ed40f1..f9efcbf74 100644 --- a/modules/email/mu4e/autoload/email.el +++ b/modules/email/mu4e/autoload/email.el @@ -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 diff --git a/modules/lang/factor/autoload.el b/modules/lang/factor/autoload.el new file mode 100644 index 000000000..c61098fe1 --- /dev/null +++ b/modules/lang/factor/autoload.el @@ -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)) diff --git a/modules/lang/factor/config.el b/modules/lang/factor/config.el index 4f89a79e4..f863f27a4 100644 --- a/modules/lang/factor/config.el +++ b/modules/lang/factor/config.el @@ -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) diff --git a/modules/lang/factor/packages.el b/modules/lang/factor/packages.el index f6b4aff31..55ec98480 100644 --- a/modules/lang/factor/packages.el +++ b/modules/lang/factor/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/factor/packages.el -(package! fuel :pin "23fcfc70753abbbdc0e86af06330d63da6e4ea64") +(package! fuel :pin "12fc9d5071e46cac7b558204db5f4f09ea56e9c7") diff --git a/modules/lang/julia/README.org b/modules/lang/julia/README.org index 38e019278..97f8094b6 100644 --- a/modules/lang/julia/README.org +++ b/modules/lang/julia/README.org @@ -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 Lisp’s SLIME and Clojure’s 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 Lisp’s SLIME and Clojure’s 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: diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 657574431..df34a47ae 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -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) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 9ed0483e3..1418ff530 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -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)) diff --git a/modules/lang/scala/packages.el b/modules/lang/scala/packages.el index 38429ea89..18dabf4e2 100644 --- a/modules/lang/scala/packages.el +++ b/modules/lang/scala/packages.el @@ -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) diff --git a/modules/tools/eval/autoload/repl.el b/modules/tools/eval/autoload/repl.el index c97ff82a2..4acafcb7f 100644 --- a/modules/tools/eval/autoload/repl.el +++ b/modules/tools/eval/autoload/repl.el @@ -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))))) diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el index 2b0f7d81e..b80c837a0 100644 --- a/modules/tools/pdf/packages.el +++ b/modules/tools/pdf/packages.el @@ -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") diff --git a/modules/ui/tabs/config.el b/modules/ui/tabs/config.el index 66504fdef..f9b8af52d 100644 --- a/modules/ui/tabs/config.el +++ b/modules/ui/tabs/config.el @@ -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) diff --git a/modules/ui/workspaces/config.el b/modules/ui/workspaces/config.el index 0fb223bf2..540c76977 100644 --- a/modules/ui/workspaces/config.el +++ b/modules/ui/workspaces/config.el @@ -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