diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 000000000..d3c7fdc44 --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,14 @@ +name: 'Lock Threads' + +on: + schedule: + - cron: '0 * * * *' + +jobs: + lock: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v2 + with: + github-token: ${{ github.token }} + issue-lock-inactive-days: '180' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9567b875b..222b276ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,20 +3,20 @@ name: CI on: push: branches: - - master - develop pull_request: branches: - - master - develop jobs: build: + if: false runs-on: ubuntu-latest strategy: matrix: emacs_version: - 26.3 + - 27.1 include: - emacs_version: 26.3 lint_ignore: 1 diff --git a/LICENSE b/LICENSE index cb8f2620c..5f4d5a097 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2020 Henrik Lissner. +Copyright (c) 2016-2021 Henrik Lissner. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/bin/doom b/bin/doom index 867e3a36c..8dc0fcc84 100755 --- a/bin/doom +++ b/bin/doom @@ -3,7 +3,7 @@ :; case "$EMACS" in *term*) EMACS=emacs ;; *) EMACS="${EMACS:-emacs}" ;; esac :; $EMACS --version >/dev/null 2>&1 || { >&2 echo "Can't find emacs in your PATH"; exit 1; } :; $EMACS --no-site-file --script "$0" -- "$@" || __DOOMCODE=$? -:; [ "${__DOOMCODE:-0}" -eq 128 ] && { "`$EMACS -Q --batch --eval '(princ temporary-file-directory)'`/doom.sh" "$0" "$@" && true; __DOOMCODE=$?; } +:; [ "${__DOOMCODE:-0}" -eq 128 ] && { sh "`$EMACS -Q --batch --eval '(princ temporary-file-directory)'`/doom.sh" "$0" "$@" && true; __DOOMCODE=$?; } :; exit $__DOOMCODE ;; The garbage collector isn't as important during CLI ops. A higher threshold @@ -125,7 +125,7 @@ (shell-quote-argument (match-string 2 env))))) (format "PATH=\"%s%s$PATH\" \\\n" (concat doom-emacs-dir "bin/") path-separator) "_postscript $@\n")) - (set-file-modes script #o700)) + (set-file-modes script #o600)) ;; Error code 128 is special: it means run the post-script after this ;; session ends. 128) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index d13dbdfd8..2c3c5f653 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -113,7 +113,7 @@ ready to be pasted in a bug report on github." (letf! ((defun sh (&rest args) (cdr (apply #'doom-call-process args))) (defun abbrev-path (path) (replace-regexp-in-string - (regexp-quote (user-login-name)) "$USER" + (concat "\\<" (regexp-quote (user-login-name)) "\\>") "$USER" (abbreviate-file-name path)))) `((system (type . ,system-type) diff --git a/core/autoload/help.el b/core/autoload/help.el index a292937ce..909898d60 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -351,13 +351,15 @@ module derived from a `featurep!' or `require!' call, c) the module that the current file is in, or d) the module associated with the current major mode (see `doom--help-major-mode-module-alist')." (interactive - (mapcar #'intern - (split-string - (completing-read "Describe module: " - (doom--help-modules-list) - nil t nil nil - (doom--help-current-module-str)) - " " t))) + (nconc + (mapcar #'intern + (split-string + (completing-read "Describe module: " + (doom--help-modules-list) + nil t nil nil + (doom--help-current-module-str)) + " " t)) + (list current-prefix-arg))) (cl-check-type category symbol) (cl-check-type module symbol) (cl-destructuring-bind (module-string path) @@ -377,29 +379,58 @@ current file is in, or d) the module associated with the current major mode (see (doom-project-browse (file-name-directory path))) ((user-error "Aborted module lookup"))))) +;;;###autoload +(defun doom/help-custom-variable (var) + "Look up documentation for a custom variable. + +Unlike `helpful-variable', which casts a wider net that includes internal +variables, this only lists variables that exist to be customized (defined with +`defcustom')." + (interactive + (list (helpful--read-symbol + "Custom variable: " + (helpful--variable-at-point) + (lambda (sym) + (and (helpful--variable-p sym) + (custom-variable-p sym) + ;; Exclude minor mode state variables, which aren't meant to be + ;; modified directly, but through their associated function. + (not (or (and (string-suffix-p "-mode" (symbol-name sym)) + (fboundp sym)) + (eq (get sym 'custom-set) 'custom-set-minor-mode)))))))) + (helpful-variable var)) + ;; ;;; `doom/help-packages' -(defun doom--help-package-insert-button (label path &optional regexp) - (declare (indent defun)) - (insert-text-button - (string-trim label) - 'face 'link - 'follow-link t - 'action - `(lambda (_) - (unless (file-exists-p ,path) - (user-error "Module doesn't exist")) - (when (window-dedicated-p) - (other-window 1)) - (let ((buffer (find-file ,path))) - (when ,(stringp regexp) - (with-current-buffer buffer - (goto-char (point-min)) - (if (re-search-forward ,regexp nil t) - (recenter) - (message "Couldn't find the config block")))))))) +(defun doom--help-insert-button (label &optional path) + (cl-destructuring-bind (uri . qs) + (let ((parts (split-string label "::" t))) + (cons (string-trim (car parts)) + (string-join (cdr parts) "::"))) + (let ((path (or path label))) + (insert-text-button + uri + 'face 'link + 'follow-link t + 'action + (lambda (_) + (when (window-dedicated-p) + (other-window 1)) + (pcase (cond ((string-match-p "^https?://" qs) 'url) + ('file)) + ((or `file `nil) + (unless (file-exists-p path) + (user-error "Path does not exist: %S" path)) + (let ((buffer (or (get-file-buffer path) + (find-file path)))) + (when qs + (with-current-buffer buffer + (goto-char (point-min)) + (re-search-forward qs) + (recenter))))) + (`url (browse-url uri)))))))) (defun doom--help-package-configs (package) (let ((default-directory doom-emacs-dir)) @@ -413,6 +444,7 @@ current file is in, or d) the module associated with the current major mode (see ":(exclude)*.org")) "\n" t))) +(defvar doom--help-packages-list nil) ;;;###autoload (defun doom/help-packages (package) "Like `describe-package', but for packages installed by Doom modules. @@ -427,12 +459,18 @@ If prefix arg is present, refresh the cache." (require 'finder-inf nil t) (require 'package) (require 'straight) - (let ((packages (delete-dups - (append (mapcar #'car package-alist) - (mapcar #'car package--builtins) - (mapcar #'intern (hash-table-keys straight--build-cache)) - (mapcar #'car (doom-package-list 'all)) - nil)))) + (let ((packages + (if (and doom--help-packages-list (null current-prefix-arg)) + doom--help-packages-list + (message "Generating packages list for the first time...") + (sit-for 0.1) + (setq doom--help-packages-list + (delete-dups + (append (mapcar #'car package-alist) + (mapcar #'car package--builtins) + (mapcar #'intern (hash-table-keys straight--build-cache)) + (mapcar #'car (doom-package-list 'all)) + nil)))))) (unless (memq guess packages) (setq guess nil)) (list @@ -440,9 +478,10 @@ If prefix arg is present, refresh the cache." (completing-read (if guess (format "Select Doom package to search for (default %s): " guess) - "Describe Doom package: ") + (format "Describe Doom package (%d): " (length packages))) packages nil t nil nil (if guess (symbol-name guess)))))))) + ;; TODO Refactor me. (require 'core-packages) (doom-initialize-packages) (if (or (package-desc-p package) @@ -477,20 +516,38 @@ If prefix arg is present, refresh the cache." "unpinned") "\n") (package--print-help-section "Build") - (insert (let ((default-directory (straight--repos-dir (symbol-name package)))) - (cdr - (doom-call-process "git" "log" "-1" "--format=%D %h %ci"))) - "\n") + (let ((default-directory (straight--repos-dir (symbol-name package)))) + (insert (cdr (doom-call-process "git" "log" "-1" "--format=%D %h %ci")) + "\n" indent)) + (package--print-help-section "Build location") + (let ((build-dir (straight--build-dir (symbol-name package)))) + (if (file-exists-p build-dir) + (doom--help-insert-button (abbreviate-file-name build-dir)) + (insert "n/a"))) + (insert "\n" indent) + (package--print-help-section "Repo location") + (let ((repo-dir (straight--repos-dir (symbol-name package)))) + (if (file-exists-p repo-dir) + (doom--help-insert-button (abbreviate-file-name repo-dir)) + (insert "n/a")) + (insert "\n")) (let ((recipe (doom-package-build-recipe package))) - (insert (format! "%s\n" - (indent 13 - (string-trim (pp-to-string recipe))))) - + (package--print-help-section "Recipe") + (insert (format "%s\n" (string-trim (pp-to-string recipe)))) (package--print-help-section "Homepage") - (insert (doom--package-url package)))) - (`elpa (insert "[M]ELPA " (doom--package-url package))) - (`builtin (insert "Built-in")) - (`other (insert + (doom--help-insert-button (doom--package-url package)))) + (`elpa (insert "[M]ELPA ") + (doom--help-insert-button (doom--package-url package)) + (package--print-help-section "Location") + (doom--help-insert-button + (abbreviate-file-name + (file-name-directory (locate-library (symbol-name package)))))) + (`builtin (insert "Built-in\n") + (package--print-help-section "Location") + (doom--help-insert-button + (abbreviate-file-name + (file-name-directory (locate-library (symbol-name package)))))) + (`other (doom--help-insert-button (abbreviate-file-name (or (symbol-file package) (locate-library (symbol-name package)))))) @@ -506,14 +563,22 @@ If prefix arg is present, refresh the cache." (package--print-help-section "Modules") (insert "Declared by the following Doom modules:\n") (dolist (m modules) - (insert indent) - (doom--help-package-insert-button - (format "%s %s" (car m) (or (cdr m) "")) - (pcase (car m) - (:core doom-core-dir) - (:private doom-private-dir) - (category (doom-module-path category (cdr m))))) - (insert "\n"))) + (let* ((module-path (pcase (car m) + (:core doom-core-dir) + (:private doom-private-dir) + (category (doom-module-path category (cdr m))))) + (readme-path (expand-file-name "README.org" module-path))) + (insert indent) + (doom--help-insert-button + (format "%s %s" (car m) (or (cdr m) "")) + module-path) + (insert " (") + (if (file-exists-p readme-path) + (doom--help-insert-button + "readme" + readme-path) + (insert "no readme")) + (insert ")\n")))) (package--print-help-section "Configs") (insert "This package is configured in the following locations:") @@ -582,7 +647,9 @@ If prefix arg is present, refresh the cache." (format "%s.el" package)))) (_ (plist-get plist :url)))))) ((and (require 'package nil t) - (or package-archive-contents (doom-refresh-packages-maybe)) + (or package-archive-contents + (progn (package-refresh-contents) + package-archive-contents)) (pcase (package-desc-archive (cadr (assq package package-archive-contents))) ("org" "https://orgmode.org") ((or "melpa" "melpa-mirror") diff --git a/core/autoload/packages.el b/core/autoload/packages.el index efcfafec4..8355da24d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -13,18 +13,24 @@ ;; ;;; Bump commands -(defun doom--package-full-recipe (package plist) +(defun doom--package-merge-recipes (package plist) (require 'straight) (doom-plist-merge (plist-get plist :recipe) - (or (cdr (straight-recipes-retrieve package)) - (plist-get (cdr (assq package doom-packages)) - :recipe)))) + (if-let (recipe (straight-recipes-retrieve package)) + (cdr (if (memq (car recipe) '(quote \`)) + (eval recipe t) + recipe)) + (let ((recipe (plist-get (cdr (assq package doom-packages)) + :recipe))) + (if (keywordp (car recipe)) + recipe + (cdr recipe)))))) (defun doom--package-to-bump-string (package plist) "Return a PACKAGE and its PLIST in 'username/repo@commit' format." (format "%s@%s" - (plist-get (doom--package-full-recipe package plist) :repo) + (plist-get (doom--package-merge-recipes package plist) :repo) (substring-no-properties (plist-get plist :pin) 0 7))) (defun doom--package-at-point (&optional point) @@ -78,7 +84,7 @@ Grabs the latest commit id of the package using 'git'." (cl-destructuring-bind (&key package plist beg end) (or (doom--package-at-point) (user-error "Not on a `package!' call")) - (let* ((recipe (doom--package-full-recipe package plist)) + (let* ((recipe (doom--package-merge-recipes package plist)) (branch (plist-get recipe :branch)) (oldid (or (plist-get plist :pin) (doom-package-get package :pin))) @@ -177,8 +183,8 @@ each package." (defun doom/bump-package (package) "Bump PACKAGE in all modules that install it." (interactive - (list (completing-read "Bump package: " - (mapcar #'car (doom-package-list 'all))))) + (list (intern (completing-read "Bump package: " + (mapcar #'car (doom-package-list 'all)))))) (let* ((packages (doom-package-list 'all)) (modules (plist-get (alist-get package packages) :modules))) (unless modules diff --git a/core/autoload/text.el b/core/autoload/text.el index f3f7f6ad0..73f56d40a 100644 --- a/core/autoload/text.el +++ b/core/autoload/text.el @@ -251,7 +251,7 @@ the value of `indent-tab-mode'. If ARG (universal argument) is non-nil, retab the current buffer using the opposite indentation style." - (interactive "Pr") + (interactive "P\nr") (unless (and beg end) (setq beg (point-min) end (point-max))) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 1f993d929..a133354c6 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -127,65 +127,32 @@ Activate again to undo this. If prefix ARG is non-nil, don't restore the last window configuration and re-maximize the current window. Alternatively, use `doom/window-enlargen'." (interactive "P") - (let ((param 'doom--maximize-last-wconf)) - (cl-destructuring-bind (window . wconf) - (or (frame-parameter nil param) - (cons nil nil)) - (set-frame-parameter - nil param - (if (and (equal window (selected-window)) - (not arg) - (null (cdr (cl-remove-if #'window-dedicated-p (window-list)))) - wconf) - (ignore - (let ((source-window (selected-window))) - (set-window-configuration wconf) - (when (window-live-p source-window) - (select-window source-window)))) - (when (and (bound-and-true-p +popup-mode) - (+popup-window-p)) - (user-error "Cannot maximize a popup, use `+popup/raise' first or use `doom/window-enlargen' instead")) - (prog1 (cons (selected-window) (or wconf (current-window-configuration))) - (delete-other-windows) - (add-hook 'doom-switch-window-hook #'doom--enlargened-forget-last-wconf-h))))))) + (when (and (bound-and-true-p +popup-mode) + (+popup-window-p)) + (+popup/raise (selected-window))) + (delete-other-windows)) ;;;###autoload (defun doom/window-enlargen (&optional arg) "Enlargen the current window to focus on this one. Does not close other windows (unlike `doom/window-maximize-buffer'). Activate again to undo." (interactive "P") - (let ((param 'doom--enlargen-last-wconf)) - (cl-destructuring-bind (window . wconf) - (or (frame-parameter nil param) - (cons nil nil)) - (set-frame-parameter - nil param - (if (and (equal window (selected-window)) - (not arg) - wconf) - (ignore - (let ((source-window (selected-window))) - (set-window-configuration wconf) - (when (window-live-p source-window) - (select-window source-window)))) - (prog1 (cons (selected-window) (or wconf (current-window-configuration))) - (let* ((window (selected-window)) - (dedicated-p (window-dedicated-p window)) - (preserved-p (window-parameter window 'window-preserved-size)) - (ignore-window-parameters t) - (window-resize-pixelwise nil) - (frame-resize-pixelwise nil)) - (unwind-protect - (progn - (when dedicated-p - (set-window-dedicated-p window nil)) - (when preserved-p - (set-window-parameter window 'window-preserved-size nil)) - (maximize-window window)) - (set-window-dedicated-p window dedicated-p) - (when preserved-p - (set-window-parameter window 'window-preserved-size preserved-p)) - (add-hook 'doom-switch-window-hook #'doom--enlargened-forget-last-wconf-h))))))))) + (let* ((window (selected-window)) + (dedicated-p (window-dedicated-p window)) + (preserved-p (window-parameter window 'window-preserved-size)) + (ignore-window-parameters t) + (window-resize-pixelwise nil) + (frame-resize-pixelwise nil)) + (unwind-protect + (progn + (when dedicated-p + (set-window-dedicated-p window nil)) + (when preserved-p + (set-window-parameter window 'window-preserved-size nil)) + (maximize-window window)) + (set-window-dedicated-p window dedicated-p) + (when preserved-p + (set-window-parameter window 'window-preserved-size preserved-p))))) ;;;###autoload (defun doom/window-maximize-horizontally () diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index 6e7ed77e7..09193c565 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -1,7 +1,7 @@ ;;; core/cli/autoloads.el -*- lexical-binding: t; -*- -(defvar doom-autoloads-excluded-packages '("gh") - "What packages whose autoloads file we won't index. +(defvar doom-autoloads-excluded-packages () + "What packages whose autoloads files we won't index. These packages have silly or destructive autoload files that try to load everyone in the universe and their dog, causing errors that make babies cry. No @@ -10,7 +10,7 @@ one wants that.") (defvar doom-autoloads-cached-vars '(doom-modules doom-disabled-packages - comp-deferred-compilation-black-list + comp-deferred-compilation-deny-list load-path auto-mode-alist interpreter-mode-alist diff --git a/core/cli/doctor.el b/core/cli/doctor.el index e7e3fc4c5..c8fc1d996 100644 --- a/core/cli/doctor.el +++ b/core/cli/doctor.el @@ -48,9 +48,15 @@ in." ;; REVIEW Refactor me (print! (start "Checking your Emacs version...")) - (when EMACS28+ - (warn! "Emacs %s detected. Doom doesn't support Emacs 28/HEAD. It is unstable and may cause errors." + (cond + (EMACS28+ + (warn! (concat "Emacs %s detected. Doom should support this version, but be prepared for " + "Emacs updates causing breakages.") emacs-version)) + ((= emacs-major-version 26) + (warn! (concat "Emacs %s detected. Doom is dropping Emacs 26.x support very soon. Consider " + "upgrading to Emacs 27.x.") + emacs-version))) (print! (start "Checking for Emacs config conflicts...")) (when (file-exists-p "~/.emacs") @@ -86,6 +92,19 @@ in." (print! (start "Checking for stale elc files...")) (elc-check-dir user-emacs-directory) + (print! (start "Checking for problematic git global settings...")) + (if (executable-find "git") + (when (zerop (car (doom-call-process "git" "config" "--global" "--get-regexp" "^url\\.git://github\\.com"))) + (warn! "Detected insteadOf rules in your global gitconfig.") + (explain! "Doom's package manager heavily relies on git. In particular, many of its packages " + "are hosted on github. Rewrite rules like these will break it:\n\n" + " [url \"git://github.com\"]\n" + " insteadOf = https://github.com\n\n" + "Please remove them from your gitconfig or use a conditional includeIf rule to " + "only apply your rewrites to specific repositories. See " + "'https://git-scm.com/docs/git-config#_includes' for more information.")) + (error! "Couldn't find the `git' binary; this a hard dependecy for Doom!")) + (print! (start "Checking Doom Emacs...")) (condition-case-unless-debug ex (print-group! diff --git a/core/cli/env.el b/core/cli/env.el index 9467858bd..4fcb84b05 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -92,7 +92,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in (process-environment doom--initial-process-environment)) (when (or force-p (not (file-exists-p env-file))) (with-temp-file env-file - (setq-local coding-system-for-write 'utf-8) + (setq-local coding-system-for-write 'utf-8-unix) (print! (start "%s envvars file at %S") (if (file-exists-p env-file) "Regenerating" @@ -104,7 +104,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in (goto-char (point-min)) (insert (concat - "# -*- mode: sh -*-\n" + "# -*- mode: sh; coding: utf-8-unix -*-\n" "# ---------------------------------------------------------------------------\n" "# This file was auto-generated by `doom env'. It contains a list of environment\n" "# variables scraped from your default shell (excluding variables blacklisted\n" diff --git a/core/cli/packages.el b/core/cli/packages.el index 0bd47ee93..a2a1fb850 100644 --- a/core/cli/packages.el +++ b/core/cli/packages.el @@ -21,10 +21,11 @@ Emacs (as byte-code is generally not forward-compatible)." t) (defcli! (purge p) - ((nobuilds-p ["-b" "--no-builds"] "Don't purge unneeded (built) packages") - (noelpa-p ["-p" "--no-elpa"] "Don't purge ELPA packages") - (norepos-p ["-r" "--no-repos"] "Don't purge unused straight repos") - (regraft-p ["-g" "--regraft"] "Regraft git repos (ie. compact them)")) + ((nobuilds-p ["-b" "--no-builds"] "Don't purge unneeded (built) packages") + (noelpa-p ["-p" "--no-elpa"] "Don't purge ELPA packages") + (norepos-p ["-r" "--no-repos"] "Don't purge unused straight repos") + (noeln-p ["-e" "--no-eln"] "Don't purge old ELN bytecode") + (noregraft-p ["-g" "--no-regraft"] "Regraft git repos (ie. compact them)")) "Deletes orphaned packages & repos, and compacts them. Purges all installed ELPA packages (as they are considered temporary). Purges @@ -39,7 +40,8 @@ list remains lean." (not noelpa-p) (not norepos-p) (not nobuilds-p) - regraft-p) + (not noregraft-p) + (not noeln-p)) (doom-autoloads-reload)) t) @@ -232,46 +234,11 @@ list remains lean." (doom-log "Compiling %s" file) (native-compile-async file)))) -(defun doom--bootstrap-trampolines () - "Build the trampolines we need to prevent hanging." - (when (featurep 'comp) - ;; HACK The following list was obtained by running 'doom build', waiting for - ;; it to hang, then checking the eln-cache for trampolines. We - ;; simulate running 'doom build' twice by compiling the trampolines - ;; then restarting. - (let (restart) - (dolist (f '(abort-recursive-edit - describe-buffer-bindings - execute-kbd-macro - handle-switch-frame - load - make-indirect-buffer - make-process - message - read-char - read-key-sequence - select-window - set-window-buffer - top-level - use-global-map - use-local-map - write-region)) - (unless (doom--find-eln-file - (concat comp-native-version-dir "/" - (comp-trampoline-filename f))) - (print! (info "Compiling trampoline for %s") f) - (comp-trampoline-compile f) - (setq restart t))) - (when restart - (throw 'exit :restart))))) - - (defun doom-cli-packages-install () "Installs missing packages. This function will install any primary package (i.e. a package with a `package!' declaration) or dependency thereof that hasn't already been." - (doom--bootstrap-trampolines) (doom-initialize-packages) (print! (start "Installing packages...")) (let ((pinned (doom-package-pinned-list))) @@ -311,7 +278,6 @@ declaration) or dependency thereof that hasn't already been." (defun doom-cli-packages-build (&optional force-p) "(Re)build all packages." - (doom--bootstrap-trampolines) (doom-initialize-packages) (print! (start "(Re)building %spackages...") (if force-p "all " "")) (print-group! @@ -335,19 +301,31 @@ declaration) or dependency thereof that hasn't already been." (doom--with-package-recipes recipes (package local-repo recipe) (unless force-p ;; Ensure packages with outdated files/bytecode are rebuilt - (let ((build-dir (straight--build-dir package)) - (repo-dir (straight--repos-dir local-repo))) - (and (not (plist-get recipe :no-build)) + (let* ((build-dir (straight--build-dir package)) + (repo-dir (straight--repos-dir local-repo)) + (build (if (plist-member recipe :build) + (plist-get recipe :build) + t)) + (want-byte-compile + (or (eq build t) + (memq 'compile build))) + (want-native-compile + (or (eq build t) + (memq 'native-compile build)))) + (when (eq (car-safe build) :not) + (setq want-byte-compile (not want-byte-compile) + want-native-compile (not want-native-compile))) + (unless (require 'comp nil t) + (setq want-native-compile nil)) + (and (or want-byte-compile want-native-compile) (or (file-newer-than-file-p repo-dir build-dir) (file-exists-p (straight--modified-dir (or local-repo package))) - (cl-loop with want-byte = (straight--byte-compile-package-p recipe) - with want-native = (if (require 'comp nil t) (straight--native-compile-package-p recipe)) - with outdated = nil + (cl-loop with outdated = nil for file in (doom-files-in build-dir :match "\\.el$" :full t) - if (or (if want-byte (doom--elc-file-outdated-p file)) - (if want-native (doom--eln-file-outdated-p file))) + if (or (if want-byte-compile (doom--elc-file-outdated-p file)) + (if want-native-compile (doom--eln-file-outdated-p file))) do (setq outdated t) - (when want-native + (when want-native-compile (push file doom--eln-output-expected)) finally return outdated)) (puthash package t straight--packages-to-rebuild)))) @@ -357,7 +335,7 @@ declaration) or dependency thereof that hasn't already been." (doom--wait-for-compile-jobs) (doom--write-missing-eln-errors) (print! (success "\033[KRebuilt %d package(s)") (length built))) - (print! (success "No packages need rebuilding")) + (print! (info "No packages need rebuilding")) nil)))) @@ -556,7 +534,23 @@ declaration) or dependency thereof that hasn't already been." (filename path) e))))))) -(defun doom-cli-packages-purge (&optional elpa-p builds-p repos-p regraft-repos-p) +(defun doom--cli-packages-purge-eln () + (if-let (dirs + (cl-delete (expand-file-name comp-native-version-dir doom--eln-output-path) + (directory-files doom--eln-output-path t "^[^.]" t) + :test #'file-equal-p)) + (progn + (print! (start "Purging old native bytecode...")) + (print-group! + (dolist (dir dirs) + (print! (info "Deleting %S") (relpath dir doom--eln-output-path)) + (delete-directory dir 'recursive)) + (print! (success "Purged %d directory(ies)" (length dirs)))) + (length dirs)) + (print! (info "No ELN directories to purge")) + 0)) + +(defun doom-cli-packages-purge (&optional elpa-p builds-p repos-p regraft-repos-p eln-p) "Auto-removes orphaned packages and repos. An orphaned package is a package that isn't a primary package (i.e. doesn't have @@ -598,4 +592,8 @@ If ELPA-P, include packages installed with package.el (M-x package-install)." (/= 0 (doom--cli-packages-purge-repos repos-to-purge))) (if (not regraft-repos-p) (ignore (print! (info "Skipping regrafting"))) - (doom--cli-packages-regraft-repos repos-to-regraft))))))) + (doom--cli-packages-regraft-repos repos-to-regraft)) + (when (require 'comp nil t) + (if (not eln-p) + (ignore (print! (info "Skipping native bytecode"))) + (doom--cli-packages-purge-eln)))))))) diff --git a/core/cli/sync.el b/core/cli/sync.el index efc6055c2..8af3ca4c2 100644 --- a/core/cli/sync.el +++ b/core/cli/sync.el @@ -31,7 +31,7 @@ stale." (doom-cli-packages-build) (when update-p (doom-cli-packages-update)) - (doom-cli-packages-purge purge-p 'builds-p purge-p purge-p) + (doom-cli-packages-purge purge-p 'builds-p purge-p purge-p purge-p) (run-hooks 'doom-sync-post-hook) (when (doom-autoloads-reload) (print! (info "Restart Emacs or use 'M-x doom/reload' for changes to take effect"))) diff --git a/core/core-cli.el b/core/core-cli.el index 12f23ac6d..c186117e8 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -20,7 +20,7 @@ ;; Don't generate superfluous files when writing temp buffers (setq make-backup-files nil) -;; Stop user configuration from interfering with Doom +;; Stop user configuration from interfering with package management (setq enable-dir-local-variables nil) @@ -260,8 +260,9 @@ BODY will be run when this dispatcher is called." (string-match-p (regexp-quote straight-process-buffer) data)) (print! (error "There was an unexpected package error")) - (print-group! - (print! "%s" (string-trim-right (straight--process-get-output))))) + (when-let (output (straight--process-get-output)) + (print-group! + (print! "%s" (string-trim-right output))))) ((print! (error "There was an unexpected error")) (print-group! (print! "%s %s" (bold "Message:") (get type 'error-message)) @@ -424,6 +425,18 @@ everywhere we use it (and internally)." cause) interactive))) +(defadvice! doom--straight-inject-load-path-a (orig-fn &rest args) + "Straight builds packages in an isolated Emacs child process, which means +needed packages may not be accessible when a package is compiled." + :override #'straight--build-compile + (let* ((package (plist-get recipe :package)) + (dir (straight--build-dir package))) + (call-process (concat invocation-directory invocation-name) + nil straight-byte-compilation-buffer nil + "-Q" "--batch" + "--eval" (prin1-to-string `(setq load-path (cons ,dir ',load-path))) + "--eval" (format "(byte-recompile-directory %S 0 'force)" dir)))) + ;; ;;; Entry point diff --git a/core/core-editor.el b/core/core-editor.el index f17cd4936..724a32802 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -9,7 +9,10 @@ detected.") indentation settings or not. This should be set by editorconfig if it successfully sets indent_style/indent_size.") -(defvar-local doom-large-file-p nil) +(defvar doom-inhibit-large-file-detection nil + "If non-nil, inhibit large/long file detection when opening files.") + +(defvar doom-large-file-p nil) (put 'doom-large-file-p 'permanent-local t) (defvar doom-large-file-size-alist '(("." . 1.0)) @@ -40,21 +43,25 @@ runtime costs (or disable themselves) to ensure the buffer is as fast as possible." :before #'abort-if-file-too-large (and (numberp size) - (> size - (* 1024 1024 - (assoc-default filename doom-large-file-size-alist - #'string-match-p))) - (setq doom-large-file-p size))) + (null doom-inhibit-large-file-detection) + (ignore-errors + (> size + (* 1024 1024 + (assoc-default filename doom-large-file-size-alist + #'string-match-p)))) + (setq-local doom-large-file-p size))) + +(add-hook! 'find-file-hook + (defun doom-optimize-for-large-files-h () + "Trigger `so-long-minor-mode' if the file is large." + (when (and doom-large-file-p buffer-file-name) + (if (or doom-inhibit-large-file-detection + (memq major-mode doom-large-file-excluded-modes)) + (kill-local-variable 'doom-large-file-p) + (when (fboundp 'so-long-minor-mode) ; in case the user disabled it + (so-long-minor-mode +1)) + (message "Large file detected! Cutting a few corners to improve performance..."))))) -(defadvice! doom--optimize-for-large-files-a (&rest _) - "Trigger `so-long-minor-mode' if the file is large." - :after #'after-find-file - (when (and doom-large-file-p buffer-file-name) - (if (memq major-mode doom-large-file-excluded-modes) - (setq doom-large-file-p nil) - (when (fboundp 'so-long-minor-mode) ; in case the user disabled it - (so-long-minor-mode +1)) - (message "Large file detected! Cutting a few corners to improve performance...")))) ;; Resolve symlinks when opening files, so that any operations are conducted ;; from the file's true directory (like `find-file'). @@ -65,19 +72,6 @@ possible." ;; warning as it will redirect you to the existing buffer anyway. (setq find-file-suppress-same-file-warnings t) -;; Create missing directories when we open a file that doesn't exist under a -;; directory tree that may not exist. -(add-hook! 'find-file-not-found-functions - (defun doom-create-missing-directories-h () - "Automatically create missing directories when creating new files." - (unless (file-remote-p buffer-file-name) - (let ((parent-directory (file-name-directory buffer-file-name))) - (and (not (file-directory-p parent-directory)) - (y-or-n-p (format "Directory `%s' does not exist! Create it?" - parent-directory)) - (progn (make-directory parent-directory 'parents) - t)))))) - ;; Don't generate backups or lockfiles. While auto-save maintains a copy so long ;; as a buffer is unsaved, backups create copies once, when the file is first ;; written, and never again until it is killed and reopened. This is better @@ -101,7 +95,7 @@ possible." ;; the purpose of a failsafe. This adds the risk of losing the data we ;; just deleted, but I believe that's VCS's jurisdiction, not ours. auto-save-include-big-deletions t - ;; ...but have directories set up in case we use it. + ;; Keep it out of `doom-emacs-dir' or the local directory. auto-save-list-file-prefix (concat doom-cache-dir "autosave/") tramp-auto-save-directory (concat doom-cache-dir "tramp-autosave/") auto-save-file-name-transforms @@ -112,7 +106,10 @@ possible." (add-hook! 'after-save-hook (defun doom-guess-mode-h () - "Guess mode when saving a file in `fundamental-mode'." + "Guess major mode when saving a file in `fundamental-mode'. + +Likely, something has changed since the buffer was opened. e.g. A shebang line +or file path may exist now." (when (eq major-mode 'fundamental-mode) (let ((buffer (or (buffer-base-buffer) (current-buffer)))) (and (buffer-file-name buffer) @@ -161,7 +158,7 @@ possible." ;; The POSIX standard defines a line is "a sequence of zero or more non-newline ;; characters followed by a terminating newline", so files should end in a ;; newline. Windows doesn't respect this (because it's Windows), but we should, -;; since programmers' tools tend to be POSIX compliant. +;; since programmers' tools tend to be POSIX compliant (and no big deal if not). (setq require-final-newline t) ;; Default to soft line-wrapping in text modes. It is more sensibile for text @@ -331,6 +328,7 @@ files, so we replace calls to `pp' with the much faster `prin1'." (when-let (name (getenv "EMACS_SERVER_NAME")) (setq server-name name)) :config + (setq server-auth-dir (concat doom-emacs-dir "server/")) (unless (server-running-p) (server-start))) @@ -486,7 +484,12 @@ files, so we replace calls to `pp' with the much faster `prin1'." ;; correct this vile injustice. (setq sp-show-pair-from-inside t) ;; ...and stay highlighted until we've truly escaped the pair! - (setq sp-cancel-autoskip-on-backward-movement nil)) + (setq sp-cancel-autoskip-on-backward-movement nil) + ;; Smartparens conditional binds a key to C-g when sp overlays are active + ;; (even if they're invisible). This disruptively changes the behavior of + ;; C-g in insert mode, requiring two presses of the key to exit insert mode. + ;; I don't see the point of this keybind, so... + (setq sp-pair-overlay-keymap (make-sparse-keymap))) ;; The default is 100, because smartparen's scans are relatively expensive ;; (especially with large pair lists for some modes), we reduce it, as a @@ -495,21 +498,25 @@ files, so we replace calls to `pp' with the much faster `prin1'." ;; No pair has any business being longer than 4 characters; if they must, set ;; it buffer-locally. It's less work for smartparens. (setq sp-max-pair-length 4) - ;; This isn't always smart enough to determine when we're in a string or not. - ;; See https://github.com/Fuco1/smartparens/issues/783. - (setq sp-escape-quotes-after-insert nil) ;; Silence some harmless but annoying echo-area spam (dolist (key '(:unmatched-expression :no-matching-tag)) (setf (alist-get key sp-message-alist) nil)) + (add-hook! 'eval-expression-minibuffer-setup-hook + (defun doom-init-smartparens-in-eval-expression-h () + "Enable `smartparens-mode' in the minibuffer for `eval-expression'. +This includes everything that calls `read--expression', e.g. +`edebug-eval-expression' Only enable it if +`smartparens-global-mode' is on." + (when smartparens-global-mode (smartparens-mode +1)))) (add-hook! 'minibuffer-setup-hook (defun doom-init-smartparens-in-minibuffer-maybe-h () - "Enable `smartparens-mode' in the minibuffer, during `eval-expression', -`pp-eval-expression' or `evil-ex'." - (and (memq this-command '(eval-expression pp-eval-expression evil-ex)) - smartparens-global-mode - (smartparens-mode)))) + "Enable `smartparens' for non-`eval-expression' commands. +Only enable `smartparens-mode' if `smartparens-global-mode' is +on." + (when (and smartparens-global-mode (memq this-command '(evil-ex))) + (smartparens-mode +1)))) ;; You're likely writing lisp in the minibuffer, therefore, disable these ;; quote pairs, which lisps doesn't use for strings: @@ -545,8 +552,6 @@ files, so we replace calls to `pp' with the much faster `prin1'." (add-to-list 'so-long-variable-overrides '(font-lock-maximum-decoration . 1)) ;; ...and insist that save-place not operate in large/long files (add-to-list 'so-long-variable-overrides '(save-place-alist . nil)) - ;; Text files could possibly be too long too - (add-to-list 'so-long-target-modes 'text-mode) ;; But disable everything else that may be unnecessary/expensive for large or ;; wide buffers. (appendq! so-long-minor-modes @@ -563,11 +568,11 @@ files, so we replace calls to `pp' with the much faster `prin1'." highlight-indent-guides-mode hl-fill-column-mode)) (defun doom-buffer-has-long-lines-p () - ;; HACK Fix #2183: `so-long-detected-long-line-p' tries to parse comment - ;; syntax, but in some buffers comment state isn't initialized, leading - ;; to a wrong-type-argument: stringp error. (unless (bound-and-true-p visual-line-mode) (let ((so-long-skip-leading-comments + ;; HACK Fix #2183: `so-long-detected-long-line-p' tries to parse + ;; comment syntax, but comment state may not be initialized, + ;; leading to a wrong-type-argument: stringp error. (bound-and-true-p comment-use-syntax))) (so-long-detected-long-line-p)))) (setq so-long-predicate #'doom-buffer-has-long-lines-p)) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index c2ed788c7..608b00ed9 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -39,6 +39,21 @@ and Emacs states, and for non-evil users.") (setq w32-lwindow-modifier 'super w32-rwindow-modifier 'super))) +;; HACK Fixes Emacs' disturbing inability to distinguish C-i from TAB. +(define-key key-translation-map [?\C-i] + (cmd! (if (let ((keys (this-single-command-raw-keys))) + (and keys + (not (cl-position 'tab keys)) + (not (cl-position 'kp-tab keys)) + (display-graphic-p) + ;; Fall back if no keybind can be found, otherwise + ;; we've broken all pre-existing C-i keybinds. + (let ((key + (doom-lookup-key + (vconcat (cl-subseq keys 0 -1) [C-i])))) + (not (or (numberp key) (null key)))))) + [C-i] [?\C-i]))) + ;; ;;; Universal, non-nuclear escape @@ -63,18 +78,22 @@ and Emacs states, and for non-evil users.") More specifically, when `doom/escape' is pressed. If any hook returns non-nil, all hooks after it are ignored.") -(defun doom/escape () +(defun doom/escape (&optional interactive) "Run `doom-escape-hook'." - (interactive) + (interactive (list 'interactive)) (cond ((minibuffer-window-active-p (minibuffer-window)) ;; quit the minibuffer if open. + (when interactive + (setq this-command 'abort-recursive-edit)) (abort-recursive-edit)) ;; Run all escape hooks. If any returns non-nil, then stop there. ((run-hook-with-args-until-success 'doom-escape-hook)) ;; don't abort macros ((or defining-kbd-macro executing-kbd-macro) nil) ;; Back to the default - ((keyboard-quit)))) + ((unwind-protect (keyboard-quit) + (when interactive + (setq this-command 'keyboard-quit)))))) (global-set-key [remap keyboard-quit] #'doom/escape) diff --git a/core/core-lib.el b/core/core-lib.el index 51bd1b596..35651ec6a 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -67,8 +67,8 @@ list is returned as-is." (defmacro doom-log (format-string &rest args) "Log to *Messages* if `doom-debug-p' is on. -Does not interrupt the minibuffer if it is in use, but still logs to *Messages*. -Accepts the same arguments as `message'." +Does not display text in echo area, but still logs to *Messages*. Accepts the +same arguments as `message'." `(when doom-debug-p (let ((inhibit-message (active-minibuffer-window))) (message @@ -85,7 +85,7 @@ Accepts the same arguments as `message'." (defalias 'doom-partial #'apply-partially) (defun doom-rpartial (fn &rest args) - "Return a function that is a partial application of FUN to right-hand ARGS. + "Return a partial application of FUN to right-hand ARGS. ARGS is a list of the last N arguments to pass to FUN. The result is a new function which does the same as FUN, except that the last N arguments are fixed @@ -94,6 +94,24 @@ at the values with which this function was called." (lambda (&rest pre-args) (apply fn (append pre-args args)))) +(defun doom-lookup-key (keys &optional keymap) + "Like `lookup-key', but search active keymaps if KEYMAP is omitted." + (if keymap + (lookup-key keymap keys) + (cl-loop for keymap + in (append (cl-loop for alist in emulation-mode-map-alists + append (mapcar #'cdr + (if (symbolp alist) + (if (boundp alist) (symbol-value alist)) + alist))) + (list (current-local-map)) + (mapcar #'cdr minor-mode-overriding-map-alist) + (mapcar #'cdr minor-mode-map-alist) + (list (current-global-map))) + if (keymapp keymap) + if (lookup-key keymap keys) + return it))) + ;; ;;; Sugars @@ -123,6 +141,7 @@ at the values with which this function was called." (defmacro letf! (bindings &rest body) "Temporarily rebind function and macros in BODY. +Intended as a simpler version of `cl-letf' and `cl-macrolet'. BINDINGS is either a) a list of, or a single, `defun' or `defmacro'-ish form, or b) a list of (PLACE VALUE) bindings as `cl-letf*' would accept. @@ -157,7 +176,8 @@ the same name, for use with `funcall' or `apply'. ARGLIST and BODY are as in "Run FORMS without generating any output. This silences calls to `message', `load', `write-region' and anything that -writes to `standard-output'." +writes to `standard-output'. In interactive sessions this won't suppress writing +to *Messages*, only inhibit output in the echo area." `(if doom-debug-p (progn ,@forms) ,(if doom-interactive-p @@ -193,21 +213,24 @@ See `eval-if!' for details on this macro's purpose." ;;; Closure factories (defmacro fn! (arglist &rest body) - "Expands to (cl-function (lambda ARGLIST BODY...))" + "Returns (cl-function (lambda ARGLIST BODY...)) +The closure is wrapped in `cl-function', meaning ARGLIST will accept anything +`cl-defun' will. " (declare (indent defun) (doc-string 1) (pure t) (side-effect-free t)) `(cl-function (lambda ,arglist ,@body))) (defmacro cmd! (&rest body) - "Expands to (lambda () (interactive) ,@body). + "Returns (lambda () (interactive) ,@body) A factory for quickly producing interaction commands, particularly for keybinds or aliases." (declare (doc-string 1) (pure t) (side-effect-free t)) `(lambda (&rest _) (interactive) ,@body)) (defmacro cmd!! (command &optional prefix-arg &rest args) - "Expands to a closure that interactively calls COMMAND with ARGS. -A factory for quickly producing interactive, prefixed commands for keybinds or -aliases." + "Returns a closure that interactively calls COMMAND with ARGS and PREFIX-ARG. +Like `cmd!', but allows you to change `current-prefix-arg' or pass arguments to +COMMAND. This macro is meant to be used as a target for keybinds (e.g. with +`define-key' or `map!')." (declare (doc-string 1) (pure t) (side-effect-free t)) `(lambda (arg &rest _) (interactive "P") (let ((current-prefix-arg (or ,prefix-arg arg))) @@ -217,7 +240,20 @@ aliases." ,command ,@args)))) (defmacro cmds! (&rest branches) - "Expands to a `menu-item' dispatcher for keybinds." + "Returns a dispatcher that runs the a command in BRANCHES. +Meant to be used as a target for keybinds (e.g. with `define-key' or `map!'). + +BRANCHES is a flat list of CONDITION COMMAND pairs. CONDITION is a lisp form +that is evaluated when (and each time) the dispatcher is invoked. If it returns +non-nil, COMMAND is invoked, otherwise it falls through to the next pair. + +The last element of BRANCHES can be a COMMANd with no CONDITION. This acts as +the fallback if all other conditions fail. + +Otherwise, Emacs will fall through the keybind and search the next keymap for a +keybind (as if this keybind never existed). + +See `general-key-dispatch' for what other arguments it accepts in BRANCHES." (declare (doc-string 1)) (let ((docstring (if (stringp (car branches)) (pop branches) "")) fallback) @@ -228,6 +264,8 @@ aliases." :docstring ,docstring ,@branches))) +(defalias 'kbd! 'general-simulate-key) + ;; For backwards compatibility (defalias 'λ! 'cmd!) (defalias 'λ!! 'cmd!!) @@ -612,7 +650,7 @@ set earlier in the ‘setq-local’. The return value of the (macroexp-progn (nreverse expr))))) (eval-when! (version< emacs-version "27.1") - ;; DEPRECATED Backported from Emacs 27; earlier verisons don't have REMOTE arg + ;; DEPRECATED Backported from Emacs 27. Remove when 26.x support is dropped. (defun executable-find (command &optional remote) "Search for COMMAND in `exec-path' and return the absolute file name. Return nil if COMMAND is not found anywhere in `exec-path'. If @@ -633,5 +671,125 @@ REMOTE is non-nil, search on the remote host indicated by (file-name-quote default-directory)))) (locate-file command exec-path exec-suffixes 1))))) +(eval-when! (not (fboundp 'exec-path)) + ;; DEPRECATED Backported from Emacs 27.1. Remove when 26.x support is dropped. + (defun exec-path () + "Return list of directories to search programs to run in remote subprocesses. +The remote host is identified by `default-directory'. For remote +hosts that do not support subprocesses, this returns `nil'. +If `default-directory' is a local directory, this function returns +the value of the variable `exec-path'." + (let ((handler (find-file-name-handler default-directory 'exec-path))) + (if handler + (funcall handler 'exec-path) + exec-path)))) + +;; DEPRECATED Remove once enough packages have adapted to these breaking changes. +(eval-when! EMACS28+ + (defmacro define-obsolete-variable-alias (obsolete-name current-name &optional when docstring) + "Make OBSOLETE-NAME a variable alias for CURRENT-NAME and mark it obsolete. + +WHEN should be a string indicating when the variable was first +made obsolete, for example a date or a release number. + +This macro evaluates all its parameters, and both OBSOLETE-NAME +and CURRENT-NAME should be symbols, so a typical usage would look like: + + (define-obsolete-variable-alias 'foo-thing 'bar-thing \"27.1\") + +This macro uses `defvaralias' and `make-obsolete-variable' (which see). +See the Info node `(elisp)Variable Aliases' for more details. + +If CURRENT-NAME is a defcustom or a defvar (more generally, any variable +where OBSOLETE-NAME may be set, e.g. in an init file, before the +alias is defined), then the define-obsolete-variable-alias +statement should be evaluated before the defcustom, if user +customizations are to be respected. The simplest way to achieve +this is to place the alias statement before the defcustom (this +is not necessary for aliases that are autoloaded, or in files +dumped with Emacs). This is so that any user customizations are +applied before the defcustom tries to initialize the +variable (this is due to the way `defvaralias' works). + +For the benefit of Customize, if OBSOLETE-NAME has +any of the following properties, they are copied to +CURRENT-NAME, if it does not already have them: +`saved-value', `saved-variable-comment'." + (declare (doc-string 4) + (advertised-calling-convention + (obsolete-name current-name when &optional docstring) "23.1")) + `(progn + (defvaralias ,obsolete-name ,current-name ,docstring) + (dolist (prop '(saved-value saved-variable-comment)) + (and (get ,obsolete-name prop) + (null (get ,current-name prop)) + (put ,current-name prop (get ,obsolete-name prop)))) + (make-obsolete-variable ,obsolete-name ,current-name ,when))) + + (defmacro define-obsolete-face-alias (obsolete-face current-face &optional when) + "Make OBSOLETE-FACE a face alias for CURRENT-FACE and mark it obsolete. +WHEN should be a string indicating when the face was first made +obsolete, for example a date or a release number." + `(progn (put ,obsolete-face 'face-alias ,current-face) + (put ,obsolete-face 'obsolete-face (or (purecopy ,when) t)))) + + (defmacro define-obsolete-function-alias (obsolete-name current-name &optional when docstring) + "Set OBSOLETE-NAME's function definition to CURRENT-NAME and mark it obsolete. + +\(define-obsolete-function-alias \\='old-fun \\='new-fun \"22.1\" \"old-fun's doc.\") + +is equivalent to the following two lines of code: + +\(defalias \\='old-fun \\='new-fun \"old-fun's doc.\") +\(make-obsolete \\='old-fun \\='new-fun \"22.1\") + +WHEN should be a string indicating when the function was first +made obsolete, for example a date or a release number. + +See the docstrings of `defalias' and `make-obsolete' for more details." + (declare (doc-string 4)) + `(progn (defalias ,obsolete-name ,current-name ,docstring) + (make-obsolete ,obsolete-name ,current-name ,when))) + + (defadvice! doom--fix-wrong-number-of-args-during-byte-compile (recipe) + :override #'straight--build-compile + (let* ((package (plist-get recipe :package)) + (dir (straight--build-dir package)) + (program (concat invocation-directory invocation-name)) + (args + `("-Q" "-L" ,dir + ,@(apply #'append + (mapcar (lambda (d) + (let ((d (straight--build-dir d))) + (when (file-exists-p d) (list "-L" d)))) + (straight--get-dependencies package))) + "--batch" + "--eval" + ,(prin1-to-string + '(progn + (defmacro define-obsolete-face-alias (obsolete-face current-face &optional when) + `(progn (put ,obsolete-face 'face-alias ,current-face) + (put ,obsolete-face 'obsolete-face (or (purecopy ,when) t)))) + (defmacro define-obsolete-function-alias (obsolete-name current-name &optional when docstring) + `(progn (defalias ,obsolete-name ,current-name ,docstring) + (make-obsolete ,obsolete-name ,current-name ,when))) + (defmacro define-obsolete-variable-alias (obsolete-name current-name &optional when docstring) + `(progn (defvaralias ,obsolete-name ,current-name ,docstring) + (dolist (prop '(saved-value saved-variable-comment)) + (and (get ,obsolete-name prop) + (null (get ,current-name prop)) + (put ,current-name prop (get ,obsolete-name prop)))) + (make-obsolete-variable ,obsolete-name ,current-name ,when))))) + "--eval" + ,(format "(byte-recompile-directory %S 0 'force)" dir)))) + (when straight-byte-compilation-buffer + (with-current-buffer (get-buffer-create straight-byte-compilation-buffer) + (insert "\n$ " (replace-regexp-in-string + "\\(-L [^z-a]*? \\)" + "\\1\\\\ \n " + (string-join `(,program ,@args) " ")) + "\n"))) + (apply #'call-process program nil straight-byte-compilation-buffer nil args)))) + (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-modules.el b/core/core-modules.el index 6a1f776b2..8e7e7cc2e 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -203,7 +203,7 @@ This doesn't require modules to be enabled. For enabled modules us for default-directory in doom-modules-dirs for path = (concat category "/" module "/" file) if (file-exists-p path) - return (file-truename path))) + return (expand-file-name path))) (defun doom-module-from-path (&optional path enabled-only) "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path). @@ -218,7 +218,7 @@ If ENABLED-ONLY, return nil if the containing module isn't enabled." (ignore-errors (doom-module-from-path (file!)))) (let* ((file-name-handler-alist nil) - (path (file-truename (or path (file!))))) + (path (expand-file-name (or path (file!))))) (save-match-data (cond ((string-match "/modules/\\([^/]+\\)/\\([^/]+\\)\\(?:/.*\\)?$" path) (when-let* ((category (doom-keyword-intern (match-string 1 path))) @@ -226,9 +226,11 @@ If ENABLED-ONLY, return nil if the containing module isn't enabled." (and (or (null enabled-only) (doom-module-p category module)) (cons category module)))) - ((file-in-directory-p path doom-core-dir) + ((or (string-match-p (concat "^" (regexp-quote doom-core-dir)) path) + (file-in-directory-p path doom-core-dir)) (cons :core (intern (file-name-base path)))) - ((file-in-directory-p path doom-private-dir) + ((or (string-match-p (concat "^" (regexp-quote doom-private-dir)) path) + (file-in-directory-p path doom-private-dir)) (cons :private (intern (file-name-base path))))))))) (defun doom-module-load-path (&optional module-dirs) @@ -277,8 +279,8 @@ those directories. The first returned path is always `doom-private-dir'." (:if (if (eval (cadr m) t) (push (caddr m) mplist) (prependq! mplist (cdddr m)))) - (test (if (or (eval (cadr m) t) - (eq test :unless)) + (test (if (xor (eval (cadr m) t) + (eq test :unless)) (prependq! mplist (cddr m)))))) ((catch 'doom-modules (let* ((module (if (listp m) (car m) m)) @@ -329,7 +331,7 @@ This value is cached. If REFRESH-P, then don't use the cached value." use-package-minimum-reported-time (if doom-debug-p 0 0.1) use-package-expand-minimally doom-interactive-p) -;; A common mistake for new users is that they inadvertantly install their +;; A common mistake for new users is that they inadvertently install their ;; packages with package.el, by copying over old `use-package' declarations with ;; an :ensure t property. Doom doesn't use package.el, so this will throw an ;; error that will confuse beginners, so we disable `:ensure'. diff --git a/core/core-packages.el b/core/core-packages.el index bd2e916c5..856f269a5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -99,9 +99,7 @@ uses a straight or package.el command directly).") straight-vc-git-default-clone-depth 1 ;; Prefix declarations are unneeded bulk added to our autoloads file. Best ;; we don't have to deal with them at all. - autoload-compute-prefixes nil - ;; We handle it ourselves - straight-fix-org nil) + autoload-compute-prefixes nil) (with-eval-after-load 'straight ;; `let-alist' is built into Emacs 26 and onwards @@ -187,28 +185,34 @@ processed." (error "Failed to initialize package.el"))) (when (or force-p (null doom-packages)) (doom-log "Initializing straight.el") - (or (setq doom-disabled-packages nil - doom-packages (doom-package-list)) - (error "Failed to read any packages")) - (dolist (package doom-packages) - (cl-destructuring-bind - (name &key recipe disable ignore shadow &allow-other-keys) package - (unless ignore - (if disable - (cl-pushnew name doom-disabled-packages) - (when shadow - (straight-override-recipe (cons shadow '(:local-repo nil))) - (let ((site-load-path (copy-sequence doom--initial-load-path)) - lib) - (while (setq - lib (locate-library (concat (symbol-name shadow) ".el") - nil site-load-path)) - (let ((lib (directory-file-name (file-name-directory lib)))) - (setq site-load-path (delete lib site-load-path) - load-path (delete lib load-path)))))) - (when recipe - (straight-override-recipe (cons name recipe))) - (straight-register-package name))))))) + (setq doom-disabled-packages nil + doom-packages (doom-package-list)) + (let (packages) + (dolist (package doom-packages) + (cl-destructuring-bind + (name &key recipe disable ignore shadow &allow-other-keys) package + (if ignore + (straight-override-recipe (cons name '(:type built-in))) + (if disable + (cl-pushnew name doom-disabled-packages) + (when shadow + (straight-override-recipe (cons shadow `(:local-repo nil :package included :build nil :included-by ,name))) + (let ((site-load-path (copy-sequence doom--initial-load-path)) + lib) + (while (setq + lib (locate-library (concat (symbol-name shadow) ".el") + nil site-load-path)) + (let ((lib (directory-file-name (file-name-directory lib)))) + (setq site-load-path (delete lib site-load-path) + load-path (delete lib load-path)))))) + (when recipe + (straight-override-recipe (cons name recipe))) + (appendq! packages (cons name (straight--get-dependencies name))))))) + (dolist (package (cl-delete-duplicates packages :test #'equal)) + (straight-register-package package) + (let ((name (symbol-name package))) + (add-to-list 'load-path (directory-file-name (straight--build-dir name))) + (straight--load-package-autoloads name)))))) ;; @@ -231,7 +235,12 @@ processed." (defun doom-package-recipe (package &optional prop nil-value) "Returns the `straight' recipe PACKAGE was registered with." - (let ((plist (gethash (symbol-name package) straight--recipe-cache))) + (let* ((recipe (straight-recipes-retrieve package)) + (plist (doom-plist-merge + (plist-get (alist-get package doom-packages) :recipe) + (cdr (if (memq (car recipe) '(quote \`)) + (eval recipe t) + recipe))))) (if prop (if (plist-member plist prop) (plist-get plist prop) @@ -240,8 +249,14 @@ processed." (defun doom-package-recipe-repo (package) "Resolve and return PACKAGE's (symbol) local-repo property." - (if-let* ((recipe (cdr (straight-recipes-retrieve package))) - (repo (straight-vc-local-repo-name recipe))) + (if-let* ((recipe (copy-sequence (doom-package-recipe package))) + (recipe (if (and (not (plist-member recipe :type)) + (memq (plist-get recipe :host) '(github gitlab bitbucket))) + (plist-put recipe :type 'git) + recipe)) + (repo (if-let (local-repo (plist-get recipe :local-repo)) + (file-name-nondirectory (directory-file-name local-repo)) + (ignore-errors (straight-vc-local-repo-name recipe))))) repo (symbol-name package))) @@ -263,12 +278,15 @@ processed." (copy-sequence deps)))) (defun doom-package-depending-on (package &optional noerror) - "Return a list of packages that depend on the package named NAME." - (cl-check-type name symbol) + "Return a list of packages that depend on PACKAGE. + +If PACKAGE (a symbol) isn't installed, throw an error, unless NOERROR is +non-nil." + (cl-check-type package symbol) ;; can't get dependencies for built-in packages - (unless (or (doom-package-build-recipe name) + (unless (or (doom-package-build-recipe package) noerror) - (error "Couldn't find %s, is it installed?" name)) + (error "Couldn't find %s, is it installed?" package)) (cl-loop for pkg in (hash-table-keys straight--build-cache) for deps = (doom-package-dependencies pkg) if (memq package deps) @@ -478,8 +496,8 @@ elsewhere." (when-let (recipe (plist-get plist :recipe)) (cl-destructuring-bind (&key local-repo _files _flavor - _no-build _build _post-build _no-byte-compile - _no-native-compile _no-autoloads _type _repo _host _branch + _build _pre-build _post-build _includes + _type _repo _host _branch _remote _nonrecursive _fork _depth) recipe ;; Expand :local-repo from current directory diff --git a/core/core-projects.el b/core/core-projects.el index 487015d47..2bfa7a533 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -145,10 +145,10 @@ c) are not valid projectile projects." projectile-project-root-files) projectile-project-root-files-bottom-up nil))) - ;; Some utilities have issues with windows-style paths in MSYS, so emit - ;; unix-style paths instead. + ;; Some MSYS utilities auto expanded the `/' path separator, so we need to prevent it. (when IS-WINDOWS - (setenv "MSYS_NO_PATHCONV" "1")) + (setenv "MSYS_NO_PATHCONV" "1") ; Fix path in Git Bash + (setenv "MSYS2_ARG_CONV_EXCL" "--path-separator")) ; Fix path in MSYS2 ;; HACK Don't rely on VCS-specific commands to generate our file lists. That's ;; 7 commands to maintain, versus the more generic, reliable and @@ -179,13 +179,13 @@ And if it's a function, evaluate it." (cl-find-if (doom-rpartial #'executable-find t) (list "fdfind" "fd")) doom-projectile-fd-binary)) - (concat (format "%s . -0 -H --color=never --type file --type symlink --follow" + (concat (format "%s . -0 -H --color=never --type file --type symlink --follow --exclude .git" bin) (if IS-WINDOWS " --path-separator=/")))) ;; Otherwise, resort to ripgrep, which is also faster than find ((executable-find "rg" t) (concat "rg -0 --files --follow --color=never --hidden -g!.git" - (if IS-WINDOWS " --path-separator /"))) + (if IS-WINDOWS " --path-separator=/"))) ("find . -type f -print0")))) (defadvice! doom--projectile-default-generic-command-a (orig-fn &rest args) diff --git a/core/core-ui.el b/core/core-ui.el index a57448729..d237942c1 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -194,8 +194,8 @@ or if the current buffer is read-only or not file-visiting." ;; for tall lines. auto-window-vscroll nil ;; mouse - mouse-wheel-scroll-amount '(5 ((shift) . 2)) - mouse-wheel-progressive-speed nil) ; don't accelerate scrolling + mouse-wheel-scroll-amount '(2 ((shift) . hscroll)) + mouse-wheel-scroll-amount-horizontal 2) ;; Remove hscroll-margin in shells, otherwise it causes jumpiness (setq-hook! '(eshell-mode-hook term-mode-hook) hscroll-margin 0) @@ -289,18 +289,16 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; where we resize windows too quickly. (setq window-resize-pixelwise nil) -(unless (assq 'menu-bar-lines default-frame-alist) - ;; We do this in early-init.el too, but in case the user is on Emacs 26 we do - ;; it here too: disable tool and scrollbars, as Doom encourages - ;; keyboard-centric workflows, so these are just clutter (the scrollbar also - ;; impacts performance). - (add-to-list 'default-frame-alist '(menu-bar-lines . 0)) - (add-to-list 'default-frame-alist '(tool-bar-lines . 0)) - (add-to-list 'default-frame-alist '(vertical-scroll-bars))) +;; Disable tool, menu, and scrollbars. Doom is designed to be keyboard-centric, +;; so these are just clutter (the scrollbar also impacts performance). Whats +;; more, the menu bar exposes functionality that Doom doesn't endorse. +(push '(menu-bar-lines . 0) default-frame-alist) +(push '(tool-bar-lines . 0) default-frame-alist) +(push '(vertical-scroll-bars) default-frame-alist) -;; These are disabled directly through their frame parameters, to avoid the -;; extra work their minor modes do, but we have to unset these variables -;; ourselves, otherwise users will have to cycle them twice to re-enable them. +;; These are disabled directly through their frame parameters to avoid the extra +;; work their minor modes do, but their variables must be unset too, otherwise +;; users will have to cycle them twice to re-enable them. (setq menu-bar-mode nil tool-bar-mode nil scroll-bar-mode nil) @@ -344,9 +342,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; Expand the minibuffer to fit multi-line text displayed in the echo-area. This ;; doesn't look too great with direnv, however... -(setq resize-mini-windows 'grow-only - ;; But don't let the minibuffer grow beyond this size - max-mini-window-height 0.15) +(setq resize-mini-windows 'grow-only) ;; Typing yes/no is obnoxious when y/n will do (fset #'yes-or-no-p #'y-or-n-p) @@ -396,7 +392,9 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; Highlights the current line :hook (doom-first-buffer . global-hl-line-mode) :init - (defvar global-hl-line-modes '(prog-mode text-mode conf-mode special-mode) + (defvar global-hl-line-modes + '(prog-mode text-mode conf-mode special-mode + org-agenda-mode) "What modes to enable `hl-line-mode' in.") :config ;; HACK I reimplement `global-hl-line-mode' so we can white/blacklist modes in @@ -506,6 +504,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original all-the-icons-wicon all-the-icons-alltheicon) "")))) +;; Hide the mode line in completion popups and MAN pages because they serve +;; little purpose there, and is better hidden. ;;;###package hide-mode-line-mode (add-hook! '(completion-list-mode-hook Man-mode-hook) #'hide-mode-line-mode) @@ -520,17 +520,19 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;;;###package rainbow-delimiters ;; Helps us distinguish stacked delimiter pairs, especially in parentheses-drunk -;; languages like Lisp. +;; languages like Lisp. I reduce it from it's default of 9 to reduce the +;; complexity of the font-lock keyword and hopefully buy us a few ms of +;; performance. (setq rainbow-delimiters-max-face-count 3) ;; ;;; Line numbers -;; Explicitly define a width to reduce computation +;; Explicitly define a width to reduce the cost of on-the-fly computation (setq-default display-line-numbers-width 3) -;; Show absolute line numbers for narrowed regions makes it easier to tell the +;; Show absolute line numbers for narrowed regions to make it easier to tell the ;; buffer is narrowed, and where you are, exactly. (setq-default display-line-numbers-widen t) @@ -550,6 +552,14 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; ;;; Theme & font +;; User themes should live in ~/.doom.d/themes, not ~/.emacs.d +(setq custom-theme-directory (concat doom-private-dir "themes/")) + +;; Always prioritize the user's themes above the built-in/packaged ones. +(setq custom-theme-load-path + (cons 'custom-theme-directory + (remq 'custom-theme-directory custom-theme-load-path))) + ;; Underline looks a bit better when drawn lower (setq x-underline-at-descent-line t) @@ -589,7 +599,7 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.") (when doom-variable-pitch-font (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font)) (when (fboundp 'set-fontset-font) - (dolist (font (append doom-unicode-extra-fonts (doom-enlist doom-unicode-font))) + (dolist (font (cons doom-unicode-font doom-unicode-extra-fonts)) (set-fontset-font t 'unicode font nil 'prepend))) (run-hooks 'after-setting-font-hook)) ((debug error) diff --git a/core/core.el b/core/core.el index 961f82733..a954358ef 100644 --- a/core/core.el +++ b/core/core.el @@ -158,11 +158,11 @@ users).") ;; HACK Disable native-compilation for some troublesome packages (mapc (doom-partial #'add-to-list 'comp-deferred-compilation-deny-list) (let ((local-dir-re (concat "\\`" (regexp-quote doom-local-dir)))) - (list (concat local-dir-re ".*/evil-collection-vterm\\.el\\'") - ;; https://github.com/nnicandro/emacs-jupyter/issues/297 - (concat local-dir-re ".*/jupyter-channel\\.el\\'") + (list (concat "\\`" (regexp-quote doom-autoloads-file) "\\'") + (concat local-dir-re ".*/evil-collection-vterm\\.el\\'") (concat local-dir-re ".*/with-editor\\.el\\'") - (concat "\\`" (regexp-quote doom-autoloads-file) "\\'")))) + ;; https://github.com/nnicandro/emacs-jupyter/issues/297 + (concat local-dir-re ".*/jupyter-channel\\.el\\'")))) ;; Default to using all cores, rather than half of them, since we compile ;; things ahead-of-time in a non-interactive session. (defadvice! doom--comp-use-all-cores-a () @@ -208,7 +208,8 @@ users).") inhibit-default-init t ;; Shave seconds off startup time by starting the scratch buffer in ;; `fundamental-mode', rather than, say, `org-mode' or `text-mode', which - ;; pull in a ton of packages. + ;; pull in a ton of packages. `doom/open-scratch-buffer' provides a better + ;; scratch buffer anyway. initial-major-mode 'fundamental-mode initial-scratch-message nil) @@ -219,7 +220,6 @@ users).") ;; We avoid `no-littering' because it's a mote too opinionated for our needs. (setq async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log") custom-file (concat doom-private-dir "custom.el") - custom-theme-directory (concat doom-private-dir "themes/") desktop-dirname (concat doom-etc-dir "desktop") desktop-base-file-name "autosave" desktop-base-lock-name "autosave-lock" @@ -247,8 +247,7 @@ config.el instead." ;;; Optimizations ;; A second, case-insensitive pass over `auto-mode-alist' is time wasted, and -;; indicates misconfiguration (or that the user needs to stop relying on case -;; insensitivity). +;; indicates misconfiguration (don't rely on case insensitivity for file names). (setq auto-mode-case-fold nil) ;; Disable bidirectional text rendering for a modest performance boost. I've set @@ -296,6 +295,10 @@ config.el instead." ;; usage, however! (setq inhibit-compacting-font-caches t) +;; Introduced in Emacs HEAD (b2f8c9f), this inhibits fontification while +;; receiving input, which should help with performance while scrolling. +(setq redisplay-skip-fontification-on-input t) + ;; Performance on Windows is considerably worse than elsewhere. We'll need ;; everything we can get. (when IS-WINDOWS @@ -378,7 +381,7 @@ config.el instead." (defvar doom-incremental-packages '(t) "A list of packages to load incrementally after startup. Any large packages -here may cause noticable pauses, so it's recommended you break them up into +here may cause noticeable pauses, so it's recommended you break them up into sub-packages. For example, `org' is comprised of many packages, and can be broken up into: @@ -612,7 +615,7 @@ to least)." (eval-after-load 'straight '(doom-initialize-packages)) ;; Bootstrap our GC manager - (add-hook 'doom-first-input-hook #'gcmh-mode) + (add-hook 'doom-first-buffer-hook #'gcmh-mode) ;; Bootstrap the interactive session (add-hook 'after-change-major-mode-hook #'doom-run-local-var-hooks-h) diff --git a/core/packages.el b/core/packages.el index d96ace855..94be74ba1 100644 --- a/core/packages.el +++ b/core/packages.el @@ -17,33 +17,28 @@ :branch ,straight-repository-branch :local-repo "straight.el" :files ("straight*.el")) - :pin "3277e1c9648b41dd5bfb239c067b8374ed2ec2bb") + :pin "f2cb888f088a790bac8731b95eeec3df068cac5f") ;; core-modules.el (package! use-package :type 'core - :pin "caa92f1d64fc25480551757d854b4b49981dfa6b") + :pin "317137b07687f16ea97a2493b0a6768c9df381a0") ;; core-ui.el -(package! all-the-icons :pin "6917b08f64dd8487e23769433d6cb9ba11f4152f") +(package! all-the-icons :pin "5fa728399bd6233a82bbfd4f7cb203a1d7ede708") (package! hide-mode-line :pin "88888825b5b27b300683e662fa3be88d954b1cea") (package! highlight-numbers :pin "8b4744c7f46c72b1d3d599d4fb75ef8183dee307") (package! rainbow-delimiters :pin "f43d48a24602be3ec899345a3326ed0247b960c6") -(package! restart-emacs :pin "e5707491d7ac20879465bb52e282ad1416748378") +(package! restart-emacs :pin "1607da2bc657fe05ae01f7fdf26f716eafead02c") ;; core-editor.el -(package! better-jumper :pin "fe548d22c9228b60d9c8a2a452a6c2e03dfdf238") -(package! dtrt-indent :pin "a7ade6d244eeeda2ada9f7eca565491cea4b622a") +(package! better-jumper :pin "411ecdf6e7a3e1b4ced7605070d2309e5fc46556") +(package! dtrt-indent :pin "854b9a1ce93d9926018a0eb18e6e552769c5407d") (package! helpful :pin "584ecc887bb92133119f93a6716cdf7af0b51dca") (package! pcre2el :pin "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d") -(package! smartparens :pin "7f5825dd655942c3d56d14acabab1ffab1aa2ae2") -(package! so-long - :built-in 'prefer ; included in Emacs 27+ - ;; REVIEW so-long is slated to be published to ELPA eventually, but until then - ;; I've created my own mirror for it because git.savannah.gnu.org runs - ;; on a potato. - :recipe (:host github :repo "hlissner/emacs-so-long") - :pin "ed666b0716f60e8988c455804de24b55919e71ca") +(package! smartparens :pin "63695c64233d215a92bf08e762f643cdb595bdd9") +;; DEPRECATED Built into Emacs 27+; remove when we drop 26 support +(package! so-long :built-in 'prefer :pin "a5d445de4829b2327bd51dad2fb04291c7a0ec5f") (package! ws-butler ;; Use my fork of ws-butler, which has a few choice improvements and ;; optimizations (the original has been abandoned). @@ -51,8 +46,8 @@ :pin "2bb49d3ee7d2cba133bc7e9cdac416cd1c5e4fe0") ;; core-projects.el -(package! projectile :pin "d1cfad008b1719a6bee17fbe9479db414c0dc5d9") +(package! projectile :pin "fd5994762a90c2311e8aa40c37373f24e1743a55") ;; core-keybinds.el (package! general :pin "a0b17d207badf462311b2eef7c065b884462cb7c") -(package! which-key :pin "ca268fd313d3fb2bd03a8b5e4bdcca675ce58ca7") +(package! which-key :pin "c0608e812a8d1bc7aefeacdfaeb56a7272eabf44") diff --git a/docs/getting_started.org b/docs/getting_started.org index 90669c4bc..61e42b71b 100644 --- a/docs/getting_started.org +++ b/docs/getting_started.org @@ -50,7 +50,7 @@ us know! - [[#installing-packages-from-external-sources][Installing packages from external sources]] - [[#pinning-packages-to-specific-commits][Pinning packages to specific commits]] - [[#disabling-packages][Disabling packages]] - - [[#changing-a-recipe-for-a-included-package][Changing a recipe for a included package]] + - [[#changing-a-recipe-for-an-included-package][Changing a recipe for an included package]] - [[#usingloading-local-packages][Using/loading local packages]] - [[#configuring-doom][Configuring Doom]] - [[#configuring-packages][Configuring packages]] @@ -886,7 +886,7 @@ packages: ensure your changes take effect. #+end_quote -*** Changing a recipe for a included package +*** Changing a recipe for an included package If a Doom module installs package X from one place, but you'd like to install it from another (say, a superior fork), add a ~package!~ declaration for it in your =DOOMDIR/packages.el=. Your private declarations always have precedence over @@ -932,9 +932,9 @@ live testing. To do this specify a ~:local-repo~ in that package's recipe: ;; you want: :files ("*.el" "src/lisp/*.el") - ;; With ':no-byte-compile t' you can avoid having to run 'doom sync' - ;; every time you change the package. - :no-byte-compile t)) + ;; With this you can avoid having to run 'doom sync' every time you + ;; change the package. + :build (:not compile))) #+END_SRC Alternatively, add the package's location to Emacs' ~load-path~. Do this if you @@ -1176,7 +1176,7 @@ Placing this on top of a lisp form will do one of two things: =~/.emacs.d/.local/autoloads.el=, which is read very early in the startup process). 2. Or copy that lisp form to Doom's autoload file verbatim (usually the case for - anything other then ~def*~ forms, like ~defun~ or ~defmacro~). + anything other than ~def*~ forms, like ~defun~ or ~defmacro~). Doom's autoload file is generated by scanning these files when you execute ~doom sync~. @@ -1414,9 +1414,9 @@ org module documentation]] for details on how to add support for it. #+END_SRC These two lines are a common sight in Emacs configs, but they are unnecessary -for Doom Emacs. We already use the more sophisticated =wsbutler= to manage +for Doom Emacs. We already use the more sophisticated =ws-butler= to manage extraneous whitespace. However, you might have the impression that it isn't -working. That's because =wsbutler= works in two unusual ways, meant to be less +working. That's because =ws-butler= works in two unusual ways, meant to be less imposing than its alternatives: 1. It only cleans up trailing whitespace /on lines that you've touched/ (but @@ -1431,7 +1431,7 @@ imposing than its alternatives: However, if it's truly deliberate, ~M-x delete-trailing-whitespaces~ and ~M-x whitespace-cleanup~ are available to be called =deliberately=, instead. -2. =wsbutler= replaces trailing whitespace and newlines with *virtual* +2. =ws-butler= replaces trailing whitespace and newlines with *virtual* whitespace. This is whitespace that only exists in the Emacs buffer, but isn't actually written to the file. @@ -1470,7 +1470,7 @@ provide tools to make this easier. Here are a few things you can try, first: issues that originate from upstream. + If you happen to know what module(s) are relevant to your issue, check their - documentation (press = h m= to jump to a module's documentation). Your + documentation (press = h d m= to jump to a module's documentation). Your issue may be documented. + If possible, see if the issue can be reproduced in vanilla Emacs (Emacs @@ -1559,9 +1559,9 @@ and before the subcommand. This will be fixed eventually. Often, you may find it helpful for debugging to evaluate some Emacs Lisp. Here are couple things you can do: -+ Use =M-;= (bound to ~eval-expression~), ++ Use =M-:= (bound to ~eval-expression~), + =SPC x= will open a scratch buffer. ~M-x emacs-lisp-mode~ will change it to - the appropriate major mode, then use ~+eval:region~ (=gr=) and ~+eval:buffer~ + the appropriate major mode, then use ~+eval:region~ (=gr=) and ~+eval/buffer~ (=gR=) to evaluate code, ** How to determine the origin of a bug @@ -1571,7 +1571,7 @@ in a fresh instance of Emacs with varying amounts of Doom loaded (none at all, all of it, or somewhere in between). This can be helpful for isolating bugs to determine who you should report a bug to. -If you can recreate a bug in vanilla Emacs than it should be reported to the +If you can recreate a bug in vanilla Emacs then it should be reported to the developers of the relevant packages or, perhaps, the Emacs devs themselves. Otherwise, it is best to bring it up on the Doom Emacs issue list, rather than diff --git a/early-init.el b/early-init.el index 224213d9a..4d182684b 100644 --- a/early-init.el +++ b/early-init.el @@ -1,28 +1,43 @@ ;;; early-init.el -*- lexical-binding: t; -*- -;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, -;; before package and UI initialization happens. +;; Emacs 27.1 introduced early-init.el, which is run before init.el, before +;; package and UI initialization happens, and before site files are loaded. -;; Defer garbage collection further back in the startup process +;; A big contributor to startup times is garbage collection. We up the gc +;; threshold to temporarily prevent it from running, then reset it later by +;; enabling `gcmh-mode'. Not resetting it will cause stuttering/freezes. (setq gc-cons-threshold most-positive-fixnum) +;; In noninteractive sessions, prioritize non-byte-compiled source files to +;; prevent the use of stale byte-code. Otherwise, it saves us a little IO time +;; to skip the mtime checks on every *.elc file. +(setq load-prefer-newer noninteractive) + ;; In Emacs 27+, package initialization occurs before `user-init-file' is ;; loaded, but after `early-init-file'. Doom handles package initialization, so ;; we must prevent Emacs from doing it early! (setq package-enable-at-startup nil) (fset #'package--ensure-init-file #'ignore) ; DEPRECATED Removed in 28 -;; Prevent the glimpse of un-styled Emacs by disabling these UI elements early. -(push '(menu-bar-lines . 0) default-frame-alist) -(push '(tool-bar-lines . 0) default-frame-alist) -(push '(vertical-scroll-bars) default-frame-alist) +;; `file-name-handler-alist' is consulted on every `require', `load' and various +;; path/io functions. You get a minor speed up by nooping this. However, this +;; may cause problems on builds of Emacs where its site lisp files aren't +;; byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine) +(unless (daemonp) + (defvar doom--initial-file-name-handler-alist file-name-handler-alist) + (setq file-name-handler-alist nil) + ;; Restore `file-name-handler-alist' later, because it is needed for handling + ;; encrypted or compressed files, among other things. + (defun doom-reset-file-handler-alist-h () + ;; Re-add rather than `setq', because changes to `file-name-handler-alist' + ;; since startup ought to be preserved. + (dolist (handler file-name-handler-alist) + (add-to-list 'doom--initial-file-name-handler-alist handler)) + (setq file-name-handler-alist doom--initial-file-name-handler-alist)) + (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)) -;; Resizing the Emacs frame can be a terribly expensive part of changing the -;; font. By inhibiting this, we easily halve startup times with fonts that are -;; larger than the system default. -(setq frame-inhibit-implied-resize t) +;; Ensure Doom is running out of this file's directory +(setq user-emacs-directory (file-name-directory load-file-name)) -;; Prevent unwanted runtime builds in gccemacs (native-comp); packages are -;; compiled ahead-of-time when they are installed and site files are compiled -;; when gccemacs is installed. -(setq comp-deferred-compilation nil) +;; Load the heart of Doom Emacs +(load (concat user-emacs-directory "core/core") nil 'nomessage) diff --git a/init.el b/init.el index bbcc64468..9ac6c416f 100644 --- a/init.el +++ b/init.el @@ -27,43 +27,11 @@ ;; ;;; License: MIT -(when (< emacs-major-version 26) - (error "Detected Emacs v%s. Doom only supports Emacs 26 and newer" - emacs-version)) - -;; A big contributor to startup times is garbage collection. We up the gc -;; threshold to temporarily prevent it from running, then reset it later by -;; enabling `gcmh-mode'. Not resetting it will cause stuttering/freezes. -(setq gc-cons-threshold most-positive-fixnum) - -;; In noninteractive sessions, prioritize non-byte-compiled source files to -;; prevent the use of stale byte-code. Otherwise, it saves us a little IO time -;; to skip the mtime checks on every *.elc file. -(setq load-prefer-newer noninteractive) - -;; `file-name-handler-alist' is consulted on every `require', `load' and various -;; path/io functions. You get a minor speed up by nooping this. However, this -;; may cause problems on builds of Emacs where its site lisp files aren't -;; byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine) -(unless (daemonp) - (defvar doom--initial-file-name-handler-alist file-name-handler-alist) - (setq file-name-handler-alist nil) - ;; Restore `file-name-handler-alist' later, because it is needed for handling - ;; encrypted or compressed files, among other things. - (defun doom-reset-file-handler-alist-h () - ;; Re-add rather than `setq', because changes to `file-name-handler-alist' - ;; since startup ought to be preserved. - (dolist (handler file-name-handler-alist) - (add-to-list 'doom--initial-file-name-handler-alist handler)) - (setq file-name-handler-alist doom--initial-file-name-handler-alist)) - (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)) - -;; Ensure Doom is running out of this file's directory -(setq user-emacs-directory (file-name-directory load-file-name)) - -;; Load the heart of Doom Emacs -(load (concat user-emacs-directory "core/core") - nil 'nomessage) +;; In the strange case that early-init.el wasn't loaded (e.g. you're using +;; Chemacs 1? Or you're loading this file directly?), we do it explicitly: +(unless (boundp 'doom-version) + (load (concat (file-name-directory load-file-name) "early-init") + nil t)) ;; And let 'er rip! (doom-initialize) diff --git a/modules/checkers/spell/README.org b/modules/checkers/spell/README.org index 93fb7e483..408570acf 100644 --- a/modules/checkers/spell/README.org +++ b/modules/checkers/spell/README.org @@ -65,6 +65,7 @@ with anything other than =aspell= yet. ** Aspell + Ubuntu: ~apt-get install aspell aspell-en~ ++ macOS: ~brew install aspell~ + Arch Linux: ~pacman -S aspell aspell-en~ + NixOS: #+BEGIN_SRC nix @@ -75,10 +76,22 @@ with anything other than =aspell= yet. } #+END_SRC -** TODO Hunspell +** Hunspell ++ Ubuntu: ~apt-get install hunspell~ ++ macOS: ~brew install hunspell~ ++ Arch Linux: ~pacman -S hunspell~ ++ NixOS: + #+BEGIN_SRC nix + { + environment.systemPackages = with pkgs; [ + hunspell + ]; + } + #+END_SRC ** Enchant + Ubuntu: ~apt-get install enchant-2~ ++ macOS: ~brew install enchant~ + Arch Linux: ~pacman -S enchant~ + NixOS: #+BEGIN_SRC nix diff --git a/modules/checkers/spell/autoload/+spell-fu.el b/modules/checkers/spell/autoload/+spell-fu.el index 25a0a1063..d90eeeebe 100644 --- a/modules/checkers/spell/autoload/+spell-fu.el +++ b/modules/checkers/spell/autoload/+spell-fu.el @@ -65,7 +65,8 @@ (featurep! :completion helm))) (call-interactively #'ispell-word) (cl-destructuring-bind (start . end) - (bounds-of-thing-at-point 'word) + (or (bounds-of-thing-at-point 'word) + (user-error "No word at point")) (let ((word (thing-at-point 'word t)) (orig-pt (point)) poss ispell-filter) diff --git a/modules/checkers/spell/config.el b/modules/checkers/spell/config.el index b28bc4b05..f72713b26 100644 --- a/modules/checkers/spell/config.el +++ b/modules/checkers/spell/config.el @@ -32,8 +32,6 @@ ispell-extra-args '("--sug-mode=ultra" "--run-together")) - (unless ispell-dictionary - (setq ispell-dictionary "english")) (unless ispell-aspell-dict-dir (setq ispell-aspell-dict-dir (ispell-get-aspell-config-value "dict-dir"))) @@ -147,7 +145,7 @@ (add-hook! 'spell-fu-mode-hook (defun +spell-init-excluded-faces-h () "Set `spell-fu-faces-exclude' according to `+spell-excluded-faces-alist'." - (when-let (excluded (alist-get major-mode +spell-excluded-faces-alist)) + (when-let (excluded (cdr (cl-find-if #'derived-mode-p +spell-excluded-faces-alist :key #'car))) (setq-local spell-fu-faces-exclude excluded)))) ;; TODO custom `spell-fu-check-range' function to reduce false positives @@ -199,7 +197,10 @@ e.g. proselint and langtool." (add-hook 'flyspell-mode-hook #'+spell-init-flyspell-predicate-h) (let ((flyspell-correct - (cmds! (and (not (or mark-active (ignore-errors (evil-insert-state-p)))) + (cmds! (and (not mark-active) + (not (and (bound-and-true-p evil-local-mode) + (or (evil-insert-state-p) + (evil-emacs-state-p)))) (memq 'flyspell-incorrect (face-at-point nil t))) #'flyspell-correct-at-point))) (map! :map flyspell-mouse-map diff --git a/modules/checkers/syntax/config.el b/modules/checkers/syntax/config.el index 93b7d73da..e535ab226 100644 --- a/modules/checkers/syntax/config.el +++ b/modules/checkers/syntax/config.el @@ -9,10 +9,10 @@ :config (setq flycheck-emacs-lisp-load-path 'inherit) - ;; Check only when saving or opening files. Newline & idle checks are a mote - ;; excessive and can catch code in an incomplete state, producing false - ;; positives, so we removed them. - (setq flycheck-check-syntax-automatically '(save mode-enabled idle-buffer-switch)) + ;; Rerunning checks on every newline is a mote excessive. + (delq 'new-line flycheck-check-syntax-automatically) + ;; And don't recheck on idle as often + (setq flycheck-idle-change-delay 1.0) ;; For the above functionality, check syntax in a buffer that you switched to ;; only briefly. This allows "refreshing" the syntax check state for several @@ -24,7 +24,9 @@ ;; Don't commandeer input focus if the error message pops up (happens when ;; tooltips and childframes are disabled). - (set-popup-rule! "^\\*Flycheck error messages\\*" :select nil) + (set-popup-rules! + '(("^\\*Flycheck error messages\\*" :select nil) + ("^\\*Flycheck errors\\*" :size 0.25))) (add-hook! 'doom-escape-hook :append (defun +syntax-check-buffer-h () diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 95197780f..55f770750 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -2,7 +2,7 @@ ;;;###autoload (defvar +company-backend-alist - '((text-mode company-dabbrev company-yasnippet company-ispell) + '((text-mode (:separate company-dabbrev company-yasnippet company-ispell)) (prog-mode company-capf company-yasnippet) (conf-mode company-capf company-dabbrev-code company-yasnippet)) "An alist matching modes to company backends. The backends for any mode is diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index cd5580d23..36eb3450c 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -13,7 +13,7 @@ (when (featurep! +fuzzy) (package! helm-flx :pin "6640fac5cb16bee73c95b8ed1248a4e5e113690e")) (when (featurep! +childframe) - (package! posframe :pin "e1552c82dffaadc5e7de09a44880a498197ffbee")) + (package! posframe :pin "efd7ea490defc53a5b78e7469a3a35d225b766cc")) (when (featurep! :lang org) (package! helm-org :pin "b7a18dfc17e8b933956d61d68c435eee03a96c24")) (package! helm-descbinds :pin "b72515982396b6e336ad7beb6767e95a80fca192") diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 806ede1ef..6877ed766 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -59,6 +59,8 @@ results buffer.") (setq ivy-height 17 ivy-wrap t ivy-fixed-height-minibuffer t + ivy-read-action-function #'ivy-hydra-read-action + ivy-read-action-format-function #'ivy-read-action-format-columns projectile-completion-system 'ivy ;; don't show recent files in switch-buffer ivy-use-virtual-buffers nil @@ -83,22 +85,22 @@ results buffer.") (add-hook! 'minibuffer-exit-hook (defun +ivy--set-jump-point-maybe-h () - (and (markerp (bound-and-true-p +ivy--origin)) - (not (equal (ignore-errors (with-ivy-window (point-marker))) - +ivy--origin)) - (with-current-buffer (marker-buffer +ivy--origin) - (better-jumper-set-jump +ivy--origin))) + (when (markerp (bound-and-true-p +ivy--origin)) + (unless (equal (ignore-errors (with-ivy-window (point-marker))) + +ivy--origin) + (with-current-buffer (marker-buffer +ivy--origin) + (better-jumper-set-jump +ivy--origin))) + (set-marker +ivy--origin nil)) (setq +ivy--origin nil))) (after! yasnippet (add-hook 'yas-prompt-functions #'+ivy-yas-prompt-fn)) - (defadvice! +ivy--inhibit-completion-in-region-a (orig-fn &rest args) - "`ivy-completion-in-region' struggles with completing certain -evil-ex-specific constructs, so we disable it solely in evil-ex." - :around #'evil-ex - (let ((completion-in-region-function #'completion--in-region)) - (apply orig-fn args))) + (after! ivy-hydra + ;; Ensure `ivy-dispatching-done' and `hydra-ivy/body' hydras can be + ;; exited / toggled by the same key binding they were opened + (add-to-list 'ivy-dispatching-done-hydra-exit-keys '("C-o" nil)) + (defhydra+ hydra-ivy () ("M-o" nil))) (define-key! ivy-minibuffer-map [remap doom/delete-backward-word] #'ivy-backward-kill-word @@ -182,6 +184,7 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." [remap describe-face] #'counsel-faces [remap describe-function] #'counsel-describe-function [remap describe-variable] #'counsel-describe-variable + [remap describe-symbol] #'counsel-describe-symbol [remap evil-ex-registers] #'counsel-evil-registers [remap evil-show-marks] #'counsel-mark-ring [remap execute-extended-command] #'counsel-M-x @@ -220,19 +223,14 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." (when (stringp counsel-rg-base-command) (setq counsel-rg-base-command (split-string counsel-rg-base-command))) - ;; REVIEW Fix #3215: prevents mingw on Windows throwing an error trying to - ;; expand / to an absolute path. Remove this when it is fixed upstream - ;; in counsel. - (when (and (memq system-type '(windows-nt ms-dos)) - (listp counsel-rg-base-command) - (member "--path-separator" counsel-rg-base-command)) - (setf (cadr (member "--path-separator" counsel-rg-base-command)) - "/")) - ;; Integrate with `helpful' (setq counsel-describe-function-function #'helpful-callable counsel-describe-variable-function #'helpful-variable) + ;; Decorate `doom/help-custom-variable' results the same way as + ;; `counsel-describe-variable' (adds value and docstring columns). + (ivy-configure 'doom/help-custom-variable :parent 'counsel-describe-variable) + ;; Record in jumplist when opening files via counsel-{ag,rg,pt,git-grep} (add-hook 'counsel-grep-post-action-hook #'better-jumper-set-jump) (add-hook 'counsel-grep-post-action-hook #'recenter) @@ -285,15 +283,15 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." "Change `counsel-file-jump' to use fd or ripgrep, if they are available." :override #'counsel--find-return-list (cl-destructuring-bind (find-program . args) - (cond ((when-let (fd (executable-find (or doom-projectile-fd-binary "fd"))) + (cond ((when-let (fd (executable-find (or doom-projectile-fd-binary "fd") t)) (append (list fd "-H" "--color=never" "--type" "file" "--type" "symlink" "--follow") (if IS-WINDOWS '("--path-separator=/"))))) - ((executable-find "rg") + ((executable-find "rg" t) (append (list "rg" "--files" "--follow" "--color=never" "--hidden" "-g!.git" "--no-messages") (cl-loop for dir in projectile-globally-ignored-directories collect "--glob" collect (concat "!" dir)) - (if IS-WINDOWS (list "--path-separator" "/")))) + (if IS-WINDOWS '("--path-separator=/")))) ((cons find-program args))) (unless (listp args) (user-error "`counsel-file-jump-args' is a list now, please customize accordingly.")) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 834f2b93c..578571141 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ivy/packages.el -(package! swiper :pin "778d8bffa33ae0bf432aa23370bb2a535d2132ce") +(package! swiper :pin "d2891aab7b816aebf21ebd01ce33933a6ac6244f") (package! ivy) (package! ivy-hydra) (package! ivy-avy) @@ -9,16 +9,16 @@ (package! amx :pin "ccfc92c600df681df5e8b5fecec328c462ceb71e") (package! counsel-projectile :pin "06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b") -(package! ivy-rich :pin "c0a164ce42920df0629c87dad5ea1bddc79ceac3") +(package! ivy-rich :pin "f8a1f5c90d2a113b597ef5903634c089fce3365b") (package! wgrep :pin "f0ef9bfa44db503cdb2f83fcfbd2fa4e2382ef1f") (if (featurep! +prescient) - (package! ivy-prescient :pin "5d139e5b1fe03ccaddff8c250ab8e9d795071b95") + (package! ivy-prescient :pin "42adc802d3ba6c747bed7ea1f6e3ffbbdfc7192d") (when (featurep! +fuzzy) (package! flx :pin "647cb2f92f9936c62e277d7a74ad54a80502d255"))) (when (featurep! +childframe) - (package! ivy-posframe :pin "08a00b81747c6b623dd1adc7491a1e2a4c3a3d2a")) + (package! ivy-posframe :pin "83047d440ff132d5a45acde5955f71853edeefb9")) (when (featurep! +icons) (package! all-the-icons-ivy :pin "a70cbfa1effe36efc946a823a580cec686d5e88d")) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index d58560566..7e59de95f 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -72,7 +72,7 @@ :desc "Find file from here" "F" #'+default/find-file-under-here :desc "Locate file" "l" #'locate :desc "Rename/move this file" "m" #'doom/move-this-file - :desc "Find file in private config" "p" #'doom/open-private-config + :desc "Find file in private config" "p" #'doom/find-file-in-private-config :desc "Browse private config" "P" #'doom/open-private-config :desc "Recent files" "r" #'recentf-open-files :desc "Recent project files" "R" #'projectile-recentf @@ -307,6 +307,7 @@ :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk) (:when (featurep! :tools magit) :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Magit file dispatch" "." #'magit-file-dispatch :desc "Forge dispatch" "'" #'forge-dispatch :desc "Magit status" "g" #'magit-status :desc "Magit status here" "G" #'magit-status-here diff --git a/modules/config/default/+emacs.el b/modules/config/default/+emacs.el index 56981eec0..5510fda65 100644 --- a/modules/config/default/+emacs.el +++ b/modules/config/default/+emacs.el @@ -12,7 +12,7 @@ (use-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) :config - (defadvice! doom--quit-expand-region-a () + (defadvice! doom--quit-expand-region-a (&rest _) "Properly abort an expand-region region." :before '(evil-escape doom/escape) (when (memq last-command '(er/expand-region er/contract-region)) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index d7d82add6..4968999aa 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -411,6 +411,7 @@ :desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk) (:when (featurep! :tools magit) :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Magit file dispatch" "." #'magit-file-dispatch :desc "Forge dispatch" "'" #'forge-dispatch :desc "Magit switch branch" "b" #'magit-branch-checkout :desc "Magit status" "g" #'magit-status diff --git a/modules/config/default/autoload/files.el b/modules/config/default/autoload/files.el index 33d6dc126..21bdef833 100644 --- a/modules/config/default/autoload/files.el +++ b/modules/config/default/autoload/files.el @@ -45,9 +45,16 @@ If prefix ARG is non-nil, prompt for the search path." (interactive "P") (if arg (call-interactively #'projectile-discover-projects-in-directory) - (if projectile-project-search-path - (mapc #'projectile-discover-projects-in-directory projectile-project-search-path) - (user-error "`projectile-project-search-path' is empty; don't know where to search")))) + (if (not projectile-project-search-path) + (user-error "`projectile-project-search-path' is empty; don't know where to search") + (letf! (defun projectile-add-known-project (project-root) + (unless (projectile-ignored-project-p project-root) + (funcall projectile-add-known-project project-root) + (message "Added %S to known project roots" project-root))) + (dolist (dir projectile-project-search-path) + (if (not (file-accessible-directory-p dir)) + (message "%S was inaccessible and couldn't searched" dir) + (projectile-discover-projects-in-directory dir))))))) ;;;###autoload (defun +default/dired (arg) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index f8e38b9c9..2f29f5940 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -310,7 +310,7 @@ Continues comments if executed from a commented line. Consults "M" #'doom/describe-active-minor-mode "O" #'+lookup/online "T" #'doom/toggle-profiler - "V" #'set-variable + "V" #'doom/help-custom-variable "W" #'+default/man-or-woman "C-k" #'describe-key-briefly "C-l" #'describe-language-environment diff --git a/modules/editor/evil/autoload/advice.el b/modules/editor/evil/autoload/advice.el index 51d0d3a9f..c2abbd821 100644 --- a/modules/editor/evil/autoload/advice.el +++ b/modules/editor/evil/autoload/advice.el @@ -106,7 +106,7 @@ more information on modifiers." (cond ((sp-point-in-comment pos) (setq evil-auto-indent nil) (if comment-line-break-function - (funcall comment-line-break-function) + (funcall comment-line-break-function nil) (comment-indent-new-line))) ;; TODO Find a better way to do this ((and (eq major-mode 'haskell-mode) @@ -121,7 +121,8 @@ more information on modifiers." (defun +evil--insert-newline-below-and-respect-comments-a (orig-fn count) (if (or (not +evil-want-o/O-to-continue-comments) (not (eq this-command 'evil-open-below)) - (evil-insert-state-p)) + (evil-insert-state-p) + (evil-emacs-state-p)) (funcall orig-fn count) (letf! (defun evil-insert-newline-below () (+evil--insert-newline)) (let ((evil-auto-indent evil-auto-indent)) @@ -131,7 +132,8 @@ more information on modifiers." (defun +evil--insert-newline-above-and-respect-comments-a (orig-fn count) (if (or (not +evil-want-o/O-to-continue-comments) (not (eq this-command 'evil-open-above)) - (evil-insert-state-p)) + (evil-insert-state-p) + (evil-emacs-state-p)) (funcall orig-fn count) (letf! (defun evil-insert-newline-above () (+evil--insert-newline 'above)) (let ((evil-auto-indent evil-auto-indent)) @@ -188,16 +190,17 @@ From https://github.com/emacs-evil/evil/issues/606" (let* ((count (count-lines beg end)) (count (if (> count 1) (1- count) count)) (fixup-mark (make-marker))) - (dotimes (var count) - (if (and (bolp) (eolp)) - (join-line 1) - (let* ((end (line-beginning-position 3)) - (fill-column (1+ (- end beg)))) - (set-marker fixup-mark (line-end-position)) - (fill-region-as-paragraph beg end nil t) - (goto-char fixup-mark) - (fixup-whitespace)))) - (set-marker fixup-mark nil))) + (unwind-protect + (dotimes (var count) + (if (and (bolp) (eolp)) + (join-line 1) + (let* ((end (line-beginning-position 3)) + (fill-column (1+ (- end beg)))) + (set-marker fixup-mark (line-end-position)) + (fill-region-as-paragraph beg end nil t) + (goto-char fixup-mark) + (fixup-whitespace)))) + (set-marker fixup-mark nil)))) ;;;###autoload (defun +evil--fix-dabbrev-in-minibuffer-h () diff --git a/modules/editor/evil/autoload/evil.el b/modules/editor/evil/autoload/evil.el index aece9766a..b923ad1b2 100644 --- a/modules/editor/evil/autoload/evil.el +++ b/modules/editor/evil/autoload/evil.el @@ -15,18 +15,18 @@ ;;; Interactive commands ;;;###autoload -(defun +evil/visual-indent () +(defun +evil/shift-right () "vnoremap < >gv" (interactive) - (evil-shift-left (region-beginning) (region-end)) + (call-interactively #'evil-shift-left) (evil-normal-state) (evil-visual-restore)) @@ -123,7 +123,7 @@ the only window, use evil-window-move-* (e.g. `evil-window-move-far-left')." "Wrapper around `doom/retab'." :motion nil :move-point nil :type line (interactive "") - (doom/retab beg end)) + (doom/retab nil beg end)) ;;;###autoload (autoload '+evil:narrow-buffer "editor/evil/autoload/evil" nil t) (evil-define-operator +evil:narrow-buffer (beg end &optional bang) diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index f8f90e37c..1c8d1d754 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -20,7 +20,7 @@ directives. By default, this only recognizes C directives.") ;; Set these defaults before `evil'; use `defvar' so they can be changed prior ;; to loading. (defvar evil-want-C-g-bindings t) -(defvar evil-want-C-i-jump (or (daemonp) (display-graphic-p))) +(defvar evil-want-C-i-jump nil) ; we do this ourselves (defvar evil-want-C-u-scroll t) ; moved the universal arg to u (defvar evil-want-C-u-delete t) (defvar evil-want-C-w-scroll t) @@ -66,7 +66,7 @@ directives. By default, this only recognizes C directives.") (put 'evil-define-key* 'lisp-indent-function 'defun) ;; stop copying each visual state move to the clipboard: - ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on + ;; https://github.com/emacs-evil/evil/issues/336 ;; grokked from: ;; http://stackoverflow.com/questions/15873346/elisp-rename-macro (advice-add #'evil-visual-update-x-selection :override #'ignore) @@ -419,6 +419,8 @@ directives. By default, this only recognizes C directives.") ;; zu{q,w} - undo last marking (map! :v "@" #'+evil:apply-macro + :m [C-i] #'evil-jump-forward + :m [tab] #'evil-jump-item ;; implement dictionary keybinds ;; evil already defines 'z=' to `ispell-word' = correct word at point @@ -516,8 +518,8 @@ directives. By default, this only recognizes C directives.") :n "zx" #'kill-current-buffer :n "ZX" #'doom/save-and-kill-buffer ;; don't leave visual mode after shifting - :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + :v "<" #'+evil/shift-left ; vnoremap < " #'+evil/shift-right ; vnoremap > >gv ;; window management (prefix "C-w") (:map evil-window-map diff --git a/modules/editor/evil/init.el b/modules/editor/evil/init.el index b309b0f74..99e05cfaa 100644 --- a/modules/editor/evil/init.el +++ b/modules/editor/evil/init.el @@ -37,7 +37,6 @@ elisp-mode ert free-keys - help helm indent image @@ -95,6 +94,7 @@ variable for an explanation of the defaults (in comments). See comint company compile + consult (custom cus-edit) cus-theme daemons @@ -102,6 +102,7 @@ variable for an explanation of the defaults (in comments). See deadgrep debbugs debug + dictionary diff-mode dired dired-sidebar @@ -187,10 +188,12 @@ variable for an explanation of the defaults (in comments). See python quickrun racer + racket-describe realgud reftex restclient rg + ripgrep rjsx-mode robe rtags @@ -263,10 +266,15 @@ and complains if a module is loaded too early (during startup)." "q" #'kill-current-buffer "d" #'process-menu-delete-process) - (mapc #'+evil-collection-init '(comint custom help))) + (mapc #'+evil-collection-init '(comint custom))) ;; ...or on first invokation of their associated major/minor modes. (after! evil + ;; Emacs loads these two packages immediately, at startup, which needlessly + ;; convolutes load order for evil-collection-help. + (defer-feature! help help-mode) + (defer-feature! help-mode help-mode) + (add-transient-hook! 'Buffer-menu-mode (+evil-collection-init '(buff-menu "buff-menu"))) (add-transient-hook! 'image-mode diff --git a/modules/editor/evil/packages.el b/modules/editor/evil/packages.el index 19bb23bb3..3e1f17374 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 "d6cf6680ec52733ea78dc530ed75fadc5171c758") +(package! evil :pin "cc9d6886b418389752a0591b9fcb270e83234cf9") (package! evil-args :pin "758ad5ae54ad34202064fec192c88151c08cb387") (package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") (package! evil-embrace :pin "4379adea032b25e359d01a36301b4a5afdd0d1b7") @@ -18,7 +18,7 @@ (package! evil-snipe :pin "6dcac7f2516c6137a2de532fc2c052f242559ee3") (package! evil-surround :pin "346d4d85fcf1f9517e9c4991c1efe68b4130f93a") (package! evil-textobj-anyblock :pin "ff00980f0634f95bf2ad9956b615a155ea8743be") -(package! evil-traces :pin "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462") +(package! evil-traces :pin "290b5323542c46af364ec485c8ec9000040acf90") (package! evil-visualstar :pin "06c053d8f7381f91c53311b1234872ca96ced752") (package! exato :pin "aee7af7b7a0e7551478f453d1de7d5b9cb2e06c4") (package! evil-quick-diff @@ -33,4 +33,4 @@ (package! neotree) (autoload 'neotree-make-executor "neotree" nil nil 'macro)) - (package! evil-collection :pin "ab5bb7c39199518d98035ef201096704a21a97ea")) + (package! evil-collection :pin "e6824e2ad2f2ee7ddccf6f54db655a4cd37a13dc")) diff --git a/modules/editor/file-templates/templates/emacs-lisp-mode/__package b/modules/editor/file-templates/templates/emacs-lisp-mode/__package index b040adbb6..8d500bc72 100644 --- a/modules/editor/file-templates/templates/emacs-lisp-mode/__package +++ b/modules/editor/file-templates/templates/emacs-lisp-mode/__package @@ -1,15 +1,15 @@ -;;; `(file-name-nondirectory buffer-file-name)`${1: --- ${2:description}} -*- lexical-binding: t; -*- +;;; `(file-name-nondirectory buffer-file-name)`${1: --- ${2:Description}} -*- lexical-binding: t; -*- ;; ;; Copyright (C) `(format-time-string "%Y")` `user-full-name` ;; -;; Author: `user-full-name` +;; Author: `user-full-name` ;; Maintainer: `user-full-name` <`user-mail-address`> ;; Created: `(format-time-string "%B %d, %Y")` ;; Modified: `(format-time-string "%B %d, %Y")` ;; Version: 0.0.1 -;; Keywords: +;; Keywords: `(mapconcat #'symbol-name (mapcar #'car finder-known-keywords) " ")` ;; Homepage: https://github.com/`user-login-name`/`(file-name-base buffer-file-name)` -;; Package-Requires: ((emacs `emacs-version`) (cl-lib "0.5")) +;; Package-Requires: ((emacs "24.3")) ;; ;; This file is not part of GNU Emacs. ;; diff --git a/modules/editor/fold/README.org b/modules/editor/fold/README.org index 517c83714..6ff0db9c1 100644 --- a/modules/editor/fold/README.org +++ b/modules/editor/fold/README.org @@ -20,8 +20,8 @@ marker, indent and syntax-based code folding for as many languages as possible. This module provides no flags. ** Plugins -+[[https://github.com/alexmurray/evil-vimish-fold][evil-vimish-fold]] -+[[https://github.com/matsievskiysv/vimish-fold][vimish-fold]] ++ [[https://github.com/alexmurray/evil-vimish-fold][evil-vimish-fold]] ++ [[https://github.com/matsievskiysv/vimish-fold][vimish-fold]] * Prerequisites This module has no prerequisites. diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 9e1020b50..6565b7c7d 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -225,9 +225,9 @@ If nil, BEG and/or END will default to the boundaries of the src block at point. (defun +format/buffer () "Reformat the current buffer using LSP or `format-all-buffer'." (interactive) - (if (and (eq major-mode 'org-mode) - (org-in-src-block-p t)) - (+format--org-region nil nil) + (if (eq major-mode 'org-mode) + (when (org-in-src-block-p t) + (+format--org-region nil nil)) (call-interactively (cond ((and +format-with-lsp (bound-and-true-p lsp-mode) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 1dfc0443f..4afd246db 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -168,7 +168,7 @@ (defun +multiple-cursors-compat-back-to-previous-state-h () (when +mc--compat-evil-prev-state (unwind-protect - (case +mc--compat-evil-prev-state + (cl-case +mc--compat-evil-prev-state ((normal visual) (evil-force-normal-state)) (t (message "Don't know how to handle previous state: %S" +mc--compat-evil-prev-state))) diff --git a/modules/editor/snippets/autoload/snippets.el b/modules/editor/snippets/autoload/snippets.el index 1a651e6d2..b87a91b72 100644 --- a/modules/editor/snippets/autoload/snippets.el +++ b/modules/editor/snippets/autoload/snippets.el @@ -33,6 +33,15 @@ ignored. This makes it easy to override built-in snippets with private ones." (make-directory dir t) (error "%S doesn't exist" (abbreviate-file-name dir))))) +(defun +snippet--get-template-by-uuid (uuid &optional mode) + "Look up the template by uuid in child-most to parent-most mode order. +Finds correctly active snippets from parent modes (based on Yas' logic)." + (cl-loop with mode = (or mode major-mode) + for active-mode in (yas--modes-to-activate mode) + if (gethash active-mode yas--tables) + if (gethash uuid (yas--table-uuidhash it)) + return it)) + (defun +snippet--completing-read-uuid (prompt all-snippets &rest args) (plist-get (text-properties-at @@ -169,7 +178,7 @@ buggy behavior when is pressed in an empty field." (interactive (list (+snippet--completing-read-uuid "Visit snippet: " current-prefix-arg))) - (if-let* ((template (yas--get-template-by-uuid major-mode template-uuid)) + (if-let* ((template (+snippet--get-template-by-uuid template-uuid major-mode)) (template-path (yas--template-load-file template))) (progn (unless (file-readable-p template-path) @@ -242,7 +251,7 @@ shadow the default snippet)." (if-let* ((major-mode (if (eq major-mode 'snippet-mode) (intern (file-name-base (directory-file-name default-directory))) major-mode)) - (template (yas--get-template-by-uuid major-mode template-uuid)) + (template (+snippet--get-template-by-uuid template-uuid major-mode)) (template-path (yas--template-load-file template))) (if (file-in-directory-p template-path +snippets-dir) (find-file template-path) @@ -312,5 +321,7 @@ is." (defun region-end () evil-visual-end)) (funcall orig-fn no-condition))) (when (and (bound-and-true-p evil-local-mode) + (not (or (evil-emacs-state-p) + (evil-insert-state-p))) (yas-active-snippets)) (evil-insert-state +1))) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index a358955dd..8cbf746de 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -93,6 +93,7 @@ info in the `header-line-format' is a more visible indicator." "Start git-commit-mode in insert state if in a blank commit message, otherwise in default state." (when (and (bound-and-true-p evil-mode) + (not (evil-emacs-state-p)) (bobp) (eolp)) (evil-insert-state))))) diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el index 02c56d0d0..7bab0e188 100644 --- a/modules/emacs/vc/packages.el +++ b/modules/emacs/vc/packages.el @@ -6,7 +6,7 @@ (package! smerge-mode :built-in t) (package! browse-at-remote :pin "fadf99d6d8e891f3b112e36c772e0eea0b9bc7f2") -(package! git-commit :pin "2fb3bf782ccf5652b98f8de989f014749473eacf") +(package! git-commit :pin "acfe22ab60a56c61aae3ca6d4f2b7b826fe3b071") (package! git-timemachine :pin "8d675750e921a047707fcdc36d84f8439b19a907") (package! gitconfig-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") (package! gitignore-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") diff --git a/modules/lang/clojure/README.org b/modules/lang/clojure/README.org index 6db97a7ad..4eb140edb 100644 --- a/modules/lang/clojure/README.org +++ b/modules/lang/clojure/README.org @@ -86,6 +86,11 @@ This module requires: | = n N= | =cider-browse-ns-all= | | = n n= | =cider-browse-ns= | | = n r= | =cider-ns-refresh= | +| = p d= | =cider-pprint-eval-defun-at-point= | +| = p D= | =cider-pprint-eval-defun-to-comment= | +| = p p= | =cider-pprint-eval-last-sexp= | +| = p P= | =cider-pprint-eval-last-sexp-to-comment= | +| = p r= | =cider-pprint-eval-last-sexp-to-repl= | | = r B= | =+clojure/cider-switch-to-repl-buffer-and-switch-ns= | | = r L= | =cider-load-buffer-and-switch-to-repl-buffer= | | = r R= | =cider-restart= | diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index efc1b6242..f8e9bdb9a 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -126,6 +126,12 @@ "n" #'cider-browse-ns "N" #'cider-browse-ns-all "r" #'cider-ns-refresh) + (:prefix ("p" . "print") + "p" #'cider-pprint-eval-last-sexp + "P" #'cider-pprint-eval-last-sexp-to-comment + "d" #'cider-pprint-eval-defun-at-point + "D" #'cider-pprint-eval-defun-to-comment + "r" #'cider-pprint-eval-last-sexp-to-repl) (:prefix ("r" . "repl") "n" #'cider-repl-set-ns "q" #'cider-quit diff --git a/modules/lang/clojure/packages.el b/modules/lang/clojure/packages.el index 548883ca9..9f340fd13 100644 --- a/modules/lang/clojure/packages.el +++ b/modules/lang/clojure/packages.el @@ -2,8 +2,8 @@ ;;; lang/clojure/packages.el (package! clojure-mode :pin "53ef8ac076ae7811627fbdd408e519ab7fca9a0b") -(package! cider :pin "ef47c1de151c212b8d2ddeb9af6c8b0dfc0e300f") -(package! clj-refactor :pin "6db85b37b57497b56d97d5e5512160e5db85f798") +(package! cider :pin "1a34f893e1fe81982fb5099192122a72ee8e94ea") +(package! clj-refactor :pin "9dcc50da7ce6f3c10276c87f09022e80c03e8bef") (when (featurep! :checkers syntax) (package! flycheck-clj-kondo :pin "a558bda44c4cb65b69fa53df233e8941ebd195c5")) diff --git a/modules/lang/common-lisp/doctor.el b/modules/lang/common-lisp/doctor.el index 891f5ae8e..3c1842726 100644 --- a/modules/lang/common-lisp/doctor.el +++ b/modules/lang/common-lisp/doctor.el @@ -1,6 +1,7 @@ ;;; lang/common-lisp/doctor.el -*- lexical-binding: t; -*- (when (require 'sly nil t) - (unless (executable-find inferior-lisp-program) - (warn! "Couldn't find your `inferior-lisp-program' (%s). Is it installed?" - inferior-lisp-program))) + (let ((prog-name (car (split-string inferior-lisp-program)))) + (unless (executable-find prog-name) + (warn! "Couldn't find your `inferior-lisp-program' (%s). Is it installed?" + inferior-lisp-program)))) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 5dcbeee1c..49cbac243 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -7,6 +7,26 @@ (set-rotate-patterns! 'csharp-mode :symbols '(("public" "protected" "private") ("class" "struct"))) + (set-ligatures! 'csharp-mode + ;; Functional + :lambda "() =>" + ;; Types + :null "null" + :true "true" + :false "false" + :int "int" + :float "float" + :str "string" + :bool "bool" + :list "List" + ;; Flow + :not "!" + :in "in" + :and "&&" + :or "||" + :for "for" + :return "return" + :yield "yield") (sp-local-pair 'csharp-mode "<" ">" :when '(+csharp-sp-point-in-type-p) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index b7257add7..d85ec57f6 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -61,7 +61,9 @@ to a pop up buffer." (defun +emacs-lisp-lookup-definition (_thing) "Lookup definition of THING." (if-let (module (+emacs-lisp--module-at-point)) - (doom/help-modules (car module) (cadr module) 'visit-dir) + ;; FIXME: this is probably a bug in `counsel'. See + ;; https://github.com/abo-abo/swiper/pull/2752. + (progn (doom/help-modules (car module) (cadr module) 'visit-dir) 'deferred) (call-interactively #'elisp-def))) ;;;###autoload diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 1286a7588..a255f642e 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -99,15 +99,17 @@ employed so that flycheck still does *some* helpful linting.") "Display variable value next to documentation in eldoc." :around #'elisp-get-var-docstring (when-let (ret (funcall orig-fn sym)) - (concat ret " " - (let* ((truncated " [...]") - (print-escape-newlines t) - (str (symbol-value sym)) - (str (prin1-to-string str)) - (limit (- (frame-width) (length ret) (length truncated) 1))) - (format (format "%%0.%ds%%s" (max limit 0)) - (propertize str 'face 'warning) - (if (< (length str) limit) "" truncated)))))) + (if (fboundp sym) + (concat ret " " + (let* ((truncated " [...]") + (print-escape-newlines t) + (str (symbol-value sym)) + (str (prin1-to-string str)) + (limit (- (frame-width) (length ret) (length truncated) 1))) + (format (format "%%0.%ds%%s" (max limit 0)) + (propertize str 'face 'warning) + (if (< (length str) limit) "" truncated)))) + ret))) (map! :localleader :map emacs-lisp-mode-map @@ -181,12 +183,12 @@ employed so that flycheck still does *some* helpful linting.") "Add Doom's own demos to help buffers." :around #'elisp-demos--search (or (funcall orig-fn symbol) - (when-let (demos-file (doom-glob doom-docs-dir "api.org")) + (when-let (demos-file (doom-module-locate-path :lang 'emacs-lisp "demos.org")) (with-temp-buffer (insert-file-contents demos-file) (goto-char (point-min)) (when (re-search-forward - (format "^\\*\\*\\* %s$" (regexp-quote (symbol-name symbol))) + (format "^\\*\\* %s$" (regexp-quote (symbol-name symbol))) nil t) (let (beg end) (forward-line 1) diff --git a/docs/api.org b/modules/lang/emacs-lisp/demos.org similarity index 73% rename from docs/api.org rename to modules/lang/emacs-lisp/demos.org index 68375bdcc..9ab9ba7a2 100644 --- a/docs/api.org +++ b/modules/lang/emacs-lisp/demos.org @@ -1,46 +1,42 @@ #+TITLE: API Demos #+PROPERTY: header-args:elisp :results pp -This appendix serves as a reference on how to use Doom Emacs' standard library. -It is integrated into Helpful, in Doom. +This file contains demos of Doom's public API; its core library, macros, and +autodefs. It is used by the =elisp-demos= package to display examples of their +usage from their documentation (e.g. =SPC h f add-hook\!=). * Table of Contents :TOC_3: -- [[#examples-for-dooms-library][Examples for Doom's library]] - - [[#core-lib][core-lib]] - - [[#add-hook][add-hook!]] - - [[#add-transient-hook][add-transient-hook!]] - - [[#after][after!]] - - [[#appendq][appendq!]] - - [[#custom-set-faces][custom-set-faces!]] - - [[#custom-theme-set-faces][custom-theme-set-faces!]] - - [[#defer-feature][defer-feature!]] - - [[#defer-until][defer-until!]] - - [[#disable-packages][disable-packages!]] - - [[#doom][doom!]] - - [[#file-exists-p][file-exists-p!]] - - [[#cmd][cmd!]] - - [[#cmd-1][cmd!!]] - - [[#letenv][letenv!]] - - [[#load][load!]] - - [[#map][map!]] - - [[#package][package!]] - - [[#pushnew][pushnew!]] - - [[#prependq][prependq!]] - - [[#quiet][quiet!]] - - [[#remove-hook][remove-hook!]] - - [[#setq][setq!]] - - [[#setq-hook][setq-hook!]] - - [[#unsetq-hook][unsetq-hook!]] - - [[#use-package][use-package!]] -- [[#interesting-snippets][Interesting snippets]] - - [[#center-emacs-initial-frame-with-a-fixed-size][Center Emacs' initial frame with a fixed size]] - - [[#persist-emacs-initial-frame-position-dimensions-andor-full-screen-state-across-sessions][Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions]] - - [[#update-cursor-shape-under-terminal-emacs][Update cursor shape under terminal Emacs]] - - [[#create-a-paste-transient-state-to-cycle-through-kill-ring-on-paste][Create a paste-transient-state to cycle through kill ring on paste]] +- [[#core-lib][core-lib]] + - [[#add-hook][add-hook!]] + - [[#add-transient-hook][add-transient-hook!]] + - [[#after][after!]] + - [[#appendq][appendq!]] + - [[#custom-set-faces][custom-set-faces!]] + - [[#custom-theme-set-faces][custom-theme-set-faces!]] + - [[#defer-feature][defer-feature!]] + - [[#defer-until][defer-until!]] + - [[#disable-packages][disable-packages!]] + - [[#doom][doom!]] + - [[#file-exists-p][file-exists-p!]] + - [[#cmd][cmd!]] + - [[#cmd-1][cmd!!]] + - [[#cmds][cmds!]] + - [[#kbd][kbd!]] + - [[#letenv][letenv!]] + - [[#load][load!]] + - [[#map][map!]] + - [[#package][package!]] + - [[#pushnew][pushnew!]] + - [[#prependq][prependq!]] + - [[#quiet][quiet!]] + - [[#remove-hook][remove-hook!]] + - [[#setq][setq!]] + - [[#setq-hook][setq-hook!]] + - [[#unsetq-hook][unsetq-hook!]] + - [[#use-package][use-package!]] -* Examples for Doom's library -** core-lib -*** add-hook! +* core-lib +** add-hook! #+BEGIN_SRC elisp :eval no ;; With only one hook and one function, this is identical to `add-hook'. In that ;; case, use that instead. @@ -68,8 +64,8 @@ It is integrated into Helpful, in Doom. ...)) #+END_SRC -*** TODO add-transient-hook! -*** after! +** TODO add-transient-hook! +** after! #+BEGIN_SRC elisp :eval no ;;; `after!' will take: @@ -95,7 +91,7 @@ It is integrated into Helpful, in Doom. (after! rustic ...) (after! python ...) #+END_SRC -*** appendq! +** appendq! #+BEGIN_SRC elisp (let ((x '(a b c))) (appendq! x '(c d e)) @@ -116,7 +112,7 @@ It is integrated into Helpful, in Doom. #+RESULTS: : (a b c c d e f g h) -*** custom-set-faces! +** custom-set-faces! #+BEGIN_SRC elisp :eval no (custom-set-faces! '(outline-1 :weight normal) @@ -150,7 +146,7 @@ It is integrated into Helpful, in Doom. `(outline-2 :background ,(doom-color 'blue))) #+END_SRC -*** custom-theme-set-faces! +** custom-theme-set-faces! #+BEGIN_SRC elisp :eval no (custom-theme-set-faces! 'doom-one '(outline-1 :weight normal) @@ -184,15 +180,15 @@ It is integrated into Helpful, in Doom. `(outline-2 :background ,(doom-color 'blue))) #+END_SRC -*** TODO defer-feature! -*** TODO defer-until! -*** disable-packages! +** TODO defer-feature! +** TODO defer-until! +** disable-packages! #+BEGIN_SRC elisp :eval no ;; Disable packages enabled by DOOM (disable-packages! some-package second-package) #+END_SRC -*** doom! +** doom! #+BEGIN_SRC elisp :eval no (doom! :completion company @@ -222,7 +218,7 @@ It is integrated into Helpful, in Doom. (default +bindings +smartparens)) #+END_SRC -*** file-exists-p! +** file-exists-p! #+BEGIN_SRC elisp (file-exists-p! "init.el" doom-emacs-dir) #+END_SRC @@ -239,12 +235,12 @@ It is integrated into Helpful, in Doom. #+RESULTS: : /home/hlissner/.emacs.d/LICENSE -*** cmd! +** cmd! #+BEGIN_SRC elisp :eval no (map! "C-j" (cmd! (newline) (indent-according-to-mode))) #+END_SRC -*** cmd!! +** cmd!! When ~newline~ is passed a numerical prefix argument (=C-u 5 M-x newline=), it inserts N newlines. We can use ~cmd!!~ to easily create a keybinds that bakes in the prefix arg into the command call: @@ -263,7 +259,33 @@ Or to create aliases for functions that behave differently: (fset 'org-reset-global-visibility (cmd!! #'org-global-cycle '(4)) #+END_SRC -*** letenv! +** cmds! +#+BEGIN_SRC elisp :eval no +(map! :i [tab] (cmds! (and (featurep! :editor snippets) + (bound-and-true-p yas-minor-mode) + (yas-maybe-expand-abbrev-key-filter 'yas-expand)) + #'yas-expand + (featurep! :completion company +tng) + #'company-indent-or-complete-common) + :m [tab] (cmds! (and (bound-and-true-p yas-minor-mode) + (evil-visual-state-p) + (or (eq evil-visual-selection 'line) + (not (memq (char-after) (list ?\( ?\[ ?\{ ?\} ?\] ?\)))))) + #'yas-insert-snippet + (and (featurep! :editor fold) + (save-excursion (end-of-line) (invisible-p (point)))) + #'+fold/toggle + (fboundp 'evil-jump-item) + #'evil-jump-item)) +#+END_SRC + +** kbd! +#+BEGIN_SRC elisp :eval no +(map! "," (kbd! "SPC") + ";" (kbd! ":")) +#+END_SRC + +** letenv! #+BEGIN_SRC elisp (letenv! (("SHELL" "/bin/sh")) (shell-command-to-string "echo $SHELL")) @@ -272,7 +294,7 @@ Or to create aliases for functions that behave differently: #+RESULTS: : "/bin/sh\n" -*** load! +** load! #+BEGIN_SRC elisp :eval no ;;; Lets say we're in ~/.doom.d/config.el (load! "lisp/module") ; loads ~/.doom.d/lisp/module.el @@ -283,7 +305,7 @@ Or to create aliases for functions that behave differently: (load! "~/.maynotexist" nil t) #+END_SRC -*** map! +** map! #+BEGIN_SRC elisp :eval no (map! :map magit-mode-map :m "C-r" 'do-something ; C-r in motion state @@ -378,7 +400,7 @@ These are side-by-side comparisons, showing how to bind keys with and without (:map go-lisp-mode :n "C-x x" #'do-something-else)) #+END_SRC -*** package! +** package! #+BEGIN_SRC elisp :eval no ;; To install a package that can be found on ELPA or any of the sources ;; specified in `straight-recipe-repositories': @@ -410,7 +432,7 @@ These are side-by-side comparisons, showing how to bind keys with and without (package! evil :ignore (not (equal system-name "my-desktop"))) #+END_SRC -*** pushnew! +** pushnew! #+BEGIN_SRC elisp (let ((list '(a b c))) (pushnew! list 'c 'd 'e) @@ -420,7 +442,7 @@ These are side-by-side comparisons, showing how to bind keys with and without #+RESULTS: : (e d a b c) -*** prependq! +** prependq! #+BEGIN_SRC elisp (let ((x '(a b c))) (prependq! x '(c d e)) @@ -441,12 +463,12 @@ These are side-by-side comparisons, showing how to bind keys with and without #+RESULTS: : (c d e f g h a b c) -*** quiet! +** quiet! #+BEGIN_SRC elisp :eval no ;; Enters recentf-mode without extra output (quiet! (recentf-mode +1)) #+END_SRC -*** remove-hook! +** remove-hook! #+BEGIN_SRC elisp :eval no ;; With only one hook and one function, this is identical to `remove-hook'. In ;; that case, use that instead. @@ -464,7 +486,7 @@ These are side-by-side comparisons, showing how to bind keys with and without ;; Removing arbitrary forms (must be exactly the same as the definition) (remove-hook! (one-mode second-mode) (setq v 5) (setq a 2)) #+END_SRC -*** setq! +** setq! #+BEGIN_SRC elisp ;; Each of these have a setter associated with them, which must be triggered in ;; order for their new values to have an effect. @@ -472,7 +494,7 @@ These are side-by-side comparisons, showing how to bind keys with and without evil-want-C-u-scroll nil evil-want-C-d-scroll nil) #+END_SRC -*** setq-hook! +** setq-hook! #+BEGIN_SRC elisp :eval no ;; Set multiple variables after a hook (setq-hook! 'markdown-mode-hook @@ -484,7 +506,7 @@ These are side-by-side comparisons, showing how to bind keys with and without hscroll-margin 0) #+END_SRC -*** unsetq-hook! +** unsetq-hook! #+BEGIN_SRC elisp :eval no (unsetq-hook! 'markdown-mode-hook line-spacing) @@ -498,7 +520,7 @@ These are side-by-side comparisons, showing how to bind keys with and without (unsetq-hook! (one-mode second-mode) enable-something) #+END_SRC -*** use-package! +** use-package! #+BEGIN_SRC elisp :eval no ;; Use after-call to load package before hook (use-package! projectile @@ -513,79 +535,3 @@ These are side-by-side comparisons, showing how to bind keys with and without (use-package! abc :defer-incrementally t) #+END_SRC -* Interesting snippets -** Center Emacs' initial frame with a fixed size -#+BEGIN_SRC elisp -(let ((width 500) - (height 250) - (display-height (display-pixel-height)) - (display-width (display-pixel-width))) - (pushnew! initial-frame-alist - `(left . ,(- (/ display-width 2) (/ width 2))) - `(top . ,(- (/ display-height 2) (/ height 2))) - `(width text-pixels ,width) - `(height text-pixels ,height))) -#+END_SRC - -** Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions -#+BEGIN_SRC elisp -;; add to ~/.doom.d/config.el -(when-let (dims (doom-store-get 'last-frame-size)) - (cl-destructuring-bind ((left . top) width height fullscreen) dims - (setq initial-frame-alist - (append initial-frame-alist - `((left . ,left) - (top . ,top) - (width . ,width) - (height . ,height) - (fullscreen . ,fullscreen)))))) - -(defun save-frame-dimensions () - (doom-store-put 'last-frame-size - (list (frame-position) - (frame-width) - (frame-height) - (frame-parameter nil 'fullscreen)))) - -(add-hook 'kill-emacs-hook #'save-frame-dimensions) -#+END_SRC - -** Update cursor shape under terminal Emacs -Install [[https://github.com/7696122/evil-terminal-cursor-changer][evil-terminal-cursor-changer]]. The package isn't included in Doom because -it is not maintained, unreasonably buggy, and lacks support for a number of -terminals. Where it fails, it inserts unexpected characters into the buffer. To -uphold the principle of least surprise, an unchanging cursor is less surprising -than unwarranted characters. - -#+BEGIN_SRC elisp -;; ~/.doom.d/packages.el -(package! evil-terminal-cursor-changer) - -;; ~/.doom.d/config.el -(use-package! evil-terminal-cursor-changer - :hook (tty-setup . evil-terminal-cursor-changer-activate)) -#+END_SRC - -Alternatively, an updated version exists at -[[https://github.com/amosbird/evil-terminal-cursor-changer][amosbird/evil-terminal-cursor-changer]], with support for urxvt and tmux. - -** Create a paste-transient-state to cycle through kill ring on paste -Replaces the default evil-paste binding to paste then let you cycle through entries in your kill ring. Gives you more flexibility when copying to your clipboard, making edits, then deciding to paste after. - -You will need to enable the `hydra` module first. - -#+BEGIN_SRC elisp -(defhydra hydra-paste (:color red - :hint nil) - "\n[%s(length kill-ring-yank-pointer)/%s(length kill-ring)] \ - [_C-j_/_C-k_] cycles through yanked text, [_p_/_P_] pastes the same text \ - above or below. Anything else exits." - ("C-j" evil-paste-pop) - ("C-k" evil-paste-pop-next) - ("p" evil-paste-after) - ("P" evil-paste-before)) - -(map! :nv "p" #'hydra-paste/evil-paste-after - :nv "P" #'hydra-paste/evil-paste-before) -#+END_SRC - diff --git a/modules/lang/fsharp/README.org b/modules/lang/fsharp/README.org index a11f9502e..bb37fdf73 100644 --- a/modules/lang/fsharp/README.org +++ b/modules/lang/fsharp/README.org @@ -31,9 +31,9 @@ This module adds [[https://fsharp.org/][F#]] support. ** Module Flags + =+lsp= Enables lsp-fsharp (this requires ~:tools lsp~ to be enabled). ** Plugins -+ [[https://github.com/fsharp/emacs-fsharp-mod+e][fsharp-mode]] ++ [[https://github.com/fsharp/emacs-fsharp-mode][fsharp-mode]] + =+lsp= - + [[https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-fsharp.el][lsp-fsharp]] + + [[https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-fsharp.el][lsp-fsharp]] ** Hacks None so far. @@ -47,7 +47,7 @@ Do *NOT* install mono via brew. See this [[https://github.com/fsharp/FsAutoCompl sudo pacman -S mono #+END_SRC ** LSP -The language server is automatically installed by [[https://github.com/emacs-lsp/lsp-mode/blob/master/lsp-fsharp.el][lsp-fsharp]]. +The language server is automatically installed by [[https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-fsharp.el][lsp-fsharp]]. * Features An in-depth list of features, how to use them, and their dependencies. diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 8aa249503..f2057558b 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -3,7 +3,7 @@ ;; Major modes (package! coffee-mode :pin "35a41c7d8233eac0b267d9593e67fb8b6235e134") -(package! js2-mode :pin "ffb70990c1a4d4616034cb810b4ce36953aecb47") +(package! js2-mode :pin "f7816bdd3e8e84ed1d64b6a13c9ba488363b7e91") (package! rjsx-mode :pin "b697fe4d92cc84fa99a7bcb476f815935ea0d919") (package! typescript-mode :pin "54f14c482701c4f937bf51469f70812624e07f87") diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index dd0edaf07..65dde2cca 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -6,7 +6,7 @@ (set-repl-handler! 'julia-mode #'+julia/open-repl) ;; Borrow matlab.el's fontification of math operators. From - ;; + ;; (dolist (mode '(julia-mode ess-julia-mode)) (font-lock-add-keywords mode diff --git a/modules/lang/lua/README.org b/modules/lang/lua/README.org index a48afb5c0..43776cdc9 100644 --- a/modules/lang/lua/README.org +++ b/modules/lang/lua/README.org @@ -39,19 +39,28 @@ This module has no dedicated maintainers. * Prerequisites ** Language Server Protocol servers -Currently the servers supported depend on the =:tools lsp= flavor you are using +LSP server support depends on which flavor of the =:tools lsp= module you have +installed (Eglot or LSP-mode). + *** LSP-mode -This server is built in Java, so a ~java~ environment will be necessary -+ [[https://github.com/EmmyLua/EmmyLua-LanguageServer][EmmyLua-LanguageServer]] must be installed and configured to use the - configuration provided by emacs-lsp. +Three servers are supported, ordered from highest to lowest priority: + ++ [[https://github.com/EmmyLua/EmmyLua-LanguageServer][EmmyLua-LanguageServer]] :: Must be in =~/.emacs.d/.local/etc/lsp/EmmyLua-LS-all.jar=. See ~lsp-clients-emmy-lua-jar-path~ variable to change this. ++ [[https://github.com/sumneko/lua-language-server][Sumneko language server]] (lua-language-server) :: Must be in + =~/.config/emacs/.local/etc/lsp/lua-language-server/=. See + ~lsp-clients-lua-language-server-bin~ variable to change this. ++ [[https://github.com/Alloyed/lua-lsp][lua-lsp]] :: Must be available in =~/.luarocks/bin/lua-lsp=. See + ~lsp-clients-lua-lsp-server-install-dir~ variable to change this. [[https://emacs-lsp.github.io/lsp-mode/page/lsp-emmy-lua/][LSP-mode documentation]] has more information about setting up the server and the -configuration variables correctly (use a bare ~(setq -lsp-clients-emmy-lua-java-path value)~ in your =config.el=) +configuration variables correctly. + *** Eglot -This server is built in Lua, so a =lua= environment will be necessary -+ [[https://github.com/sumneko/lua-language-server][lua-language-server]] must be installed and built locally, with =+lua-lsp-dir= - variable pointing to the root of the repository +Eglot currently only supports one of the above servers out of the box: + ++ [[https://github.com/sumneko/lua-language-server][Sumneko language server]] (lua-language-server) :: Must be in + =~/.config/emacs/.local/etc/lsp/lua-language-server/=. See + ~+lua-lsp-dir~ variable to change this. * TODO Features # An in-depth list of features, how to use them, and their dependencies. diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 9137b7806..4dc22b2ef 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,11 +1,5 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- -(defvar +lua-lsp-dir (concat doom-etc-dir "lsp/lua-language-server/") - "Absolute path to the directory of sumneko's lua-language-server. - -This directory MUST contain the 'main.lua' file and be the in-source build of -lua-language-server.") - ;; sp's default rules are obnoxious, so disable them (provide 'smartparens-lua) @@ -25,27 +19,29 @@ lua-language-server.") (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) (when (featurep! +lsp) - (defun +lua-generate-lsp-server-command () - ;; The absolute path to lua-language-server binary is necessary because - ;; the bundled dependencies aren't found otherwise. The only reason this - ;; is a function is to dynamically change when/if `+lua-lsp-dir' does - (list (doom-path +lua-lsp-dir - (cond (IS-MAC "bin/macOS") - (IS-LINUX "bin/Linux") - (IS-WINDOWS "bin/Windows")) - "lua-language-server") - "-E" "-e" "LANG=en" - (doom-path +lua-lsp-dir "main.lua"))) + (add-hook 'lua-mode-local-vars-hook #'lsp!) - (if (featurep! :tools lsp +eglot) - (set-eglot-client! 'lua-mode (+lua-generate-lsp-server-command)) - (after! lsp-mode - (lsp-register-client - (make-lsp-client :new-connection (lsp-stdio-connection '+lua-generate-lsp-server-command) - :major-modes '(lua-mode) - :priority -1 - :server-id 'lua-langserver)))) - (add-hook 'lua-mode-local-vars-hook #'lsp!))) + (when (featurep! :tools lsp +eglot) + (defvar +lua-lsp-dir (concat doom-etc-dir "lsp/lua-language-server/") + "Absolute path to the directory of sumneko's lua-language-server. + +This directory MUST contain the 'main.lua' file and be the in-source build of +lua-language-server.") + + (defun +lua-generate-lsp-server-command () + ;; The absolute path to lua-language-server binary is necessary because + ;; the bundled dependencies aren't found otherwise. The only reason this + ;; is a function is to dynamically change when/if `+lua-lsp-dir' does + (list (or (executable-find "lua-language-server") + (doom-path +lua-lsp-dir + (cond (IS-MAC "bin/macOS") + (IS-LINUX "bin/Linux") + (IS-WINDOWS "bin/Windows")) + "lua-language-server")) + "-E" "-e" "LANG=en" + (doom-path +lua-lsp-dir "main.lua"))) + + (set-eglot-client! 'lua-mode (+lua-generate-lsp-server-command))))) (use-package! moonscript diff --git a/modules/lang/markdown/autoload.el b/modules/lang/markdown/autoload.el index c4f6b8d8f..81d0185d3 100644 --- a/modules/lang/markdown/autoload.el +++ b/modules/lang/markdown/autoload.el @@ -2,31 +2,37 @@ ;;;###autoload (defun +markdown-flyspell-word-p () - "Return t if `flyspell' should check work before point. + "Return t if `flyspell' should check word before point. -Used for `flyspell-generic-check-word-predicate'. Augments -`markdown-flyspell-check-word-p' to: +Used for `flyspell-generic-check-word-predicate'. Like +`markdown-flyspell-check-word-p', but also: -a) Do spell check in code comments and -b) Inhibit spell check in html markup" - (and (markdown-flyspell-check-word-p) - (save-excursion - (goto-char (1- (point))) - (if (or - ;; Spell check in code comments - (not (and (markdown-code-block-at-point-p) - (markdown--face-p (point) '(font-lock-comment-face)))) - ;; Don't spell check in html markup - (markdown--face-p (point) '(markdown-html-attr-name-face - markdown-html-attr-value-face - markdown-html-tag-name-face))) - (prog1 nil - ;; If flyspell overlay is put, then remove it - (when-let (bounds (bounds-of-thing-at-point 'word)) - (cl-loop for ov in (overlays-in (car bounds) (cdr bounds)) - when (overlay-get ov 'flyspell-overlay) - do (delete-overlay ov)))) - t)))) +a) Performs spell check in code comments and +b) Inhibits spell check in html markup" + (save-excursion + (goto-char (1- (point))) + (if (or (and (markdown-code-block-at-point-p) + (not (or (markdown-text-property-at-point 'markdown-yaml-metadata-section) + (markdown--face-p (point) '(font-lock-comment-face))))) + (markdown-inline-code-at-point-p) + (markdown-in-comment-p) + (markdown--face-p (point) '(markdown-reference-face + markdown-markup-face + markdown-plain-url-face + markdown-inline-code-face + markdown-url-face + markdown-html-attr-name-face + markdown-html-attr-value-face + markdown-html-tag-name-face))) + (prog1 nil + ;; If flyspell overlay is put, then remove it + (let ((bounds (bounds-of-thing-at-point 'word))) + (when bounds + (cl-loop for ov in (overlays-in (car bounds) (cdr bounds)) + when (overlay-get ov 'flyspell-overlay) + do + (delete-overlay ov))))) + t))) ;; diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index ef8524846..89a351349 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -86,12 +86,35 @@ capture, the end position, and the output buffer.") "p" #'markdown-preview "e" #'markdown-export (:when (featurep! +grip) - "p" #'grip-mode) + "p" #'grip-mode) (:prefix ("i" . "insert") - "t" #'markdown-toc-generate-toc - "i" #'markdown-insert-image - "l" #'markdown-insert-link))) - + :desc "Table Of Content" "T" #'markdown-toc-generate-toc + :desc "Image" "i" #'markdown-insert-image + :desc "Link" "l" #'markdown-insert-link + :desc "
" "-" #'markdown-insert-hr + :desc "Heading 1" "1" #'markdown-insert-header-atx-1 + :desc "Heading 2" "2" #'markdown-insert-header-atx-2 + :desc "Heading 3" "3" #'markdown-insert-header-atx-3 + :desc "Heading 4" "4" #'markdown-insert-header-atx-4 + :desc "Heading 5" "5" #'markdown-insert-header-atx-5 + :desc "Heading 6" "6" #'markdown-insert-header-atx-6 + :desc "Code block" "C" #'markdown-insert-gfm-code-block + :desc "Pre region" "P" #'markdown-pre-region + :desc "Blockquote region" "Q" #'markdown-blockquote-region + :desc "Checkbox" "[" #'markdown-insert-gfm-checkbox + :desc "Bold" "b" #'markdown-insert-bold + :desc "Inline code" "c" #'markdown-insert-code + :desc "Italic" "e" #'markdown-insert-italic + :desc "Footnote" "f" #'markdown-insert-footnote + :desc "Header dwim" "h" #'markdown-insert-header-dwim + :desc "Italic" "i" #'markdown-insert-italic + :desc "Kbd" "k" #'markdown-insert-kbd + :desc "Link" "l" #'markdown-insert-link + :desc "Pre" "p" #'markdown-insert-pre + :desc "New blockquote" "q" #'markdown-insert-blockquote + :desc "Strike through" "s" #'markdown-insert-strike-through + :desc "Table" "t" #'markdown-insert-table + :desc "Wiki link" "w" #'markdown-insert-wiki-link))) (use-package! evil-markdown :when (featurep! :editor evil +everywhere) diff --git a/modules/lang/nix/autoload.el b/modules/lang/nix/autoload.el index cf345407e..08c858a0e 100644 --- a/modules/lang/nix/autoload.el +++ b/modules/lang/nix/autoload.el @@ -53,7 +53,8 @@ (save-excursion (goto-char (point-min)) (save-match-data - (if (not (re-search-forward "#! *\\(?:cached-\\)?nix-shell +-i +\\([^ \n]+\\)" 256 t)) + (if (not (and (re-search-forward "\\_ t= | display type under point | + | =tuareg-find-alternate-file= | = a= | switch between =.ml= and =.mli= | + | =merlin-locate= | =g d= | lookup definition | + | =merlin-occurences= | =SPC c D= | lookup references | + | =merlin-document= | =K= | lookup documentation | + | =merlin-imenu= | =SPC s i= | symbol lookup in file | + | =merlin-iedit-occurrences= | =v R= | visual refactor identifier under point (multiple cursors) | + | =utop= | =SPC o r= | open =utop= as REPL | + | =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= | ** Hacks + =set-ligatures!= is called with the full tuareg prettify symbol list, this diff --git a/modules/lang/org/README.org b/modules/lang/org/README.org index 8af539491..d6a094380 100644 --- a/modules/lang/org/README.org +++ b/modules/lang/org/README.org @@ -173,6 +173,8 @@ esoteric features: + To execute babel code blocks, you need whatever dependencies those languages need. It is recommended you enable the associated =:lang= module and ensure its dependencies are met, e.g. install the =ruby= executable for ruby support. + To use ~jupyter kernels~ you need the =+jupyter= flag, the associated kernel as + well as the ~jupyter~ program. + =org-roam= (with the =+roam= flag) requires =sqlite3= to be installed. ** MacOS @@ -185,6 +187,7 @@ brew install gnuplot #+BEGIN_SRC sh pacman -S texlive-core texlive-bin texlive-science pacman -S gnuplot +pacman -S jupyter # required by +jupyter #+END_SRC ** NixOS @@ -192,6 +195,8 @@ pacman -S gnuplot environment.systemPackages = with pkgs; [ # any less than medium isn't guaranteed to work texlive.combined.scheme-medium + # required by +jupyter + (python38.withPackages(ps: with ps; [jupyter])) ]; #+END_SRC diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 385da9c66..ad2462b0a 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -387,7 +387,8 @@ another level of headings on each invocation." Made for `org-tab-first-hook' in evil-mode." (interactive) (cond ((not (and (bound-and-true-p evil-local-mode) - (evil-insert-state-p))) + (or (evil-insert-state-p) + (evil-emacs-state-p)))) nil) ((org-at-item-p) (if (eq this-command 'org-shifttab) @@ -424,7 +425,8 @@ Made for `org-tab-first-hook'." ;; in the few cases where it does. (yas-indent-line 'fixed)) (cond ((and (or (not (bound-and-true-p evil-local-mode)) - (evil-insert-state-p)) + (evil-insert-state-p) + (evil-emacs-state-p)) (yas--templates-for-key-at-point)) (yas-expand) t) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d52892bc4..0f0a6063d 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -541,12 +541,6 @@ the exported output (i.e. formatters)." :before-while #'org-fix-tags-on-the-fly org-auto-align-tags) - ;; HACK Org is known to use a lot of unicode symbols (and large org files tend - ;; to be especially memory hungry). Compounded with - ;; `inhibit-compacting-font-caches' being non-nil, org needs more memory - ;; to be performant. - (setq-hook! 'org-mode-hook gcmh-high-cons-threshold (* 2 gcmh-high-cons-threshold)) - (defadvice! +org--recenter-after-follow-link-a (&rest _args) "Recenter after following a link, but only internal or file links." :after '(org-footnote-action @@ -556,20 +550,14 @@ the exported output (i.e. formatters)." (when (get-buffer-window) (recenter))) - (defadvice! +org--strip-properties-from-outline-a (orig-fn path &optional width prefix separator) - "Remove link syntax and fix variable height text (e.g. org headings) in the -eldoc string." + (defadvice! +org--strip-properties-from-outline-a (orig-fn &rest args) + "Fix variable height faces in eldoc breadcrumbs." :around #'org-format-outline-path - (funcall orig-fn - (cl-loop for part in path - ;; Remove full link syntax - for fixedpart = (replace-regexp-in-string org-link-any-re "\\4" (or part "")) - for n from 0 - for face = (nth (% n org-n-level-faces) org-level-faces) - collect - (org-add-props fixedpart - nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) - width prefix separator)) + (let ((org-level-faces + (cl-loop for face in org-level-faces + collect `(:foreground ,(face-foreground face nil t) + :weight bold)))) + (apply orig-fn args))) (after! org-eldoc ;; HACK Fix #2972: infinite recursion when eldoc kicks in in 'org' or @@ -588,8 +576,7 @@ eldoc string." (add-hook! 'org-agenda-finalize-hook (defun +org-exclude-agenda-buffers-from-workspace-h () - "Prevent temporary agenda buffers being associated with current -workspace." + "Don't associate temporary agenda buffers with current workspace." (when (and org-agenda-new-buffers (bound-and-true-p persp-mode) (not org-agenda-sticky)) @@ -598,11 +585,12 @@ workspace." (get-current-persp) nil)))) (defun +org-defer-mode-in-agenda-buffers-h () - "Org agenda opens temporary agenda incomplete org-mode buffers. -These are great for extracting agenda information from, but what if the user -tries to visit one of these buffers? Then we remove it from the to-be-cleaned -queue and restart `org-mode' so they can grow up to be full-fledged org-mode -buffers." + "`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) (with-current-buffer buffer (add-hook 'doom-switch-buffer-hook #'+org--restart-mode-h @@ -612,7 +600,7 @@ buffers." "Prevent temporarily opened agenda buffers from polluting recentf." :around #'org-get-agenda-file-buffer (let ((recentf-exclude (list (lambda (_file) t))) - (doom-large-file-p t) + (doom-inhibit-large-file-detection t) find-file-hook org-mode-hook) (funcall orig-fn file))) @@ -1128,7 +1116,9 @@ compelling reason, so..." (run-hooks 'org-load-hook)) :config - (set-company-backend! 'org-mode 'company-capf 'company-dabbrev) + (add-to-list 'doom-debug-variables 'org-export-async-debug) + + (set-company-backend! 'org-mode 'company-capf) (set-eval-handler! 'org-mode #'+org-eval-handler) (set-lookup-handlers! 'org-mode :definition #'+org-lookup-definition-handler diff --git a/modules/lang/org/contrib/journal.el b/modules/lang/org/contrib/journal.el index 6f93b05ca..b9fff2559 100644 --- a/modules/lang/org/contrib/journal.el +++ b/modules/lang/org/contrib/journal.el @@ -45,6 +45,8 @@ (set-popup-rule! "^\\*Org-journal search" :select t :quit t) + (set-company-backend! 'org-journal-mode 'company-capf 'company-dabbrev) + (map! (:map org-journal-mode-map :n "]f" #'org-journal-next-entry :n "[f" #'org-journal-previous-entry diff --git a/modules/lang/org/contrib/pretty.el b/modules/lang/org/contrib/pretty.el index 3ca56e071..497707b0a 100644 --- a/modules/lang/org/contrib/pretty.el +++ b/modules/lang/org/contrib/pretty.el @@ -21,4 +21,5 @@ (use-package! org-fancy-priorities ; priority icons :hook (org-mode . org-fancy-priorities-mode) + :hook (org-agenda-mode . org-fancy-priorities-mode) :config (setq org-fancy-priorities-list '("⚑" "⬆" "■"))) diff --git a/modules/lang/org/doctor.el b/modules/lang/org/doctor.el index 1ebfb3f9d..c4c672d24 100644 --- a/modules/lang/org/doctor.el +++ b/modules/lang/org/doctor.el @@ -9,4 +9,20 @@ (unless (executable-find "sqlite3") (warn! "Couldn't find the sqlite3 executable. org-roam will not work.")) (unless (executable-find "dot") - (warn! "Couldn't find the dot executable (from graphviz). org-roam will not be able to generate graph visuallizations."))) + (warn! "Couldn't find the dot executable (from graphviz). org-roam will not be able to generate graph visualizations."))) + +(when (featurep! +dragndrop) + (when IS-MAC + (unless (executable-find "pngpaste") + (warn! "Couldn't find the pngpaste executable. org-download-clipboard will not work."))) + (when IS-LINUX + (unless (or (executable-find "maim") (executable-find "scrot") (executable-find "gnome-screenshot")) + (warn! "Couldn't find the maim, scrot or gnome-screenshot executable. org-download-clipboard will not work.")) + (if (string= "wayland" (getenv "XDG_SESSION_TYPE")) + (unless (executable-find "wl-paste") + (warn! "Couldn't find the wl-paste executable (from wl-clipboard). org-download-clipboard will not work.")) + (unless (executable-find "xclip") + (warn! "Couldn't find the xclip executable. org-download-clipboard will not work.")))) + (when IS-WINDOWS + (unless (executable-find "convert") + (warn! "Couldn't find the convert program (from ImageMagick). org-download-clipboard will not work.")))) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index d5d2a5926..ce0e4504b 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -14,11 +14,12 @@ ;; root. Of course, this command won't work in a sparse clone, ;; and more than that, initiating these compilation step is a ;; hassle, so... - :build (with-temp-file (expand-file-name "org-version.el" (straight--repos-dir "org-mode")) - (insert "(fset 'org-release (lambda () \"9.5\"))\n" - "(fset 'org-git-version #'ignore)\n" - "(provide 'org-version)\n"))) - :pin "7c8dce72bd5d86157dd1dda2ba0a21ac86084426" + :pre-build + (with-temp-file (doom-path (straight--repos-dir "org-mode") "org-version.el") + (insert "(fset 'org-release (lambda () \"9.5\"))\n" + "(fset 'org-git-version #'ignore)\n" + "(provide 'org-version)\n"))) + :pin "6b83c6e4eaec4af47a90d05c3410d4637d8cb8da" ;; Prevents built-in Org from sneaking into the byte-compilation of ;; `org-plus-contrib', and inform other packages that `org-mode' satisfies the ;; `org' dependency: https://github.com/raxod502/straight.el/issues/352 @@ -38,22 +39,22 @@ :recipe (:host github :repo "hlissner/evil-org-mode") :pin "a9706da260c45b98601bcd72b1d2c0a24a017700")) (when (featurep! :tools pdf) - (package! org-pdftools :pin "3c2b9a413eb841c781cfb49d8c343bf07aa0ad1f")) + (package! org-pdftools :pin "bcf0084883ede36e91c72be73c0fbd7098439c99")) (when (featurep! :tools magit) (package! orgit :pin "ac9b1a42863a864fde9d225890ef5464bffdc646")) (when (featurep! +brain) - (package! org-brain :pin "1ae4fd46165fc56f34f36ce38cb2ae816b07e207")) + (package! org-brain :pin "f7939ef5071895930eebccf490ea7cb25cc54b2c")) (when (featurep! +dragndrop) - (package! org-download :pin "42ac361ef5502017e6fc1bceb00333eba90402f4")) + (package! org-download :pin "97bec7412e1a4d6e9031c7a0568d0f065cd9fd00")) (when (featurep! +gnuplot) - (package! gnuplot :pin "f0001c30010b2899e36d7d89046322467e923088") + (package! gnuplot :pin "116cad8e09024223f97e81b0a4503cef20de9bf5") (package! gnuplot-mode :pin "601f6392986f0cba332c87678d31ae0d0a496ce7")) (when (featurep! +ipython) ; DEPRECATED (package! ob-ipython :pin "7147455230841744fb5b95dcbe03320313a77124")) (when (featurep! +jupyter) (package! jupyter :pin "360cae2c70ab28c7a7848c0c56473d984f0243e5")) (when (featurep! +journal) - (package! org-journal :pin "14ce0119fe2d89f2f2207788be2edce0b9372822")) + (package! org-journal :pin "c0836483ae43e525bf7547b7a789d171eda84c84")) (when (featurep! +noter) (package! org-noter :pin "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d")) (when (featurep! +pomodoro) @@ -65,14 +66,14 @@ (package! centered-window :recipe (:host github :repo "anler/centered-window-mode") :pin "f50859941ab5c7cbeaee410f2d38716252b552ac") - (package! org-tree-slide :pin "18034c476038adcc1c4697168b8068f4d0ce62fe") - (package! org-re-reveal :pin "0062756e9a5b6ec96c7de5ca94372cc6495296a1") + (package! org-tree-slide :pin "d6e8e91433dfe4968f1343b483f2680f45a77d52") + (package! org-re-reveal :pin "47339ef6772c79849a9764716df8361649ea7bdc") (package! revealjs :recipe (:host github :repo "hakimel/reveal.js" :files ("css" "dist" "js" "plugin")) :pin "0582f57517c97a4c7bfeb58762138c78883f94c5")) (when (featurep! +roam) - (package! org-roam :pin "be95b42d32d9707309ab373f1d8182c84db41c5c")) + (package! org-roam :pin "15d864a500d90c9dc2e16d888e93343528ec3941")) ;;; Babel (package! ob-async :pin "de1cd6c93242a4cb8773bbe115b7be3d4dd6b97e") @@ -89,7 +90,7 @@ :recipe (:host github :repo "DEADB17/ob-racket") :pin "d8fd51bddb019b0eb68755255f88fc800cfe03cb")) (when (featurep! :lang rest) - (package! ob-restclient :pin "f7449b2068498fe9d8ab9589e0a638148861533f")) + (package! ob-restclient :pin "0ebfc7c5ebf96d2fe1a476439831363a5a43b9b6")) (when (featurep! :lang scala) (package! ob-ammonite :pin "39937dff395e70aff76a4224fa49cf2ec6c57cca")) @@ -99,6 +100,6 @@ (when (featurep! +hugo) (package! ox-hugo :recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t) - :pin "f24c9bd522ae22bee2327c2b53858d0a5066707d")) + :pin "6bc8ee08023695fa167ac0ddf1fc61e1975fa1ce")) (when (featurep! :lang rst) (package! ox-rst :pin "99fa790da55b57a3f2e9aa187493ba434a64250e")) diff --git a/modules/lang/php/README.org b/modules/lang/php/README.org index e4a183229..e945cacaf 100644 --- a/modules/lang/php/README.org +++ b/modules/lang/php/README.org @@ -100,29 +100,41 @@ sudo zypper install nodejs npm #+END_SRC ** Dependencies -The features in this module optionally depend on the following php packages: +This module has no required dependencies, but it has a couple optional ones. + ~boris~ (REPL) + ~phpctags~ (better code completion) + ~phpunit~ (unit test commands) -+ ~php-cs-fixer~ (for code formatting) ++ ~php-cs-fixer~ and ~@prettier/plugin-php~ (for code formatting) #+BEGIN_SRC sh composer global require \ d11wtq/boris \ phpunit/phpunit \ - techlivezheng/phpctags + techlivezheng/phpctags \ + friendsofphp/php-cs-fixer + +# Needed by php-cs-fixer, otherwise you'll get "Couldn't resolve parser +# 'php'" errors +npm install -g @prettier/plugin-php #+END_SRC -Ensure that ~\~/.composer/vendor/bin~ is in ~PATH~: +You must ensure that ~\~/.composer/vendor/bin~ is in ~PATH~, so these +executables are visible to Emacs: #+BEGIN_SRC sh # place this in your profile file, like ~/.bash_profile or ~/.zshenv export PATH="~/.composer/vendor/bin:$PATH" #+END_SRC -By the way, if you use intelephense, running =M-x lsp-install-server= and -choose ~iph~ to install lsp-intelephense. +You may also need to regenerate your envvar file by running ~doom env~ on the +command line. + +#+begin_quote +To use intelephense instead of , run =M-x lsp-install-server= and choose ~iph~ to +install lsp-intelephense. +#+end_quote + * TODO Features # An in-depth list of features, how to use them, and their dependencies. diff --git a/modules/lang/python/README.org b/modules/lang/python/README.org index 2ae54de86..41b2aafb1 100644 --- a/modules/lang/python/README.org +++ b/modules/lang/python/README.org @@ -36,7 +36,7 @@ Adds Python support to Doom Emacs. + [[https://github.com/pythonic-emacs/anaconda-mode][anaconda-mode]]* + [[https://github.com/Wilfred/pyimport][pyimport]]* + [[https://github.com/paetzke/py-isort.el][py-isort]]* -+ [[https://melpa.org/#/nose][nose]]* ++ [[https://github.com/emacsattic/nose/][nose]]* + [[https://github.com/wbolster/emacs-python-pytest][python-pytest]]* + [[https://github.com/Wilfred/pip-requirements.el][pip-requirements]]* + [[https://github.com/pwalsh/pipenv.el][pipenv]]* diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index f1d23d19e..043045bef 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -102,7 +102,7 @@ (unless (or (bound-and-true-p lsp-mode) (bound-and-true-p eglot--managed-mode) (bound-and-true-p lsp--buffer-deferred) - (not (executable-find python-shell-interpreter))) + (not (executable-find python-shell-interpreter t))) (anaconda-mode +1)))) :config (set-company-backend! 'anaconda-mode '(company-anaconda)) @@ -207,7 +207,7 @@ (set-eval-handler! 'python-mode '((:command . (lambda () python-shell-interpreter)) (:exec (lambda () - (if-let* ((bin (executable-find "pipenv")) + (if-let* ((bin (executable-find "pipenv" t)) (_ (pipenv-project-p))) (format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin) "%c %o %s %a"))) diff --git a/modules/lang/python/doctor.el b/modules/lang/python/doctor.el index 546df9a8d..d1d2c08e4 100644 --- a/modules/lang/python/doctor.el +++ b/modules/lang/python/doctor.el @@ -4,10 +4,12 @@ (featurep! :tools lsp)) "This module requires (:tools lsp)") -(if (not (executable-find "python")) +(if (not (or (executable-find "python") + (executable-find "python3"))) (error! "Couldn't find python in your PATH") (unless (featurep! +lsp) - (unless (zerop (shell-command "python -c 'import setuptools'")) + (unless (or (zerop (shell-command "python -c 'import setuptools'")) + (zerop (shell-command "python3 -c 'import setuptools'"))) (warn! "setuptools wasn't detected, which anaconda-mode requires")))) (when (featurep! +pyenv) diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index ef4b29aa9..081a2b26b 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -4,7 +4,7 @@ ;; Major modes (package! pip-requirements :pin "216cd1690f80cc965d4ae47b8753fc185f778ff6") (when (featurep! +cython) - (package! cython-mode :pin "21b4e533747507c4dad5e6908df1f157dff4de89") + (package! cython-mode :pin "17e03b8658a07b6d6da49300b39b57ed9c59ddb1") (when (featurep! :checkers syntax) (package! flycheck-cython :pin "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76"))) @@ -12,21 +12,21 @@ (when (featurep! +lsp) (unless (featurep! :tools lsp +eglot) (if (featurep! +pyright) - (package! lsp-pyright :pin "d9e7d3cf1bdc8ee0395c8df4408b05ee3ba9c22a") - (package! lsp-python-ms :pin "c4ebc7a11398733055a1dc07f9cffacd04d1c2dc")))) + (package! lsp-pyright :pin "71ff088ac4c93b0edd012f305a3dfd1602c5d21e") + (package! lsp-python-ms :pin "5470ada6cde6e68fe6ce13ff1146c89c3bae0cc8")))) ;; Programming environment -(package! anaconda-mode :pin "39b1cf88c8c459901630d248d6135d8644075648") +(package! anaconda-mode :pin "b1875a5d0ec9885c1c42558c126b93ee6bcedaa6") (when (featurep! :completion company) (package! company-anaconda :pin "da1566db41a68809ef7f91ebf2de28118067c89b")) ;; Environment management -(package! pipenv :pin "b730bb509e8b60af9f5ab1f1e6c3458d1d95d789") -(package! pyvenv :pin "0bf4b87068e9040fc99afa85af1992247dd7aacd") +(package! pipenv :pin "f516a1a8677a6a1ce9683056e9f77b1e785e8431") +(package! pyvenv :pin "9b3678bc29192d2dba64df90fbdb17393ef8d877") (when (featurep! +pyenv) (package! pyenv-mode :pin "b818901b8eac0e260ced66a6a5acabdbf6f5ba99")) (when (featurep! +conda) - (package! conda :pin "9f7eea16e9ad3eb34fe3d1cbd9d6162b8046c2f8")) + (package! conda :pin "dce431b25f5a13af58cc7cacfa7968b5a888609c")) (when (featurep! +poetry) (package! poetry :pin "d5163fe065239bb7b46ed8b3ff3b85b1f3229af3")) @@ -35,7 +35,7 @@ ;; REVIEW Remove this when emacsmirror/epkgs updates its emacsattic index :recipe (:host github :repo "emacsattic/nose") :pin "f8528297519eba911696c4e68fa88892de9a7b72") -(package! python-pytest :pin "4a1c4c8915c12e540d41aae1d4e326a2362da541") +(package! python-pytest :pin "3fadf1f8bc363d57c54eedd1bf98e6d9db9f0a62") ;; Import managements (package! pyimport :pin "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") diff --git a/modules/lang/rust/README.org b/modules/lang/rust/README.org index fa5a5ed47..63a0bec2c 100644 --- a/modules/lang/rust/README.org +++ b/modules/lang/rust/README.org @@ -97,7 +97,7 @@ selected by default. Modify ~rustic-lsp-server~ to change the default: (setq rustic-lsp-server 'rls)) #+END_SRC -** Enabling elgot support for Rust +** Enabling eglot support for Rust Doom's =:tools lsp= module has an =+eglot= flag. Enable it and this module will use eglot instead. diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index c0a0cc5b9..993702b72 100644 --- a/modules/lang/rust/packages.el +++ b/modules/lang/rust/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/rust/packages.el -(package! rustic :pin "91ad5db27b86bb2ba6f3019b764d0f45ec93f484") +(package! rustic :pin "f7d5ac0c930ae435421f3f5bc827e8c61ce73662") (unless (featurep! +lsp) (package! racer :pin "a0bdf778f01e8c4b8a92591447257422ac0b455b")) diff --git a/modules/lang/scheme/config.el b/modules/lang/scheme/config.el index 41249b72c..4b2f57175 100644 --- a/modules/lang/scheme/config.el +++ b/modules/lang/scheme/config.el @@ -11,7 +11,9 @@ (setq geiser-active-implementations '(guile chicken mit chibi chez) geiser-autodoc-identifier-format "%s → %s" geiser-repl-current-project-function 'doom-project-root) - (unless (featurep! :lang racket) + (if (featurep! :lang racket) + (setq auto-mode-alist + (remove '("\\.rkt\\'" . scheme-mode) auto-mode-alist)) (push 'racket geiser-active-implementations)) (after! scheme ; built-in (set-repl-handler! 'scheme-mode #'+scheme/open-repl) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 81f2f88b4..8188d0c12 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -65,12 +65,9 @@ (add-to-list 'web-mode-engines-alist '("elixir" . "\\.eex\\'")) - (let ((types '("javascript" "jsx"))) - (setq web-mode-comment-formats - (cl-remove-if (lambda (item) (member (car item) types)) - web-mode-comment-formats)) - (dolist (type types) - (push (cons type "//") web-mode-comment-formats))) + ;; Use // instead of /* as the default comment delimited in JS + (setf (alist-get "javascript" web-mode-comment-formats nil nil #'equal) + "//") (add-hook! 'web-mode-hook (defun +web--fix-js-comments-h () diff --git a/modules/os/tty/config.el b/modules/os/tty/config.el index 5546166e8..bcd6ee018 100644 --- a/modules/os/tty/config.el +++ b/modules/os/tty/config.el @@ -22,7 +22,7 @@ ;; wl-copy, termux-clipboard-get, or getclip (cygwin); depending on what ;; is available. (and (require 'xclip nil t) - (xclip-mode +1))))) + (with-demoted-errors "%s" (xclip-mode +1)))))) (when (featurep! :editor evil) ;; Fix cursor shape-changing in the terminal. Only supported in XTerm, Gnome diff --git a/modules/term/eshell/autoload/eshell.el b/modules/term/eshell/autoload/eshell.el index 0a4604a0b..b9d183332 100644 --- a/modules/term/eshell/autoload/eshell.el +++ b/modules/term/eshell/autoload/eshell.el @@ -28,7 +28,7 @@ (switch-to-buffer (doom-fallback-buffer))) (when +eshell-enable-new-shell-on-split (let ((default-directory directory)) - (when-let (win (get-buffer-window (+eshell/here t))) + (when-let (win (get-buffer-window (+eshell/here))) (set-window-dedicated-p win dedicated-p)))))) (defun +eshell--setup-window (window &optional flag) diff --git a/modules/term/eshell/config.el b/modules/term/eshell/config.el index 755c598fe..d1e52b065 100644 --- a/modules/term/eshell/config.el +++ b/modules/term/eshell/config.el @@ -103,6 +103,10 @@ You should use `set-eshell-alias!' to change this.") ;; or configure `+eshell-aliases' via elisp. (advice-add #'eshell-write-aliases-list :override #'ignore) + ;; REVIEW In Emacs 27 and newer, waiting for esh-module is unnecessary. + (after! esh-module + (add-to-list 'eshell-modules-list 'eshell-tramp)) + ;; Visual commands require a proper terminal. Eshell can't handle that, so ;; it delegates these commands to a term buffer. (after! em-term diff --git a/modules/term/vterm/autoload.el b/modules/term/vterm/autoload.el index 8932b8c68..0ffcbe675 100644 --- a/modules/term/vterm/autoload.el +++ b/modules/term/vterm/autoload.el @@ -75,18 +75,3 @@ method to prepare vterm at the corresponding remote directory." (vterm-send-string (concat "cd " path-localname)) (vterm-send-return))))) - - -(defvar +vterm--insert-point nil) - -;;;###autoload -(defun +vterm-remember-insert-point-h () - "Remember point when leaving insert mode." - (setq-local +vterm--insert-point (point))) - -;;;###autoload -(defun +vterm-goto-insert-point-h () - "Go to the point we were at when we left insert mode." - (when +vterm--insert-point - (goto-char +vterm--insert-point) - (setq-local +vterm--insert-point nil))) diff --git a/modules/term/vterm/config.el b/modules/term/vterm/config.el index 9f29dc5bb..d82706cc1 100644 --- a/modules/term/vterm/config.el +++ b/modules/term/vterm/config.el @@ -19,11 +19,4 @@ ;; Don't prompt about dying processes when killing vterm confirm-kill-processes nil ;; Prevent premature horizontal scrolling - hscroll-margin 0) - - ;; Restore the point's location when leaving and re-entering insert mode. - (when (featurep! :editor evil) - (add-hook! 'vterm-mode-hook - (defun +vterm-init-remember-point-h () - (add-hook 'evil-insert-state-exit-hook #'+vterm-remember-insert-point-h nil t) - (add-hook 'evil-insert-state-entry-hook #'+vterm-goto-insert-point-h nil t))))) + hscroll-margin 0)) diff --git a/modules/term/vterm/packages.el b/modules/term/vterm/packages.el index b674ee25d..5cd91f5f8 100644 --- a/modules/term/vterm/packages.el +++ b/modules/term/vterm/packages.el @@ -3,4 +3,4 @@ (package! vterm :built-in 'prefer - :pin "101ff86d4d1c7ff8ca954ba59f666fd36f789aae") + :pin "fb12d7f49e2da121d9b17ed583d269166e0da087") diff --git a/modules/tools/ansible/config.el b/modules/tools/ansible/config.el index 0e425be03..efef20a50 100644 --- a/modules/tools/ansible/config.el +++ b/modules/tools/ansible/config.el @@ -7,6 +7,8 @@ :config (setq ansible-section-face 'font-lock-variable-name-face ansible-task-label-face 'font-lock-doc-face) + (when (featurep! :completion company) + (set-company-backend! 'ansible 'company-ansible)) (map! :map ansible-key-map :localleader :desc "Decrypt buffer" "d" #'ansible-decrypt-buffer diff --git a/modules/tools/ansible/doctor.el b/modules/tools/ansible/doctor.el new file mode 100644 index 000000000..343875d14 --- /dev/null +++ b/modules/tools/ansible/doctor.el @@ -0,0 +1,5 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; tools/ansible/doctor.el + +(unless (executable-find "ansible") + (warn! "Couldn't find ansible executable. Some features of the ansible module won't work")) diff --git a/modules/tools/ansible/packages.el b/modules/tools/ansible/packages.el index 4314ba690..bb8cf2457 100644 --- a/modules/tools/ansible/packages.el +++ b/modules/tools/ansible/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/ansible/packages.el -(package! ansible :recipe (:nonrecursive t) :pin "cf6b8f06c2628357fc2a72ea9817a2c2d0ebf690") +(package! ansible :recipe (:nonrecursive t) :pin "40af0d2bbb6c5bbcf7aa9269ac9a07e22622d263") (package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") (package! jinja2-mode :pin "ecd19a40b7832bb00f0a2244e3b0713d0bf3850d") (package! yaml-mode :pin "fc5e1c58f94472944c4aa838f00f6adcac6fa992") diff --git a/modules/tools/biblio/packages.el b/modules/tools/biblio/packages.el index 81425bb59..7861658a9 100644 --- a/modules/tools/biblio/packages.el +++ b/modules/tools/biblio/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/biblio/packages.el -(package! bibtex-completion :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c") +(package! bibtex-completion :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6") (when (featurep! :completion ivy) - (package! ivy-bibtex :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c")) + (package! ivy-bibtex :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6")) (when (featurep! :completion helm) - (package! helm-bibtex :pin "8d84d8beb3bfafaa060d7e956fcc569ecf010d9c")) + (package! helm-bibtex :pin "1bb81d77e08296a50de7ebfe5cf5b0c715b7f3d6")) diff --git a/modules/tools/debugger/packages.el b/modules/tools/debugger/packages.el index f3075ad02..13efc670d 100644 --- a/modules/tools/debugger/packages.el +++ b/modules/tools/debugger/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/debugger/packages.el -(when (package! realgud :pin "ff660011c82c6af504915833e2d981a547b7ad58") +(when (package! realgud :pin "f73c039a340579a98e6716c901fd4e80e7eaa2eb") (when (featurep! :lang javascript) (package! realgud-trepan-ni :pin "6e38cf838c7b47b5f1353d00901b939ffa36d707"))) (when (featurep! +lsp) - (package! dap-mode :pin "e582ff90c104703ed65c1f3174d4c4690e9cf1fd") - (package! posframe :pin "e1552c82dffaadc5e7de09a44880a498197ffbee")) + (package! dap-mode :pin "612388d0b85e77972a9c28391bac6224a63408c7") + (package! posframe :pin "efd7ea490defc53a5b78e7469a3a35d225b766cc")) diff --git a/modules/tools/docker/packages.el b/modules/tools/docker/packages.el index b786965dc..f3b149df6 100644 --- a/modules/tools/docker/packages.el +++ b/modules/tools/docker/packages.el @@ -3,4 +3,4 @@ (package! docker :pin "3773112eea3fc99704b5ca50c1e9a3db2cb8e4f3") (package! docker-tramp :pin "8e2b671eff7a81af43b76d9dfcf94ddaa8333a23") -(package! dockerfile-mode :pin "d31f7685ebc5832d957e25070a930aa42984327d") +(package! dockerfile-mode :pin "6a56c1cc1713b501040b08fdbf0c4159a4fe95f9") diff --git a/modules/tools/editorconfig/packages.el b/modules/tools/editorconfig/packages.el index fb6222b93..517eb50d7 100644 --- a/modules/tools/editorconfig/packages.el +++ b/modules/tools/editorconfig/packages.el @@ -3,4 +3,4 @@ (package! editorconfig :recipe (:nonrecursive t) - :pin "da844718bfe1ca51919c63fdffedaba5d0cc1bba") + :pin "d73333c224de783e42acd225a20330a667fe5191") diff --git a/modules/tools/ein/packages.el b/modules/tools/ein/packages.el index 74ee841a3..b9fe836f8 100644 --- a/modules/tools/ein/packages.el +++ b/modules/tools/ein/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/ein/packages.el -(package! ein :pin "a019ee3994585e4ed4700d2591d693fda3232616") +(package! ein :pin "917f2a0b6ca76ed9e966985ca6f19d8b57690d40") diff --git a/modules/tools/lookup/autoload/lookup.el b/modules/tools/lookup/autoload/lookup.el index dc5b94843..6d529f183 100644 --- a/modules/tools/lookup/autoload/lookup.el +++ b/modules/tools/lookup/autoload/lookup.el @@ -163,18 +163,20 @@ This can be passed nil as its second argument to unset handlers for MODES. e.g. (+lookup--run-handlers handler identifier origin) (user-error "No lookup handler selected")) (run-hook-wrapped handlers #'+lookup--run-handlers identifier origin)))) - (when (cond ((null result) - (message "No lookup handler could find %S" identifier) - nil) - ((markerp result) - (funcall (or display-fn #'switch-to-buffer) - (marker-buffer result)) - (goto-char result) - result) - (result)) - (with-current-buffer (marker-buffer origin) - (better-jumper-set-jump (marker-position origin))) - result))) + (unwind-protect + (when (cond ((null result) + (message "No lookup handler could find %S" identifier) + nil) + ((markerp result) + (funcall (or display-fn #'switch-to-buffer) + (marker-buffer result)) + (goto-char result) + result) + (result)) + (with-current-buffer (marker-buffer origin) + (better-jumper-set-jump (marker-position origin))) + result) + (set-marker origin nil)))) ;; diff --git a/modules/tools/lookup/config.el b/modules/tools/lookup/config.el index 5dc20b33f..9064fadf7 100644 --- a/modules/tools/lookup/config.el +++ b/modules/tools/lookup/config.el @@ -26,7 +26,8 @@ ("Github" "https://github.com/search?ref=simplesearch&q=%s") ("Youtube" "https://youtube.com/results?aq=f&oq=&search_query=%s") ("Wolfram alpha" "https://wolframalpha.com/input/?i=%s") - ("Wikipedia" "https://wikipedia.org/search-redirect.php?language=en&go=Go&search=%s")) + ("Wikipedia" "https://wikipedia.org/search-redirect.php?language=en&go=Go&search=%s") + ("MDN" "https://developer.mozilla.org/en-US/search?q=%s")) (when (featurep! :lang rust) '(("Rust Docs" "https://doc.rust-lang.org/std/?search=%s")))) "An alist that maps online resources to either: @@ -170,7 +171,16 @@ Dictionary.app behind the scenes to get definitions.") (setq xref-show-definitions-function #'ivy-xref-show-defs)) ;; Necessary in Emacs <27. In Emacs 27 it will affect all xref-based ;; commands other than xref-find-definitions too (eg project-find-regexp) - (setq xref-show-xrefs-function #'ivy-xref-show-xrefs)) + (setq xref-show-xrefs-function #'ivy-xref-show-xrefs) + + ;; HACK Fix #4386: `ivy-xref-show-xrefs' calls `fetcher' twice, which has + ;; side effects that breaks in some cases (i.e. on `dired-do-find-regexp'). + (defadvice! +lookup--fix-ivy-xrefs (orig-fn fetcher alist) + :around #'ivy-xref-show-xrefs + (when (functionp fetcher) + (setf (alist-get 'fetched-xrefs alist) + (funcall fetcher))) + (funcall orig-fn fetcher alist))) (use-package! helm-xref :when (featurep! :completion helm))) diff --git a/modules/tools/lookup/packages.el b/modules/tools/lookup/packages.el index da3273b38..3c707eaa2 100644 --- a/modules/tools/lookup/packages.el +++ b/modules/tools/lookup/packages.el @@ -27,7 +27,7 @@ (when (featurep! +dictionary) (if IS-MAC (package! osx-dictionary :pin "1b79ff64c72485cb078db9ab7ee3256b11a99f4b") - (package! define-word :pin "3af6825c5f3bf4f6176a3f5b2e499616c65e2fe0") + (package! define-word :pin "6e4a427503aef096484f88332962c346cdd10847") (package! powerthesaurus :pin "93036d3b111925ebc34f747ff846cb0b8669b92e") (when (featurep! +offline) (package! wordnut :pin "feac531404041855312c1a046bde7ea18c674915") diff --git a/modules/tools/lsp/+lsp.el b/modules/tools/lsp/+lsp.el index 0196866dc..cc541e71b 100644 --- a/modules/tools/lsp/+lsp.el +++ b/modules/tools/lsp/+lsp.el @@ -28,6 +28,8 @@ Can be a list of backends; accepts any value `company-backends' accepts.") lsp-enable-text-document-color nil) ;; Reduce unexpected modifications to code (setq lsp-enable-on-type-formatting nil) + ;; Make breadcrumbs opt-in; they're redundant with the modeline and imenu + (setq lsp-headerline-breadcrumb-enable nil) ;; Let doom bind the lsp keymap. (when (featurep! :config default +bindings) @@ -40,7 +42,10 @@ Can be a list of backends; accepts any value `company-backends' accepts.") lsp-vetur-global-snippets-dir (expand-file-name "vetur" (or (bound-and-true-p +snippets-dir) (concat doom-private-dir "snippets/"))) - lsp-clients-emmy-lua-jar-path (concat lsp-server-install-dir "EmmyLua-LS-all.jar") + lsp-clients-lua-language-server-bin (concat lsp-server-install-dir "lua-language-server/" + (cond (IS-MAC "bin/macOS") + (IS-LINUX "bin/Linux") + (IS-WINDOWS "bin/Windows"))) lsp-xml-jar-file (concat lsp-server-install-dir "org.eclipse.lsp4xml-0.3.0-uber.jar") lsp-groovy-server-file (concat lsp-server-install-dir "groovy-language-server-all.jar")) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index c105ef365..c09e1c050 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -41,8 +41,6 @@ killing and opening many LSP/eglot-powered buffers.") ;; GC strategy, so we modify its variables rather than ;; `gc-cons-threshold' directly. (setq-default gcmh-high-cons-threshold (* 2 +lsp--default-gcmh-high-cons-threshold)) - (unless (bound-and-true-p gcmh-mode) - (gcmh-mode +1)) (gcmh-set-high-threshold) (setq +lsp--optimization-init-p t)))) diff --git a/modules/tools/lsp/packages.el b/modules/tools/lsp/packages.el index 5ee2055f7..564389447 100644 --- a/modules/tools/lsp/packages.el +++ b/modules/tools/lsp/packages.el @@ -3,10 +3,10 @@ (if (featurep! +eglot) (progn - (package! eglot :pin "21726416e6e580b20dfa90833c6dab2a8a15ea48") - (package! project :pin "67216fba813461a8b8d5db1a12aaca08a0389423")) - (package! lsp-mode :pin "e1c42412eac0d742196efe64a82699326e72b391") - (package! lsp-ui :pin "b1693d610c4d2c44305eba2719e8d4097fdcdcb8") + (package! eglot :pin "4c85df2b04e467b8ed0eca68bd202fd0e7b671f4") + (package! project :pin "a1997af9a6de5b10cebe8c06875508249ad559ea")) + (package! lsp-mode :pin "dbfbe1a221de78e5d42e93ab2833d68c7f27f1b7") + (package! lsp-ui :pin "94673cd08c35acc3b6c34301f74f1852487a5558") (when (featurep! :completion ivy) (package! lsp-ivy :pin "c70ee8b54357c56d1b972393ee53e57a2e545fbb")) (when (featurep! :completion helm) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index ea5723419..528716738 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(when (package! magit :pin "2e0c697188ca728c240b5aa677f4a5e853692b6e") +(when (package! magit :pin "21454777281247d97814ce5fb64f4afe39fab5da") (when (featurep! +forge) - (package! forge :pin "844aa6d52792dd56a14f1759312c96a3de9b988e")) + (package! forge :pin "e340c2be2aa5337c8c4c81cd6eab87961c6848b6")) (package! magit-gitflow :pin "cc41b561ec6eea947fe9a176349fb4f771ed865b") (package! magit-todos :pin "78d24cf419138b543460f40509c8c1a168b52ca0") (package! github-review :pin "db723740e02348c0760407e532ad667ef89210ec")) diff --git a/modules/tools/pass/packages.el b/modules/tools/pass/packages.el index 20ef7d3c9..52b809493 100644 --- a/modules/tools/pass/packages.el +++ b/modules/tools/pass/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/pass/packages.el -(package! pass :pin "919d8e3826d556433ab67d4ee21a509d209d1baa") +(package! pass :pin "a095d24cf06a7b0fbc3add480c101304a91cf788") (package! password-store :pin "f152064da9832d6d3d2b4e75f43f63bf2d50716f") (package! password-store-otp :pin "04998c8578a060ab4a4e8f46f2ee0aafad4ab4d5") diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 1371b5434..f32bc01a9 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -38,9 +38,8 @@ (message nil) ; flush lingering prompt in echo-area ;; Make sure this doesn't run more than once (advice-remove #'pdf-view-mode #'+pdf--install-epdfinfo-a) - (if (or (pdf-info-running-p) - (ignore-errors (pdf-info-check-epdfinfo) t)) - (pdf-tools-install-noverify) + (unless (or (pdf-info-running-p) + (ignore-errors (pdf-info-check-epdfinfo) t)) ;; HACK On the first pdf you open (before pdf-tools loaded) ;; `pdf-tools-install' throws errors because it has hardcoded ;; opinions about what buffer should be focused when it is run. @@ -61,6 +60,8 @@ (revert-buffer t t)))))))))) ((message "Aborted"))))) + (pdf-tools-install-noverify) + ;; For consistency with other special modes (map! :map pdf-view-mode-map :gn "q" #'kill-current-buffer) diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el index d198a277c..8c08f99b7 100644 --- a/modules/tools/pdf/packages.el +++ b/modules/tools/pdf/packages.el @@ -8,4 +8,4 @@ :branch "fix-macros") :pin "eb6d40663069f2b7e6b52e907eeaa4e37375feb6") -(package! saveplace-pdf-view :pin "88e07be656544bcdfa332d25880abff168ca1423") +(package! saveplace-pdf-view :pin "b0370912049222f3a4c943856de3d69d48d53a35") diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index f30525da1..7bbecb3aa 100644 --- a/modules/tools/terraform/packages.el +++ b/modules/tools/terraform/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/terraform/packages.el -(package! terraform-mode :pin "63fafc635b04b1b72e408e7dcb21c1fac78fc60b") +(package! terraform-mode :pin "a9fa5bdaf58e9cae32ee44b7d0883f5600441b05") (when (featurep! :completion company) (package! company-terraform :pin "2d11a21fee2f298e48968e479ddcaeda4d736e12")) diff --git a/modules/ui/deft/packages.el b/modules/ui/deft/packages.el index c295162db..f8280e01c 100644 --- a/modules/ui/deft/packages.el +++ b/modules/ui/deft/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/deft/packages.el -(package! deft :pin "fca9ea05ef4fdac825e2ad3921baa7042f6b82c8") +(package! deft :pin "c4af44827f4257e7619e63abfd22094a29a9ab52") diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 494205178..8de62e8ad 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -48,7 +48,7 @@ Possible values: (defvar +doom-dashboard-menu-sections '(("Reload last session" :icon (all-the-icons-octicon "history" :face 'doom-dashboard-menu-title) - :when (cond ((require 'persp-mode nil t) + :when (cond ((featurep! :ui workspaces) (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) ((require 'desktop nil t) (file-exists-p (desktop-full-file-name)))) diff --git a/modules/ui/doom/README.org b/modules/ui/doom/README.org index 17d365df6..51fd24ea4 100644 --- a/modules/ui/doom/README.org +++ b/modules/ui/doom/README.org @@ -42,7 +42,7 @@ Although this module uses the ~doom-one~ theme by default, [[https://github.com/ + *doom-one:* doom-themes' flagship theme, inspired by [[https://atom.io/][Atom's]] One Dark themes + *doom-vibrant:* a more vibrant version of doom-one + *doom-molokai:* based on Textmate's monokai -+ *doom-nova:* adapted from [[https://trevordmiller.com/projects/nova][Nova]] ++ *doom-nova:* adapted from [[https://github.com/trevordmiller/nova-colors][Nova]] + *doom-one-light:* light version of doom-one + *doom-peacock:* based on Peacock from [[https://daylerees.github.io/][daylerees' themes]] + *doom-tomorrow-night:* by [[https://github.com/ChrisKempson/Tomorrow-Theme][Chris Kempson]] diff --git a/modules/ui/doom/packages.el b/modules/ui/doom/packages.el index 0ec3ba0ce..55f1342c3 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 "74ebd778571a2ba2a490d45a3f4161ea7251e050") +(package! doom-themes :pin "5adcc29eeccb251937fe002594bc21ce08ae5317") (package! solaire-mode :pin "c697925f7e03819a4046a233f6ab31664aca9d6a") diff --git a/modules/ui/emoji/packages.el b/modules/ui/emoji/packages.el index 921e6ada2..6b29cb73e 100644 --- a/modules/ui/emoji/packages.el +++ b/modules/ui/emoji/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/emoji/packages.el -(package! emojify :pin "4b96f37f315182f95d4ea9ff33a9b5af9f1b1620") +(package! emojify :pin "cfa00865388809363df3f884b4dd554a5d44f835") diff --git a/modules/ui/hl-todo/packages.el b/modules/ui/hl-todo/packages.el index 299a46912..d4477f408 100644 --- a/modules/ui/hl-todo/packages.el +++ b/modules/ui/hl-todo/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/hl-todo/packages.el -(package! hl-todo :pin "0598b98f63b623c1778cbd2e2f60b774b7a311b9") +(package! hl-todo :pin "9661a462d86b22293caaa4c3d94f971a15dbf1d5") diff --git a/modules/ui/minimap/config.el b/modules/ui/minimap/config.el index 86afde935..40389aa22 100644 --- a/modules/ui/minimap/config.el +++ b/modules/ui/minimap/config.el @@ -6,4 +6,5 @@ (setq minimap-window-location 'right minimap-update-delay 0 minimap-width-fraction 0.09 - minimap-minimum-width 15)) + minimap-minimum-width 15) + (pushnew! minimap-major-modes 'text-mode 'conf-mode)) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el index f7bc4c6f9..572d70df5 100644 --- a/modules/ui/modeline/packages.el +++ b/modules/ui/modeline/packages.el @@ -2,7 +2,7 @@ ;;; ui/modeline/packages.el (unless (featurep! +light) - (package! doom-modeline :pin "fb34eb5eb60f41ce1bc23c2bad6ac20de5669f22")) + (package! doom-modeline :pin "4956606a5455a3968ca10cbdb8de3889e6bd1d85")) (package! anzu :pin "bdb3da5028935a4aea55c40769bc191a81afb54e") (when (featurep! :editor evil) (package! evil-anzu :pin "d3f6ed4773b48767bd5f4708c7f083336a8a8a86")) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 62fd79014..15999df6d 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -45,7 +45,9 @@ the buffer is visible, then set another timer and try again later." + And finally deletes the window!" (let ((buffer (window-buffer window)) (inhibit-quit t)) - (and (buffer-file-name buffer) + (and (or (buffer-file-name buffer) + (if-let (base-buffer (buffer-base-buffer buffer)) + (buffer-file-name base-buffer))) (buffer-modified-p buffer) (let ((autosave (+popup-parameter 'autosave window))) (cond ((eq autosave 't)) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index e2b183f43..3e85e1525 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -174,6 +174,6 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; -;; Hacks +;;; Hacks (load! "+hacks") diff --git a/modules/ui/tabs/packages.el b/modules/ui/tabs/packages.el index ebbf99467..d2a843ed9 100644 --- a/modules/ui/tabs/packages.el +++ b/modules/ui/tabs/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/tabs/packages.el -(package! centaur-tabs :pin "b172646b49d00c7e11fe4a4eaa80bbf026e58ab5") +(package! centaur-tabs :pin "23eda0a0292a84c7e0a0aa2b598f9e29c7e5b54f") diff --git a/modules/ui/treemacs/packages.el b/modules/ui/treemacs/packages.el index 4f4e7bfc6..13a083411 100644 --- a/modules/ui/treemacs/packages.el +++ b/modules/ui/treemacs/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/treemacs/packages.el -(package! treemacs :pin "389bca1c3bdd4c4cf8245d6c4bdf8aa875e40d14") +(package! treemacs :pin "559fa09e32d5db7f620fdd08e03b938e67bf398b") ;; These packages have no :pin because they're in the same repo (when (featurep! :editor evil +everywhere) (package! treemacs-evil)) diff --git a/modules/ui/unicode/README.org b/modules/ui/unicode/README.org index 83509613a..82de5312c 100644 --- a/modules/ui/unicode/README.org +++ b/modules/ui/unicode/README.org @@ -61,7 +61,7 @@ If your font does not provide some glyphs, this package will try its best to fin A list of fonts with good unicode coverage can be found on the page of the [[https://github.com/rolandwalker/unicode-fonts#minimum-useful-fonts][unicode-fonts]] package. ** Advanced configuration -Consult the [[https://github.com/rolandwalker/unicode-font][unicode-fonts]] package documentation for a description of more advanced configuration. The configuration should be placed, as usual, in your private =config.el= wrapped in an ~(after! unicode-fonts)~ block. The variable ~unicode-fonts-blocks~ contains a list of all unicode block names and their character ranges. The default fonts to search for glyphs are in the variable ~unicode-fonts-block-font-mapping~. +Consult the [[https://github.com/rolandwalker/unicode-fonts][unicode-fonts]] package documentation for a description of more advanced configuration. The configuration should be placed, as usual, in your private =config.el= wrapped in an ~(after! unicode-fonts)~ block. The variable ~unicode-fonts-blocks~ contains a list of all unicode block names and their character ranges. The default fonts to search for glyphs are in the variable ~unicode-fonts-block-font-mapping~. If you want to use the font =Symbola= for =Miscellaneous Symbols= by default you could add #+BEGIN_SRC elisp diff --git a/modules/ui/zen/packages.el b/modules/ui/zen/packages.el index 90193e2fc..b5440b28d 100644 --- a/modules/ui/zen/packages.el +++ b/modules/ui/zen/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/zen/packages.el -(package! writeroom-mode :pin "92c47dfa659c418700d064a479e30590bcfc1904") -(package! mixed-pitch :pin "d305108f9520e196b533f05d1dcc284cf535faaf") +(package! writeroom-mode :pin "b648b340172ce4e44307375697e190bc723203e0") +(package! mixed-pitch :pin "beb22e85f6073a930f7338a78bd186e3090abdd7")