From 95ba26ba6805c8a45e4306055f55556c5d210257 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2024 01:58:29 -0400 Subject: [PATCH 1/9] bump: :app everywhere tecosaur/emacs-everywhere@fbeff1982533 -> tecosaur/emacs-everywhere@bc91164151ab Ref: tecosaur/emacs-everywhere#75 Revert: b439300e6a0c --- modules/app/everywhere/config.el | 4 ---- modules/app/everywhere/packages.el | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) 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") From 968974663d236045aa3acc0a059847ded36cd979 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2024 16:08:40 -0400 Subject: [PATCH 2/9] bump: :editor snippets doomemacs/snippets@07b3bdaf60b7 -> doomemacs/snippets@c1384cc7975e joaotavora/yasnippet@33587a8551b8 -> joaotavora/yasnippet@eb5ba2664c3a - Recently, yasnippet start complaining about snippets with the same name (particularly y-or-n-p and x-file). I've removed/renamed the offending snippets in doomemacs/snippets. Ref: doomemacs/snippets@41417b4398d5 Ref: doomemacs/snippets@d0a96a37d49c --- modules/editor/snippets/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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") From f99863b9f5edaffb4f48135fb165fe6ec3ea8d06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2024 16:10:39 -0400 Subject: [PATCH 3/9] bump: :ui doom doomemacs/themes@37d2182f5078 -> doomemacs/themes@3b2422b208d2 hlissner/emacs-solaire-mode@8af65fbdc50b -> hlissner/emacs-solaire-mode@8ccdceeb9298 --- modules/ui/doom/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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") From 675691172119266e5a27c6d2f03f6ee26357b0b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2024 16:41:37 -0400 Subject: [PATCH 4/9] fix(syntax): flycheck popups clearing active region Moving the cursor over a flycheck-highlighted error will display the error message in a popup. Displaying that popup could clear the active selection (#7242), which is disruptive. This only affected non-Evil users and users not using the module's +childframe flag, but should no longer affect anyone after this commit. Fix: #7242 Ref: flycheck/flycheck-popup-tip#14 --- modules/checkers/syntax/config.el | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) 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 From a8d612385fcc001f711f21eda2e275a78cdf1efb Mon Sep 17 00:00:00 2001 From: StrawberryTea Date: Mon, 8 Apr 2024 17:59:49 -0500 Subject: [PATCH 5/9] tweak(corfu): update dabbrev-ignore-buffer-modes The Corfu documentation has been updated to suggest more modes to ignore with `dabbrev-ignore-buffer-modes`. This commit updates the list of modes to ignore in `cape-dabbrev` to match the documentation. --- modules/completion/corfu/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/completion/corfu/config.el b/modules/completion/corfu/config.el index ce954d400..a65194aba 100644 --- a/modules/completion/corfu/config.el +++ b/modules/completion/corfu/config.el @@ -126,10 +126,12 @@ use the minibuffer such as `query-replace'.") (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) From 21f6fb7576262cc366c7ee13aca094268728c563 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2024 19:05:19 -0400 Subject: [PATCH 6/9] fix(eval): warnings after eval error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This addresses the warning emitted when evaluating elisp in org-mode: Warning (org-element): ‘org-element-at-point’ cannot be used in non-Org buffer # (emacs-lisp-mode) Close: #7753 Fix: #7752 Co-authored-by: pysnow530 --- modules/lang/org/autoload/org-babel.el | 3 +- modules/tools/eval/autoload/eval.el | 58 +++++++++++++++----------- 2 files changed, 34 insertions(+), 27 deletions(-) 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 () From a4b7aa1c56f47bdf33796099e3006cbafe194b71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2024 19:12:08 -0400 Subject: [PATCH 7/9] fix(helm): helm-descbinds-disable-which-key = nil Otherwise, helm-descbind throws errors if which-key is enabled. Setting prefix-help-command seems to resolve the incompatibility (more testing is needed). Ref: emacs-helm/helm-descbinds@ca03f02da4e5 Ref: emacs-helm/helm-descbinds@14d1929d547f Amend: 52599ab53647 --- modules/completion/helm/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7f983f872..916a944fe 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -188,7 +188,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 From 42de6282f42f9dce3e1e69f4b4fb25b496d65867 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2024 21:20:08 -0400 Subject: [PATCH 8/9] tweak(helm): helm-always-two-windows = t Don't comandeer the entire frame for helm commands. --- modules/completion/helm/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 916a944fe..7dedabbf1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -43,7 +43,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 From da3d0687c5008edbbe5575ac1077798553549a6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2024 02:00:32 -0400 Subject: [PATCH 9/9] fix: doom-init-fonts-h: don't run more than needed The face and theme-face manipulation only needs to happen once per frame, and the `set-fontset-font` calls only need to happen once per session (or whenever the user calls `M-x doom/reload-fonts`). This change ensures this and saves Emacs some work when initializing new frames, as well as resolves `set-fontset-font` related segfaults in some edge cases (#7803). Fix: #7803 --- lisp/doom-ui.el | 120 +++++++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 58 deletions(-) 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."