dev: merge branch 'master' into emenel

This commit is contained in:
Matt Nish-Lapidus 2024-07-10 10:33:50 -04:00
commit e9b11dc6f4
22 changed files with 226 additions and 126 deletions

View file

@ -604,8 +604,6 @@ current buffer."
:hook (doom-first-buffer . smartparens-global-mode) :hook (doom-first-buffer . smartparens-global-mode)
:commands sp-pair sp-local-pair sp-with-modes sp-point-in-comment sp-point-in-string :commands sp-pair sp-local-pair sp-with-modes sp-point-in-comment sp-point-in-string
:config :config
(add-to-list 'doom-point-in-string-functions 'sp-point-in-string)
(add-to-list 'doom-point-in-comment-functions 'sp-point-in-comment)
;; smartparens recognizes `slime-mrepl-mode', but not `sly-mrepl-mode', so... ;; smartparens recognizes `slime-mrepl-mode', but not `sly-mrepl-mode', so...
(add-to-list 'sp-lisp-modes 'sly-mrepl-mode) (add-to-list 'sp-lisp-modes 'sly-mrepl-mode)
;; Load default smartparens rules for various languages ;; Load default smartparens rules for various languages

View file

@ -163,7 +163,12 @@
(defun doom-run-local-var-hooks-h () (defun doom-run-local-var-hooks-h ()
"Run MODE-local-vars-hook after local variables are initialized." "Run MODE-local-vars-hook after local variables are initialized."
(unless (or doom-inhibit-local-var-hooks delay-mode-hooks) (unless (or doom-inhibit-local-var-hooks
delay-mode-hooks
;; Don't trigger local-vars hooks in temporary (internal) buffers
(string-prefix-p
" " (buffer-name (or (buffer-base-buffer)
(current-buffer)))))
(setq-local doom-inhibit-local-var-hooks t) (setq-local doom-inhibit-local-var-hooks t)
(doom-run-hooks (intern-soft (format "%s-local-vars-hook" major-mode))))) (doom-run-hooks (intern-soft (format "%s-local-vars-hook" major-mode)))))

View file

@ -302,6 +302,10 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
(setq use-short-answers t) (setq use-short-answers t)
;; DEPRECATED: Remove when we drop 27.x support ;; DEPRECATED: Remove when we drop 27.x support
(advice-add #'yes-or-no-p :override #'y-or-n-p)) (advice-add #'yes-or-no-p :override #'y-or-n-p))
;; HACK: By default, SPC = yes when `y-or-n-p' prompts you (and
;; `y-or-n-p-use-read-key' is off). This seems too easy to hit by accident,
;; especially with SPC as our default leader key.
(define-key y-or-n-p-map " " nil)
;; Try to keep the cursor out of the read-only portions of the minibuffer. ;; Try to keep the cursor out of the read-only portions of the minibuffer.
(setq minibuffer-prompt-properties '(read-only t intangible t cursor-intangible t face minibuffer-prompt)) (setq minibuffer-prompt-properties '(read-only t intangible t cursor-intangible t face minibuffer-prompt))

View file

@ -355,9 +355,8 @@ without needing to check if they are available."
(defun doom--help-current-module-str () (defun doom--help-current-module-str ()
(cond ((save-excursion (cond ((save-excursion
(require 'smartparens)
(ignore-errors (ignore-errors
(sp-beginning-of-sexp) (thing-at-point--beginning-of-sexp)
(unless (eq (char-after) ?\() (unless (eq (char-after) ?\()
(backward-char)) (backward-char))
(let ((sexp (sexp-at-point))) (let ((sexp (sexp-at-point)))

View file

@ -29,9 +29,10 @@
;;;###autoload ;;;###autoload
(defun doom-plist-merge (from-plist to-plist) (defun doom-plist-merge (from-plist to-plist)
"Non-destructively merge FROM-PLIST onto TO-PLIST" "Non-destructively merge FROM-PLIST onto TO-PLIST"
(let ((plist (copy-sequence from-plist))) (let ((from-plist (copy-sequence from-plist))
(while plist (to-plist (copy-sequence to-plist)))
(cl-callf plist-put to-plist (pop plist) (pop plist))) (while from-plist
(cl-callf plist-put to-plist (pop from-plist) (pop from-plist)))
to-plist)) to-plist))
;;;###autoload ;;;###autoload

View file

@ -1,18 +1,32 @@
;;; lisp/lib/text.el -*- lexical-binding: t; -*- ;;; lisp/lib/text.el -*- lexical-binding: t; -*-
;;;###autoload (defvar-local doom--sppss-memo-last-point nil)
(defvar doom-point-in-comment-functions () (defvar-local doom--sppss-memo-last-result nil)
"List of functions to run to determine if point is in a comment.
Each function takes one argument: the position of the point. Stops on the first (defun doom--sppss-memo-reset-h (&rest _ignored)
function to return non-nil. Used by `doom-point-in-comment-p'.") "Reset memoization as a safety precaution.
IGNORED is a dummy argument used to eat up arguments passed from
the hook where this is executed."
(setq doom--sppss-memo-last-point nil
doom--sppss-memo-last-result nil))
;;;###autoload ;;;###autoload
(defvar doom-point-in-string-functions () (defun doom-syntax-ppss (&optional p)
"List of functions to run to determine if point is in a string. "Memoize the last result of `syntax-ppss'.
Each function takes one argument: the position of the point. Stops on the first P is the point at which we run `syntax-ppss'"
function to return non-nil. Used by `doom-point-in-string-p'.") (let ((p (or p (point)))
(mem-p doom--sppss-memo-last-point))
(if (and (eq p (nth 0 mem-p))
(eq (point-min) (nth 1 mem-p))
(eq (point-max) (nth 2 mem-p)))
doom--sppss-memo-last-result
;; Add hook to reset memoization if necessary
(unless doom--sppss-memo-last-point
(add-hook 'before-change-functions #'doom--sppss-memo-reset-h t t))
(setq doom--sppss-memo-last-point (list p (point-min) (point-max))
doom--sppss-memo-last-result (syntax-ppss p)))))
;;;###autoload ;;;###autoload
(defun doom-surrounded-p (pair &optional inline balanced) (defun doom-surrounded-p (pair &optional inline balanced)
@ -40,22 +54,49 @@ lines, above and below, with only whitespace in between."
(= (- pt nbeg) (- nend pt)))))))))))) (= (- pt nbeg) (- nend pt))))))))))))
;;;###autoload ;;;###autoload
(defun doom-point-in-comment-p (&optional pos) (defun doom-point-in-comment-p (&optional pt)
"Return non-nil if POS is in a comment. "Return non-nil if point is in a comment.
POS defaults to the current position." PT defaults to the current position."
(let ((pos (or pos (point)))) (let ((pt (or pt (point))))
(if doom-point-in-comment-functions (ignore-errors
(run-hook-with-args-until-success 'doom-point-in-comment-functions pos) (save-excursion
(nth 4 (syntax-ppss pos))))) ;; We cannot be in a comment if we are inside a string
(unless (nth 3 (doom-syntax-ppss pt))
(or (nth 4 (doom-syntax-ppss pt))
;; this also test opening and closing comment delimiters... we
;; need to chack that it is not newline, which is in "comment
;; ender" class in elisp-mode, but we just want it to be treated
;; as whitespace
(and (< pt (point-max))
(memq (char-syntax (char-after pt)) '(?< ?>))
(not (eq (char-after pt) ?\n)))
;; we also need to test the special syntax flag for comment
;; starters and enders, because `syntax-ppss' does not yet know if
;; we are inside a comment or not (e.g. / can be a division or
;; comment starter...).
(when-let ((s (car (syntax-after pt))))
(or (and (/= 0 (logand (ash 1 16) s))
(nth 4 (syntax-ppss (+ pt 2))))
(and (/= 0 (logand (ash 1 17) s))
(nth 4 (syntax-ppss (+ pt 1))))
(and (/= 0 (logand (ash 1 18) s))
(nth 4 (syntax-ppss (- pt 1))))
(and (/= 0 (logand (ash 1 19) s))
(nth 4 (syntax-ppss (- pt 2))))))))))))
;;;###autoload ;;;###autoload
(defun doom-point-in-string-p (&optional pos) (defun doom-point-in-string-p (&optional pt)
"Return non-nil if POS is in a string." "Return non-nil if point is inside string.
;; REVIEW Should we cache `syntax-ppss'?
(let ((pos (or pos (point)))) This function actually returns the 3rd element of `syntax-ppss'
(if doom-point-in-string-functions which can be a number if the string is delimited by that
(run-hook-with-args-until-success 'doom-point-in-string-functions pos) character or t if the string is delimited by general string
(nth 3 (syntax-ppss pos))))) fences.
If optional argument PT is present test this instead of point."
(ignore-errors
(save-excursion
(nth 3 (doom-syntax-ppss pt)))))
;;;###autoload ;;;###autoload
(defun doom-point-in-string-or-comment-p (&optional pos) (defun doom-point-in-string-or-comment-p (&optional pos)

View file

@ -6,13 +6,17 @@
(add-hook! 'doom-load-theme-hook (add-hook! 'doom-load-theme-hook
(defun doom-apply-customized-faces-h () (defun doom-apply-customized-faces-h ()
"Run `doom-customize-theme-hook'." "Run `doom-customize-theme-hook'."
(run-hooks 'doom-customize-theme-hook))) (letf! ((#'custom--should-apply-setting #'ignore)
(defun custom-push-theme (prop symbol theme mode &optional value)
(funcall custom-push-theme prop symbol theme mode value)
(if (facep symbol) (face-spec-set symbol value t))))
(run-hooks 'doom-customize-theme-hook))))
(defun doom--custom-theme-set-face (spec) (defun doom--normalize-face-spec (spec)
(cond ((listp (car spec)) (cond ((listp (car spec))
(cl-loop for face in (car spec) (cl-loop for face in (car spec)
collect collect
(car (doom--custom-theme-set-face (cons face (cdr spec)))))) (car (doom--normalize-face-spec (cons face (cdr spec))))))
((keywordp (cadr spec)) ((keywordp (cadr spec))
`((,(car spec) ((t ,(cdr spec)))))) `((,(car spec) ((t ,(cdr spec))))))
(`((,(car spec) ,(cdr spec)))))) (`((,(car spec) ,(cdr spec))))))
@ -27,13 +31,12 @@ all themes. It will apply to all themes once they are loaded."
(let ((fn (gensym "doom--customize-themes-h-"))) (let ((fn (gensym "doom--customize-themes-h-")))
`(progn `(progn
(defun ,fn () (defun ,fn ()
(let (custom--inhibit-theme-enable) (dolist (theme (ensure-list (or ,theme 'user)))
(dolist (theme (ensure-list (or ,theme 'user))) (if (or (eq theme 'user)
(when (or (eq theme 'user) (custom-theme-enabled-p theme))
(custom-theme-enabled-p theme))
(apply #'custom-theme-set-faces theme (apply #'custom-theme-set-faces theme
(mapcan #'doom--custom-theme-set-face (mapcan #'doom--normalize-face-spec
(list ,@specs))))))) (list ,@specs))))))
;; Apply the changes immediately if the user is using the default theme ;; Apply the changes immediately if the user is using the default theme
;; or the theme has already loaded. This allows you to evaluate these ;; or the theme has already loaded. This allows you to evaluate these
;; macros on the fly and customize your faces iteratively. ;; macros on the fly and customize your faces iteratively.

View file

@ -211,6 +211,21 @@ results buffer.")
(when (stringp counsel-rg-base-command) (when (stringp counsel-rg-base-command)
(setq counsel-rg-base-command (split-string counsel-rg-base-command))) (setq counsel-rg-base-command (split-string counsel-rg-base-command)))
;; REVIEW: See abo-abo/swiper#2339.
(defadvice! +counsel-rg-suppress-error-code-a (fn &rest args)
"Ripgrep returns a non-zero exit code if it encounters any trouble (e.g. you
don't have the needed permissions for a couple files/directories in a project).
Even if rg continues to produce workable results, that non-zero exit code causes
counsel-rg to discard the rest of the output to display an error.
This advice suppresses the error code, so you can still operate on whatever
workable results ripgrep produces, despite the error."
:around #'counsel-rg
(letf! (defun process-exit-status (proc)
(let ((code (funcall process-exit-status proc)))
(if (= code 2) 0 code)))
(apply fn args)))
;; Integrate with `helpful' ;; Integrate with `helpful'
(setq counsel-describe-function-function #'helpful-callable (setq counsel-describe-function-function #'helpful-callable
counsel-describe-variable-function #'helpful-variable counsel-describe-variable-function #'helpful-variable

View file

@ -78,10 +78,9 @@ more information on modifiers."
(defun +evil--insert-newline (&optional above _noextranewline) (defun +evil--insert-newline (&optional above _noextranewline)
(let ((pos (save-excursion (beginning-of-line-text) (point))) (let ((pos (save-excursion (beginning-of-line-text) (point)))
comment-auto-fill-only-comments) comment-auto-fill-only-comments)
(require 'smartparens)
(evil-narrow-to-field (evil-narrow-to-field
(if above (if above
(if (save-excursion (nth 4 (sp--syntax-ppss pos))) (if (save-excursion (nth 4 (doom-syntax-ppss pos)))
(evil-save-goal-column (evil-save-goal-column
(setq evil-auto-indent nil) (setq evil-auto-indent nil)
(goto-char pos) (goto-char pos)
@ -103,7 +102,7 @@ more information on modifiers."
(forward-line -1) (forward-line -1)
(back-to-indentation)) (back-to-indentation))
(evil-move-end-of-line) (evil-move-end-of-line)
(cond ((sp-point-in-comment pos) (cond ((doom-point-in-comment-p pos)
(setq evil-auto-indent nil) (setq evil-auto-indent nil)
(if comment-line-break-function (if comment-line-break-function
(funcall comment-line-break-function nil) (funcall comment-line-break-function nil)

View file

@ -18,7 +18,7 @@
(if (eq char 27) (if (eq char 27)
(cons "" "") (cons "" "")
(let* ((pair (+evil--embrace-get-pair (string char))) (let* ((pair (+evil--embrace-get-pair (string char)))
(escape (if (sp-point-in-string) "\\\\" "\\")) (escape (if (doom-point-in-string-p) "\\\\" "\\"))
(escape (format "\\1%s" (regexp-quote escape)))) (escape (format "\\1%s" (regexp-quote escape))))
(cons (replace-regexp-in-string "^\\( *\\)" escape (car pair)) (cons (replace-regexp-in-string "^\\( *\\)" escape (car pair))
(replace-regexp-in-string "^\\( *\\)" escape (cdr pair))))))) (replace-regexp-in-string "^\\( *\\)" escape (cdr pair)))))))

View file

@ -57,13 +57,13 @@ See `+evil/next-preproc-directive' for details."
(require 'newcomment) (require 'newcomment)
(dotimes (_ (abs count)) (dotimes (_ (abs count))
(cond ((> count 0) (cond ((> count 0)
(while (and (not (eobp)) (sp-point-in-comment)) (while (and (not (eobp)) (doom-point-in-comment-p))
(forward-line 1)) (forward-line 1))
(unless (comment-search-forward (point-max) 'noerror) (unless (comment-search-forward (point-max) 'noerror)
(goto-char orig-pt) (goto-char orig-pt)
(user-error "No comment after point"))) (user-error "No comment after point")))
(t (t
(while (and (not (bobp)) (sp-point-in-comment)) (while (and (not (bobp)) (doom-point-in-comment-p))
(forward-line -1)) (forward-line -1))
(unless (comment-search-backward nil 'noerror) (unless (comment-search-backward nil 'noerror)
(goto-char orig-pt) (goto-char orig-pt)

View file

@ -359,4 +359,13 @@ and complains if a module is loaded too early (during startup)."
(dolist (mode evil-collection-mode-list) (dolist (mode evil-collection-mode-list)
(dolist (req (or (cdr-safe mode) (list mode))) (dolist (req (or (cdr-safe mode) (list mode)))
(with-eval-after-load req (with-eval-after-load req
(+evil-collection-init mode +evil-collection-disabled-list)))))) (+evil-collection-init mode +evil-collection-disabled-list)))))
;; HACK: The Diff options in `save-some-buffers's prompt should persist after
;; you quit view-mode, but evil-collection-view's bindings on q/Q break
;; this, so these are here to restore them.
;; REVIEW: PR this upstream!
(map! :after (view evil-collection-view)
:map view-mode-map
:n "q" #'View-quit
:n "Q" #'View-quit-all))

View file

@ -42,6 +42,8 @@ be formatted and returned to the buffer using
works in many cases, but makes no guarantees that it will work with all works in many cases, but makes no guarantees that it will work with all
formatters. Lisp, Scheme, Python, or similarly indentation-based languages are formatters. Lisp, Scheme, Python, or similarly indentation-based languages are
most likely to see strange results. most likely to see strange results.
- [[fn:save-buffer]] is advised to suppress format-on-save behavior if passed the
universal argument (e.g. [[kbd:SPC u SPC b s]] or [[kbd:C-u C-x C-s]]).
** TODO Changelog ** TODO Changelog
# This section will be machine generated. Don't edit it by hand. # This section will be machine generated. Don't edit it by hand.
@ -176,7 +178,7 @@ enabled, and the running server supports =textDocument/formatting= or
=textDocument/rangeFormatting=, it can be used instead of =textDocument/rangeFormatting=, it can be used instead of
[[doom-package:apheleia]]'s (or Doom's) default formatters by enabling this module [[doom-package:apheleia]]'s (or Doom's) default formatters by enabling this module
with its =+lsp= flag or manually activating the [[fn:+format-with-lsp-mode]] minor with its =+lsp= flag or manually activating the [[fn:+format-with-lsp-mode]] minor
mode (though it's a better idea to use [[fn:+format-with-lsp-maybe-h]] if you're mode (though it's a better idea to use [[fn:+format-with-lsp-toggle-h]] if you're
looking for a function to use with mode hooks; this function will respect looking for a function to use with mode hooks; this function will respect
pre-existing modifications to [[var:+format-with]]). pre-existing modifications to [[var:+format-with]]).

View file

@ -44,9 +44,9 @@ mode unconditionally, call `+format-with-lsp-mode' instead."
;;; Apheleia formatters ;;; Apheleia formatters
;;;###autoload ;;;###autoload
(cl-defun +format-lsp-buffer (&rest plist &key callback &allow-other-keys) (cl-defun +format-lsp-buffer (&rest plist &key buffer callback &allow-other-keys)
"Format the current buffer with any available lsp-mode or eglot formatter." "Format the current buffer with any available lsp-mode or eglot formatter."
(if-let* ((fn (+format--lsp-fn)) (if-let* ((fn (with-current-buffer buffer (+format--lsp-fn)))
((apply fn plist))) ((apply fn plist)))
(funcall callback) (funcall callback)
(funcall callback "LSP server doesn't support formatting"))) (funcall callback "LSP server doesn't support formatting")))

View file

@ -37,8 +37,8 @@ This is controlled by `+format-on-save-disabled-modes'."
;; Use the formatter provided by lsp-mode and eglot, if available. ;; Use the formatter provided by lsp-mode and eglot, if available.
(when (modulep! +lsp) (when (modulep! +lsp)
(add-hook 'eglot-managed-mode-hook #'+format-with-lsp-maybe-h) (add-hook 'eglot-managed-mode-hook #'+format-with-lsp-toggle-h)
(add-hook 'lsp-managed-mode-hook #'+format-with-lsp-maybe-h)) (add-hook 'lsp-managed-mode-hook #'+format-with-lsp-toggle-h))
:config :config
(add-to-list 'doom-debug-variables '(apheleia-log-only-errors . nil)) (add-to-list 'doom-debug-variables '(apheleia-log-only-errors . nil))

View file

@ -27,8 +27,6 @@ Provide a helping hand when working with LaTeX documents.
- +fold :: - +fold ::
Use TeX-fold (from [[doom-package:auctex]]) to fold LaTeX macros to unicode, and make folding Use TeX-fold (from [[doom-package:auctex]]) to fold LaTeX macros to unicode, and make folding
hook-based and less manual. hook-based and less manual.
- +latexmk ::
Use LatexMk instead of LaTeX to compile documents.
- +lsp :: - +lsp ::
Enable LSP support in latex buffers. Requires [[doom-module::tools lsp]] and a langserver Enable LSP support in latex buffers. Requires [[doom-module::tools lsp]] and a langserver
(supports digestif and TexLab). (supports digestif and TexLab).
@ -36,7 +34,6 @@ Provide a helping hand when working with LaTeX documents.
** Packages ** Packages
- [[doom-package:adaptive-wrap]] - [[doom-package:adaptive-wrap]]
- [[doom-package:auctex]] - [[doom-package:auctex]]
- [[doom-package:auctex-latexmk]] if [[doom-module:+latexmk]]
- [[doom-package:cdlatex]] if [[doom-module:+cdlatex]] - [[doom-package:cdlatex]] if [[doom-module:+cdlatex]]
- [[doom-package:evil-tex]] if [[doom-module::editor evil +everywhere]] - [[doom-package:evil-tex]] if [[doom-module::editor evil +everywhere]]
- [[doom-package:latex-preview-pane]] - [[doom-package:latex-preview-pane]]

View file

@ -250,19 +250,6 @@ Math faces should stay fixed by the mixed-pitch blacklist, this is mostly for
:init (setq-default adaptive-wrap-extra-indent 0)) :init (setq-default adaptive-wrap-extra-indent 0))
(use-package! auctex-latexmk
:when (modulep! +latexmk)
:after latex
:init
;; Pass the -pdf flag when TeX-PDF-mode is active.
(setq auctex-latexmk-inherit-TeX-PDF-mode t)
;; Set LatexMk as the default.
(setq-hook! LaTeX-mode TeX-command-default "LatexMk")
:config
;; Add LatexMk as a TeX target.
(auctex-latexmk-setup))
(use-package! evil-tex (use-package! evil-tex
:when (modulep! :editor evil +everywhere) :when (modulep! :editor evil +everywhere)
:hook (LaTeX-mode . evil-tex-mode)) :hook (LaTeX-mode . evil-tex-mode))

View file

@ -3,18 +3,47 @@
(package! auctex (package! auctex
:recipe (:files ("*.el" "*.info" "dir" :recipe (:files ("*.el" "*.info" "dir"
"doc" "etc" "images" "latex" "style")) "doc" "etc" "images" "latex" "style")
:pin "280cd4a0ca5a9c80e67efc2bec354b3052258e8d") ;; HACK: Auctex has a post-install step that generates tex-site.el
(package! adaptive-wrap :pin "a3b179ea21aeb4e8cfaf5646bb66d9d045263780") ;; and *.texi documentation files, which largely assumes the user
;; is on a Linux system with various shell tools like sed, gnu
;; make, tex, etc. -- an assumption I can't safely make about
;; Doom's users, so reinvent its 'make tex-site.el' task in elisp:
:pre-build
(with-temp-file "tex-site.el"
(insert-file-contents "tex-site.el.in")
(while (re-search-forward "@\\(\\(?:AUCTEX\\|lisp\\)[^@]+\\)@" nil t)
(pcase (match-string 1)
("AUCTEXVERSION"
(replace-match (with-temp-buffer
(insert-file-contents "auctex.el" nil 0 1024)
(save-match-data
(if (re-search-forward "^;; Version: \\([^\n-]+\\)" nil t)
(match-string-no-properties 1)
"Unknown")))
t t))
("AUCTEXDATE"
(when-let* ((time (cdr (doom-call-process "git" "log" "-n1" "--pretty=tformat:%ct")))
(time (string-to-number time)))
(replace-match (format-time-string "%Y-%m-%d %T" time) t t)))
("lispautodir"
(replace-match
(prin1-to-string
`(if (file-writable-p "/usr/local/var/auctex")
"/usr/local/var/auctex"
,(file-name-concat doom-data-dir "auctex")))
t t))
((or "lisppackagedatadir" "lisppackagelispdir")
(replace-match "(directory-file-name (file-name-directory load-file-name))" t t))
(it (error "Unknown substitution variable in tex-site.el.in: %s" it))))))
:pin "764a53c8e93150f0edd169593a4d453810792abe")
(package! adaptive-wrap :pin "dea4e32c18d285a6ca9f72b1eadd61e27a555ed3")
(package! latex-preview-pane :pin "5297668a89996b50b2b62f99cba01cc544dbed2e") (package! latex-preview-pane :pin "5297668a89996b50b2b62f99cba01cc544dbed2e")
(when (modulep! :editor evil +everywhere) (when (modulep! :editor evil +everywhere)
(package! evil-tex :pin "2a3177c818f106e6c11032ac261f8691f5e11f74")) (package! evil-tex :pin "2a3177c818f106e6c11032ac261f8691f5e11f74"))
;; Optional module features. ;; Optional module features.
(when (modulep! +latexmk)
(package! auctex-latexmk :pin "b00a95e6b34c94987fda5a57c20cfe2f064b1c7a"))
(when (modulep! +cdlatex) (when (modulep! +cdlatex)
(package! cdlatex :pin "33770dec73138909714711b05a63e79da5a19ccd")) (package! cdlatex :pin "33770dec73138909714711b05a63e79da5a19ccd"))

View file

@ -23,6 +23,7 @@ capture, the end position, and the output buffer.")
markdown-gfm-additional-languages '("sh") markdown-gfm-additional-languages '("sh")
markdown-make-gfm-checkboxes-buttons t markdown-make-gfm-checkboxes-buttons t
markdown-fontify-whole-heading-line t markdown-fontify-whole-heading-line t
markdown-fontify-code-blocks-natively t
;; `+markdown-compile' offers support for many transpilers (see ;; `+markdown-compile' offers support for many transpilers (see
;; `+markdown-compile-functions'), which it tries until one succeeds. ;; `+markdown-compile-functions'), which it tries until one succeeds.
@ -46,10 +47,6 @@ capture, the end position, and the output buffer.")
"<script src='https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js'></script>" "<script src='https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js'></script>"
"<script>document.addEventListener('DOMContentLoaded', () => { document.body.classList.add('markdown-body'); document.querySelectorAll('pre[lang] > code').forEach((code) => { code.classList.add(code.parentElement.lang); }); document.querySelectorAll('pre > code').forEach((code) => { hljs.highlightBlock(code); }); });</script>")) "<script>document.addEventListener('DOMContentLoaded', () => { document.body.classList.add('markdown-body'); document.querySelectorAll('pre[lang] > code').forEach((code) => { code.classList.add(code.parentElement.lang); }); document.querySelectorAll('pre > code').forEach((code) => { hljs.highlightBlock(code); }); });</script>"))
;; A shorter alias for org src blocks than "markdown"
(after! org-src
(add-to-list 'org-src-lang-modes '("md" . markdown)))
:config :config
(set-flyspell-predicate! '(markdown-mode gfm-mode) (set-flyspell-predicate! '(markdown-mode gfm-mode)
#'+markdown-flyspell-word-p) #'+markdown-flyspell-word-p)
@ -77,6 +74,13 @@ capture, the end position, and the output buffer.")
:override #'markdown-match-generic-metadata :override #'markdown-match-generic-metadata
(ignore (goto-char (point-max)))) (ignore (goto-char (point-max))))
;; HACK: markdown-mode calls a major mode without inhibiting its hooks, which
;; could contain expensive functionality. I suppress it to speed up their
;; fontification.
(defadvice! +markdown-optimize-src-buffer-modes-a (fn &rest args)
:around #'markdown-fontify-code-block-natively
(delay-mode-hooks (apply fn args)))
(map! :map markdown-mode-map (map! :map markdown-mode-map
:localleader :localleader
"'" #'markdown-edit-code-block "'" #'markdown-edit-code-block

View file

@ -205,6 +205,9 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default
;; Our :lang common-lisp module uses sly, so... ;; Our :lang common-lisp module uses sly, so...
org-babel-lisp-eval-fn #'sly-eval) org-babel-lisp-eval-fn #'sly-eval)
;; A shorter alias for markdown code blocks.
(add-to-list 'org-src-lang-modes '("md" . markdown))
;; I prefer C-c C-c over C-c ' (more consistent) ;; I prefer C-c C-c over C-c ' (more consistent)
(define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit)
@ -747,15 +750,6 @@ mutating hooks on exported output, like formatters."
:before-while #'org-fix-tags-on-the-fly :before-while #'org-fix-tags-on-the-fly
org-auto-align-tags) org-auto-align-tags)
(defadvice! +org--recenter-after-follow-link-a (&rest _args)
"Recenter after following a link, but only internal or file links."
:after '(org-footnote-action
org-follow-timestamp-link
org-link-open-as-file
org-link-search)
(when (get-buffer-window)
(recenter)))
(defadvice! +org--strip-properties-from-outline-a (fn &rest args) (defadvice! +org--strip-properties-from-outline-a (fn &rest args)
"Fix variable height faces in eldoc breadcrumbs." "Fix variable height faces in eldoc breadcrumbs."
:around #'org-format-outline-path :around #'org-format-outline-path
@ -781,26 +775,14 @@ mutating hooks on exported output, like formatters."
(let (persp-autokill-buffer-on-remove) (let (persp-autokill-buffer-on-remove)
(persp-remove-buffer org-agenda-new-buffers (persp-remove-buffer org-agenda-new-buffers
(get-current-persp) (get-current-persp)
nil)))) nil)))))
(defun +org-defer-mode-in-agenda-buffers-h ()
"`org-agenda' opens temporary, incomplete org-mode buffers.
I've disabled a lot of org-mode's startup processes for these invisible buffers
to speed them up (in `+org--exclude-agenda-buffers-from-recentf-a'). However, if
the user tries to visit one of these buffers they'll see a gimped, half-broken
org buffer. To avoid that, restart `org-mode' when they're switched to so they
can grow up to be fully-fledged org-mode buffers."
(dolist (buffer org-agenda-new-buffers)
(when (buffer-live-p buffer) ; Ensure buffer is not killed
(with-current-buffer buffer
(add-hook 'doom-switch-buffer-hook #'+org--restart-mode-h
nil 'local))))))
(defadvice! +org--restart-mode-before-indirect-buffer-a (&optional buffer _) (defadvice! +org--restart-mode-before-indirect-buffer-a (&optional buffer _)
"Restart `org-mode' in buffers in which the mode has been deferred (see "Restart `org-mode' in buffers in which the mode has been deferred (see
`+org-defer-mode-in-agenda-buffers-h') before they become the base buffer for an `+org-defer-mode-in-agenda-buffers-h') before they become the base buffer for an
indirect buffer. This ensures that the buffer is fully functional not only when indirect org-cpature buffer. This ensures that the buffer is fully functional
the *user* visits it, but also when some code interacts with it via an indirect not only when the *user* visits it, but also when org-capture interacts with it
buffer as done, e.g., by `org-capture'." via an indirect buffer."
:before #'org-capture-get-indirect-buffer :before #'org-capture-get-indirect-buffer
(with-current-buffer (or buffer (current-buffer)) (with-current-buffer (or buffer (current-buffer))
(when (memq #'+org--restart-mode-h doom-switch-buffer-hook) (when (memq #'+org--restart-mode-h doom-switch-buffer-hook)
@ -808,7 +790,14 @@ buffer as done, e.g., by `org-capture'."
(defvar recentf-exclude) (defvar recentf-exclude)
(defadvice! +org--optimize-backgrounded-agenda-buffers-a (fn file) (defadvice! +org--optimize-backgrounded-agenda-buffers-a (fn file)
"Prevent temporarily opened agenda buffers from polluting recentf." "Disable a lot of org-mode's startup processes for temporary agenda buffers.
This includes preventing them from polluting recentf.
However, if the user tries to visit one of these buffers they'll see a
gimped, half-broken org buffer. To avoid that, install a hook to restart
`org-mode' when they're switched to so they can grow up to be fully-fledged
org-mode buffers."
:around #'org-get-agenda-file-buffer :around #'org-get-agenda-file-buffer
(let ((recentf-exclude (list (lambda (_file) t))) (let ((recentf-exclude (list (lambda (_file) t)))
(doom-inhibit-large-file-detection t) (doom-inhibit-large-file-detection t)
@ -817,7 +806,12 @@ buffer as done, e.g., by `org-capture'."
vc-handled-backends vc-handled-backends
org-mode-hook org-mode-hook
find-file-hook) find-file-hook)
(funcall fn file))) (let ((buf (funcall fn file)))
(if buf
(with-current-buffer buf
(add-hook 'doom-switch-buffer-hook #'+org--restart-mode-h
nil 'local)))
buf)))
(defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid) (defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid)
"Ensure uuidgen is always lowercase (consistent) regardless of system." "Ensure uuidgen is always lowercase (consistent) regardless of system."

View file

@ -1,7 +1,7 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; tools/ansible/packages.el ;;; tools/ansible/packages.el
(package! ansible :recipe (:nonrecursive t) :pin "b4dca00f89334392d770a7a67fffc935ec7354aa") (package! ansible :recipe (:nonrecursive t) :pin "eebb2fb49d3c0a0586d1e4ead9ba618c7d003cae")
(package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") (package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0")
(package! jinja2-mode :pin "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1") (package! jinja2-mode :pin "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1")
(package! yaml-mode :pin "7b5ce294fb15c2c8926fa476d7218aa415550a2a") (package! yaml-mode :pin "7b5ce294fb15c2c8926fa476d7218aa415550a2a")

View file

@ -3,33 +3,44 @@
;; ;;
;;; Default styles ;;; Default styles
;; STYLE: Redefine fringe bitmaps to be sleeker by making them solid bars (with
;; no border) that only take up half the horizontal space in the fringe. This
;; approach lets us avoid robbing fringe space from other packages/modes that
;; may need benefit from it (like magit, flycheck, or flyspell).
(when (modulep! +pretty) (when (modulep! +pretty)
;; UI: make the fringe small enough that the diff bars aren't too domineering,
;; while leaving enough room for other indicators.
(if (fboundp 'fringe-mode) (fringe-mode '8)) (if (fboundp 'fringe-mode) (fringe-mode '8))
;; UI: the gutter looks less cramped with some space between it and buffer.
(setq-default fringes-outside-margins t) (setq-default fringes-outside-margins t)
;; STYLE: Redefine fringe bitmaps to take up only half the horizontal space in (defadvice! +vc-gutter-define-thin-bitmaps-a (&rest _)
;; the fringe. This way we avoid overbearingly large diff bars without :after #'diff-hl-define-bitmaps
;; having to shrink the fringe and sacrifice precious space for other fringe (let* ((scale (if (and (boundp 'text-scale-mode-amount)
;; indicators (like flycheck or flyspell). (numberp text-scale-mode-amount))
;; REVIEW: Extract these into a package with faces that themes can target. (expt text-scale-mode-step text-scale-mode-amount)
(defadvice! +vc-gutter-define-thin-bitmaps-a (&rest args) 1))
:override #'diff-hl-define-bitmaps (spacing (or (and (display-graphic-p) (default-value 'line-spacing)) 0))
(define-fringe-bitmap 'diff-hl-bmp-middle [224] nil nil '(center repeated)) (h (+ (ceiling (* (frame-char-height) scale))
(define-fringe-bitmap 'diff-hl-bmp-delete [240 224 192 128] nil nil 'top)) (if (floatp spacing)
(defun +vc-gutter-type-face-fn (type _pos) (truncate (* (frame-char-height) spacing))
(intern (format "diff-hl-%s" type))) spacing)))
(w (min (frame-parameter nil (intern (format "%s-fringe" diff-hl-side)))
16))
(_ (if (zerop w) (setq w 16))))
(define-fringe-bitmap 'diff-hl-bmp-middle
(make-vector
h (string-to-number (let ((half-w (1- (/ w 2))))
(concat (make-string half-w ?1)
(make-string (- w half-w) ?0)))
2))
nil nil 'center)))
(defun +vc-gutter-type-at-pos-fn (type _pos) (defun +vc-gutter-type-at-pos-fn (type _pos)
(if (eq type 'delete) (if (eq type 'delete)
'diff-hl-bmp-delete 'diff-hl-bmp-delete
'diff-hl-bmp-middle)) 'diff-hl-bmp-middle))
(advice-add #'diff-hl-fringe-bmp-from-pos :override #'+vc-gutter-type-at-pos-fn) (setq diff-hl-fringe-bmp-function #'+vc-gutter-type-at-pos-fn)
(advice-add #'diff-hl-fringe-bmp-from-type :override #'+vc-gutter-type-at-pos-fn)
(setq diff-hl-draw-borders nil) (setq diff-hl-draw-borders nil)
(add-hook! 'diff-hl-mode-hook (add-hook! 'diff-hl-mode-hook
(defun +vc-gutter-fix-diff-hl-faces-h () (defun +vc-gutter-make-diff-hl-faces-transparent-h ()
(mapc (doom-rpartial #'set-face-background nil) (mapc (doom-rpartial #'set-face-background nil)
'(diff-hl-insert '(diff-hl-insert
diff-hl-delete diff-hl-delete
@ -61,6 +72,8 @@
(setq vc-git-diff-switches '("--histogram")) (setq vc-git-diff-switches '("--histogram"))
;; PERF: Slightly more conservative delay before updating the diff ;; PERF: Slightly more conservative delay before updating the diff
(setq diff-hl-flydiff-delay 0.5) ; default: 0.3 (setq diff-hl-flydiff-delay 0.5) ; default: 0.3
;; PERF: don't block Emacs when updating vc gutter
(setq diff-hl-update-async t)
;; UX: get realtime feedback in diffs after staging/unstaging hunks. ;; UX: get realtime feedback in diffs after staging/unstaging hunks.
(setq diff-hl-show-staged-changes nil) (setq diff-hl-show-staged-changes nil)
@ -107,9 +120,9 @@
(when (modulep! :editor evil) (when (modulep! :editor evil)
(add-hook! 'diff-hl-flydiff-mode-hook (add-hook! 'diff-hl-flydiff-mode-hook
(defun +vc-gutter-init-flydiff-mode-h () (defun +vc-gutter-init-flydiff-mode-h ()
(if (not diff-hl-flydiff-mode) (if diff-hl-flydiff-mode
(remove-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update) (add-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update)
(add-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update))))) (remove-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update)))))
;; FIX: Reverting a hunk causes the cursor to be moved to an unexpected place, ;; FIX: Reverting a hunk causes the cursor to be moved to an unexpected place,
;; often far from the target hunk. ;; often far from the target hunk.