diff --git a/lisp/doom-ui.el b/lisp/doom-ui.el index f449cde2a..0028f1636 100644 --- a/lisp/doom-ui.el +++ b/lisp/doom-ui.el @@ -497,65 +497,69 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (cons 'custom-theme-directory (delq 'custom-theme-directory custom-theme-load-path))) -(defun doom-init-fonts-h (&optional _reload) +(defun doom-init-fonts-h (&optional reload) "Loads `doom-font', `doom-serif-font', and `doom-variable-pitch-font'." - (let ((this-frame (selected-frame))) - (dolist (map `((default . ,doom-font) - (fixed-pitch . ,doom-font) - (fixed-pitch-serif . ,doom-serif-font) - (variable-pitch . ,doom-variable-pitch-font))) - (condition-case e - (when-let* ((face (car map)) - (font (cdr map))) - (dolist (frame (frame-list)) - (when (display-multi-font-p frame) - (set-face-attribute face frame - :width 'normal :weight 'normal - :slant 'normal :font font))) - (custom-push-theme - 'theme-face face 'user 'set - (let* ((base-specs (cadr (assq 'user (get face 'theme-face)))) - (base-specs (or base-specs '((t nil)))) - (attrs '(:family :foundry :slant :weight :height :width)) - (new-specs nil)) - (dolist (spec base-specs) - ;; Each SPEC has the form (DISPLAY ATTRIBUTE-PLIST) - (let ((display (car spec)) - (plist (copy-tree (nth 1 spec)))) - ;; Alter only DISPLAY conditions matching this frame. - (when (or (memq display '(t default)) - (face-spec-set-match-display display this-frame)) - (dolist (attr attrs) - (setq plist (plist-put plist attr (face-attribute face attr))))) - (push (list display plist) new-specs))) - (nreverse new-specs))) - (put face 'face-modified nil)) - ('error - (ignore-errors (doom--reset-inhibited-vars-h)) - (if (string-prefix-p "Font not available" (error-message-string e)) - (signal 'doom-font-error (list (font-get (cdr map) :family))) - (signal (car e) (cdr e))))))) - (when (fboundp 'set-fontset-font) - (let* ((fn (doom-rpartial #'member (font-family-list))) - (symbol-font (or doom-symbol-font - (cl-find-if fn doom-symbol-fallback-font-families))) - (emoji-font (or doom-emoji-font - (cl-find-if fn doom-emoji-fallback-font-families)))) - (when symbol-font - (dolist (script '(symbol mathematical)) - (set-fontset-font t script symbol-font))) - (when emoji-font - ;; DEPRECATED: make unconditional when we drop 27 support - (when (version<= "28.1" emacs-version) - (set-fontset-font t 'emoji emoji-font)) - ;; some characters in the Emacs symbol script are often covered by emoji - ;; fonts - (set-fontset-font t 'symbol emoji-font nil 'append))) - ;; Nerd Fonts use these Private Use Areas - (dolist (range '((#xe000 . #xf8ff) (#xf0000 . #xfffff))) - (set-fontset-font t range "Symbols Nerd Font Mono"))) - ;; Users should inject their own font logic in `after-setting-font-hook' - (run-hooks 'after-setting-font-hook)) + (let ((initialized-frames (unless reload (get 'doom-font 'initialized-frames)))) + (dolist (frame (if reload (frame-list) (list (selected-frame)))) + (unless (member frame initialized-frames) + (dolist (map `((default . ,doom-font) + (fixed-pitch . ,doom-font) + (fixed-pitch-serif . ,doom-serif-font) + (variable-pitch . ,doom-variable-pitch-font))) + (condition-case e + (when-let* ((face (car map)) + (font (cdr map))) + (when (display-multi-font-p frame) + (set-face-attribute face frame + :width 'normal :weight 'normal + :slant 'normal :font font)) + (custom-push-theme + 'theme-face face 'user 'set + (let* ((base-specs (cadr (assq 'user (get face 'theme-face)))) + (base-specs (or base-specs '((t nil)))) + (attrs '(:family :foundry :slant :weight :height :width)) + (new-specs nil)) + (dolist (spec base-specs) + (let ((display (car spec)) + (plist (copy-tree (nth 1 spec)))) + (when (or (memq display '(t default)) + (face-spec-set-match-display display frame)) + (dolist (attr attrs) + (setq plist (plist-put plist attr (face-attribute face attr))))) + (push (list display plist) new-specs))) + (nreverse new-specs))) + (put face 'face-modified nil)) + ('error + (ignore-errors (doom--reset-inhibited-vars-h)) + (if (string-prefix-p "Font not available" (error-message-string e)) + (signal 'doom-font-error (list (font-get (cdr map) :family))) + (signal (car e) (cdr e)))))) + (put 'doom-font 'initialized-frames + (cons frame (cl-delete-if-not #'frame-live-p initialized-frames)))))) + ;; Only do this once per session (or on `doom/reload-fonts'); superfluous + ;; `set-fontset-font' calls may segfault in some contexts. + (when (or reload (not (get 'doom-font 'initialized))) + (when (fboundp 'set-fontset-font) ; unavailable in emacs-nox + (let* ((fn (doom-rpartial #'member (font-family-list))) + (symbol-font (or doom-symbol-font + (cl-find-if fn doom-symbol-fallback-font-families))) + (emoji-font (or doom-emoji-font + (cl-find-if fn doom-emoji-fallback-font-families)))) + (when symbol-font + (dolist (script '(symbol mathematical)) + (set-fontset-font t script symbol-font))) + (when emoji-font + ;; DEPRECATED: make unconditional when we drop 27 support + (when (version<= "28.1" emacs-version) + (set-fontset-font t 'emoji emoji-font)) + ;; some characters in the Emacs symbol script are often covered by + ;; emoji fonts + (set-fontset-font t 'symbol emoji-font nil 'append))) + ;; Nerd Fonts use these Private Use Areas + (dolist (range '((#xe000 . #xf8ff) (#xf0000 . #xfffff))) + (set-fontset-font t range "Symbols Nerd Font Mono"))) + (run-hooks 'after-setting-font-hook)) + (put 'doom-font 'initialized t)) (defun doom-init-theme-h (&rest _) "Load the theme specified by `doom-theme' in FRAME." diff --git a/modules/app/everywhere/config.el b/modules/app/everywhere/config.el index 4e235b7af..32aaadc08 100644 --- a/modules/app/everywhere/config.el +++ b/modules/app/everywhere/config.el @@ -14,10 +14,6 @@ ;; buffers anyway. (setq-hook! 'emacs-everywhere-init-hooks doom-inhibit-local-var-hooks t) - ;; REVIEW: Fixes tecosaur/emacs-everywhere#75. Remove when dealt with - ;; upstream. - (define-key emacs-everywhere-mode-map "\C-c\C-c" #'emacs-everywhere-finish) - (after! doom-modeline (doom-modeline-def-segment emacs-everywhere (concat diff --git a/modules/app/everywhere/packages.el b/modules/app/everywhere/packages.el index 91e7e4040..7d9518f5f 100644 --- a/modules/app/everywhere/packages.el +++ b/modules/app/everywhere/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; app/everywhere/packages.el -(package! emacs-everywhere :pin "fbeff19825336777dccaefedf3f376dd622cd294") +(package! emacs-everywhere :pin "bc91164151ab012ff884af92321557f9b37eeed1") diff --git a/modules/checkers/syntax/config.el b/modules/checkers/syntax/config.el index 3845e5a68..faa1b730e 100644 --- a/modules/checkers/syntax/config.el +++ b/modules/checkers/syntax/config.el @@ -51,16 +51,19 @@ :hook (flycheck-mode . +syntax-init-popups-h) :config (setq flycheck-popup-tip-error-prefix "X ") - (after! evil - ;; Don't display popups while in insert or replace mode, as it can affect - ;; the cursor's position or cause disruptive input delays. - (add-hook! '(evil-insert-state-entry-hook evil-replace-state-entry-hook) - #'flycheck-popup-tip-delete-popup) - (defadvice! +syntax--disable-flycheck-popup-tip-maybe-a (&rest _) - :before-while #'flycheck-popup-tip-show-popup - (if evil-local-mode - (eq evil-state 'normal) - (not (bound-and-true-p company-backend)))))) + + ;; HACK: Only display the flycheck popup if we're in normal mode (for evil + ;; users) or if no selection or completion is active. This popup can + ;; interfere with the active evil mode, clear active regions, and other + ;; funny business (see #7242). + (defadvice! +syntax--disable-flycheck-popup-tip-maybe-a (&rest _) + :before-while #'flycheck-popup-tip-show-popup + (if (and (bound-and-true-p evil-local-mode) + (not (evil-emacs-state-p))) + (evil-normal-state-p) + (and (not (region-active-p)) + (not (bound-and-true-p company-backend)) + (not (ignore-errors (>= corfu--index 0))))))) (use-package! flycheck-posframe diff --git a/modules/completion/corfu/config.el b/modules/completion/corfu/config.el index 465f271e1..1f111cd7d 100644 --- a/modules/completion/corfu/config.el +++ b/modules/completion/corfu/config.el @@ -138,10 +138,12 @@ TAB/S-TAB.") (after! dabbrev (setq dabbrev-friend-buffer-function #'+dabbrev-friend-buffer-p dabbrev-ignored-buffer-regexps - '("^ " + '("\\` " "\\(TAGS\\|tags\\|ETAGS\\|etags\\|GTAGS\\|GRTAGS\\|GPATH\\)\\(<[0-9]+>\\)?") dabbrev-upcase-means-case-search t) - (add-to-list 'dabbrev-ignored-buffer-modes 'pdf-view-mode))) + (add-to-list 'dabbrev-ignored-buffer-modes 'pdf-view-mode) + (add-to-list 'dabbrev-ignored-buffer-modes 'doc-view-mode) + (add-to-list 'dabbrev-ignored-buffer-modes 'tags-table-mode))) ;; Make these capfs composable. (advice-add #'lsp-completion-at-point :around #'cape-wrap-noninterruptible) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 109c182fa..b990eeffa 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -44,7 +44,9 @@ Can be negative.") ;; symbol at point. helm-imenu-execute-action-at-once-if-one nil ;; Disable special behavior for left/right, M-left/right keys. - helm-ff-lynx-style-map nil) + helm-ff-lynx-style-map nil + ;; Don't commandeer the entire frame for helm commands. + helm-always-two-windows nil) (map! [remap apropos] #'helm-apropos [remap find-library] #'helm-locate-library @@ -189,7 +191,13 @@ Can be negative.") (use-package! helm-descbinds - :hook (helm-mode . helm-descbinds-mode)) + :hook (helm-mode . helm-descbinds-mode) + :config + ;; HACK: Upstream claims that the two packages are incompatible, but changing + ;; `prefix-help-command' seems to smooth the incompatibility over. More + ;; testing is needed... + (setq helm-descbinds-disable-which-key nil + prefix-help-command #'helm-descbinds)) (use-package! helm-icons diff --git a/modules/editor/snippets/packages.el b/modules/editor/snippets/packages.el index 6af0e2787..2c865ec1e 100644 --- a/modules/editor/snippets/packages.el +++ b/modules/editor/snippets/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/snippets/packages.el -(package! yasnippet :pin "33587a8551b8f6991b607d3532062a384c010ce1") +(package! yasnippet :pin "eb5ba2664c3a68ae4a53bb38b85418dd131b208f") (package! auto-yasnippet :pin "6a9e406d0d7f9dfd6dff7647f358cb05a0b1637e") (package! doom-snippets :recipe (:host github :repo "doomemacs/snippets" :files (:defaults "*")) - :pin "07b3bdaf60b74080f899b12c3d46594c7fa75e04") + :pin "c1384cc7975ee7ca7d551eb56c104d768440c3cb") diff --git a/modules/lang/org/autoload/org-babel.el b/modules/lang/org/autoload/org-babel.el index 544b0b0c1..de8ba79aa 100644 --- a/modules/lang/org/autoload/org-babel.el +++ b/modules/lang/org/autoload/org-babel.el @@ -23,8 +23,7 @@ (cond ((and (string-prefix-p "jupyter-" lang) (require 'jupyter nil t)) (jupyter-eval-region beg end)) - ((let ((major-mode (org-src-get-lang-mode lang))) - (+eval/region beg end)))))))) + ((+eval-region-as-major-mode beg end (org-src-get-lang-mode lang)))))))) ;;;###autoload diff --git a/modules/tools/eval/autoload/eval.el b/modules/tools/eval/autoload/eval.el index 78ded4c82..e4ad97864 100644 --- a/modules/tools/eval/autoload/eval.el +++ b/modules/tools/eval/autoload/eval.el @@ -72,6 +72,38 @@ output source-buffer) output) +;;;###autoload +(defun +eval-region-as-major-mode (beg end &optional runner-major-mode) + "Evaluate a region between BEG and END and display the output. + +Evaluate as in RUNNER-MAJOR-MODE. If RUNNER-MAJOR-MODE is nil, use major-mode +of the buffer instead." + (let ((load-file-name buffer-file-name) + (load-true-file-name + (or buffer-file-truename + (if buffer-file-name + (file-truename buffer-file-name)))) + (runner-major-mode (or runner-major-mode major-mode))) + (cond ((if (fboundp '+eval--ensure-in-repl-buffer) + (ignore-errors + (get-buffer-window (or (+eval--ensure-in-repl-buffer) + t)))) + (funcall (or (plist-get (cdr (alist-get runner-major-mode +eval-repls)) :send-region) + #'+eval/send-region-to-repl) + beg end)) + ((let (lang) + (if-let ((runner + (or (alist-get runner-major-mode +eval-runners) + (and (require 'quickrun nil t) + (equal (setq + lang (quickrun--command-key + (buffer-file-name (buffer-base-buffer)))) + "emacs") + (alist-get 'emacs-lisp-mode +eval-runners))))) + (funcall runner beg end) + (let ((quickrun-option-cmdkey lang)) + (quickrun-region beg end)))))))) + ;; ;;; Commands @@ -103,31 +135,7 @@ (defun +eval/region (beg end) "Evaluate a region between BEG and END and display the output." (interactive "r") - (let ((load-file-name buffer-file-name) - (load-true-file-name - (or buffer-file-truename - (if buffer-file-name - (file-truename buffer-file-name))))) - (cond ((and (fboundp '+eval--ensure-in-repl-buffer) - (ignore-errors - (get-buffer-window (or (+eval--ensure-in-repl-buffer) - t)))) - (funcall (or (plist-get (cdr (alist-get major-mode +eval-repls)) :send-region) - #'+eval/send-region-to-repl) - beg end)) - ((let ((runner - (or (alist-get major-mode +eval-runners) - (and (require 'quickrun nil t) - (equal (setq - lang (quickrun--command-key - (buffer-file-name (buffer-base-buffer)))) - "emacs") - (alist-get 'emacs-lisp-mode +eval-runners)))) - lang) - (if runner - (funcall runner beg end) - (let ((quickrun-option-cmdkey lang)) - (quickrun-region beg end)))))))) + (+eval-region-as-major-mode beg end)) ;;;###autoload (defun +eval/line-or-region () diff --git a/modules/ui/doom/packages.el b/modules/ui/doom/packages.el index 744147bf2..9e306c51e 100644 --- a/modules/ui/doom/packages.el +++ b/modules/ui/doom/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/doom/packages.el -(package! doom-themes :pin "37d2182f5078d29fb22bbace346e523bb84b2c4e") -(package! solaire-mode :pin "8af65fbdc50b25ed3214da949b8a484527c7cc14") +(package! doom-themes :pin "3b2422b208d28e8734b300cd3cc6a7f4af5eba55") +(package! solaire-mode :pin "8ccdceeb9298b3c4e35f630914f467bf164f39ad")