diff --git a/.github/PULL_REQUEST/bump.md b/.github/PULL_REQUEST_TEMPLATE/bump.md similarity index 84% rename from .github/PULL_REQUEST/bump.md rename to .github/PULL_REQUEST_TEMPLATE/bump.md index c02624b7e..91330f0ea 100644 --- a/.github/PULL_REQUEST/bump.md +++ b/.github/PULL_REQUEST_TEMPLATE/bump.md @@ -15,12 +15,13 @@ labels: is:update re:packages > > OR, if multiple packages are bumped in one commit: > -> Bump package1, package2 & package 3 +> Bump :tools lsp > > emacs-lsp/lsp-mode@91e37a6 -> emacs-lsp/lsp-mode@c8188ef > emacs-lsp/lsp-ui@cf6906c -> emacs-lsp/lsp-ui@582e153 > -> (Commit hashes should be limited to 7 characters) +> Commit hashes should be limited to 7 characters. Include additional +> commentary after the list of commit changes. > > 4. You've included links to relevant issues, if any > 5. You've deleted this template diff --git a/.github/PULL_REQUEST/general.md b/.github/PULL_REQUEST_TEMPLATE/general.md similarity index 100% rename from .github/PULL_REQUEST/general.md rename to .github/PULL_REQUEST_TEMPLATE/general.md diff --git a/bin/doom b/bin/doom index 919b6ed40..46a06bf8d 100755 --- a/bin/doom +++ b/bin/doom @@ -6,7 +6,7 @@ :; DOOMBASE="$(dirname "$0")/.." :; [ "$1" = -d ] || [ "$1" = --debug ] && { shift; export DEBUG=1; } :; [ "$1" = run ] && { cd "$DOOMBASE"; shift; exec $EMACS -q --no-splash -l bin/doom "$@"; exit 0; } -:; exec $EMACS --script "$0" -- "$@" +:; exec $EMACS --no-site-file --script "$0" -- "$@" :; exit 0 (let* ((load-prefer-newer t) @@ -15,6 +15,13 @@ (user-emacs-directory (abbreviate-file-name (or emacsdir (expand-file-name "../" loaddir))))) + ;; HACK Load `cl' and site files manually so we can stop them from polluting + ;; CLI logs with deprecation and file load messages. + (let ((inhibit-message t)) + (when (> emacs-major-version 26) + (require 'cl)) + (load "site-start" t t)) + (push (expand-file-name "core" user-emacs-directory) load-path) (require 'core) (require 'core-cli) diff --git a/core/autoload/cache.el b/core/autoload/cache.el deleted file mode 100644 index 79db071dd..000000000 --- a/core/autoload/cache.el +++ /dev/null @@ -1,95 +0,0 @@ -;;; core/autoload/cache.el -*- lexical-binding: t; -*- - -;; This little library thinly wraps around persistent-soft (which is a pcache -;; wrapper, how about that). It has three purposes: -;; -;; + To encapsulate the cache backend (persistent-soft/pcache in this case), in -;; case it needs to change. -;; + To provide `doom-cache-persist': a mechanism for easily persisting -;; variables across Emacs sessions. -;; + To lazy-load persistent-soft until it is really needed. -;; -;; Like persistent-soft, caches assume a 2-tier structure, where all caches are -;; namespaced by location. - -(defvar doom-cache-alists '(t) - "An alist of alists, containing lists of variables for the doom cache library -to persist across Emacs sessions.") - -(defvar doom-cache-location 'doom - "The default location for cache files. This symbol is translated into a file -name under `pcache-directory' (by default a subdirectory under -`doom-cache-dir'). One file may contain multiple cache entries.") - -(defun doom-save-persistent-cache-h () - "Hook to run when an Emacs session is killed. Saves all persisted variables -listed in `doom-cache-alists' to files." - (dolist (alist (butlast doom-cache-alists 1)) - (cl-loop with key = (car alist) - for var in (cdr alist) - if (symbol-value var) - do (doom-cache-set var it nil key)))) -(add-hook 'kill-emacs-hook #'doom-save-persistent-cache-h) - - -;; -;; Library - -;;;###autoload -(defmacro with-cache! (location &rest body) - "Runs BODY with a different default `doom-cache-location'." - (declare (indent defun)) - `(let ((doom-cache-location ',location)) - ,@body)) - -;;;###autoload -(defun doom-cache-persist (location variables) - "Persist VARIABLES (list of symbols) in LOCATION (symbol). - -This populates these variables with cached values, if one exists, and saves them -to file when Emacs quits. - -Warning: this is incompatible with buffer-local variables." - (dolist (var variables) - (when (doom-cache-exists var location) - (set var (doom-cache-get var location)))) - (setf (alist-get location doom-cache-alists) - (append variables (cdr (assq location doom-cache-alists))))) - -;;;###autoload -(defun doom-cache-desist (location &optional variables) - "Unregisters VARIABLES (list of symbols) in LOCATION (symbol) from -`doom-cache-alists', thus preventing them from being saved between sessions. -Does not affect the actual variables themselves or their values." - (if variables - (setf (alist-get location doom-cache-alists) - (cl-set-difference (cdr (assq location doom-cache-alists)) - variables)) - (delq (assq location doom-cache-alists) - doom-cache-alists))) - -;;;###autoload -(defun doom-cache-get (key &optional location) - "Retrieve KEY from LOCATION (defaults to `doom-cache-location'), if it exists -and hasn't expired." - (persistent-soft-fetch - key (symbol-name (or location doom-cache-location)))) - -;;;###autoload -(defun doom-cache-set (key value &optional ttl location) - "Set KEY to VALUE in the cache. TTL is the time (in seconds) until this cache -entry expires. LOCATION is the super-key to store this cache item under; the -default is `doom-cache-location'. " - (persistent-soft-store - key value - (symbol-name (or location doom-cache-location)) ttl)) - -;;;###autoload -(defun doom-cache-exists (key &optional location) - "Returns t if KEY exists at LOCATION (defaults to `doom-cache-location')." - (persistent-soft-exists-p key (or location doom-cache-location))) - -;;;###autoload -(defun doom-cache-clear (&optional location) - "Clear a cache LOCATION (defaults to `doom-cache-location')." - (persistent-soft-flush (or location doom-cache-location))) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 7b3f5ddcd..c6d58e8f9 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -46,10 +46,7 @@ ready to be pasted in a bug report on github." (require 'core-packages) (let ((default-directory doom-emacs-dir) (doom-modules (doom-modules))) - (cl-letf - (((symbol-function 'sh) - (lambda (&rest args) - (cdr (apply #'doom-call-process args))))) + (letf! (defun sh (&rest args) (cdr (apply #'doom-call-process args))) `((emacs (version . ,emacs-version) (features ,@system-configuration-features) diff --git a/core/autoload/help.el b/core/autoload/help.el index 7cd190969..060731b18 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -38,6 +38,7 @@ (LaTeX-mode :lang latex) (ledger-mode :lang ledger) (lua-mode :lang lua) + (moonscript-mode :lang lua) (markdown-mode :lang markdown) (gfm-mode :lang markdown) (nim-mode :lang nim) @@ -45,6 +46,7 @@ (taureg-mode :lang ocaml) (org-mode :lang org) (perl-mode :lang perl) + (raku-mode :lang perl) (php-mode :lang php) (hack-mode :lang php) (plantuml-mode :lang plantuml) @@ -53,7 +55,9 @@ (restclient-mode :lang rest) (ruby-mode :lang ruby) (rust-mode :lang rust) + (rustic-mode :lang rust) (scala-mode :lang scala) + (scheme-mode :lang scheme) (sh-mode :lang sh) (swift-mode :lang swift) (web-mode :lang web) @@ -131,7 +135,8 @@ selection of all minor-modes, active or not." (list (or (+org-get-global-property "TITLE") (file-relative-name (buffer-file-name))))) path - (list (replace-regexp-in-string org-link-any-re "\\4" text))) + (when text + (list (replace-regexp-in-string org-link-any-re "\\4" text)))) " > ") tags) " ") diff --git a/core/autoload/projects.el b/core/autoload/projects.el index edce48b76..b71623bf6 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -101,11 +101,10 @@ If DIR is not a project, it will be indexed (but not cached)." (unless (file-readable-p dir) (error "Directory %S isn't readable" dir)) (let* ((default-directory (file-truename (expand-file-name dir))) - (project-root (doom-project-root default-directory)) - (projectile-project-root default-directory) + (projectile-project-root (doom-project-root default-directory)) (projectile-enable-caching projectile-enable-caching)) - (cond ((and project-root (file-equal-p project-root projectile-project-root)) - (unless (doom-project-p projectile-project-root) + (cond ((and projectile-project-root (file-equal-p projectile-project-root default-directory)) + (unless (doom-project-p default-directory) ;; Disable caching if this is not a real project; caching ;; non-projects easily has the potential to inflate the projectile ;; cache beyond reason. diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el index 0d2833802..de08be93d 100644 --- a/core/autoload/sessions.el +++ b/core/autoload/sessions.el @@ -130,8 +130,11 @@ (interactive "P") (setq doom-autosave-session nil) (doom/quicksave-session) - (restart-emacs - (append (if debug (list "--debug-init")) - (when (boundp 'chemacs-current-emacs-profile) - (list "--with-profile" chemacs-current-emacs-profile)) - (list "--restore")))) + (save-some-buffers nil t) + (letf! ((#'save-buffers-kill-emacs #'kill-emacs) + (confirm-kill-emacs)) + (restart-emacs + (append (if debug (list "--debug-init")) + (when (boundp 'chemacs-current-emacs-profile) + (list "--with-profile" chemacs-current-emacs-profile)) + (list "--restore"))))) diff --git a/core/autoload/store.el b/core/autoload/store.el new file mode 100644 index 000000000..92ac05832 --- /dev/null +++ b/core/autoload/store.el @@ -0,0 +1,142 @@ +;;; core/autoload/cache.el -*- lexical-binding: t; -*- + +;; This little library abstracts the process of writing arbitrary elisp values +;; to a 2-tiered file store (in `doom-store-dir'/`doom-store-location'). + +(defvar doom-store-dir (concat doom-etc-dir "store/") + "Directory to look for and store data accessed through this API.") + +(defvar doom-store-persist-alist '(t) + "An alist of alists, containing lists of variables for the doom cache library +to persist across Emacs sessions.") + +(defvar doom-store-location "default" + "The default location for cache files. This symbol is translated into a file +name under `pcache-directory' (by default a subdirectory under +`doom-store-dir'). One file may contain multiple cache entries.") + +(defvar doom--store-table (make-hash-table :test 'equal)) +(defvar doom--inhibit-flush nil) + +(defun doom-save-persistent-store-h () + "Hook to run when an Emacs session is killed. Saves all persisted variables +listed in `doom-store-persist-alist' to files." + (let (locations) + (let ((doom--inhibit-flush t)) + (dolist (alist (butlast doom-store-persist-alist 1)) + (cl-loop with location = (car alist) + for var in (cdr alist) + do (doom-store-put var (symbol-value var) nil location) + and do (cl-pushnew location locations)))) + (mapc #'doom--store-flush locations))) +(add-hook 'kill-emacs-hook #'doom-save-persistent-store-h) + + +;; +;; Library + +;;;###autoload +(defun doom-store-persist (location variables) + "Persist VARIABLES (list of symbols) in LOCATION (symbol). +This populates these variables with cached values, if one exists, and saves them +to file when Emacs quits. This cannot persist buffer-local variables." + (dolist (var variables) + (when (doom-store-member-p var location) + (set var (doom-store-get var location)))) + (setf (alist-get location doom-store-persist-alist) + (append variables (alist-get location doom-store-persist-alist)))) + +;;;###autoload +(defun doom-store-desist (location &optional variables) + "Unregisters VARIABLES (list of symbols) in LOCATION (symbol). +Variables to persist are recorded in `doom-store-persist-alist'. Does not affect +the actual variables themselves or their values." + (if variables + (setf (alist-get location doom-store-persist-alist) + (cl-set-difference (cdr (assq location doom-store-persist-alist)) + variables)) + (delq! location doom-store-persist-alist 'assoc))) + +(defun doom--store-init (location) + (or (gethash location doom--store-table) + (let* ((file-name-handler-alist nil) + (location-path (expand-file-name location doom-store-dir))) + (if (file-exists-p location-path) + (puthash location + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally location-path) + (read (current-buffer))) + doom--store-table) + (puthash location (make-hash-table :test 'equal) + doom--store-table))))) + +(defun doom--store-get (key location &optional default-value) + (let* ((location-data (doom--store-init location)) + (data (gethash key location-data default-value))) + (if (and (not (eq data default-value)) + (or (null (car data)) + (not (time-less-p (car data) (current-time))))) + (cdr data) + default-value))) + +(defun doom--store-put (key value location &optional ttl) + (puthash key (cons (if ttl (time-add (current-time) ttl)) value) + (doom--store-init location)) + (doom--store-flush location)) + +(defun doom--store-flush (location) + (unless doom--inhibit-flush + (let ((file-name-handler-alist nil) + (coding-system-for-write 'binary) + (write-region-annotate-functions nil) + (write-region-post-annotation-function nil) + (data (doom--store-init location))) + (make-directory doom-store-dir 'parents) + (with-temp-file (expand-file-name location doom-store-dir) + (prin1 data (current-buffer))) + data))) + + +;;;###autoload +(defun doom-store-get (key &optional location default-value) + "Retrieve KEY from LOCATION (defaults to `doom-store-location'). +If it doesn't exist or has expired, DEFAULT_VALUE is returned." + (doom--store-get key (or location doom-store-location) default-value)) + +;;;###autoload +(defun doom-store-put (key value &optional ttl location) + "Set KEY to VALUE in the store at LOCATION. +KEY can be any lisp object that is comparable with `equal'. TTL is the time (in +seconds) until this cache entry expires. LOCATION is the super-key to store this +cache item under. It defaults to `doom-store-location'." + (doom--store-put key value (or location doom-store-location) ttl)) + +;;;###autoload +(defun doom-store-rem (key &optional location) + "Clear a cache LOCATION (defaults to `doom-store-location')." + (let ((location (or location doom-store-location))) + (remhash key (doom--store-init location)) + (let ((table (doom--store-init "default"))) + (remhash 'test table) + table) + (doom--store-flush location))) + +;;;###autoload +(defun doom-store-member-p (key &optional location) + "Return t if KEY in LOCATION exists. +LOCATION defaults to `doom-store-location'." + (let ((nil-value (format "--nilvalue%s--" (current-time)))) + (not (equal (doom-store-get key location nil-value) + nil-value)))) + +;;;###autoload +(defun doom-store-clear (&optional location) + "Clear the store at LOCATION (defaults to `doom-store-location')." + (let* ((location (or location doom-store-location)) + (path (expand-file-name location doom-store-dir))) + (remhash location doom--store-table) + (when (file-exists-p path) + (delete-file path) + t))) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index cfc03ba57..8150513c3 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -32,14 +32,16 @@ one wants that.") (cl-check-type file string) (and (print! (start "Generating core autoloads...")) (doom-cli--write-autoloads - file (doom-cli--generate-autoloads - (cl-loop for dir - in (append (list doom-core-dir) - (cdr (doom-module-load-path 'all-p)) - (list doom-private-dir)) - if (doom-glob dir "autoload.el") collect it - if (doom-glob dir "autoload/*.el") append it) - 'scan)) + file + (doom-cli--generate-emacs-version-check) + (doom-cli--generate-autoloads + (cl-loop for dir + in (append (list doom-core-dir) + (cdr (doom-module-load-path 'all-p)) + (list doom-private-dir)) + if (doom-glob dir "autoload.el") collect it + if (doom-glob dir "autoload/*.el") append it) + 'scan)) (print! (start "Byte-compiling core autoloads file...")) (doom-cli--byte-compile-file file) (print! (success "Generated %s") @@ -105,6 +107,12 @@ one wants that.") (print! "M-x doom/restart") (print! "M-x doom/reload"))) +(defun doom-cli--generate-emacs-version-check () + `((unless (equal emacs-major-version (eval-when-compile emacs-major-version)) + (signal 'doom-error + (list "Your installed (major) version of Emacs has changed" + "Run 'doom sync && doom build' to bring Doom up to speed"))))) + (defun doom-cli--generate-var-cache (vars) `((setq ,@(cl-loop for var in vars append `(,var ',(symbol-value var)))))) diff --git a/core/cli/env.el b/core/cli/env.el index bb546ede1..f13a838d3 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -113,10 +113,11 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in "# run 'doom sync'. To create a safe-to-edit envvar file use:\n#\n" "# doom env -o ~/.doom.d/myenv\n#\n" "# And load it with (doom-load-envvars-file \"~/.doom.d/myenv\").\n") - (concat "# This file is safe to edit by hand, but needs to be loaded manually with:\n#\n" + (concat "# This file is safe to edit by hand, but remember to preserve the null bytes at\n" + "# the end of each line! needs to be loaded manually with:\n#\n" "# (doom-load-envvars-file \"path/to/this/file\")\n#\n" "# Use 'doom env -o path/to/this/file' to regenerate it.")) - "# ---------------------------------------------------------------------------\n\n")) + "# ---------------------------------------------------------------------------\n\0\n")) ;; We assume that this noninteractive session was spawned from the ;; user's interactive shell, therefore we just dump ;; `process-environment' to a file. @@ -124,7 +125,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in (if (cl-find-if (doom-rpartial #'string-match-p (car (split-string env "="))) doom-env-ignored-vars) (print! (info "Ignoring %s") env) - (insert env "\n"))) + (insert env "\0\n"))) (print! (success "Successfully generated %S") (path env-file)) t)))))) diff --git a/core/core-cli.el b/core/core-cli.el index cc1511b37..852f6fd43 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -258,7 +258,7 @@ BODY will be run when this dispatcher is called." (print! "%2s) %s" (1+ (length options)) (if (cl-find-if (doom-rpartial #'string-match-p desc) doom--cli-straight-discard-options) - (concat desc " (Recommended)") + (green (concat desc " (Recommended)")) desc)))) (terpri) (let* ((options diff --git a/core/core-editor.el b/core/core-editor.el index 1702c4d8e..d4638d5c6 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -293,10 +293,7 @@ possible." `pp' can be expensive for longer lists, and there's no reason to prettify cache files, so we replace calls to `pp' with the much faster `prin1'." :around #'save-place-alist-to-file - (cl-letf (((symbol-function #'pp) #'prin1)) - (funcall orig-fn))) - - (save-place-mode +1)) + (letf! ((#'pp #'prin1)) (funcall orig-fn)))) (use-package! server @@ -394,18 +391,14 @@ files, so we replace calls to `pp' with the much faster `prin1'." `nim-mode'. This prevents them from leaving Emacs in a broken state." :around #'dtrt-indent-mode (let ((dtrt-indent-run-after-smie dtrt-indent-run-after-smie)) - (cl-letf* ((old-smie-config-guess (symbol-function 'smie-config-guess)) - (old-smie-config--guess (symbol-function 'symbol-config--guess)) - ((symbol-function 'symbol-config--guess) - (lambda (beg end) - (funcall old-smie-config--guess beg (min end 10000)))) - ((symbol-function 'smie-config-guess) - (lambda () - (condition-case e (funcall old-smie-config-guess) - (error (setq dtrt-indent-run-after-smie t) - (message "[WARNING] Indent detection: %s" - (error-message-string e)) - (message "")))))) ; warn silently + (letf! ((defun symbol-config--guess (beg end) + (funcall symbol-config--guess beg (min end 10000))) + (defun smie-config-guess () + (condition-case e (funcall smie-config-guess) + (error (setq dtrt-indent-run-after-smie t) + (message "[WARNING] Indent detection: %s" + (error-message-string e)) + (message ""))))) ; warn silently (funcall orig-fn arg))))) @@ -421,8 +414,8 @@ files, so we replace calls to `pp' with the much faster `prin1'." (defun doom-use-helpful-a (orig-fn &rest args) "Force ORIG-FN to use helpful instead of the old describe-* commands." - (cl-letf (((symbol-function #'describe-function) #'helpful-function) - ((symbol-function #'describe-variable) #'helpful-variable)) + (letf! ((#'describe-function #'helpful-function) + (#'describe-variable #'helpful-variable)) (apply orig-fn args))) (after! apropos @@ -486,8 +479,9 @@ files, so we replace calls to `pp' with the much faster `prin1'." (defun doom-init-smartparens-in-minibuffer-maybe-h () "Enable `smartparens-mode' in the minibuffer, during `eval-expression', `pp-eval-expression' or `evil-ex'." - (when (memq this-command '(eval-expression pp-eval-expression evil-ex)) - (smartparens-mode)))) + (and (memq this-command '(eval-expression pp-eval-expression evil-ex)) + smartparens-global-mode + (smartparens-mode)))) ;; You're likely writing lisp in the minibuffer, therefore, disable these ;; quote pairs, which lisps doesn't use for strings: diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 19b0517c4..0e89a270c 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -221,16 +221,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See else do (error "not a valid state: %s" l))) -;; Register keywords for proper indentation (see `map!') -(put :after 'lisp-indent-function 'defun) -(put :desc 'lisp-indent-function 'defun) -(put :leader 'lisp-indent-function 'defun) -(put :localleader 'lisp-indent-function 'defun) -(put :map 'lisp-indent-function 'defun) -(put :mode 'lisp-indent-function 'defun) -(put :prefix 'lisp-indent-function 'defun) -(put :prefix-map 'lisp-indent-function 'defun) - ;; specials (defvar doom--map-forms nil) (defvar doom--map-fn nil) diff --git a/core/core-lib.el b/core/core-lib.el index 1bf435167..0dd055f72 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,8 +1,5 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(require 'cl-lib) -(require 'subr-x) - ;; ;;; Helpers @@ -85,6 +82,60 @@ Accepts the same arguments as `message'." format-string) ,@args)))) +(defun doom-try-run-hook (hook) + "Run HOOK (a hook function) with better error handling. +Meant to be used with `run-hook-wrapped'." + (doom-log "Running doom hook: %s" hook) + (condition-case e + (funcall hook) + ((debug error) + (signal 'doom-hook-error (list hook e)))) + ;; return nil so `run-hook-wrapped' won't short circuit + nil) + +(defun doom-load-autoloads-file (file &optional noerror) + "Tries to load FILE (an autoloads file). +Return t on success, nil otherwise (but logs a warning)." + (condition-case e + ;; Avoid `file-name-sans-extension' for premature optimization reasons. + ;; `string-remove-suffix' is much cheaper (because it does no file sanity + ;; checks during or after; just plain ol' string manipulation). + (load (string-remove-suffix ".el" file) noerror 'nomessage) + (doom-error + (signal (car e) (cdr e))) + ((debug error) + (message "Autoload file error: %s -> %s" (file-name-nondirectory file) e) + nil))) + +(defun doom-load-envvars-file (file &optional noerror) + "Read and set envvars from FILE. +If NOERROR is non-nil, don't throw an error if the file doesn't exist or is +unreadable. Returns the names of envvars that were changed." + (if (null (file-exists-p file)) + (unless noerror + (signal 'file-error (list "No envvar file exists" file))) + (when-let + (env + (with-temp-buffer + (save-excursion + (insert "\0\n") ; to prevent off-by-one + (insert-file-contents file)) + (save-match-data + (when (re-search-forward "\0\n *\\([^#= \n]*\\)=" nil t) + (setq + env (split-string (buffer-substring (match-beginning 1) (point-max)) + "\0\n" + 'omit-nulls)))))) + (setq process-environment (append (nreverse env) process-environment) + exec-path (append (split-string (getenv "PATH") path-separator t) + (list exec-directory)) + shell-file-name (or (getenv "SHELL") shell-file-name)) + env))) + + +;; +;;; Functional library + (defalias 'doom-partial #'apply-partially) (defun doom-rpartial (fn &rest args) @@ -119,6 +170,11 @@ aliases." (call-interactively command)))) (defalias 'lambda!! 'λ!!) +(defun dir! () + "Returns the directory of the emacs lisp file this macro is called from." + (when-let (path (file!)) + (directory-file-name (file-name-directory path)))) + (defun file! () "Return the emacs lisp file this macro is called from." (cond ((bound-and-true-p byte-compile-current-file)) @@ -128,10 +184,129 @@ aliases." (buffer-file-name) ((error "Cannot get this file-path")))) -(defun dir! () - "Returns the directory of the emacs lisp file this macro is called from." - (when-let (path (file!)) - (directory-file-name (file-name-directory path)))) +(defmacro letenv! (envvars &rest body) + "Lexically bind ENVVARS in BODY, like `let' but for `process-environment'." + (declare (indent 1)) + `(let ((process-environment (copy-sequence process-environment))) + (dolist (var (list ,@(cl-loop for (var val) in envvars + collect `(cons ,var ,val)))) + (setenv (car var) (cdr var))) + ,@body)) + +(defmacro letf! (bindings &rest body) + "Temporarily rebind function and macros in BODY. + +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. + +TYPE is either `defun' or `defmacro'. NAME is the name of the function. If an +original definition for NAME exists, it can be accessed as a lexical variable by +the same name, for use with `funcall' or `apply'. ARGLIST and BODY are as in +`defun'. + +\(fn ((TYPE NAME ARGLIST &rest BODY) ...) BODY...)" + (declare (indent defun)) + (setq body (macroexp-progn body)) + (when (memq (car bindings) '(defun defmacro)) + (setq bindings (list bindings))) + (dolist (binding (nreverse bindings) body) + (let ((type (car binding)) + (rest (cdr binding))) + (setq + body (pcase type + (`defmacro `(cl-macrolet ((,(car rest) ,(cadr rest) ,@(cddr rest))) ,body)) + (`defun `(cl-letf* ((,(car rest) (symbol-function #',(car rest))) + ((symbol-function #',(car rest)) + (lambda ,(cadr rest) ,@(cddr rest)))) + ,body)) + (_ + (when (eq (car-safe type) 'function) + (setq type `(symbol-function ,type))) + `(cl-letf ((,type ,@rest)) ,body))))))) + +(defmacro quiet! (&rest forms) + "Run FORMS without generating any output. + +This silences calls to `message', `load-file', `write-region' and anything that +writes to `standard-output'." + `(cond (doom-debug-mode ,@forms) + ((not doom-interactive-mode) + (letf! ((standard-output (lambda (&rest _))) + (defun load-file (file) (load-file nil t)) + (defun message (&rest _)) + (defun write-region (start end filename &optional append visit lockname mustbenew) + (unless visit (setq visit 'no-message)) + (funcall write-region start end filename append visit lockname mustbenew))) + ,@forms)) + ((let ((inhibit-message t) + (save-silently t)) + (prog1 ,@forms (message "")))))) + +(defmacro if! (cond then &rest body) + "Expands to THEN if COND is non-nil, to BODY otherwise. +COND is checked at compile/expansion time, allowing BODY to be omitted +entirely when the elisp is byte-compiled. Use this for forms that contain +expensive macros that could safely be removed at compile time." + (declare (indent 2)) + (if (eval cond) + then + (macroexp-progn body))) + +(defmacro when! (cond &rest body) + "Expands to BODY if CONDITION is non-nil at compile/expansion time. +See `if!' for details on this macro's purpose." + (declare (indent 1)) + (when (eval cond) + (macroexp-progn body))) + + +;;; Mutation +(defmacro appendq! (sym &rest lists) + "Append LISTS to SYM in place." + `(setq ,sym (append ,sym ,@lists))) + +(defmacro setq! (&rest settings) + "A stripped-down `customize-set-variable' with the syntax of `setq'. + +Use this instead of `setq' when you know a variable has a custom setter (a :set +property in its `defcustom' declaration). This trigger setters. `setq' does +not." + (macroexp-progn + (cl-loop for (var val) on settings by 'cddr + collect (list (or (get var 'custom-set) #'set) + (list 'quote var) + val)))) + +(defmacro delq! (elt list &optional fetcher) + "`delq' ELT from LIST in-place. + +If FETCHER is a function, ELT is used as the key in LIST (an alist)." + `(setq ,list + (delq ,(if fetcher + `(funcall ,fetcher ,elt ,list) + elt) + ,list))) + +(defmacro pushnew! (place &rest values) + "Push VALUES sequentially into PLACE, if they aren't already present. +This is a variadic `cl-pushnew'." + (let ((var (make-symbol "result"))) + `(dolist (,var (list ,@values) (with-no-warnings ,place)) + (cl-pushnew ,var ,place :test #'equal)))) + +(defmacro prependq! (sym &rest lists) + "Prepend LISTS to SYM in place." + `(setq ,sym (append ,@lists ,sym))) + + +;;; Loading +(defmacro add-load-path! (&rest dirs) + "Add DIRS to `load-path', relative to the current file. +The current file is the file from which `add-to-load-path!' is used." + `(let ((default-directory ,(dir!)) + file-name-handler-alist) + (dolist (dir (list ,@dirs)) + (cl-pushnew (expand-file-name dir) load-path)))) (defmacro after! (package &rest body) "Evaluate BODY after PACKAGE have loaded. @@ -183,58 +358,84 @@ This is a wrapper around `eval-after-load' that: (setq body `((after! ,next ,@body)))) (car body)))))) -(defmacro setq! (&rest settings) - "A stripped-down `customize-set-variable' with the syntax of `setq'. +(defun doom--handle-load-error (e target path) + (let* ((source (file-name-sans-extension target)) + (err (cond ((not (featurep 'core)) + (cons 'error (file-name-directory path))) + ((file-in-directory-p source doom-core-dir) + (cons 'doom-error doom-core-dir)) + ((file-in-directory-p source doom-private-dir) + (cons 'doom-private-error doom-private-dir)) + ((cons 'doom-module-error doom-emacs-dir))))) + (signal (car err) + (list (file-relative-name + (concat source ".el") + (cdr err)) + e)))) -Use this instead of `setq' when you know a variable has a custom setter (a :set -property in its `defcustom' declaration). This trigger setters. `setq' does -not." - (macroexp-progn - (cl-loop for (var val) on settings by 'cddr - collect `(funcall (or (get ',var 'custom-set) #'set) - ',var ,val)))) +(defmacro load! (filename &optional path noerror) + "Load a file relative to the current executing file (`load-file-name'). -(defmacro pushnew! (place &rest values) - "Push VALUES sequentially into PLACE, if they aren't already present. -This is a variadic `cl-pushnew'." - (let ((var (make-symbol "result"))) - `(dolist (,var (list ,@values) (with-no-warnings ,place)) - (cl-pushnew ,var ,place :test #'equal)))) +FILENAME is either a file path string or a form that should evaluate to such a +string at run time. PATH is where to look for the file (a string representing a +directory path). If omitted, the lookup is relative to either `load-file-name', +`byte-compile-current-file' or `buffer-file-name' (checked in that order). -(defmacro prependq! (sym &rest lists) - "Prepend LISTS to SYM in place." - `(setq ,sym (append ,@lists ,sym))) +If NOERROR is non-nil, don't throw an error if the file doesn't exist." + (let* ((path (or path + (dir!) + (error "Could not detect path to look for '%s' in" + filename))) + (file (if path + `(expand-file-name ,filename ,path) + filename))) + `(condition-case-unless-debug e + (let (file-name-handler-alist) + (load ,file ,noerror 'nomessage)) + (doom-error (signal (car e) (cdr e))) + (error (doom--handle-load-error e ,file ,path))))) -(defmacro appendq! (sym &rest lists) - "Append LISTS to SYM in place." - `(setq ,sym (append ,sym ,@lists))) +(defmacro defer-until! (condition &rest body) + "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to +serve as a predicated alternative to `after!'." + (declare (indent defun) (debug t)) + `(if ,condition + (progn ,@body) + ,(let ((fn (intern (format "doom--delay-form-%s-h" (sxhash (cons condition body)))))) + `(progn + (fset ',fn (lambda (&rest args) + (when ,(or condition t) + (remove-hook 'after-load-functions #',fn) + (unintern ',fn nil) + (ignore args) + ,@body))) + (put ',fn 'permanent-local-hook t) + (add-hook 'after-load-functions #',fn))))) -(defmacro delq! (elt list &optional fetcher) - "`delq' ELT from LIST in-place. +(defmacro defer-feature! (feature &optional fn) + "Pretend FEATURE hasn't been loaded yet, until FEATURE-hook or FN runs. -If FETCHER is a function, ELT is used as the key in LIST (an alist)." - `(setq ,list - (delq ,(if fetcher - `(funcall ,fetcher ,elt ,list) - elt) - ,list))) +Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at +startup, which will prematurely trigger `after!' (and `with-eval-after-load') +blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet, +then wait until FEATURE-hook (or MODE-hook, if FN is provided) is triggered to +reverse this and trigger `after!' blocks at a more reasonable time." + (let ((advice-fn (intern (format "doom--defer-feature-%s-a" feature))) + (fn (or fn feature))) + `(progn + (setq features (delq ',feature features)) + (advice-add #',fn :before #',advice-fn) + (defun ,advice-fn (&rest _) + ;; Some plugins (like yasnippet) will invoke a fn early to parse + ;; code, which would prematurely trigger this. In those cases, well + ;; behaved plugins will use `delay-mode-hooks', which we can check for: + (when (and ,(intern (format "%s-hook" fn)) + (not delay-mode-hooks)) + ;; ...Otherwise, announce to the world this package has been loaded, + ;; so `after!' handlers can react. + (provide ',feature) + (advice-remove #',fn #',advice-fn)))))) -(defmacro letenv! (envvars &rest body) - "Lexically bind ENVVARS in BODY, like `let' but for `process-environment'." - (declare (indent 1)) - `(let ((process-environment (copy-sequence process-environment))) - (dolist (var (list ,@(cl-loop for (var val) in envvars - collect `(cons ,var ,val)))) - (setenv (car var) (cdr var))) - ,@body)) - -(defmacro add-load-path! (&rest dirs) - "Add DIRS to `load-path', relative to the current file. -The current file is the file from which `add-to-load-path!' is used." - `(let ((default-directory ,(dir!)) - file-name-handler-alist) - (dolist (dir (list ,@dirs)) - (cl-pushnew (expand-file-name dir) load-path)))) ;;; Hooks (defvar doom--transient-counter 0) @@ -360,106 +561,8 @@ If N and M = 1, there's no benefit to using this macro over `remove-hook'. in (doom--setq-hook-fns hooks vars 'singles) collect `(remove-hook ',hook #',fn)))) -(defmacro load! (filename &optional path noerror) - "Load a file relative to the current executing file (`load-file-name'). -FILENAME is either a file path string or a form that should evaluate to such a -string at run time. PATH is where to look for the file (a string representing a -directory path). If omitted, the lookup is relative to either `load-file-name', -`byte-compile-current-file' or `buffer-file-name' (checked in that order). - -If NOERROR is non-nil, don't throw an error if the file doesn't exist." - (let* ((path (or path - (dir!) - (error "Could not detect path to look for '%s' in" - filename))) - (file (if path - `(expand-file-name ,filename ,path) - filename))) - `(condition-case-unless-debug e - (let (file-name-handler-alist) - (load ,file ,noerror 'nomessage)) - (doom-error (signal (car e) (cdr e))) - (error - (let* ((source (file-name-sans-extension ,file)) - (err (cond ((not (featurep 'core)) - (cons 'error (file-name-directory path))) - ((file-in-directory-p source doom-core-dir) - (cons 'doom-error doom-core-dir)) - ((file-in-directory-p source doom-private-dir) - (cons 'doom-private-error doom-private-dir)) - ((cons 'doom-module-error doom-emacs-dir))))) - (signal (car err) - (list (file-relative-name - (concat source ".el") - (cdr err)) - e))))))) - -(defmacro defer-until! (condition &rest body) - "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to -serve as a predicated alternative to `after!'." - (declare (indent defun) (debug t)) - `(if ,condition - (progn ,@body) - ,(let ((fn (intern (format "doom--delay-form-%s-h" (sxhash (cons condition body)))))) - `(progn - (fset ',fn (lambda (&rest args) - (when ,(or condition t) - (remove-hook 'after-load-functions #',fn) - (unintern ',fn nil) - (ignore args) - ,@body))) - (put ',fn 'permanent-local-hook t) - (add-hook 'after-load-functions #',fn))))) - -(defmacro defer-feature! (feature &optional fn) - "Pretend FEATURE hasn't been loaded yet, until FEATURE-hook or FN runs. - -Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at -startup, which will prematurely trigger `after!' (and `with-eval-after-load') -blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet, -then wait until FEATURE-hook (or MODE-hook, if FN is provided) is triggered to -reverse this and trigger `after!' blocks at a more reasonable time." - (let ((advice-fn (intern (format "doom--defer-feature-%s-a" feature))) - (fn (or fn feature))) - `(progn - (setq features (delq ',feature features)) - (advice-add #',fn :before #',advice-fn) - (defun ,advice-fn (&rest _) - ;; Some plugins (like yasnippet) will invoke a fn early to parse - ;; code, which would prematurely trigger this. In those cases, well - ;; behaved plugins will use `delay-mode-hooks', which we can check for: - (when (and ,(intern (format "%s-hook" fn)) - (not delay-mode-hooks)) - ;; ...Otherwise, announce to the world this package has been loaded, - ;; so `after!' handlers can react. - (provide ',feature) - (advice-remove #',fn #',advice-fn)))))) - -(defmacro quiet! (&rest forms) - "Run FORMS without generating any output. - -This silences calls to `message', `load-file', `write-region' and anything that -writes to `standard-output'." - `(cond (doom-debug-mode ,@forms) - ((not doom-interactive-mode) - (let ((old-fn (symbol-function 'write-region))) - (cl-letf ((standard-output (lambda (&rest _))) - ((symbol-function 'load-file) (lambda (file) (load file nil t))) - ((symbol-function 'message) (lambda (&rest _))) - ((symbol-function 'write-region) - (lambda (start end filename &optional append visit lockname mustbenew) - (unless visit (setq visit 'no-message)) - (funcall old-fn start end filename append visit lockname mustbenew)))) - ,@forms))) - ((let ((inhibit-message t) - (save-silently t)) - (prog1 ,@forms (message "")))))) - - -;; ;;; Definers - (defmacro defadvice! (symbol arglist &optional docstring &rest body) "Define an advice called SYMBOL and add it to PLACES. diff --git a/core/core-modules.el b/core/core-modules.el index f3c22fb71..c866e1289 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -211,13 +211,15 @@ those directories. The first returned path is always `doom-private-dir'." (declare (pure t) (side-effect-free t)) (append (list doom-private-dir) (if module-dirs - (doom-files-in (if (listp module-dirs) - module-dirs - doom-modules-dirs) - :type 'dirs - :mindepth 1 - :depth 1) - (cl-loop for plist being the hash-values of (doom-modules) + (mapcar (lambda (m) (doom-module-locate-path (car m) (cdr m))) + (doom-files-in (if (listp module-dirs) + module-dirs + doom-modules-dirs) + :map #'doom-module-from-path + :type 'dirs + :mindepth 1 + :depth 1)) + (cl-loop for plist being the hash-values of doom-modules collect (plist-get plist :path))) nil)) diff --git a/core/core-packages.el b/core/core-packages.el index 416e0f2d0..1ad951a37 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -269,9 +269,13 @@ elsewhere." recipe ;; Expand :local-repo from current directory (when local-repo - (plist-put! plist :recipe - (plist-put recipe :local-repo - (expand-file-name local-repo ,(dir!))))))) + (plist-put! + plist :recipe + (plist-put recipe :local-repo + (let ((local-path (expand-file-name local-repo ,(dir!)))) + (if (file-directory-p local-path) + local-path + local-repo))))))) (error (signal 'doom-package-error (cons ,(symbol-name name) diff --git a/core/core-projects.el b/core/core-projects.el index ebb8d803e..04310ffe7 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -43,7 +43,7 @@ Emacs.") ;; REVIEW Resolve the project root once, when the file/buffer is opened. This ;; speeds up projectile's project root resolution by leaps, but does ;; put you at risk of having a stale project root. - (setq-hook! '(after-change-major-mode-hook + (setq-hook! '(change-major-mode-after-body-hook ;; In case the user saves the file to a new location after-save-hook ;; ...or makes external changes then returns to Emacs @@ -146,7 +146,7 @@ c) are not valid projectile projects." ;; .gitignore. This is recommended in the projectile docs. ((executable-find doom-projectile-fd-binary) (setq projectile-generic-command - (format "%s . --color=never --type f -0 -H -E .git" + (format "%s . -0 -H -E .git --color=never --type file --type symlink --follow" doom-projectile-fd-binary) projectile-git-command projectile-generic-command projectile-git-submodule-command nil @@ -156,9 +156,11 @@ c) are not valid projectile projects." ;; Otherwise, resort to ripgrep, which is also faster than find ((executable-find "rg") (setq projectile-generic-command - (concat "rg -0 --files --color=never --hidden" + (concat "rg -0 --files --follow --color=never --hidden" (cl-loop for dir in projectile-globally-ignored-directories - concat (format " --glob '!%s'" dir))) + concat " --glob " + concat (shell-quote-argument (concat "!" dir))) + (if IS-WINDOWS " --path-separator /")) projectile-git-command projectile-generic-command projectile-git-submodule-command nil ;; ensure Windows users get rg's benefits diff --git a/core/core-ui.el b/core/core-ui.el index 6ff9e85ba..9b590b668 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -54,6 +54,9 @@ examples. It is recommended you don't set specify a font-size, as to inherit `doom-font's size.") +(defvar doom-unicode-extra-fonts nil + "Fonts to inject into the unicode charset before `doom-unicode-font'.") + ;; ;;; Custom hooks @@ -85,48 +88,51 @@ size.") (defvar doom--last-frame nil) (defun doom-run-switch-window-hooks-h () - (let ((gc-cons-threshold most-positive-fixnum)) - (unless (or doom-inhibit-switch-window-hooks - (eq doom--last-window (selected-window)) - (minibufferp)) - (let ((doom-inhibit-switch-window-hooks t) - (inhibit-redisplay t)) - (run-hooks 'doom-switch-window-hook) - (setq doom--last-window (selected-window)))))) + (unless (or doom-inhibit-switch-window-hooks + (eq doom--last-window (selected-window)) + (minibufferp)) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-window-hooks t) + (inhibit-redisplay t)) + (run-hooks 'doom-switch-window-hook) + (setq doom--last-window (selected-window))))) (defun doom-run-switch-frame-hooks-h (&rest _) (unless (or doom-inhibit-switch-frame-hooks (eq doom--last-frame (selected-frame)) (frame-parameter nil 'parent-frame)) - (let ((doom-inhibit-switch-frame-hooks t)) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-frame-hooks t)) (run-hooks 'doom-switch-frame-hook) (setq doom--last-frame (selected-frame))))) (defun doom-run-switch-buffer-hooks-a (orig-fn buffer-or-name &rest args) - (let ((gc-cons-threshold most-positive-fixnum)) - (if (or doom-inhibit-switch-buffer-hooks - (eq (current-buffer) (get-buffer buffer-or-name)) - (and (eq orig-fn #'switch-to-buffer) (car args))) - (apply orig-fn buffer-or-name args) - (let ((doom-inhibit-switch-buffer-hooks t) - (inhibit-redisplay t)) - (when-let (buffer (apply orig-fn buffer-or-name args)) - (with-current-buffer (if (windowp buffer) - (window-buffer buffer) - buffer) - (run-hooks 'doom-switch-buffer-hook)) - buffer))))) + (if (or doom-inhibit-switch-buffer-hooks + (and buffer-or-name + (eq (current-buffer) + (get-buffer buffer-or-name))) + (and (eq orig-fn #'switch-to-buffer) (car args))) + (apply orig-fn buffer-or-name args) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-buffer-hooks t) + (inhibit-redisplay t)) + (when-let (buffer (apply orig-fn buffer-or-name args)) + (with-current-buffer (if (windowp buffer) + (window-buffer buffer) + buffer) + (run-hooks 'doom-switch-buffer-hook)) + buffer)))) (defun doom-run-switch-to-next-prev-buffer-hooks-a (orig-fn &rest args) - (let ((gc-cons-threshold most-positive-fixnum)) - (if doom-inhibit-switch-buffer-hooks - (apply orig-fn args) - (let ((doom-inhibit-switch-buffer-hooks t) - (inhibit-redisplay t)) - (when-let (buffer (apply orig-fn args)) - (with-current-buffer buffer - (run-hooks 'doom-switch-buffer-hook)) - buffer))))) + (if doom-inhibit-switch-buffer-hooks + (apply orig-fn args) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-buffer-hooks t) + (inhibit-redisplay t)) + (when-let (buffer (apply orig-fn args)) + (with-current-buffer buffer + (run-hooks 'doom-switch-buffer-hook)) + buffer)))) (defun doom-protect-fallback-buffer-h () "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." @@ -300,7 +306,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (add-to-list 'default-frame-alist '(tool-bar-lines . 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars))) -(when IS-MAC +(when! IS-MAC ;; Curse Lion and its sudden but inevitable fullscreen mode! ;; NOTE Meaningless to railwaycat's emacs-mac build (setq ns-use-native-fullscreen nil) @@ -410,13 +416,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (set-window-configuration doom--ediff-saved-wconf))))) -(use-package! goto-addr - :hook (text-mode . goto-address-mode) - :hook (prog-mode . goto-address-prog-mode) - :config - (define-key goto-address-highlight-keymap (kbd "RET") #'goto-address-at-point)) - - (use-package! hl-line ;; Highlights the current line :hook ((prog-mode text-mode conf-mode special-mode) . hl-line-mode) @@ -485,6 +484,14 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) + :preface + (setq doom-unicode-extra-fonts + (list "Weather Icons" + "github-octicons" + "FontAwesome" + "all-the-icons" + "file-icons" + "Material Icons")) :config (cond ((daemonp) (defadvice! doom--disable-all-the-icons-in-tty-a (orig-fn &rest args) @@ -579,8 +586,9 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.") (set-face-attribute 'fixed-pitch-serif nil :font doom-serif-font)) (when doom-variable-pitch-font (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font)) - (when (and doom-unicode-font (fboundp 'set-fontset-font)) - (set-fontset-font t 'unicode doom-unicode-font nil 'prepend))) + (when (fboundp 'set-fontset-font) + (dolist (font (append doom-unicode-extra-fonts (doom-enlist doom-unicode-font))) + (set-fontset-font t 'unicode font nil 'prepend)))) ((debug error) (if (string-prefix-p "Font not available: " (error-message-string e)) (lwarn 'doom-ui :warning @@ -611,11 +619,14 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.") (unless no-enable (setq doom-theme theme doom-init-theme-p t) + ;; `load-theme' doesn't disable previously enabled themes, which seems + ;; like what you'd want. You could always use `enable-theme' to activate + ;; multiple themes instead. (mapc #'disable-theme (remq theme custom-enabled-themes)) (run-hooks 'doom-load-theme-hook)) result))) -(unless EMACS27+ +(when! (not EMACS27+) ;; DEPRECATED Not needed in Emacs 27 (defadvice! doom--prefer-compiled-theme-a (orig-fn &rest args) "Have `load-theme' prioritize the byte-compiled theme. @@ -624,10 +635,8 @@ This offers a moderate boost in startup (or theme switch) time, so long as :around #'load-theme (if (or (null after-init-time) doom--prefer-theme-elc) - (cl-letf* ((old-locate-file (symbol-function 'locate-file)) - ((symbol-function 'locate-file) - (lambda (filename path &optional _suffixes predicate) - (funcall old-locate-file filename path '("c" "") predicate)))) + (letf! (defun locate-file (filename path &optional _suffixes predicate) + (funcall locate-file filename path '("c" "") predicate)) (apply orig-fn args)) (apply orig-fn args)))) diff --git a/core/core.el b/core/core.el index 7d0596ba7..1d768ec33 100644 --- a/core/core.el +++ b/core/core.el @@ -14,6 +14,10 @@ (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) (defconst IS-BSD (or IS-MAC (eq system-type 'berkeley-unix))) +;; Unix tools looks for HOME, but this is normally not defined on Windows. +(when (and IS-WINDOWS (null (getenv "HOME"))) + (setenv "HOME" (getenv "USERPROFILE"))) + ;; Ensure `doom-core-dir' is in `load-path' (add-to-list 'load-path (file-name-directory load-file-name)) @@ -40,6 +44,8 @@ (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)) ;; Just the bare necessities +(require 'subr-x) +(require 'cl-lib) (require 'core-lib) @@ -207,27 +213,22 @@ users).") ;; https://www.keylength.com/en/4/ gnutls-min-prime-bits 3072 tls-checktrust gnutls-verify-error - ;; Emacs is built with `gnutls' by default, so `tls-program' would not - ;; be used in that case. Otherwiese, people have reasons to not go with - ;; `gnutls', we use `openssl' instead. - ;; For more details, see https://redd.it/8sykl1 + ;; Emacs is built with `gnutls' by default, so `tls-program' would not be + ;; used in that case. Otherwise, people have reasons to not go with + ;; `gnutls', we use `openssl' instead. For more details, see + ;; https://redd.it/8sykl1 tls-program '("openssl s_client -connect %h:%p -CAfile %t -nbio -no_ssl3 -no_tls1 -no_tls1_1 -ign_eof" "gnutls-cli -p %p --dh-bits=3072 --ocsp --x509cafile=%t \ --strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h" ;; compatibility fallbacks "gnutls-cli -p %p %h")) -;; Emacs stores authinfo in $HOME and in plaintext. Let's not do that, mkay? +;; Emacs stores `authinfo' in $HOME and in plain-text. Let's not do that, mkay? ;; This file stores usernames, passwords, and other such treasures for the ;; aspiring malicious third party. -(setq auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) +(setq auth-sources (list (concat doom-etc-dir "authinfo.gpg") "~/.authinfo.gpg")) -;; Emacs on Windows frequently confuses HOME (C:\Users\) and %APPDATA%, -;; causing `abbreviate-home-dir' to produce incorrect paths. -(when IS-WINDOWS - (setq abbreviated-home-dir "\\`'")) - ;; Don't litter `doom-emacs-dir'. We don't use `no-littering' because it's a ;; mote too opinionated for our needs. (setq abbrev-file-name (concat doom-local-dir "abbrev.el") @@ -274,11 +275,6 @@ users).") ;; quickly self-correct. (setq fast-but-imprecise-scrolling t) -;; Font locking is the source of much slowness in Emacs. jit-lock-mode tries to -;; defer fontification until the user is idle. This should help... in theory. -(setq jit-lock-defer-time 0 ; only defer while processing input - jit-lock-stealth-time 2) ; fontify the rest of the buffer after a delay - ;; Resizing the Emacs frame can be a terribly expensive part of changing the ;; font. By inhibiting this, we halve startup times, particularly when we use ;; fonts that are larger than the system default (which would resize the frame). @@ -288,7 +284,7 @@ users).") (setq ffap-machine-p-known 'reject) ;; Font compacting can be terribly expensive, especially for rendering icon -;; fonts on Windows. Whether it has a noteable affect on Linux and Mac hasn't +;; fonts on Windows. Whether it has a notable affect on Linux and Mac hasn't ;; been determined, but we inhibit it there anyway. (setq inhibit-compacting-font-caches t) @@ -432,17 +428,6 @@ If this is a daemon session, load them all immediately instead." ;; ;;; Bootstrap helpers -(defun doom-try-run-hook (hook) - "Run HOOK (a hook function) with better error handling. -Meant to be used with `run-hook-wrapped'." - (doom-log "Running doom hook: %s" hook) - (condition-case e - (funcall hook) - ((debug error) - (signal 'doom-hook-error (list hook e)))) - ;; return nil so `run-hook-wrapped' won't short circuit - nil) - (defun doom-display-benchmark-h (&optional return-p) "Display a benchmark including number of packages and modules loaded. @@ -455,50 +440,6 @@ If RETURN-P, return the message as a string instead of displaying it." (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) -(defun doom-load-autoloads-file (file &optional noerror) - "Tries to load FILE (an autoloads file). -Return t on success, nil otherwise (but logs a warning)." - (condition-case e - (load (substring file 0 -3) noerror 'nomessage) - ((debug error) - (message "Autoload file error: %s -> %s" (file-name-nondirectory file) e) - nil))) - -(defun doom-load-envvars-file (file &optional noerror) - "Read and set envvars from FILE. -If NOERROR is non-nil, don't throw an error if the file doesn't exist or is -unreadable. Returns the names of envvars that were changed." - (if (not (file-readable-p file)) - (unless noerror - (signal 'file-error (list "Couldn't read envvar file" file))) - (let (envvars environment) - (with-temp-buffer - (save-excursion - (insert "\n") - (insert-file-contents file)) - (while (re-search-forward "\n *\\([^#= \n]*\\)=" nil t) - (push (match-string 1) envvars) - (push (buffer-substring - (match-beginning 1) - (1- (or (save-excursion - (when (re-search-forward "^\\([^= ]+\\)=" nil t) - (line-beginning-position))) - (point-max)))) - environment))) - (when environment - (setq process-environment - (append (nreverse environment) process-environment) - exec-path - (if (member "PATH" envvars) - (append (split-string (getenv "PATH") path-separator t) - (list exec-directory)) - exec-path) - shell-file-name - (if (member "SHELL" envvars) - (or (getenv "SHELL") shell-file-name) - shell-file-name)) - envvars)))) - (defun doom-initialize (&optional force-p noerror) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). @@ -517,7 +458,7 @@ The overall load order of Doom is as follows: Module config.el files ~/.doom.d/config.el `doom-init-modules-hook' - `doom-after-init-hook' (`after-init-hook') + `doom-after-init-modules-hook' (`after-init-hook') `emacs-startup-hook' `doom-init-ui-hook' `window-setup-hook' diff --git a/core/packages.el b/core/packages.el index 6e22d9c1e..4d6494314 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,47 +2,44 @@ ;;; core/packages.el ;; core.el -(package! auto-minor-mode :pin "17cfa1b548") -(package! gcmh :pin "b1bde50891") +(package! auto-minor-mode :pin "17cfa1b54800fdef2975c0c0531dad34846a5065") +(package! gcmh :pin "b1bde5089169a74f62033d027e06e98cbeedd43f") ;; core-ui.el -(package! all-the-icons :pin "0b74fc3618") -(package! hide-mode-line :pin "88888825b5") -(package! highlight-numbers :pin "8b4744c7f4") -(package! rainbow-delimiters :pin "5125f4e476") -(package! restart-emacs :pin "9aa90d3df9") +(package! all-the-icons :pin "0b74fc361817e885580c3f3408079f949f5830e1") +(package! hide-mode-line :pin "88888825b5b27b300683e662fa3be88d954b1cea") +(package! highlight-numbers :pin "8b4744c7f46c72b1d3d599d4fb75ef8183dee307") +(package! rainbow-delimiters :pin "5125f4e47604ad36c3eb4706310fcafac729ca8c") +(package! restart-emacs :pin "9aa90d3df9e08bc420e1c9845ee3ff568e911bd9") ;; core-editor.el -(package! better-jumper :pin "6d240032ca") -(package! dtrt-indent :pin "9163cd990f") -(package! helpful :pin "c54e9ddbd6") +(package! better-jumper :pin "6d240032ca213ccb3347e25f26c29b6822bf03a7") +(package! dtrt-indent :pin "9163cd990fb1f43dafed3948c6e406c13a45a6be") +(package! helpful :pin "c54e9ddbd6a77858048c1a4c4b549de98af8f88e") (when IS-MAC - (package! ns-auto-titlebar :pin "1efc30d385")) -(package! pcre2el :pin "0b5b2a2c17") -(package! smartparens :pin "555626a43f") + (package! ns-auto-titlebar :pin "1efc30d38509647b417f05587fd7003457719256")) +(package! pcre2el :pin "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d") +(package! smartparens :pin "555626a43f9bb1985aa9a0eb675f2b88b29702c8") (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 "ed666b0716") + :pin "ed666b0716f60e8988c455804de24b55919e71ca") (package! ws-butler ;; Use my fork of ws-butler, which has a few choice improvements and ;; optimizations (the original has been abandoned). :recipe (:host github :repo "hlissner/ws-butler") - :pin "2bb49d3ee7") + :pin "2bb49d3ee7d2cba133bc7e9cdac416cd1c5e4fe0") (unless IS-WINDOWS (package! clipetty :recipe (:host github :repo "spudlyo/clipetty") - :pin "7ee3f9c52f")) + :pin "01b39044b9b65fa4ea7d3166f8b1ffab6f740362")) ;; core-projects.el -(package! projectile :pin "eec569dc32") +(package! projectile :pin "5cd261dd75f4d711c0016617621349e2a98b43aa") ;; core-keybinds.el -(package! general :pin "14ad4c888b") -(package! which-key :pin "8b49ae978c") - -;; autoload/cache.el -(package! persistent-soft :pin "a1e0ddf2a1") +(package! general :pin "42e38034cd2305fa7432866323c923979d8f9b06") +(package! which-key :pin "8b49ae978cceca65967f3544c236f32964ddbed0") diff --git a/docs/api.org b/docs/api.org index e4702ffc5..9c3f8e1c5 100644 --- a/docs/api.org +++ b/docs/api.org @@ -535,7 +535,7 @@ These are side-by-side comparisons, showing how to bind keys with and without ** 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-cache-get 'last-frame-size)) +(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 @@ -546,7 +546,7 @@ These are side-by-side comparisons, showing how to bind keys with and without (fullscreen . ,fullscreen)))))) (defun save-frame-dimensions () - (doom-cache-set 'last-frame-size + (doom-store-set 'last-frame-size (list (frame-position) (frame-width) (frame-height) diff --git a/docs/getting_started.org b/docs/getting_started.org index 5e04916a9..389f551ed 100644 --- a/docs/getting_started.org +++ b/docs/getting_started.org @@ -17,6 +17,7 @@ us know! - [[#on-linux][On Linux]] - [[#arch-linux][Arch Linux:]] - [[#ubuntu][Ubuntu:]] + - [[#fedora][Fedora:]] - [[#nixos][NixOS]] - [[#on-macos][On macOS]] - [[#with-homebrew][With Homebrew]] @@ -143,6 +144,14 @@ apt-get update apt-get install emacs26 #+END_SRC +**** Fedora: +#+BEGIN_SRC bash +# required dependencies +sudo dnf install emacs git ripgrep +# optional dependencies +sudo dnf install tar fd-find clang multimarkdown ShellCheck +#+END_SRC + **** NixOS On NixOS Emacs 26.3 can be installed via ~nix-env -Ai nixos.emacs~, or permanently with the following added to ~etc/nixos/configuration.nix~: @@ -343,9 +352,7 @@ provides, and ~bin/doom help COMMAND~ to display documentation for a particular #+begin_quote I recommend you add =~/.emacs.d/bin= to your ~PATH~ so you can call =doom= directly and from anywhere. Accomplish this by adding this to your .bashrc or -.zshrc file: - -~export PATH="$HOME/.emacs.d/bin:$PATH"~ +.zshrc file: ~export PATH=~/.emacs.d/bin:$PATH~ #+end_quote *** Install Doom Manually diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 66a26291e..46b94c22b 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -42,10 +42,10 @@ org-gcal-fetch org-gcal-post-at-point org-gcal-delete-at-point) + :init + (defvar org-gcal-dir (concat doom-cache-dir "org-gcal/")) + (defvar org-gcal-token-file (concat org-gcal-dir "token.gpg")) :config ;; hack to avoid the deferred.el error (defun org-gcal--notify (title mes) (message "org-gcal::%s - %s" title mes))) - - -;; (use-package! alert) diff --git a/modules/app/calendar/packages.el b/modules/app/calendar/packages.el index 9f10dc730..a66ecac7b 100644 --- a/modules/app/calendar/packages.el +++ b/modules/app/calendar/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; app/calendar/packages.el -(package! calfw :pin "03abce9762") -(package! calfw-org :pin "03abce9762") -(package! org-gcal :pin "6821e34967") +(package! calfw :pin "03abce97620a4a7f7ec5f911e669da9031ab9088") +(package! calfw-org :pin "03abce97620a4a7f7ec5f911e669da9031ab9088") +(package! org-gcal :pin "2ee2b31547e6f4e33db70fb812d552e55d612fd6") diff --git a/modules/app/irc/packages.el b/modules/app/irc/packages.el index d4609d107..5c83b8060 100644 --- a/modules/app/irc/packages.el +++ b/modules/app/irc/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/irc/packages.el -(package! circe :pin "e5bf5f8974") -(package! circe-notifications :pin "291149ac12") +(package! circe :pin "e5bf5f89741a9c43aa406491e94dd8d58c302fb4") +(package! circe-notifications :pin "291149ac12877bbd062da993479d3533a26862b0") diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 1cf548212..98f121c83 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -101,10 +101,9 @@ ;;;###autoload (defun +rss-put-sliced-image-fn (spec alt &optional flags) "TODO" - (cl-letf (((symbol-function #'insert-image) - (lambda (image &optional alt _area _slice) - (let ((height (cdr (image-size image t)))) - (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))))) + (letf! (defun insert-image (image &optional alt _area _slice) + (let ((height (cdr (image-size image t)))) + (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))) (shr-put-image spec alt flags))) ;;;###autoload diff --git a/modules/app/rss/packages.el b/modules/app/rss/packages.el index 076686e55..544a39f89 100644 --- a/modules/app/rss/packages.el +++ b/modules/app/rss/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/rss/packages.el -(package! elfeed :pin "d0405e6386") -(package! elfeed-org :pin "77b6bbf222") +(package! elfeed :pin "d0405e63863e54a01200740a6717ac875eceabc1") +(package! elfeed-org :pin "77b6bbf222487809813de260447d31c4c59902c9") diff --git a/modules/app/twitter/packages.el b/modules/app/twitter/packages.el index 927619ae8..8ad7dd82e 100644 --- a/modules/app/twitter/packages.el +++ b/modules/app/twitter/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/twitter/packages.el -(package! twittering-mode :pin "114891e8fd") -(package! avy :pin "3bf83140fa") +(package! twittering-mode :pin "114891e8fdb4f06b1326a6cf795e49c205cf9e29") +(package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd") diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 58a505fb5..f972eaa61 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -8,15 +8,16 @@ :init (setq langtool-default-language "en-US") :config (unless (or langtool-bin - langtool-language-tool-jar) - (setq langtool-language-tool-jar - (cond (IS-MAC + langtool-language-tool-jar + langtool-java-classpath) + (cond (IS-MAC + (setq langtool-language-tool-jar (locate-file "libexec/languagetool-commandline.jar" (doom-files-in "/usr/local/Cellar/languagetool" :type 'dirs - :depth 2))) - (IS-LINUX - "/usr/share/java/languagetool/languagetool-commandline.jar"))))) + :depth 2)))) + (IS-LINUX + (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*"))))) ;; Detects weasel words, passive voice and duplicates. Proselint would be a diff --git a/modules/checkers/grammar/packages.el b/modules/checkers/grammar/packages.el index 052e9207c..3207a672d 100644 --- a/modules/checkers/grammar/packages.el +++ b/modules/checkers/grammar/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/grammar/packages.el -(package! langtool :pin "a71ed02ce0") -(package! writegood-mode :pin "b71757ec33") +(package! langtool :pin "a71ed02ce06920ae3cafd6708de1c21811ce14c3") +(package! writegood-mode :pin "b71757ec337e226909fb0422f0224e31acc71733") diff --git a/modules/checkers/spell/packages.el b/modules/checkers/spell/packages.el index 083a1cf12..254de3230 100644 --- a/modules/checkers/spell/packages.el +++ b/modules/checkers/spell/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/spell/packages.el -(package! flyspell-correct :pin "e765d1a3d9") +(package! flyspell-correct :pin "fd8ac7a4f922ce5ea1cc5d4583a7d584847cb6b5") (cond ((featurep! :completion ivy) - (package! flyspell-correct-ivy :pin "e765d1a3d9")) + (package! flyspell-correct-ivy)) ((featurep! :completion helm) - (package! flyspell-correct-helm :pin "e765d1a3d9")) - ((package! flyspell-correct-popup :pin "e765d1a3d9"))) + (package! flyspell-correct-helm)) + ((package! flyspell-correct-popup))) -(package! flyspell-lazy :pin "3ebf68cc9e") +(package! flyspell-lazy :pin "3ebf68cc9eb10c972a2de8d7861cbabbbce69570") diff --git a/modules/checkers/syntax/packages.el b/modules/checkers/syntax/packages.el index d4cf34bbc..a1db8dc40 100644 --- a/modules/checkers/syntax/packages.el +++ b/modules/checkers/syntax/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/syntax/packages.el -(package! flycheck :pin "f19a51c0f1") -(package! flycheck-popup-tip :pin "ef86aad907") +(package! flycheck :pin "246e1d4380721ca03962464f11d02dd1372860ce") +(package! flycheck-popup-tip :pin "ef86aad907f27ca076859d8d9416f4f7727619c6") (when (featurep! +childframe) - (package! flycheck-posframe :pin "2b3e94c2e4")) + (package! flycheck-posframe :pin "2b3e94c2e427ec9831c513007460c5ea9e2225a3")) ;; TODO flymake? diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c44adb444..e53822f82 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -11,9 +11,26 @@ company-require-match 'never company-global-modes '(not erc-mode message-mode help-mode gud-mode) - company-backends '(company-capf) company-frontends '(company-pseudo-tooltip-frontend - company-echo-metadata-frontend)) + company-echo-metadata-frontend) + + ;; Buffer-local backends will be computed when loading a major mode, so + ;; only specify a global default here. + company-backends '(company-capf) + + ;; Company overrides `company-active-map' based on + ;; `company-auto-complete-chars'; no magic please! + company-auto-complete-chars nil + + ;; Only search the current buffer for `company-dabbrev' (a backend that + ;; suggests text your open buffers). This prevents Company from causing + ;; lag once you have a lot of buffers open. + company-dabbrev-other-buffers nil + ;; Make `company-dabbrev' fully case-sensitive, to improve UX with + ;; domain-specific words with particular casing. + company-dabbrev-ignore-case nil + company-dabbrev-downcase nil) + :config (when (featurep! :editor evil) (add-hook 'company-mode-hook #'evil-normalize-keymaps) @@ -106,6 +123,8 @@ (ElispFeature . ,(all-the-icons-material "stars" :face 'all-the-icons-orange)) (ElispFace . ,(all-the-icons-material "format_paint" :face 'all-the-icons-pink))))) + (delq! 'company-echo-metadata-frontend company-frontends) + (defun +company-box-icons--elisp-fn (candidate) (when (derived-mode-p 'emacs-lisp-mode) (let ((sym (intern candidate))) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index 2006fe791..0fefa4d71 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/company/packages.el -(package! company :pin "61ddd9afb5") -(package! company-dict :pin "cd7b8394f6") -(package! company-prescient :pin "53307731f3") +(package! company :pin "6333fc4ebbbf4d28e834de8715561e984f149ecb") +(package! company-dict :pin "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") +(package! company-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63") (when (featurep! +childframe) - (package! company-box :pin "8fc6168f2d")) + (package! company-box :pin "3814fcb14e92f4b85b19e664e216a7c8d5c7144d")) diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index e16931e25..9b1bf3090 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -1,19 +1,19 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/helm/packages.el -(package! helm :pin "d978f20f4c") -(package! helm-rg :pin "785a80fe5c") -(package! helm-c-yasnippet :pin "65ca732b51") -(package! helm-company :pin "6eb5c2d730") +(package! helm :pin "b6db9fb47a8900704394e63b795f4a54cb4701a8") +(package! helm-rg :pin "785a80fe5cc87e27c5ea3d00a70049028d9e2847") +(package! helm-c-yasnippet :pin "65ca732b510bfc31636708aebcfe4d2d845b59b0") +(package! helm-company :pin "6eb5c2d730a60e394e005b47c1db018697094dde") (package! helm-describe-modes :recipe (:host github :repo "emacs-helm/helm-describe-modes") - :pin "11fb36af11") -(package! helm-projectile :pin "5328b74ddd") -(package! swiper-helm :pin "93fb6db87b") + :pin "11fb36af119b784539d31c6160002de1957408aa") +(package! helm-projectile :pin "5328b74dddcee8d1913803ca8167868831a07463") +(package! swiper-helm :pin "93fb6db87bc6a5967898b5fd3286954cc72a0008") (when (featurep! +fuzzy) - (package! helm-flx :pin "6640fac5cb")) + (package! helm-flx :pin "6640fac5cb16bee73c95b8ed1248a4e5e113690e")) (when (featurep! +childframe) - (package! posframe :pin "e62e584268")) + (package! posframe :pin "093b29a53cbeda6d637ccc9ef4dfc47123e79b9e")) (when (featurep! :lang org) - (package! helm-org :pin "b7a18dfc17")) -(package! helm-descbinds :pin "b725159823") + (package! helm-org :pin "b7a18dfc17e8b933956d61d68c435eee03a96c24")) +(package! helm-descbinds :pin "b72515982396b6e336ad7beb6767e95a80fca192") diff --git a/modules/completion/ido/config.el b/modules/completion/ido/config.el index e1221dd1d..22de041ae 100644 --- a/modules/completion/ido/config.el +++ b/modules/completion/ido/config.el @@ -33,7 +33,7 @@ (map! :map (ido-common-completion-map ido-file-completion-map) "C-w" #'ido-delete-backward-word-updir - :map ido-common-completion-map + :map (ido-common-completion-map ido-file-dir-completion-map) "C-n" #'ido-next-match "C-p" #'ido-prev-match [down] #'ido-next-match diff --git a/modules/completion/ido/packages.el b/modules/completion/ido/packages.el index fc694fbfc..a7bed5bed 100644 --- a/modules/completion/ido/packages.el +++ b/modules/completion/ido/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ido/packages.el -(package! flx-ido :pin "17f5c9cb2a") -(package! ido-completing-read+ :pin "98d3a6e56b") -(package! ido-sort-mtime :pin "f638ff0c92") -(package! ido-vertical-mode :pin "16c4c1a112") -(package! crm-custom :pin "f1aaccf643") +(package! flx-ido :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5") +(package! ido-completing-read+ :pin "98d3a6e56b1d3652da7b47f49f76d77f82ea80ba") +(package! ido-sort-mtime :pin "f638ff0c922af862f5211779f2311a27fde428eb") +(package! ido-vertical-mode :pin "16c4c1a112796ee0bcf401ea39d3e2643a89feaf") +(package! crm-custom :pin "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 73276413f..bfdf62690 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -129,7 +129,11 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." (ivy-rich-counsel-function-docstring (:face font-lock-doc-face)))) ;; Apply switch buffer transformers to `counsel-projectile-switch-to-buffer' as well 'counsel-projectile-switch-to-buffer - (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer)) + (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer) + 'counsel-bookmark + '(:columns + ((ivy-rich-candidate (:width 0.5)) + (ivy-rich-bookmark-filename (:width 60))))) ;; Remove built-in coloring of buffer list; we do our own (setq ivy-switch-buffer-faces-alist nil) @@ -260,11 +264,14 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." :override #'counsel--find-return-list (cl-destructuring-bind (find-program . args) (cond ((executable-find doom-projectile-fd-binary) - (cons doom-projectile-fd-binary (list "-t" "f" "-E" ".git"))) + (cons doom-projectile-fd-binary + (list "--color=never" "-E" ".git" + "--type" "file" "--type" "symlink" "--follow"))) ((executable-find "rg") - (append (list "rg" "--files" "--color=never" "--hidden" "--no-messages") + (append (list "rg" "--files" "--follow" "--color=never" "--hidden" "--no-messages") (cl-loop for dir in projectile-globally-ignored-directories - collect "--glob" and collect (concat "!" dir)) + collect "--glob" + collect (concat "!" dir)) (if IS-WINDOWS (list "--path-separator" "/")))) ((cons find-program args))) (unless (listp args) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 3f1b3ad4a..f7f6d57ab 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -1,23 +1,23 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ivy/packages.el -(package! swiper :pin "64f05f4735") +(package! swiper :pin "9e0803cdb5b47e4e1844e8281516b46589ef26c7") (package! ivy) (package! ivy-hydra) (package! counsel) -(package! amx :pin "e512e74e83") -(package! counsel-projectile :pin "b556ed8995") -(package! ivy-rich :pin "596874d146") -(package! wgrep :pin "5977b8e000") +(package! amx :pin "7fb7b874291e0cdeb1f0acb18564a686ec86788d") +(package! counsel-projectile :pin "b556ed8995f375e57496f3482aef4b0def565de8") +(package! ivy-rich :pin "3f818b201769bc13cc75aa73645217e374136aca") +(package! wgrep :pin "5977b8e00051c9003ca96e9d35133e0dea68db2c") (if (featurep! +prescient) - (package! ivy-prescient :pin "53307731f3") + (package! ivy-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63") (when (featurep! +fuzzy) - (package! flx :pin "17f5c9cb2a"))) + (package! flx :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5"))) (when (featurep! +childframe) - (package! ivy-posframe :pin "ae9bafe94f")) + (package! ivy-posframe :pin "ae9bafe94fe6b77b6fe45766ae6172646f6a5d50")) (when (featurep! +icons) - (package! all-the-icons-ivy :pin "a70cbfa1ef")) + (package! all-the-icons-ivy :pin "a70cbfa1effe36efc946a823a580cec686d5e88d")) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index fc8b67fe2..ac6310c75 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -27,362 +27,363 @@ ;;; c --- code (:prefix-map ("c" . "code") - :desc "Compile" "c" #'compile - :desc "Recompile" "C" #'recompile - :desc "Jump to definition" "d" #'+lookup/definition - :desc "Jump to references" "D" #'+lookup/references - :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region - :desc "Evaluate & replace region" "E" #'+eval/region-and-replace - :desc "Format buffer/region" "f" #'+format/region-or-buffer - :desc "Jump to documentation" "k" #'+lookup/documentation - :desc "Send to repl" "s" #'+eval/send-region-to-repl - :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace - :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines - :desc "List errors" "x" #'flymake-show-diagnostics-buffer - (:when (featurep! :tools flycheck) - :desc "List errors" "x" #'flycheck-list-errors) - (:when (featurep! :tools lsp) + :desc "Compile" "c" #'compile + :desc "Recompile" "C" #'recompile + :desc "Jump to definition" "d" #'+lookup/definition + :desc "Jump to references" "D" #'+lookup/references + :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region + :desc "Evaluate & replace region" "E" #'+eval/region-and-replace + :desc "Format buffer/region" "f" #'+format/region-or-buffer + :desc "Jump to documentation" "k" #'+lookup/documentation + :desc "Send to repl" "s" #'+eval/send-region-to-repl + :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace + :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines + :desc "List errors" "x" #'flymake-show-diagnostics-buffer + (:when (featurep! :checkers syntax) + :desc "List errors" "x" #'flycheck-list-errors) + (:when (featurep! :tools lsp) :desc "LSP Code actions" "a" #'lsp-execute-code-action - :desc "LSP Format buffer/region" "F" #'+default/lsp-format-region-or-buffer :desc "LSP Organize imports" "i" #'lsp-organize-imports :desc "LSP Rename" "r" #'lsp-rename + (:after lsp-mode + :desc "LSP" "l" lsp-command-map) (:when (featurep! :completion ivy) - :desc "Jump to symbol in current workspace" "j" #'lsp-ivy-workspace-symbol - :desc "Jump to symbol in any workspace" "J" #'lsp-ivy-global-workspace-symbol) + :desc "Jump to symbol in current workspace" "j" #'lsp-ivy-workspace-symbol + :desc "Jump to symbol in any workspace" "J" #'lsp-ivy-global-workspace-symbol) (:when (featurep! :completion helm) - :desc "Jump to symbol in current workspace" "j" #'helm-lsp-workspace-symbol - :desc "Jump to symbol in any workspace" "J" #'helm-lsp-global-workspace-symbol))) + :desc "Jump to symbol in current workspace" "j" #'helm-lsp-workspace-symbol + :desc "Jump to symbol in any workspace" "J" #'helm-lsp-global-workspace-symbol))) ;;; f --- file (:prefix-map ("f" . "file") - :desc "Copy this file" "C" #'doom/copy-this-file - :desc "Find file in private config" "C" #'doom/find-file-in-private-config - :desc "Delete this file" "D" #'doom/delete-this-file - :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd - :desc "Browse emacs.d" "E" #'+default/browse-emacsd - :desc "Find file from here" "f" #'+default/find-file-under-here - :desc "Rename/move this file" "m" #'doom/move-this-file - :desc "Browse private config" "p" #'doom/open-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 - :desc "Sudo this file" "s" #'doom/sudo-this-file - :desc "Sudo find file" "S" #'doom/sudo-find-file - :desc "Yank filename" "y" #'+default/yank-buffer-filename - :desc "Open scratch buffer" "x" #'doom/open-scratch-buffer - :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer - (:when (featurep! :tools editorconfig) - :desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig)) + :desc "Copy this file" "C" #'doom/copy-this-file + :desc "Find file in private config" "C" #'doom/find-file-in-private-config + :desc "Delete this file" "D" #'doom/delete-this-file + :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" "E" #'+default/browse-emacsd + :desc "Find file from here" "f" #'+default/find-file-under-here + :desc "Rename/move this file" "m" #'doom/move-this-file + :desc "Browse private config" "p" #'doom/open-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 + :desc "Sudo this file" "s" #'doom/sudo-this-file + :desc "Sudo find file" "S" #'doom/sudo-find-file + :desc "Yank filename" "y" #'+default/yank-buffer-filename + :desc "Open scratch buffer" "x" #'doom/open-scratch-buffer + :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer + (:when (featurep! :tools editorconfig) + :desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig)) ;;; r --- remote (:when (featurep! :tools upload) - (:prefix-map ("r" . "remote") - :desc "Upload local" "u" #'ssh-deploy-upload-handler - :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced - :desc "Download remote" "d" #'ssh-deploy-download-handler - :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler - :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler - :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) + (:prefix-map ("r" . "remote") + :desc "Upload local" "u" #'ssh-deploy-upload-handler + :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced + :desc "Download remote" "d" #'ssh-deploy-download-handler + :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler + :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler + :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) ;;; s --- search (:prefix-map ("s" . "search") - :desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point - :desc "Search buffer" "b" #'swiper - :desc "Search current directory" "d" #'+default/search-cwd - :desc "Search other directory" "D" #'+default/search-other-cwd - :desc "Locate file" "f" #'locate - :desc "Jump to symbol" "i" #'imenu - :desc "Jump to visible link" "l" #'link-hint-open-link - :desc "Jump to link" "L" #'ffap-menu - :desc "Jump list" "j" #'evil-show-jumps - :desc "Jump to mark" "m" #'evil-show-marks - :desc "Search project" "p" #'+default/search-project - :desc "Search other project" "P" #'+default/search-other-project - :desc "Search buffer" "s" #'swiper-isearch - :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point) + :desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point + :desc "Search buffer" "b" #'swiper + :desc "Search current directory" "d" #'+default/search-cwd + :desc "Search other directory" "D" #'+default/search-other-cwd + :desc "Locate file" "f" #'locate + :desc "Jump to symbol" "i" #'imenu + :desc "Jump to visible link" "l" #'link-hint-open-link + :desc "Jump to link" "L" #'ffap-menu + :desc "Jump list" "j" #'evil-show-jumps + :desc "Jump to mark" "m" #'evil-show-marks + :desc "Search project" "p" #'+default/search-project + :desc "Search other project" "P" #'+default/search-other-project + :desc "Search buffer" "s" #'swiper-isearch + :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point) ;;; g --- lookup (:when (featurep! :tools lookup) - (:prefix-map ("g" . "lookup") - "k" #'+lookup/documentation - "d" #'+lookup/definition - "D" #'+lookup/references - "f" #'+lookup/file - "o" #'+lookup/online-select - "i" #'+lookup/in-docsets - "I" #'+lookup/in-all-docsets)) + (:prefix-map ("g" . "lookup") + "k" #'+lookup/documentation + "d" #'+lookup/definition + "D" #'+lookup/references + "f" #'+lookup/file + "o" #'+lookup/online-select + "i" #'+lookup/in-docsets + "I" #'+lookup/in-all-docsets)) ;;; i --- insert (:prefix-map ("i" . "insert") - :desc "Current file name" "f" #'+default/insert-file-path - :desc "Current file path" "F" (λ!! #'+default/insert-file-path t) - :desc "Snippet" "s" #'yas-insert-snippet - :desc "Unicode" "u" #'unicode-chars-list-chars - :desc "From clipboard" "y" #'+default/yank-pop) + :desc "Current file name" "f" #'+default/insert-file-path + :desc "Current file path" "F" (λ!! #'+default/insert-file-path t) + :desc "Snippet" "s" #'yas-insert-snippet + :desc "Unicode" "u" #'unicode-chars-list-chars + :desc "From clipboard" "y" #'+default/yank-pop) ;;; n --- notes (:prefix-map ("n" . "notes") - :desc "Search notes for symbol" "." #'+default/search-notes-for-symbol-at-point - :desc "Org agenda" "a" #'org-agenda - (:when (featurep! :tools biblio) - :desc "Bibliographic entries" "b" - (cond ((featurep! :completion ivy) #'ivy-bibtex) - ((featurep! :completion helm) #'helm-bibtex))) + :desc "Search notes for symbol" "." #'+default/search-notes-for-symbol-at-point + :desc "Org agenda" "a" #'org-agenda + (:when (featurep! :tools biblio) + :desc "Bibliographic entries" "b" + (cond ((featurep! :completion ivy) #'ivy-bibtex) + ((featurep! :completion helm) #'helm-bibtex))) - :desc "Toggle org-clock" "c" #'+org/toggle-clock - :desc "Cancel org-clock" "C" #'org-clock-cancel - :desc "Open deft" "d" #'deft - (:when (featurep! :lang org +noter) - :desc "Org noter" "e" #'org-noter) - - :desc "Find file in notes" "f" #'+default/find-in-notes - :desc "Browse notes" "F" #'+default/browse-notes - :desc "Org store link" "l" #'org-store-link - :desc "Tags search" "m" #'org-tags-view - :desc "Org capture" "n" #'org-capture - :desc "Goto capture" "N" #'org-capture-goto-target - :desc "Active org-clock" "o" #'org-clock-goto - :desc "Todo list" "t" #'org-todo-list - :desc "Search notes" "s" #'+default/org-notes-search - :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines - :desc "View search" "v" #'org-search-view - :desc "Org export to clipboard" "y" #'+org/export-to-clipboard - :desc "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text - (:when (featurep! :lang org +journal) - (:prefix ("j" . "journal") - :desc "New Entry" "j" #'org-journal-new-entry - :desc "Search Forever" "s" #'org-journal-search-forever)) - (:when (featurep! :lang org +roam) - (:prefix ("r" . "roam") - :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer - :desc "Org Roam Capture" "c" #'org-roam-capture - :desc "Find file" "f" #'org-roam-find-file - :desc "Show graph" "g" #'org-roam-graph - :desc "Insert" "i" #'org-roam-insert - :desc "Org Roam" "r" #'org-roam - (:prefix ("d" . "by date") - :desc "Arbitrary date" "d" #'org-roam-dailies-date - :desc "Today" "t" #'org-roam-dailies-today - :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow - :desc "Yesterday" "y" #'org-roam-dailies-yesterday)))) + :desc "Toggle org-clock" "c" #'+org/toggle-clock + :desc "Cancel org-clock" "C" #'org-clock-cancel + :desc "Open deft" "d" #'deft + (:when (featurep! :lang org +noter) + :desc "Org noter" "e" #'org-noter) + + :desc "Find file in notes" "f" #'+default/find-in-notes + :desc "Browse notes" "F" #'+default/browse-notes + :desc "Org store link" "l" #'org-store-link + :desc "Tags search" "m" #'org-tags-view + :desc "Org capture" "n" #'org-capture + :desc "Goto capture" "N" #'org-capture-goto-target + :desc "Active org-clock" "o" #'org-clock-goto + :desc "Todo list" "t" #'org-todo-list + :desc "Search notes" "s" #'+default/org-notes-search + :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines + :desc "View search" "v" #'org-search-view + :desc "Org export to clipboard" "y" #'+org/export-to-clipboard + :desc "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text + (:when (featurep! :lang org +journal) + (:prefix ("j" . "journal") + :desc "New Entry" "j" #'org-journal-new-entry + :desc "Search Forever" "s" #'org-journal-search-forever)) + (:when (featurep! :lang org +roam) + (:prefix ("r" . "roam") + :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer + :desc "Org Roam Capture" "c" #'org-roam-capture + :desc "Find file" "f" #'org-roam-find-file + :desc "Show graph" "g" #'org-roam-graph + :desc "Insert" "i" #'org-roam-insert + :desc "Org Roam" "r" #'org-roam + (:prefix ("d" . "by date") + :desc "Arbitrary date" "d" #'org-roam-dailies-date + :desc "Today" "t" #'org-roam-dailies-today + :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow + :desc "Yesterday" "y" #'org-roam-dailies-yesterday)))) ;;; o --- open "o" nil ; we need to unbind it first as Org claims this prefix (:prefix-map ("o" . "open") - :desc "Browser" "b" #'browse-url-of-file - :desc "Debugger" "d" #'+debugger/start - :desc "New frame" "f" #'make-frame - :desc "REPL" "r" #'+eval/open-repl-other-window - :desc "REPL (same window)" "R" #'+eval/open-repl-same-window - :desc "Dired" "-" #'dired-jump - (:when (featurep! :ui neotree) - :desc "Project sidebar" "p" #'+neotree/open - :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) - (:when (featurep! :ui treemacs) - :desc "Project sidebar" "p" #'+treemacs/toggle - :desc "Find file in project rsidebar" "P" #'+treemacs/find-file) - (:when (featurep! :term shell) - :desc "Toggle shell popup" "t" #'+shell/toggle - :desc "Open shell here" "T" #'+shell/here) - (:when (featurep! :term term) - :desc "Toggle terminal popup" "t" #'+term/toggle - :desc "Open terminal here" "T" #'+term/here) - (:when (featurep! :term vterm) - :desc "Toggle vterm popup" "t" #'+vterm/toggle - :desc "Open vterm here" "T" #'+vterm/here) - (:when (featurep! :term eshell) - :desc "Toggle eshell popup" "e" #'+eshell/toggle - :desc "Open eshell here" "E" #'+eshell/here) - (:when (featurep! :tools macos) - :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder - :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder - :desc "Send to Transmit" "u" #'+macos/send-to-transmit - :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit - :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar - :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) - (:when (featurep! :tools docker) - :desc "Docker" "D" #'docker)) + :desc "Browser" "b" #'browse-url-of-file + :desc "Debugger" "d" #'+debugger/start + :desc "New frame" "f" #'make-frame + :desc "REPL" "r" #'+eval/open-repl-other-window + :desc "REPL (same window)" "R" #'+eval/open-repl-same-window + :desc "Dired" "-" #'dired-jump + (:when (featurep! :ui neotree) + :desc "Project sidebar" "p" #'+neotree/open + :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) + (:when (featurep! :ui treemacs) + :desc "Project sidebar" "p" #'+treemacs/toggle + :desc "Find file in project rsidebar" "P" #'treemacs-find-file) + (:when (featurep! :term shell) + :desc "Toggle shell popup" "t" #'+shell/toggle + :desc "Open shell here" "T" #'+shell/here) + (:when (featurep! :term term) + :desc "Toggle terminal popup" "t" #'+term/toggle + :desc "Open terminal here" "T" #'+term/here) + (:when (featurep! :term vterm) + :desc "Toggle vterm popup" "t" #'+vterm/toggle + :desc "Open vterm here" "T" #'+vterm/here) + (:when (featurep! :term eshell) + :desc "Toggle eshell popup" "e" #'+eshell/toggle + :desc "Open eshell here" "E" #'+eshell/here) + (:when (featurep! :tools macos) + :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder + :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder + :desc "Send to Transmit" "u" #'+macos/send-to-transmit + :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit + :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar + :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) + (:when (featurep! :tools docker) + :desc "Docker" "D" #'docker)) ;;; p --- project (:prefix ("p" . "project") - :desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point - :desc "Find file in other project" "F" #'doom/find-file-in-other-project - :desc "Search project" "s" #'+default/search-project - :desc "List project tasks" "t" #'magit-todos-list - :desc "Open project scratch buffer" "x" #'doom/open-project-scratch-buffer - :desc "Switch to project scratch buffer" "X" #'doom/switch-to-project-scratch-buffer - ;; later expanded by projectile - (:prefix ("4" . "in other window")) - (:prefix ("5" . "in other frame"))) + :desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point + :desc "Find file in other project" "F" #'doom/find-file-in-other-project + :desc "Search project" "s" #'+default/search-project + :desc "List project tasks" "t" #'magit-todos-list + :desc "Open project scratch buffer" "x" #'doom/open-project-scratch-buffer + :desc "Switch to project scratch buffer" "X" #'doom/switch-to-project-scratch-buffer + ;; later expanded by projectile + (:prefix ("4" . "in other window")) + (:prefix ("5" . "in other frame"))) ;;; q --- quit/restart (:prefix-map ("q" . "quit/restart") - :desc "Restart emacs server" "d" #'+default/restart-server - :desc "Delete frame" "f" #'delete-frame - :desc "Clear current frame" "F" #'doom/kill-all-buffers - :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs - :desc "Quit Emacs" "q" #'kill-emacs - :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal - :desc "Quick save current session" "s" #'doom/quicksave-session - :desc "Restore last session" "l" #'doom/quickload-session - :desc "Save session to file" "S" #'doom/save-session - :desc "Restore session from file" "L" #'doom/load-session - :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore - :desc "Restart Emacs" "R" #'doom/restart) + :desc "Restart emacs server" "d" #'+default/restart-server + :desc "Delete frame" "f" #'delete-frame + :desc "Clear current frame" "F" #'doom/kill-all-buffers + :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs + :desc "Quit Emacs" "q" #'kill-emacs + :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal + :desc "Quick save current session" "s" #'doom/quicksave-session + :desc "Restore last session" "l" #'doom/quickload-session + :desc "Save session to file" "S" #'doom/save-session + :desc "Restore session from file" "L" #'doom/load-session + :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore + :desc "Restart Emacs" "R" #'doom/restart) ;;; & --- snippets (:prefix-map ("&" . "snippets") - :desc "New snippet" "n" #'yas-new-snippet - :desc "Insert snippet" "i" #'yas-insert-snippet - :desc "Find global snippet" "/" #'yas-visit-snippet-file - :desc "Reload snippets" "r" #'yas-reload-all - :desc "Create Temp Template" "c" #'aya-create - :desc "Use Temp Template" "e" #'aya-expand) + :desc "New snippet" "n" #'yas-new-snippet + :desc "Insert snippet" "i" #'yas-insert-snippet + :desc "Find global snippet" "/" #'yas-visit-snippet-file + :desc "Reload snippets" "r" #'yas-reload-all + :desc "Create Temp Template" "c" #'aya-create + :desc "Use Temp Template" "e" #'aya-expand) ;;; t --- toggle (:prefix-map ("t" . "toggle") - :desc "Big mode" "b" #'doom-big-font-mode - :desc "Flymake" "f" #'flymake-mode - :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen - :desc "Indent style" "I" #'doom/toggle-indent-style - :desc "Line numbers" "l" #'doom/toggle-line-numbers - :desc "Word-wrap mode" "w" #'+word-wrap-mode - (:when (featurep! :tools flycheck) - :desc "Flycheck" "f" #'flycheck-mode) - (:when (featurep! :ui indent-guides) - :desc "Indent guides" "i" #'highlight-indent-guides-mode) - (:when (featurep! :lang org +present) - :desc "org-tree-slide mode" "p" #'+org-present/start) - :desc "Read-only mode" "r" #'read-only-mode - (:when (featurep! :tools flyspell) - :desc "Flyspell" "s" #'flyspell-mode) - (:when (featurep! :lang org +pomodoro) - :desc "Pomodoro timer" "t" #'org-pomodoro) - (:when (featurep! :ui zen) - :desc "Zen mode" "z" #'writeroom-mode)) + :desc "Big mode" "b" #'doom-big-font-mode + :desc "Flymake" "f" #'flymake-mode + :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen + :desc "Indent style" "I" #'doom/toggle-indent-style + :desc "Line numbers" "l" #'doom/toggle-line-numbers + :desc "Word-wrap mode" "w" #'+word-wrap-mode + (:when (featurep! :checkers syntax) + :desc "Flycheck" "f" #'flycheck-mode) + (:when (featurep! :ui indent-guides) + :desc "Indent guides" "i" #'highlight-indent-guides-mode) + (:when (featurep! :lang org +present) + :desc "org-tree-slide mode" "p" #'+org-present/start) + :desc "Read-only mode" "r" #'read-only-mode + (:when (featurep! :checkers spell) + :desc "Flyspell" "s" #'flyspell-mode) + (:when (featurep! :lang org +pomodoro) + :desc "Pomodoro timer" "t" #'org-pomodoro) + (:when (featurep! :ui zen) + :desc "Zen mode" "z" #'writeroom-mode)) ;;; v --- versioning (:prefix-map ("v" . "versioning") - :desc "Git revert file" "R" #'vc-revert - :desc "Kill link to remote" "y" #'browse-at-remote-kill - :desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage - (:when (featurep! :ui vc-gutter) - :desc "Git revert hunk" "r" #'git-gutter:revert-hunk - :desc "Git stage hunk" "s" #'git-gutter:stage-hunk - :desc "Git time machine" "t" #'git-timemachine-toggle - :desc "Jump to next hunk" "n" #'git-gutter:next-hunk - :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk) - (:when (featurep! :tools magit) - :desc "Magit dispatch" "/" #'magit-dispatch - :desc "Forge dispatch" "'" #'forge-dispatch - :desc "Magit status" "g" #'magit-status - :desc "Magit file delete" "x" #'magit-file-delete - :desc "Magit blame" "B" #'magit-blame-addition - :desc "Magit clone" "C" #'magit-clone - :desc "Magit fetch" "F" #'magit-fetch - :desc "Magit buffer log" "L" #'magit-log - :desc "Git stage file" "S" #'magit-stage-file - :desc "Git unstage file" "U" #'magit-unstage-file - (:prefix ("f" . "find") - :desc "Find file" "f" #'magit-find-file - :desc "Find gitconfig file" "g" #'magit-find-git-config-file - :desc "Find commit" "c" #'magit-show-commit - :desc "Find issue" "i" #'forge-visit-issue - :desc "Find pull request" "p" #'forge-visit-pullreq) - (:prefix ("o" . "open in browser") - :desc "Browse file or region" "." #'browse-at-remote - :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage - :desc "Browse remote" "r" #'forge-browse-remote - :desc "Browse commit" "c" #'forge-browse-commit - :desc "Browse an issue" "i" #'forge-browse-issue - :desc "Browse a pull request" "p" #'forge-browse-pullreq - :desc "Browse issues" "I" #'forge-browse-issues - :desc "Browse pull requests" "P" #'forge-browse-pullreqs) - (:prefix ("l" . "list") - (:when (featurep! :tools gist) - :desc "List gists" "g" #'+gist:list) - :desc "List repositories" "r" #'magit-list-repositories - :desc "List submodules" "s" #'magit-list-submodules - :desc "List issues" "i" #'forge-list-issues - :desc "List pull requests" "p" #'forge-list-pullreqs - :desc "List notifications" "n" #'forge-list-notifications) - (:prefix ("c" . "create") - :desc "Initialize repo" "r" #'magit-init - :desc "Clone repo" "R" #'magit-clone - :desc "Commit" "c" #'magit-commit-create - :desc "Fixup" "f" #'magit-commit-fixup - :desc "Issue" "i" #'forge-create-issue - :desc "Pull request" "p" #'forge-create-pullreq))) + :desc "Git revert file" "R" #'vc-revert + :desc "Kill link to remote" "y" #'browse-at-remote-kill + :desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage + (:when (featurep! :ui vc-gutter) + :desc "Git revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Jump to next hunk" "n" #'git-gutter:next-hunk + :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk) + (:when (featurep! :tools magit) + :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Forge dispatch" "'" #'forge-dispatch + :desc "Magit status" "g" #'magit-status + :desc "Magit file delete" "x" #'magit-file-delete + :desc "Magit blame" "B" #'magit-blame-addition + :desc "Magit clone" "C" #'magit-clone + :desc "Magit fetch" "F" #'magit-fetch + :desc "Magit buffer log" "L" #'magit-log + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git unstage file" "U" #'magit-unstage-file + (:prefix ("f" . "find") + :desc "Find file" "f" #'magit-find-file + :desc "Find gitconfig file" "g" #'magit-find-git-config-file + :desc "Find commit" "c" #'magit-show-commit + :desc "Find issue" "i" #'forge-visit-issue + :desc "Find pull request" "p" #'forge-visit-pullreq) + (:prefix ("o" . "open in browser") + :desc "Browse file or region" "." #'browse-at-remote + :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage + :desc "Browse remote" "r" #'forge-browse-remote + :desc "Browse commit" "c" #'forge-browse-commit + :desc "Browse an issue" "i" #'forge-browse-issue + :desc "Browse a pull request" "p" #'forge-browse-pullreq + :desc "Browse issues" "I" #'forge-browse-issues + :desc "Browse pull requests" "P" #'forge-browse-pullreqs) + (:prefix ("l" . "list") + (:when (featurep! :tools gist) + :desc "List gists" "g" #'+gist:list) + :desc "List repositories" "r" #'magit-list-repositories + :desc "List submodules" "s" #'magit-list-submodules + :desc "List issues" "i" #'forge-list-issues + :desc "List pull requests" "p" #'forge-list-pullreqs + :desc "List notifications" "n" #'forge-list-notifications) + (:prefix ("c" . "create") + :desc "Initialize repo" "r" #'magit-init + :desc "Clone repo" "R" #'magit-clone + :desc "Commit" "c" #'magit-commit-create + :desc "Fixup" "f" #'magit-commit-fixup + :desc "Issue" "i" #'forge-create-issue + :desc "Pull request" "p" #'forge-create-pullreq))) ;;; w --- workspaces/windows (:prefix-map ("w" . "workspaces/windows") - :desc "Autosave session" "a" #'doom/quicksave-session - :desc "Display workspaces" "d" #'+workspace/display - :desc "Rename workspace" "r" #'+workspace/rename - :desc "Create workspace" "c" #'+workspace/new - :desc "Delete workspace" "k" #'+workspace/delete - :desc "Save session" "s" #'doom/save-session - :desc "Save workspace" "S" #'+workspace/save - :desc "Load session" "l" #'doom/load-session - :desc "Load last autosaved session" "L" #'doom/quickload-session - :desc "Switch to other workspace" "o" #'+workspace/other - :desc "Undo window config" "u" #'winner-undo - :desc "Redo window config" "U" #'winner-redo - :desc "Switch to left workspace" "p" #'+workspace/switch-left - :desc "Switch to right workspace" "n" #'+workspace/switch-right - :desc "Switch to" "w" #'+workspace/switch-to - :desc "Switch to workspace 1" "1" #'+workspace/switch-to-0 - :desc "Switch to workspace 2" "2" #'+workspace/switch-to-1 - :desc "Switch to workspace 3" "3" #'+workspace/switch-to-2 - :desc "Switch to workspace 4" "4" #'+workspace/switch-to-3 - :desc "Switch to workspace 5" "5" #'+workspace/switch-to-4 - :desc "Switch to workspace 6" "6" #'+workspace/switch-to-5 - :desc "Switch to workspace 7" "7" #'+workspace/switch-to-6 - :desc "Switch to workspace 8" "8" #'+workspace/switch-to-7 - :desc "Switch to workspace 9" "9" #'+workspace/switch-to-8 - :desc "Switch to last workspace" "0" #'+workspace/switch-to-final) + :desc "Autosave session" "a" #'doom/quicksave-session + :desc "Display workspaces" "d" #'+workspace/display + :desc "Rename workspace" "r" #'+workspace/rename + :desc "Create workspace" "c" #'+workspace/new + :desc "Delete workspace" "k" #'+workspace/delete + :desc "Save session" "s" #'doom/save-session + :desc "Save workspace" "S" #'+workspace/save + :desc "Load session" "l" #'doom/load-session + :desc "Load last autosaved session" "L" #'doom/quickload-session + :desc "Switch to other workspace" "o" #'+workspace/other + :desc "Undo window config" "u" #'winner-undo + :desc "Redo window config" "U" #'winner-redo + :desc "Switch to left workspace" "p" #'+workspace/switch-left + :desc "Switch to right workspace" "n" #'+workspace/switch-right + :desc "Switch to" "w" #'+workspace/switch-to + :desc "Switch to workspace 1" "1" #'+workspace/switch-to-0 + :desc "Switch to workspace 2" "2" #'+workspace/switch-to-1 + :desc "Switch to workspace 3" "3" #'+workspace/switch-to-2 + :desc "Switch to workspace 4" "4" #'+workspace/switch-to-3 + :desc "Switch to workspace 5" "5" #'+workspace/switch-to-4 + :desc "Switch to workspace 6" "6" #'+workspace/switch-to-5 + :desc "Switch to workspace 7" "7" #'+workspace/switch-to-6 + :desc "Switch to workspace 8" "8" #'+workspace/switch-to-7 + :desc "Switch to workspace 9" "9" #'+workspace/switch-to-8 + :desc "Switch to last workspace" "0" #'+workspace/switch-to-final) ;;; m --- multiple cursors (:when (featurep! :editor multiple-cursors) - (:prefix-map ("m" . "multiple cursors") - :desc "Edit lines" "l" #'mc/edit-lines - :desc "Mark next" "n" #'mc/mark-next-like-this - :desc "Unmark next" "N" #'mc/unmark-next-like-this - :desc "Mark previous" "p" #'mc/mark-previous-like-this - :desc "Unmark previous" "P" #'mc/unmark-previous-like-this - :desc "Mark all" "t" #'mc/mark-all-like-this - :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim - :desc "Edit line endings" "e" #'mc/edit-ends-of-lines - :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines - :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair - :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun - :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click)) + (:prefix-map ("m" . "multiple cursors") + :desc "Edit lines" "l" #'mc/edit-lines + :desc "Mark next" "n" #'mc/mark-next-like-this + :desc "Unmark next" "N" #'mc/unmark-next-like-this + :desc "Mark previous" "p" #'mc/mark-previous-like-this + :desc "Unmark previous" "P" #'mc/unmark-previous-like-this + :desc "Mark all" "t" #'mc/mark-all-like-this + :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim + :desc "Edit line endings" "e" #'mc/edit-ends-of-lines + :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines + :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair + :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun + :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click)) ;; APPs ;;; M --- mu4e (:when (featurep! :email mu4e) - (:prefix-map ("M" . "mu4e") - :desc "Open email app" "M" #'=mu4e - :desc "Compose email" "c" #'+mu4e/compose)) + (:prefix-map ("M" . "mu4e") + :desc "Open email app" "M" #'=mu4e + :desc "Compose email" "c" #'+mu4e/compose)) ;;; I --- IRC (:when (featurep! :app irc) - (:prefix-map ("I" . "irc") - :desc "Open irc app" "I" #'=irc - :desc "Next unread buffer" "a" #'tracking-next-buffer - :desc "Quit irc" "q" #'+irc/quit - :desc "Reconnect all" "r" #'circe-reconnect-all - :desc "Send message" "s" #'+irc/send-message - (:when (featurep! :completion ivy) - :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) + (:prefix-map ("I" . "irc") + :desc "Open irc app" "I" #'=irc + :desc "Next unread buffer" "a" #'tracking-next-buffer + :desc "Quit irc" "q" #'+irc/quit + :desc "Reconnect all" "r" #'circe-reconnect-all + :desc "Send message" "s" #'+irc/send-message + (:when (featurep! :completion ivy) + :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) ;;; T --- twitter (:when (featurep! :app twitter) - (:prefix-map ("T" . "twitter") - :desc "Open twitter app" "T" #'=twitter - :desc "Quit twitter" "q" #'+twitter/quit - :desc "Rerender twits" "r" #'+twitter/rerender-all - :desc "Ace link" "l" #'+twitter/ace-link))) + (:prefix-map ("T" . "twitter") + :desc "Open twitter app" "T" #'=twitter + :desc "Quit twitter" "q" #'+twitter/quit + :desc "Rerender twits" "r" #'+twitter/rerender-all + :desc "Ace link" "l" #'+twitter/ace-link))) ;; @@ -541,4 +542,4 @@ ;;; treemacs (:when (featurep! :ui treemacs) "" #'+treemacs/toggle - "" #'+treemacs/find-file)) + "" #'treemacs-find-file)) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 52df2ec1b..2cc5d3f40 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -26,6 +26,9 @@ "C-k" #'previous-line "C-S-j" #'scroll-up-command "C-S-k" #'scroll-down-command) + (define-key! :states 'insert :keymaps +default-minibuffer-maps + "C-j" #'next-line + "C-k" #'previous-line) (define-key! read-expression-map "C-j" #'next-line-or-history-element "C-k" #'previous-line-or-history-element))) @@ -54,42 +57,42 @@ :i "C-j" #'+default/newline ; default behavior (:after help :map help-mode-map - :n "o" #'link-hint-open-link) + :n "o" #'link-hint-open-link) (:after helpful :map helpful-mode-map - :n "o" #'link-hint-open-link) + :n "o" #'link-hint-open-link) (:after info :map Info-mode-map - :n "o" #'link-hint-open-link) + :n "o" #'link-hint-open-link) (:after apropos :map apropos-mode-map - :n "o" #'link-hint-open-link - :n "TAB" #'forward-button - :n [tab] #'forward-button - :n [backtab] #'backward-button) + :n "o" #'link-hint-open-link + :n "TAB" #'forward-button + :n [tab] #'forward-button + :n [backtab] #'backward-button) (:after view :map view-mode-map - [escape] #'View-quit-all) + [escape] #'View-quit-all) (:after man :map Man-mode-map - :n "q" #'kill-current-buffer) + :n "q" #'kill-current-buffer) (:after (evil-org evil-easymotion) - :map evil-org-mode-map - :m "gsh" #'+org/goto-visible) + :map evil-org-mode-map + :m "gsh" #'+org/goto-visible) (:when (featurep! :editor multiple-cursors) - :prefix "gz" - :nv "d" #'evil-mc-make-and-goto-next-match - :nv "D" #'evil-mc-make-and-goto-prev-match - :nv "j" #'evil-mc-make-cursor-move-next-line - :nv "k" #'evil-mc-make-cursor-move-prev-line - :nv "m" #'evil-mc-make-all-cursors - :nv "n" #'evil-mc-make-and-goto-next-cursor - :nv "N" #'evil-mc-make-and-goto-last-cursor - :nv "p" #'evil-mc-make-and-goto-prev-cursor - :nv "P" #'evil-mc-make-and-goto-first-cursor - :nv "q" #'evil-mc-undo-all-cursors - :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors - :nv "u" #'evil-mc-undo-last-added-cursor - :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here - :v "I" #'evil-mc-make-cursor-in-visual-selection-beg - :v "A" #'evil-mc-make-cursor-in-visual-selection-end) + :prefix "gz" + :nv "d" #'evil-mc-make-and-goto-next-match + :nv "D" #'evil-mc-make-and-goto-prev-match + :nv "j" #'evil-mc-make-cursor-move-next-line + :nv "k" #'evil-mc-make-cursor-move-prev-line + :nv "m" #'evil-mc-make-all-cursors + :nv "n" #'evil-mc-make-and-goto-next-cursor + :nv "N" #'evil-mc-make-and-goto-last-cursor + :nv "p" #'evil-mc-make-and-goto-prev-cursor + :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "q" #'evil-mc-undo-all-cursors + :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors + :nv "u" #'evil-mc-undo-last-added-cursor + :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here + :v "I" #'evil-mc-make-cursor-in-visual-selection-beg + :v "A" #'evil-mc-make-cursor-in-visual-selection-end) ;; misc :n "C-S-f" #'toggle-frame-fullscreen @@ -107,119 +110,119 @@ ;;; :completion (map! (:when (featurep! :completion company) - :i "C-@" #'+company/complete - :i "C-SPC" #'+company/complete - (:after company - (:map company-active-map - "C-w" nil ; don't interfere with `evil-delete-backward-word' - "C-n" #'company-select-next - "C-p" #'company-select-previous - "C-j" #'company-select-next - "C-k" #'company-select-previous - "C-h" #'company-show-doc-buffer - "C-u" #'company-previous-page - "C-d" #'company-next-page - "C-s" #'company-filter-candidates - "C-S-s" (cond ((featurep! :completion helm) #'helm-company) - ((featurep! :completion ivy) #'counsel-company)) - "C-SPC" #'company-complete-common - "TAB" #'company-complete-common-or-cycle - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous - [f1] nil) - (:map company-search-map ; applies to `company-filter-map' too - "C-n" #'company-select-next-or-abort - "C-p" #'company-select-previous-or-abort - "C-j" #'company-select-next-or-abort - "C-k" #'company-select-previous-or-abort - "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort)) - ;; TAB auto-completion in term buffers - (:after comint :map comint-mode-map - "TAB" #'company-complete - [tab] #'company-complete)) + :i "C-@" #'+company/complete + :i "C-SPC" #'+company/complete + (:after company + (:map company-active-map + "C-w" nil ; don't interfere with `evil-delete-backward-word' + "C-n" #'company-select-next + "C-p" #'company-select-previous + "C-j" #'company-select-next + "C-k" #'company-select-previous + "C-h" #'company-show-doc-buffer + "C-u" #'company-previous-page + "C-d" #'company-next-page + "C-s" #'company-filter-candidates + "C-S-s" (cond ((featurep! :completion helm) #'helm-company) + ((featurep! :completion ivy) #'counsel-company)) + "C-SPC" #'company-complete-common + "TAB" #'company-complete-common-or-cycle + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous + [f1] nil) + (:map company-search-map ; applies to `company-filter-map' too + "C-n" #'company-select-next-or-abort + "C-p" #'company-select-previous-or-abort + "C-j" #'company-select-next-or-abort + "C-k" #'company-select-previous-or-abort + "C-s" (λ! (company-search-abort) (company-filter-candidates)) + [escape] #'company-search-abort)) + ;; TAB auto-completion in term buffers + (:after comint :map comint-mode-map + "TAB" #'company-complete + [tab] #'company-complete)) (:when (featurep! :completion ivy) - (:after ivy - :map ivy-minibuffer-map - "C-SPC" #'ivy-call-and-recenter ; preview file - "C-l" #'ivy-alt-done - "C-v" #'yank) - (:after counsel - :map counsel-ag-map - "C-SPC" #'ivy-call-and-recenter ; preview - "C-l" #'ivy-done - [C-return] #'+ivy/git-grep-other-window-action)) + (:after ivy + :map ivy-minibuffer-map + "C-SPC" #'ivy-call-and-recenter ; preview file + "C-l" #'ivy-alt-done + "C-v" #'yank) + (:after counsel + :map counsel-ag-map + "C-SPC" #'ivy-call-and-recenter ; preview + "C-l" #'ivy-done + [C-return] #'+ivy/git-grep-other-window-action)) (:when (featurep! :completion helm) - (:after helm :map helm-map - [remap next-line] #'helm-next-line - [remap previous-line] #'helm-previous-line - [left] #'left-char - [right] #'right-char - "C-S-f" #'helm-previous-page - "C-S-n" #'helm-next-source - "C-S-p" #'helm-previous-source - (:when (featurep! :editor evil +everywhere) - "C-j" #'helm-next-line - "C-k" #'helm-previous-line - "C-S-j" #'helm-next-source - "C-S-k" #'helm-previous-source) - "C-u" #'helm-delete-minibuffer-contents - "C-s" #'helm-minibuffer-history - ;; Swap TAB and C-z - "TAB" #'helm-execute-persistent-action - [tab] #'helm-execute-persistent-action - "C-z" #'helm-select-action) - (:after helm-ag :map helm-ag-map - "C--" #'+helm-do-ag-decrease-context - "C-=" #'+helm-do-ag-increase-context - [left] nil - [right] nil) - (:after helm-files :map (helm-find-files-map helm-read-file-map) - [C-return] #'helm-ff-run-switch-other-window - "C-w" #'helm-find-files-up-one-level) - (:after helm-locate :map helm-generic-files-map - [C-return] #'helm-ff-run-switch-other-window) - (:after helm-buffers :map helm-buffer-map - [C-return] #'helm-buffer-switch-other-window) - (:after helm-occur :map helm-occur-map - [C-return] #'helm-occur-run-goto-line-ow) - (:after helm-grep :map helm-grep-map - [C-return] #'helm-grep-run-other-window-action))) + (:after helm :map helm-map + [remap next-line] #'helm-next-line + [remap previous-line] #'helm-previous-line + [left] #'left-char + [right] #'right-char + "C-S-f" #'helm-previous-page + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + (:when (featurep! :editor evil +everywhere) + "C-j" #'helm-next-line + "C-k" #'helm-previous-line + "C-S-j" #'helm-next-source + "C-S-k" #'helm-previous-source) + "C-u" #'helm-delete-minibuffer-contents + "C-s" #'helm-minibuffer-history + ;; Swap TAB and C-z + "TAB" #'helm-execute-persistent-action + [tab] #'helm-execute-persistent-action + "C-z" #'helm-select-action) + (:after helm-ag :map helm-ag-map + "C--" #'+helm-do-ag-decrease-context + "C-=" #'+helm-do-ag-increase-context + [left] nil + [right] nil) + (:after helm-files :map (helm-find-files-map helm-read-file-map) + [C-return] #'helm-ff-run-switch-other-window + "C-w" #'helm-find-files-up-one-level) + (:after helm-locate :map helm-generic-files-map + [C-return] #'helm-ff-run-switch-other-window) + (:after helm-buffers :map helm-buffer-map + [C-return] #'helm-buffer-switch-other-window) + (:after helm-occur :map helm-occur-map + [C-return] #'helm-occur-run-goto-line-ow) + (:after helm-grep :map helm-grep-map + [C-return] #'helm-grep-run-other-window-action))) ;;; :ui (map! (:when (featurep! :ui popup) - "C-`" #'+popup/toggle - "C-~" #'+popup/raise - "C-x p" #'+popup/other) + "C-`" #'+popup/toggle + "C-~" #'+popup/raise + "C-x p" #'+popup/other) (:when (featurep! :ui workspaces) - :n "C-t" #'+workspace/new - :n "C-S-t" #'+workspace/display - :g "M-1" #'+workspace/switch-to-0 - :g "M-2" #'+workspace/switch-to-1 - :g "M-3" #'+workspace/switch-to-2 - :g "M-4" #'+workspace/switch-to-3 - :g "M-5" #'+workspace/switch-to-4 - :g "M-6" #'+workspace/switch-to-5 - :g "M-7" #'+workspace/switch-to-6 - :g "M-8" #'+workspace/switch-to-7 - :g "M-9" #'+workspace/switch-to-8 - :g "M-0" #'+workspace/switch-to-final - (:when IS-MAC - :g "s-t" #'+workspace/new - :g "s-T" #'+workspace/display - :n "s-1" #'+workspace/switch-to-0 - :n "s-2" #'+workspace/switch-to-1 - :n "s-3" #'+workspace/switch-to-2 - :n "s-4" #'+workspace/switch-to-3 - :n "s-5" #'+workspace/switch-to-4 - :n "s-6" #'+workspace/switch-to-5 - :n "s-7" #'+workspace/switch-to-6 - :n "s-8" #'+workspace/switch-to-7 - :n "s-9" #'+workspace/switch-to-8 - :n "s-0" #'+workspace/switch-to-final))) + :n "C-t" #'+workspace/new + :n "C-S-t" #'+workspace/display + :g "M-1" #'+workspace/switch-to-0 + :g "M-2" #'+workspace/switch-to-1 + :g "M-3" #'+workspace/switch-to-2 + :g "M-4" #'+workspace/switch-to-3 + :g "M-5" #'+workspace/switch-to-4 + :g "M-6" #'+workspace/switch-to-5 + :g "M-7" #'+workspace/switch-to-6 + :g "M-8" #'+workspace/switch-to-7 + :g "M-9" #'+workspace/switch-to-8 + :g "M-0" #'+workspace/switch-to-final + (:when IS-MAC + :g "s-t" #'+workspace/new + :g "s-T" #'+workspace/display + :n "s-1" #'+workspace/switch-to-0 + :n "s-2" #'+workspace/switch-to-1 + :n "s-3" #'+workspace/switch-to-2 + :n "s-4" #'+workspace/switch-to-3 + :n "s-5" #'+workspace/switch-to-4 + :n "s-6" #'+workspace/switch-to-5 + :n "s-7" #'+workspace/switch-to-6 + :n "s-8" #'+workspace/switch-to-7 + :n "s-9" #'+workspace/switch-to-8 + :n "s-0" #'+workspace/switch-to-final))) ;;; :editor (map! (:when (featurep! :editor format) @@ -267,12 +270,12 @@ :desc "help" "h" help-map (:when (featurep! :ui popup) - :desc "Toggle last popup" "~" #'+popup/toggle) + :desc "Toggle last popup" "~" #'+popup/toggle) :desc "Find file" "." #'find-file :desc "Switch buffer" "," #'switch-to-buffer (:when (featurep! :ui workspaces) - :desc "Switch workspace buffer" "," #'persp-switch-to-buffer - :desc "Switch buffer" "<" #'switch-to-buffer) + :desc "Switch workspace buffer" "," #'persp-switch-to-buffer + :desc "Switch buffer" "<" #'switch-to-buffer) :desc "Switch to last buffer" "`" #'evil-switch-to-windows-last-buffer :desc "Resume last search" "'" (cond ((featurep! :completion ivy) #'ivy-resume) @@ -285,365 +288,367 @@ ;;; TAB --- workspace (:when (featurep! :ui workspaces) - (:prefix-map ("TAB" . "workspace") - :desc "Display tab bar" "TAB" #'+workspace/display - :desc "Switch workspace" "." #'+workspace/switch-to - :desc "Switch to last workspace" "`" #'+workspace/other - :desc "New workspace" "n" #'+workspace/new - :desc "Load workspace from file" "l" #'+workspace/load - :desc "Save workspace to file" "s" #'+workspace/save - :desc "Delete session" "x" #'+workspace/kill-session - :desc "Delete this workspace" "d" #'+workspace/delete - :desc "Rename workspace" "r" #'+workspace/rename - :desc "Restore last session" "R" #'+workspace/restore-last-session - :desc "Next workspace" "]" #'+workspace/switch-right - :desc "Previous workspace" "[" #'+workspace/switch-left - :desc "Switch to 1st workspace" "1" #'+workspace/switch-to-0 - :desc "Switch to 2nd workspace" "2" #'+workspace/switch-to-1 - :desc "Switch to 3rd workspace" "3" #'+workspace/switch-to-2 - :desc "Switch to 4th workspace" "4" #'+workspace/switch-to-3 - :desc "Switch to 5th workspace" "5" #'+workspace/switch-to-4 - :desc "Switch to 6th workspace" "6" #'+workspace/switch-to-5 - :desc "Switch to 7th workspace" "7" #'+workspace/switch-to-6 - :desc "Switch to 8th workspace" "8" #'+workspace/switch-to-7 - :desc "Switch to 9th workspace" "9" #'+workspace/switch-to-8 - :desc "Switch to final workspace" "0" #'+workspace/switch-to-final)) + (:prefix-map ("TAB" . "workspace") + :desc "Display tab bar" "TAB" #'+workspace/display + :desc "Switch workspace" "." #'+workspace/switch-to + :desc "Switch to last workspace" "`" #'+workspace/other + :desc "New workspace" "n" #'+workspace/new + :desc "Load workspace from file" "l" #'+workspace/load + :desc "Save workspace to file" "s" #'+workspace/save + :desc "Delete session" "x" #'+workspace/kill-session + :desc "Delete this workspace" "d" #'+workspace/delete + :desc "Rename workspace" "r" #'+workspace/rename + :desc "Restore last session" "R" #'+workspace/restore-last-session + :desc "Next workspace" "]" #'+workspace/switch-right + :desc "Previous workspace" "[" #'+workspace/switch-left + :desc "Switch to 1st workspace" "1" #'+workspace/switch-to-0 + :desc "Switch to 2nd workspace" "2" #'+workspace/switch-to-1 + :desc "Switch to 3rd workspace" "3" #'+workspace/switch-to-2 + :desc "Switch to 4th workspace" "4" #'+workspace/switch-to-3 + :desc "Switch to 5th workspace" "5" #'+workspace/switch-to-4 + :desc "Switch to 6th workspace" "6" #'+workspace/switch-to-5 + :desc "Switch to 7th workspace" "7" #'+workspace/switch-to-6 + :desc "Switch to 8th workspace" "8" #'+workspace/switch-to-7 + :desc "Switch to 9th workspace" "9" #'+workspace/switch-to-8 + :desc "Switch to final workspace" "0" #'+workspace/switch-to-final)) ;;; b --- buffer (:prefix-map ("b" . "buffer") - :desc "Toggle narrowing" "-" #'doom/toggle-narrow-buffer - :desc "Previous buffer" "[" #'previous-buffer - :desc "Next buffer" "]" #'next-buffer - (:when (featurep! :ui workspaces) - :desc "Switch workspace buffer" "b" #'persp-switch-to-buffer - :desc "Switch buffer" "B" #'switch-to-buffer) - (:unless (featurep! :ui workspaces) - :desc "Switch buffer" "b" #'switch-to-buffer) - :desc "Kill buffer" "d" #'kill-current-buffer - :desc "ibuffer" "i" #'ibuffer - :desc "Kill buffer" "k" #'kill-current-buffer - :desc "Kill all buffers" "K" #'doom/kill-all-buffers - :desc "Switch to last buffer" "l" #'evil-switch-to-windows-last-buffer - :desc "Set bookmark" "m" #'bookmark-set - :desc "Delete bookmark" "M" #'bookmark-delete - :desc "Next buffer" "n" #'next-buffer - :desc "New empty buffer" "N" #'evil-buffer-new - :desc "Kill other buffers" "O" #'doom/kill-other-buffers - :desc "Previous buffer" "p" #'previous-buffer - :desc "Revert buffer" "r" #'revert-buffer - :desc "Save buffer" "s" #'basic-save-buffer - :desc "Save all buffers" "S" #'evil-write-all - :desc "Save buffer as root" "u" #'doom/sudo-save-buffer - :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer - :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer - :desc "Bury buffer" "z" #'bury-buffer - :desc "Kill buried buffers" "Z" #'doom/kill-buried-buffers) + :desc "Toggle narrowing" "-" #'doom/toggle-narrow-buffer + :desc "Previous buffer" "[" #'previous-buffer + :desc "Next buffer" "]" #'next-buffer + (:when (featurep! :ui workspaces) + :desc "Switch workspace buffer" "b" #'persp-switch-to-buffer + :desc "Switch buffer" "B" #'switch-to-buffer) + (:unless (featurep! :ui workspaces) + :desc "Switch buffer" "b" #'switch-to-buffer) + :desc "Kill buffer" "d" #'kill-current-buffer + :desc "ibuffer" "i" #'ibuffer + :desc "Kill buffer" "k" #'kill-current-buffer + :desc "Kill all buffers" "K" #'doom/kill-all-buffers + :desc "Switch to last buffer" "l" #'evil-switch-to-windows-last-buffer + :desc "Set bookmark" "m" #'bookmark-set + :desc "Delete bookmark" "M" #'bookmark-delete + :desc "Next buffer" "n" #'next-buffer + :desc "New empty buffer" "N" #'evil-buffer-new + :desc "Kill other buffers" "O" #'doom/kill-other-buffers + :desc "Previous buffer" "p" #'previous-buffer + :desc "Revert buffer" "r" #'revert-buffer + :desc "Save buffer" "s" #'basic-save-buffer + :desc "Save all buffers" "S" #'evil-write-all + :desc "Save buffer as root" "u" #'doom/sudo-save-buffer + :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer + :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer + :desc "Bury buffer" "z" #'bury-buffer + :desc "Kill buried buffers" "Z" #'doom/kill-buried-buffers) ;;; c --- code (:prefix-map ("c" . "code") + :desc "Compile" "c" #'compile + :desc "Recompile" "C" #'recompile + :desc "Jump to definition" "d" #'+lookup/definition + :desc "Jump to references" "D" #'+lookup/references + :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region + :desc "Evaluate & replace region" "E" #'+eval:replace-region + :desc "Format buffer/region" "f" #'+format/region-or-buffer + (:when (featurep! :completion ivy) + :desc "Jump to symbol in current workspace" "j" #'lsp-ivy-workspace-symbol + :desc "Jump to symbol in any workspace" "J" #'lsp-ivy-global-workspace-symbol) + (:when (featurep! :completion helm) + :desc "Jump to symbol in current workspace" "j" #'helm-lsp-workspace-symbol + :desc "Jump to symbol in any workspace" "J" #'helm-lsp-global-workspace-symbol) + :desc "Jump to documentation" "k" #'+lookup/documentation + (:when (featurep! :tools lsp) :desc "LSP Execute code action" "a" #'lsp-execute-code-action - :desc "Compile" "c" #'compile - :desc "Recompile" "C" #'recompile - :desc "Jump to definition" "d" #'+lookup/definition - :desc "Jump to references" "D" #'+lookup/references - :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region - :desc "Evaluate & replace region" "E" #'+eval:replace-region - :desc "Format buffer/region" "f" #'+format/region-or-buffer - :desc "LSP Format buffer/region" "F" #'+default/lsp-format-region-or-buffer :desc "LSP Organize imports" "i" #'lsp-organize-imports - (:when (featurep! :completion ivy) - :desc "Jump to symbol in current workspace" "j" #'lsp-ivy-workspace-symbol - :desc "Jump to symbol in any workspace" "J" #'lsp-ivy-global-workspace-symbol) - (:when (featurep! :completion helm) - :desc "Jump to symbol in current workspace" "j" #'helm-lsp-workspace-symbol - :desc "Jump to symbol in any workspace" "J" #'helm-lsp-global-workspace-symbol) - :desc "Jump to documentation" "k" #'+lookup/documentation :desc "LSP Rename" "r" #'lsp-rename - :desc "Send to repl" "s" #'+eval/send-region-to-repl - :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace - :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines - :desc "List errors" "x" #'flymake-show-diagnostics-buffer - (:when (featurep! :checkers syntax) - :desc "List errors" "x" #'flycheck-list-errors)) + (:after lsp-mode + :desc "LSP" "l" lsp-command-map)) + :desc "Send to repl" "s" #'+eval/send-region-to-repl + :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace + :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines + :desc "List errors" "x" #'flymake-show-diagnostics-buffer + (:when (featurep! :checkers syntax) + :desc "List errors" "x" #'flycheck-list-errors)) ;;; f --- file (:prefix-map ("f" . "file") - :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig - :desc "Copy this file" "C" #'doom/copy-this-file - :desc "Find directory" "d" #'dired - :desc "Delete this file" "D" #'doom/delete-this-file - :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd - :desc "Browse emacs.d" "E" #'+default/browse-emacsd - :desc "Find file" "f" #'find-file - :desc "Find file from here" "F" #'+default/find-file-under-here - :desc "Locate file" "l" #'locate - :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 "Rename/move file" "R" #'doom/move-this-file - :desc "Save file" "s" #'save-buffer - :desc "Save file as..." "S" #'write-file - :desc "Sudo find file" "u" #'doom/sudo-find-file - :desc "Sudo this file" "U" #'doom/sudo-this-file - :desc "Yank filename" "y" #'+default/yank-buffer-filename) + :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig + :desc "Copy this file" "C" #'doom/copy-this-file + :desc "Find directory" "d" #'dired + :desc "Delete this file" "D" #'doom/delete-this-file + :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" "E" #'+default/browse-emacsd + :desc "Find file" "f" #'find-file + :desc "Find file from here" "F" #'+default/find-file-under-here + :desc "Locate file" "l" #'locate + :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 "Rename/move file" "R" #'doom/move-this-file + :desc "Save file" "s" #'save-buffer + :desc "Save file as..." "S" #'write-file + :desc "Sudo find file" "u" #'doom/sudo-find-file + :desc "Sudo this file" "U" #'doom/sudo-this-file + :desc "Yank filename" "y" #'+default/yank-buffer-filename) ;;; g --- git/version control (:prefix-map ("g" . "git") - :desc "Revert file" "R" #'vc-revert - :desc "Copy link to remote" "y" #'browse-at-remote-kill - :desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage + :desc "Revert file" "R" #'vc-revert + :desc "Copy link to remote" "y" #'browse-at-remote-kill + :desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage + (:when (featurep! :ui hydra) + :desc "SMerge" "m" #'+vc/smerge-hydra/body) + (:when (featurep! :ui vc-gutter) (:when (featurep! :ui hydra) - :desc "SMerge" "m" #'+vc/smerge-hydra/body) - (:when (featurep! :ui vc-gutter) - (:when (featurep! :ui hydra) - :desc "VCGutter" "." #'+vc/gutter-hydra/body) - :desc "Revert hunk" "r" #'git-gutter:revert-hunk - :desc "Git stage hunk" "s" #'git-gutter:stage-hunk - :desc "Git time machine" "t" #'git-timemachine-toggle - :desc "Jump to next hunk" "]" #'git-gutter:next-hunk - :desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk) - (:when (featurep! :tools magit) - :desc "Magit dispatch" "/" #'magit-dispatch - :desc "Forge dispatch" "'" #'forge-dispatch - :desc "Magit switch branch" "b" #'magit-branch-checkout - :desc "Magit status" "g" #'magit-status - :desc "Magit file delete" "D" #'magit-file-delete - :desc "Magit blame" "B" #'magit-blame-addition - :desc "Magit clone" "C" #'magit-clone - :desc "Magit fetch" "F" #'magit-fetch - :desc "Magit buffer log" "L" #'magit-log - :desc "Git stage file" "S" #'magit-stage-file - :desc "Git unstage file" "U" #'magit-unstage-file - (:prefix ("f" . "find") - :desc "Find file" "f" #'magit-find-file - :desc "Find gitconfig file" "g" #'magit-find-git-config-file - :desc "Find commit" "c" #'magit-show-commit - :desc "Find issue" "i" #'forge-visit-issue - :desc "Find pull request" "p" #'forge-visit-pullreq) - (:prefix ("o" . "open in browser") - :desc "Browse file or region" "o" #'browse-at-remote - :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage - :desc "Browse remote" "r" #'forge-browse-remote - :desc "Browse commit" "c" #'forge-browse-commit - :desc "Browse an issue" "i" #'forge-browse-issue - :desc "Browse a pull request" "p" #'forge-browse-pullreq - :desc "Browse issues" "I" #'forge-browse-issues - :desc "Browse pull requests" "P" #'forge-browse-pullreqs) - (:prefix ("l" . "list") - (:when (featurep! :tools gist) - :desc "List gists" "g" #'+gist:list) - :desc "List repositories" "r" #'magit-list-repositories - :desc "List submodules" "s" #'magit-list-submodules - :desc "List issues" "i" #'forge-list-issues - :desc "List pull requests" "p" #'forge-list-pullreqs - :desc "List notifications" "n" #'forge-list-notifications) - (:prefix ("c" . "create") - :desc "Initialize repo" "r" #'magit-init - :desc "Clone repo" "R" #'magit-clone - :desc "Commit" "c" #'magit-commit-create - :desc "Fixup" "f" #'magit-commit-fixup - :desc "Branch" "b" #'magit-branch-and-checkout - :desc "Issue" "i" #'forge-create-issue - :desc "Pull request" "p" #'forge-create-pullreq))) + :desc "VCGutter" "." #'+vc/gutter-hydra/body) + :desc "Revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Jump to next hunk" "]" #'git-gutter:next-hunk + :desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk) + (:when (featurep! :tools magit) + :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Forge dispatch" "'" #'forge-dispatch + :desc "Magit switch branch" "b" #'magit-branch-checkout + :desc "Magit status" "g" #'magit-status + :desc "Magit file delete" "D" #'magit-file-delete + :desc "Magit blame" "B" #'magit-blame-addition + :desc "Magit clone" "C" #'magit-clone + :desc "Magit fetch" "F" #'magit-fetch + :desc "Magit buffer log" "L" #'magit-log + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git unstage file" "U" #'magit-unstage-file + (:prefix ("f" . "find") + :desc "Find file" "f" #'magit-find-file + :desc "Find gitconfig file" "g" #'magit-find-git-config-file + :desc "Find commit" "c" #'magit-show-commit + :desc "Find issue" "i" #'forge-visit-issue + :desc "Find pull request" "p" #'forge-visit-pullreq) + (:prefix ("o" . "open in browser") + :desc "Browse file or region" "o" #'browse-at-remote + :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage + :desc "Browse remote" "r" #'forge-browse-remote + :desc "Browse commit" "c" #'forge-browse-commit + :desc "Browse an issue" "i" #'forge-browse-issue + :desc "Browse a pull request" "p" #'forge-browse-pullreq + :desc "Browse issues" "I" #'forge-browse-issues + :desc "Browse pull requests" "P" #'forge-browse-pullreqs) + (:prefix ("l" . "list") + (:when (featurep! :tools gist) + :desc "List gists" "g" #'+gist:list) + :desc "List repositories" "r" #'magit-list-repositories + :desc "List submodules" "s" #'magit-list-submodules + :desc "List issues" "i" #'forge-list-issues + :desc "List pull requests" "p" #'forge-list-pullreqs + :desc "List notifications" "n" #'forge-list-notifications) + (:prefix ("c" . "create") + :desc "Initialize repo" "r" #'magit-init + :desc "Clone repo" "R" #'magit-clone + :desc "Commit" "c" #'magit-commit-create + :desc "Fixup" "f" #'magit-commit-fixup + :desc "Branch" "b" #'magit-branch-and-checkout + :desc "Issue" "i" #'forge-create-issue + :desc "Pull request" "p" #'forge-create-pullreq))) ;;; i --- insert (:prefix-map ("i" . "insert") - :desc "Current file name" "f" #'+default/insert-file-path - :desc "Current file path" "F" (λ!! #'+default/insert-file-path t) - :desc "Evil ex path" "p" (λ! (evil-ex "R!echo ")) - :desc "From evil register" "r" #'evil-ex-registers - :desc "Snippet" "s" #'yas-insert-snippet - :desc "Unicode" "u" #'unicode-chars-list-chars - :desc "From clipboard" "y" #'+default/yank-pop) + :desc "Current file name" "f" #'+default/insert-file-path + :desc "Current file path" "F" (λ!! #'+default/insert-file-path t) + :desc "Evil ex path" "p" (λ! (evil-ex "R!echo ")) + :desc "From evil register" "r" #'evil-ex-registers + :desc "Snippet" "s" #'yas-insert-snippet + :desc "Unicode" "u" #'unicode-chars-list-chars + :desc "From clipboard" "y" #'+default/yank-pop) ;;; n --- notes (:prefix-map ("n" . "notes") - :desc "Search notes for symbol" "*" #'+default/search-notes-for-symbol-at-point - :desc "Org agenda" "a" #'org-agenda - (:when (featurep! :tools biblio) - :desc "Bibliographic entries" "b" - (cond ((featurep! :completion ivy) #'ivy-bibtex) - ((featurep! :completion helm) #'helm-bibtex))) + :desc "Search notes for symbol" "*" #'+default/search-notes-for-symbol-at-point + :desc "Org agenda" "a" #'org-agenda + (:when (featurep! :tools biblio) + :desc "Bibliographic entries" "b" + (cond ((featurep! :completion ivy) #'ivy-bibtex) + ((featurep! :completion helm) #'helm-bibtex))) - :desc "Toggle org-clock" "c" #'+org/toggle-clock - :desc "Cancel org-clock" "C" #'org-clock-cancel - :desc "Open deft" "d" #'deft - (:when (featurep! :lang org +noter) - :desc "Org noter" "e" #'org-noter) + :desc "Toggle org-clock" "c" #'+org/toggle-clock + :desc "Cancel org-clock" "C" #'org-clock-cancel + :desc "Open deft" "d" #'deft + (:when (featurep! :lang org +noter) + :desc "Org noter" "e" #'org-noter) - :desc "Find file in notes" "f" #'+default/find-in-notes - :desc "Browse notes" "F" #'+default/browse-notes - :desc "Org store link" "l" #'org-store-link - :desc "Tags search" "m" #'org-tags-view - :desc "Org capture" "n" #'org-capture - :desc "Goto capture" "N" #'org-capture-goto-target - :desc "Active org-clock" "o" #'org-clock-goto - :desc "Todo list" "t" #'org-todo-list - :desc "Search notes" "s" #'+default/org-notes-search - :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines - :desc "View search" "v" #'org-search-view - :desc "Org export to clipboard" "y" #'+org/export-to-clipboard - :desc "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text + :desc "Find file in notes" "f" #'+default/find-in-notes + :desc "Browse notes" "F" #'+default/browse-notes + :desc "Org store link" "l" #'org-store-link + :desc "Tags search" "m" #'org-tags-view + :desc "Org capture" "n" #'org-capture + :desc "Goto capture" "N" #'org-capture-goto-target + :desc "Active org-clock" "o" #'org-clock-goto + :desc "Todo list" "t" #'org-todo-list + :desc "Search notes" "s" #'+default/org-notes-search + :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines + :desc "View search" "v" #'org-search-view + :desc "Org export to clipboard" "y" #'+org/export-to-clipboard + :desc "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text - (:when (featurep! :lang org +roam) - (:prefix ("r" . "roam") - :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer - :desc "Org Roam Capture" "c" #'org-roam-capture - :desc "Find file" "f" #'org-roam-find-file - :desc "Show graph" "g" #'org-roam-graph - :desc "Insert" "i" #'org-roam-insert - :desc "Org Roam" "r" #'org-roam - (:prefix ("d" . "by date") - :desc "Arbitrary date" "d" #'org-roam-dailies-date - :desc "Today" "t" #'org-roam-dailies-today - :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow - :desc "Yesterday" "y" #'org-roam-dailies-yesterday))) + (:when (featurep! :lang org +roam) + (:prefix ("r" . "roam") + :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer + :desc "Org Roam Capture" "c" #'org-roam-capture + :desc "Find file" "f" #'org-roam-find-file + :desc "Show graph" "g" #'org-roam-graph + :desc "Insert" "i" #'org-roam-insert + :desc "Org Roam" "r" #'org-roam + (:prefix ("d" . "by date") + :desc "Arbitrary date" "d" #'org-roam-dailies-date + :desc "Today" "t" #'org-roam-dailies-today + :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow + :desc "Yesterday" "y" #'org-roam-dailies-yesterday))) - (:when (featurep! :lang org +journal) - (:prefix ("j" . "journal") - :desc "New Entry" "j" #'org-journal-new-entry - :desc "Search Forever" "s" #'org-journal-search-forever))) + (:when (featurep! :lang org +journal) + (:prefix ("j" . "journal") + :desc "New Entry" "j" #'org-journal-new-entry + :desc "Search Forever" "s" #'org-journal-search-forever))) ;;; o --- open (:prefix-map ("o" . "open") - :desc "Org agenda" "A" #'org-agenda - (:prefix ("a" . "org agenda") - :desc "Agenda" "a" #'org-agenda - :desc "Todo list" "t" #'org-todo-list - :desc "Tags search" "m" #'org-tags-view - :desc "View search" "v" #'org-search-view) - :desc "Default browser" "b" #'browse-url-of-file - :desc "Start debugger" "d" #'+debugger/start - :desc "New frame" "f" #'make-frame - :desc "REPL" "r" #'+eval/open-repl-other-window - :desc "REPL (same window)" "R" #'+eval/open-repl-same-window - :desc "Dired" "-" #'dired-jump - (:when (featurep! :ui neotree) - :desc "Project sidebar" "p" #'+neotree/open - :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) - (:when (featurep! :ui treemacs) - :desc "Project sidebar" "p" #'+treemacs/toggle - :desc "Find file in project sidebar" "P" #'+treemacs/find-file) - (:when (featurep! :term shell) - :desc "Toggle shell popup" "t" #'+shell/toggle - :desc "Open shell here" "T" #'+shell/here) - (:when (featurep! :term term) - :desc "Toggle terminal popup" "t" #'+term/toggle - :desc "Open terminal here" "T" #'+term/here) - (:when (featurep! :term vterm) - :desc "Toggle vterm popup" "t" #'+vterm/toggle - :desc "Open vterm here" "T" #'+vterm/here) - (:when (featurep! :term eshell) - :desc "Toggle eshell popup" "e" #'+eshell/toggle - :desc "Open eshell here" "E" #'+eshell/here) - (:when (featurep! :tools macos) - :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder - :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder - :desc "Send to Transmit" "u" #'+macos/send-to-transmit - :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit - :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar - :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) - (:when (featurep! :tools docker) - :desc "Docker" "D" #'docker)) + :desc "Org agenda" "A" #'org-agenda + (:prefix ("a" . "org agenda") + :desc "Agenda" "a" #'org-agenda + :desc "Todo list" "t" #'org-todo-list + :desc "Tags search" "m" #'org-tags-view + :desc "View search" "v" #'org-search-view) + :desc "Default browser" "b" #'browse-url-of-file + :desc "Start debugger" "d" #'+debugger/start + :desc "New frame" "f" #'make-frame + :desc "REPL" "r" #'+eval/open-repl-other-window + :desc "REPL (same window)" "R" #'+eval/open-repl-same-window + :desc "Dired" "-" #'dired-jump + (:when (featurep! :ui neotree) + :desc "Project sidebar" "p" #'+neotree/open + :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) + (:when (featurep! :ui treemacs) + :desc "Project sidebar" "p" #'+treemacs/toggle + :desc "Find file in project sidebar" "P" #'treemacs-find-file) + (:when (featurep! :term shell) + :desc "Toggle shell popup" "t" #'+shell/toggle + :desc "Open shell here" "T" #'+shell/here) + (:when (featurep! :term term) + :desc "Toggle terminal popup" "t" #'+term/toggle + :desc "Open terminal here" "T" #'+term/here) + (:when (featurep! :term vterm) + :desc "Toggle vterm popup" "t" #'+vterm/toggle + :desc "Open vterm here" "T" #'+vterm/here) + (:when (featurep! :term eshell) + :desc "Toggle eshell popup" "e" #'+eshell/toggle + :desc "Open eshell here" "E" #'+eshell/here) + (:when (featurep! :tools macos) + :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder + :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder + :desc "Send to Transmit" "u" #'+macos/send-to-transmit + :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit + :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar + :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) + (:when (featurep! :tools docker) + :desc "Docker" "D" #'docker)) ;;; p --- project (:prefix-map ("p" . "project") - :desc "Browse project" "." #'+default/browse-project - :desc "Browse other project" ">" #'doom/browse-in-other-project - :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root - :desc "Add new project" "a" #'projectile-add-known-project - :desc "Switch to project buffer" "b" #'projectile-switch-to-buffer - :desc "Compile in project" "c" #'projectile-compile-project - :desc "Repeat last command" "C" #'projectile-repeat-last-command - :desc "Remove known project" "d" #'projectile-remove-known-project - :desc "Discover projects in folder" "D" #'+default/discover-projects - :desc "Edit project .dir-locals" "e" #'projectile-edit-dir-locals - :desc "Find file in project" "f" #'projectile-find-file - :desc "Find file in other project" "F" #'doom/find-file-in-other-project - :desc "Configure project" "g" #'projectile-configure-project - :desc "Invalidate project cache" "i" #'projectile-invalidate-cache - :desc "Kill project buffers" "k" #'projectile-kill-buffers - :desc "Find other file" "o" #'projectile-find-other-file - :desc "Switch project" "p" #'projectile-switch-project - :desc "Find recent project files" "r" #'projectile-recentf - :desc "Run project" "R" #'projectile-run-project - :desc "Save project files" "s" #'projectile-save-project-buffers - :desc "List project tasks" "t" #'magit-todos-list - :desc "Test project" "T" #'projectile-test-project - :desc "Pop up scratch buffer" "x" #'doom/open-project-scratch-buffer - :desc "Switch to scratch buffer" "X" #'doom/switch-to-project-scratch-buffer) + :desc "Browse project" "." #'+default/browse-project + :desc "Browse other project" ">" #'doom/browse-in-other-project + :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root + :desc "Add new project" "a" #'projectile-add-known-project + :desc "Switch to project buffer" "b" #'projectile-switch-to-buffer + :desc "Compile in project" "c" #'projectile-compile-project + :desc "Repeat last command" "C" #'projectile-repeat-last-command + :desc "Remove known project" "d" #'projectile-remove-known-project + :desc "Discover projects in folder" "D" #'+default/discover-projects + :desc "Edit project .dir-locals" "e" #'projectile-edit-dir-locals + :desc "Find file in project" "f" #'projectile-find-file + :desc "Find file in other project" "F" #'doom/find-file-in-other-project + :desc "Configure project" "g" #'projectile-configure-project + :desc "Invalidate project cache" "i" #'projectile-invalidate-cache + :desc "Kill project buffers" "k" #'projectile-kill-buffers + :desc "Find other file" "o" #'projectile-find-other-file + :desc "Switch project" "p" #'projectile-switch-project + :desc "Find recent project files" "r" #'projectile-recentf + :desc "Run project" "R" #'projectile-run-project + :desc "Save project files" "s" #'projectile-save-project-buffers + :desc "List project tasks" "t" #'magit-todos-list + :desc "Test project" "T" #'projectile-test-project + :desc "Pop up scratch buffer" "x" #'doom/open-project-scratch-buffer + :desc "Switch to scratch buffer" "X" #'doom/switch-to-project-scratch-buffer) ;;; q --- quit/session (:prefix-map ("q" . "quit/session") - :desc "Restart emacs server" "d" #'+default/restart-server - :desc "Delete frame" "f" #'delete-frame - :desc "Clear current frame" "F" #'doom/kill-all-buffers - :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs - :desc "Quit Emacs" "q" #'save-buffers-kill-terminal - :desc "Quit Emacs without saving" "Q" #'evil-quit-all-with-error-code - :desc "Quick save current session" "s" #'doom/quicksave-session - :desc "Restore last session" "l" #'doom/quickload-session - :desc "Save session to file" "S" #'doom/save-session - :desc "Restore session from file" "L" #'doom/load-session - :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore - :desc "Restart Emacs" "R" #'doom/restart) + :desc "Restart emacs server" "d" #'+default/restart-server + :desc "Delete frame" "f" #'delete-frame + :desc "Clear current frame" "F" #'doom/kill-all-buffers + :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs + :desc "Quit Emacs" "q" #'save-buffers-kill-terminal + :desc "Quit Emacs without saving" "Q" #'evil-quit-all-with-error-code + :desc "Quick save current session" "s" #'doom/quicksave-session + :desc "Restore last session" "l" #'doom/quickload-session + :desc "Save session to file" "S" #'doom/save-session + :desc "Restore session from file" "L" #'doom/load-session + :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore + :desc "Restart Emacs" "R" #'doom/restart) ;;; r --- remote (:when (featurep! :tools upload) - (:prefix-map ("r" . "remote") - :desc "Upload local" "u" #'ssh-deploy-upload-handler - :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced - :desc "Download remote" "d" #'ssh-deploy-download-handler - :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler - :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler - :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) + (:prefix-map ("r" . "remote") + :desc "Upload local" "u" #'ssh-deploy-upload-handler + :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced + :desc "Download remote" "d" #'ssh-deploy-download-handler + :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler + :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler + :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) ;;; s --- search (:prefix-map ("s" . "search") - :desc "Search buffer" "b" #'swiper - :desc "Search current directory" "d" #'+default/search-cwd - :desc "Search other directory" "D" #'+default/search-other-cwd - :desc "Locate file" "f" #'locate - :desc "Jump to symbol" "i" #'imenu - :desc "Jump to visible link" "l" #'link-hint-open-link - :desc "Jump to link" "L" #'ffap-menu - :desc "Jump list" "j" #'evil-show-jumps - :desc "Jump to bookmark" "m" #'bookmark-jump - :desc "Look up online" "o" #'+lookup/online - :desc "Look up online (w/ prompt)" "O" #'+lookup/online-select - :desc "Look up in local docsets" "k" #'+lookup/in-docsets - :desc "Look up in all docsets" "K" #'+lookup/in-all-docsets - :desc "Search project" "p" #'+default/search-project - :desc "Search other project" "P" #'+default/search-other-project - :desc "Jump to mark" "r" #'evil-show-marks - :desc "Search buffer" "s" #'swiper-isearch - :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point - :desc "Dictionary" "t" #'+lookup/dictionary-definition - :desc "Thesaurus" "T" #'+lookup/synonyms) + :desc "Search buffer" "b" #'swiper + :desc "Search current directory" "d" #'+default/search-cwd + :desc "Search other directory" "D" #'+default/search-other-cwd + :desc "Locate file" "f" #'locate + :desc "Jump to symbol" "i" #'imenu + :desc "Jump to visible link" "l" #'link-hint-open-link + :desc "Jump to link" "L" #'ffap-menu + :desc "Jump list" "j" #'evil-show-jumps + :desc "Jump to bookmark" "m" #'bookmark-jump + :desc "Look up online" "o" #'+lookup/online + :desc "Look up online (w/ prompt)" "O" #'+lookup/online-select + :desc "Look up in local docsets" "k" #'+lookup/in-docsets + :desc "Look up in all docsets" "K" #'+lookup/in-all-docsets + :desc "Search project" "p" #'+default/search-project + :desc "Search other project" "P" #'+default/search-other-project + :desc "Jump to mark" "r" #'evil-show-marks + :desc "Search buffer" "s" #'swiper-isearch + :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point + :desc "Dictionary" "t" #'+lookup/dictionary-definition + :desc "Thesaurus" "T" #'+lookup/synonyms) ;;; t --- toggle (:prefix-map ("t" . "toggle") - :desc "Big mode" "b" #'doom-big-font-mode - :desc "Flymake" "f" #'flymake-mode - (:when (featurep! :checkers syntax) - :desc "Flycheck" "f" #'flycheck-mode) - :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen - :desc "Evil goggles" "g" #'evil-goggles-mode - (:when (featurep! :ui indent-guides) - :desc "Indent guides" "i" #'highlight-indent-guides-mode) - :desc "Indent style" "I" #'doom/toggle-indent-style - :desc "Line numbers" "l" #'doom/toggle-line-numbers - (:when (featurep! :lang org +present) - :desc "org-tree-slide mode" "p" #'org-tree-slide-mode) - :desc "Read-only mode" "r" #'read-only-mode - (:when (featurep! :checkers spell) - :desc "Flyspell" "s" #'flyspell-mode) - (:when (featurep! :lang org +pomodoro) - :desc "Pomodoro timer" "t" #'org-pomodoro) - :desc "Soft line wrapping" "w" #'visual-line-mode - (:when (featurep! :editor word-wrap) - :desc "Soft line wrapping" "w" #'+word-wrap-mode) - :desc "Zen mode" "z" #'writeroom-mode)) + :desc "Big mode" "b" #'doom-big-font-mode + :desc "Flymake" "f" #'flymake-mode + (:when (featurep! :checkers syntax) + :desc "Flycheck" "f" #'flycheck-mode) + :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen + :desc "Evil goggles" "g" #'evil-goggles-mode + (:when (featurep! :ui indent-guides) + :desc "Indent guides" "i" #'highlight-indent-guides-mode) + :desc "Indent style" "I" #'doom/toggle-indent-style + :desc "Line numbers" "l" #'doom/toggle-line-numbers + (:when (featurep! :lang org +present) + :desc "org-tree-slide mode" "p" #'org-tree-slide-mode) + :desc "Read-only mode" "r" #'read-only-mode + (:when (featurep! :checkers spell) + :desc "Flyspell" "s" #'flyspell-mode) + (:when (featurep! :lang org +pomodoro) + :desc "Pomodoro timer" "t" #'org-pomodoro) + :desc "Soft line wrapping" "w" #'visual-line-mode + (:when (featurep! :editor word-wrap) + :desc "Soft line wrapping" "w" #'+word-wrap-mode) + :desc "Zen mode" "z" #'writeroom-mode)) (after! which-key (let ((prefix-re (regexp-opt (list doom-leader-key doom-leader-alt-key)))) diff --git a/modules/config/default/autoload/search.el b/modules/config/default/autoload/search.el index dcd704895..bb3cb2445 100644 --- a/modules/config/default/autoload/search.el +++ b/modules/config/default/autoload/search.el @@ -25,7 +25,8 @@ If prefix ARG is set, prompt for a directory to search from." "Conduct a text search in the current project root. If prefix ARG is set, prompt for a known project to search from." (interactive "P") - (let* ((disabled-command-function nil) + (let* ((projectile-project-root nil) + (disabled-command-function nil) (default-directory (if arg (if-let (projects (projectile-relevant-known-projects)) @@ -51,13 +52,14 @@ If prefix ARG is set, prompt for a known project to search from." (interactive (list (rxt-quote-pcre (or (doom-thing-at-point-or-region) "")) current-prefix-arg)) - (let ((default-directory - (if arg - (if-let (projects (projectile-relevant-known-projects)) - (completing-read "Switch to project: " projects - nil t nil nil (doom-project-root)) - (user-error "There are no known projects")) - default-directory))) + (let* ((projectile-project-root nil) + (default-directory + (if arg + (if-let (projects (projectile-relevant-known-projects)) + (completing-read "Switch to project: " projects + nil t nil nil (doom-project-root)) + (user-error "There are no known projects")) + default-directory))) (cond ((featurep! :completion ivy) (+ivy/project-search nil symbol)) ((featurep! :completion helm) diff --git a/modules/config/default/autoload/text.el b/modules/config/default/autoload/text.el index 7c523817e..01141cc6e 100644 --- a/modules/config/default/autoload/text.el +++ b/modules/config/default/autoload/text.el @@ -50,21 +50,6 @@ If `buffer-file-name' isn't set, uses `default-directory'." (abbreviate-file-name path) (file-name-nondirectory path))))) -;;;###autoload -(defun +default--newline-indent-and-continue-comments-a () - "A replacement for `newline-and-indent'. - -Continues comments if executed from a commented line, with special support for -languages with weak native comment continuation support (like C-family -languages)." - (interactive) - (if (and (sp-point-in-comment) - comment-line-break-function) - (funcall comment-line-break-function nil) - (delete-horizontal-space t) - (newline nil t) - (indent-according-to-mode))) - (defun doom--backward-delete-whitespace-to-column () "Delete back to the previous column of whitespace, or as much whitespace as diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 8ed0cf535..bbfc1ade7 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,5 +1,8 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- +(defvar +default-want-RET-continue-comments t + "If non-nil, RET will continue commented lines.") + (defvar +default-minibuffer-maps (append '(minibuffer-local-map minibuffer-local-ns-map @@ -220,8 +223,28 @@ ;; f) do none of this when inside a string (advice-add #'delete-backward-char :override #'+default--delete-backward-char-a)) - ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :override #'+default--newline-indent-and-continue-comments-a)) + ;; HACK Makes `newline-and-indent' continue comments (and more reliably). + ;; Consults `doom-point-in-comment-functions' to detect a commented + ;; region and uses that mode's `comment-line-break-function' to continue + ;; comments. If neither exists, it will fall back to the normal behavior + ;; of `newline-and-indent'. + ;; + ;; We use an advice here instead of a remapping because many modes define + ;; and remap to their own newline-and-indent commands, and tackling all + ;; those cases was judged to be more work than dealing with the edge + ;; cases on a case by case basis. + (defadvice! +default--newline-indent-and-continue-comments-a (&rest _) + "A replacement for `newline-and-indent'. + +Continues comments if executed from a commented line. Consults +`doom-point-in-comment-functions' to determine if in a comment." + :before-until #'newline-and-indent + (interactive "*") + (when (and +default-want-RET-continue-comments + (doom-point-in-comment-p) + (fboundp comment-line-break-function)) + (funcall comment-line-break-function nil) + t))) ;; diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el index 8178f8758..a4eb26ffe 100644 --- a/modules/config/default/packages.el +++ b/modules/config/default/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; config/default/packages.el -(package! avy :pin "3bf83140fa") -(package! drag-stuff :pin "6d06d846cd") -(package! link-hint :pin "0d9cabcdb7") +(package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd") +(package! drag-stuff :pin "6d06d846cd37c052d79acd0f372c13006aa7e7c8") +(package! link-hint :pin "7440704cacb5c0fab35fff8ec59d30fbea17f44a") (unless (featurep! :editor evil) - (package! expand-region :pin "ea6b4cbb99")) + (package! expand-region :pin "ea6b4cbb9985ddae532bd2faf9bb00570c9f2781")) diff --git a/modules/editor/evil/autoload/advice.el b/modules/editor/evil/autoload/advice.el index e54a1ab90..bdf2ce8f9 100644 --- a/modules/editor/evil/autoload/advice.el +++ b/modules/editor/evil/autoload/advice.el @@ -123,8 +123,7 @@ more information on modifiers." (not (eq this-command 'evil-open-below)) (evil-insert-state-p)) (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-below) - (lambda () (+evil--insert-newline)))) + (letf! (defun evil-insert-newline-below () (+evil--insert-newline)) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) @@ -134,8 +133,7 @@ more information on modifiers." (not (eq this-command 'evil-open-above)) (evil-insert-state-p)) (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-above) - (lambda () (+evil--insert-newline 'above)))) + (letf! (defun evil-insert-newline-above () (+evil--insert-newline 'above)) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index 358e0cb1f..3d214619b 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -280,8 +280,13 @@ directives. By default, this only recognizes C directives.") evil-escape-delay 0.15) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config - ;; no `evil-escape' in minibuffer - (add-hook 'evil-escape-inhibit-functions #'minibufferp) + ;; no `evil-escape' in minibuffer, unless `evil-collection-setup-minibuffer' + ;; is enabled, where we could be in insert mode in the minibuffer. + (add-hook! 'evil-escape-inhibit-functions + (defun +evil-inhibit-escape-in-minibuffer-fn () + (and (minibufferp) + (or (not (bound-and-true-p evil-collection-setup-minibuffer)) + (evil-normal-state-p))))) ;; so that evil-escape-mode-hook runs, and can be toggled by evil-mc (evil-escape-mode +1)) @@ -422,22 +427,22 @@ To change these keys see `+evil-repeat-keys'." :m "]y" #'+evil:c-string-encode :m "[y" #'+evil:c-string-decode (:when (featurep! :lang web) - :m "]x" #'+web:encode-html-entities - :m "[x" #'+web:decode-html-entities) + :m "]x" #'+web:encode-html-entities + :m "[x" #'+web:decode-html-entities) (:when (featurep! :ui vc-gutter) - :m "]d" #'git-gutter:next-hunk - :m "[d" #'git-gutter:previous-hunk) + :m "]d" #'git-gutter:next-hunk + :m "[d" #'git-gutter:previous-hunk) (:when (featurep! :ui hl-todo) - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous) + :m "]t" #'hl-todo-next + :m "[t" #'hl-todo-previous) (:when (featurep! :ui workspaces) - :n "gt" #'+workspace:switch-next - :n "gT" #'+workspace:switch-previous - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left) + :n "gt" #'+workspace:switch-next + :n "gT" #'+workspace:switch-previous + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left) (:when (featurep! :ui tabs) - :n "gt" #'centaur-tabs-forward - :n "gT" #'centaur-tabs-backward) + :n "gt" #'centaur-tabs-forward + :n "gT" #'centaur-tabs-backward) ;; custom vim-unmpaired-esque keys :m "]#" #'+evil/next-preproc-directive @@ -470,27 +475,27 @@ To change these keys see `+evil-repeat-keys'." :v "g-" #'evil-numbers/dec-at-pt-incremental :v "g+" #'evil-numbers/inc-at-pt (:when (featurep! :tools lookup) - :nv "K" #'+lookup/documentation - :nv "gd" #'+lookup/definition - :nv "gD" #'+lookup/references - :nv "gf" #'+lookup/file) + :nv "K" #'+lookup/documentation + :nv "gd" #'+lookup/definition + :nv "gD" #'+lookup/references + :nv "gf" #'+lookup/file) (:when (featurep! :tools eval) - :nv "gr" #'+eval:region - :n "gR" #'+eval/buffer - :v "gR" #'+eval:replace-region - ;; Restore these keybinds, since the blacklisted/overwritten gr/gR will - ;; undo them: - (:after dired - :map dired-mode-map - :n "gr" #'revert-buffer) - (:after notmuch - :map notmuch-common-keymap - :n "gr" #'notmuch-refresh-this-buffer - :n "gR" #'notmuch-poll-and-refresh-this-buffer) - (:after elfeed - :map elfeed-search-update--force - :n "gr" #'elfeed-search-update--force - :n "gR" #'elfeed-search-fetch)) + :nv "gr" #'+eval:region + :n "gR" #'+eval/buffer + :v "gR" #'+eval:replace-region + ;; Restore these keybinds, since the blacklisted/overwritten gr/gR will + ;; undo them: + (:after dired + :map dired-mode-map + :n "gr" #'revert-buffer) + (:after notmuch + :map notmuch-common-keymap + :n "gr" #'notmuch-refresh-this-buffer + :n "gR" #'notmuch-poll-and-refresh-this-buffer) + (:after elfeed + :map elfeed-search-mode-map + :n "gr" #'elfeed-search-update--force + :n "gR" #'elfeed-search-fetch)) :nv "z=" #'flyspell-correct-at-point ;; custom evil keybinds @@ -504,30 +509,30 @@ To change these keys see `+evil-repeat-keys'." ;; window management (prefix "C-w") (:map evil-window-map - ;; Navigation - "C-h" #'evil-window-left - "C-j" #'evil-window-down - "C-k" #'evil-window-up - "C-l" #'evil-window-right - "C-w" #'other-window - ;; Swapping windows - "H" #'+evil/window-move-left - "J" #'+evil/window-move-down - "K" #'+evil/window-move-up - "L" #'+evil/window-move-right - "C-S-w" #'ace-swap-window - ;; Window undo/redo - (:prefix "m" - "m" #'doom/window-maximize-buffer - "v" #'doom/window-maximize-vertically - "s" #'doom/window-maximize-horizontally) - "u" #'winner-undo - "C-u" #'winner-undo - "C-r" #'winner-redo - "o" #'doom/window-enlargen - ;; Delete window - "d" #'evil-window-delete - "C-C" #'ace-delete-window) + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'other-window + ;; Swapping windows + "H" #'+evil/window-move-left + "J" #'+evil/window-move-down + "K" #'+evil/window-move-up + "L" #'+evil/window-move-right + "C-S-w" #'ace-swap-window + ;; Window undo/redo + (:prefix "m" + "m" #'doom/window-maximize-buffer + "v" #'doom/window-maximize-vertically + "s" #'doom/window-maximize-horizontally) + "u" #'winner-undo + "C-u" #'winner-undo + "C-r" #'winner-redo + "o" #'doom/window-enlargen + ;; Delete window + "d" #'evil-window-delete + "C-C" #'ace-delete-window) ;; text objects :textobj "a" #'evil-inner-arg #'evil-outer-arg @@ -543,23 +548,23 @@ To change these keys see `+evil-repeat-keys'." ;; evil-easymotion (see `+evil/easymotion') (:after evil-easymotion - :m "gs" evilem-map - (:map evilem-map - "a" (evilem-create #'evil-forward-arg) - "A" (evilem-create #'evil-backward-arg) - "s" #'evil-avy-goto-char-2 - "SPC" (λ!! #'evil-avy-goto-char-timer t) - "/" #'evil-avy-goto-char-timer)) + :m "gs" evilem-map + (:map evilem-map + "a" (evilem-create #'evil-forward-arg) + "A" (evilem-create #'evil-backward-arg) + "s" #'evil-avy-goto-char-2 + "SPC" (λ!! #'evil-avy-goto-char-timer t) + "/" #'evil-avy-goto-char-timer)) - ;; evil-snipe + ;; evil-snipe (:after evil-snipe - :map evil-snipe-parent-transient-map - "C-;" (λ! (require 'evil-easymotion) - (call-interactively - (evilem-create #'evil-snipe-repeat - :bind ((evil-snipe-scope 'whole-buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight)))))) + :map evil-snipe-parent-transient-map + "C-;" (λ! (require 'evil-easymotion) + (call-interactively + (evilem-create #'evil-snipe-repeat + :bind ((evil-snipe-scope 'whole-buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight)))))) ;; evil-surround :v "S" #'evil-surround-region @@ -574,13 +579,13 @@ To change these keys see `+evil-repeat-keys'." ;; Omni-completion (:when (featurep! :completion company) - (:prefix "C-x" - :i "C-l" #'+company/whole-lines - :i "C-k" #'+company/dict-or-keywords - :i "C-f" #'company-files - :i "C-]" #'company-etags - :i "s" #'company-ispell - :i "C-s" #'company-yasnippet - :i "C-o" #'company-capf - :i "C-n" #'+company/dabbrev - :i "C-p" #'+company/dabbrev-code-previous))) + (:prefix "C-x" + :i "C-l" #'+company/whole-lines + :i "C-k" #'+company/dict-or-keywords + :i "C-f" #'company-files + :i "C-]" #'company-etags + :i "s" #'company-ispell + :i "C-s" #'company-yasnippet + :i "C-o" #'company-capf + :i "C-n" #'+company/dabbrev + :i "C-p" #'+company/dabbrev-code-previous))) diff --git a/modules/editor/evil/init.el b/modules/editor/evil/init.el index 439082071..462e35b39 100644 --- a/modules/editor/evil/init.el +++ b/modules/editor/evil/init.el @@ -260,7 +260,8 @@ and complains if a module is loaded too early (during startup)." (+evil-collection-init '(occur replace))) (add-transient-hook! 'minibuffer-setup-hook (when evil-collection-setup-minibuffer - (+evil-collection-init 'minibuffer))) + (+evil-collection-init 'minibuffer) + (evil-collection-minibuffer-insert))) ;; HACK Do this ourselves because evil-collection break's `eval-after-load' ;; load order by loading their target plugin before applying keys. This diff --git a/modules/editor/evil/packages.el b/modules/editor/evil/packages.el index 2a427f444..d4d940266 100644 --- a/modules/editor/evil/packages.el +++ b/modules/editor/evil/packages.el @@ -1,27 +1,29 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/evil/packages.el -(package! evil :pin "8aa6337fa8") -(package! evil-args :pin "758ad5ae54") -(package! evil-easymotion :pin "79c13ed3bc") -(package! evil-embrace :pin "4379adea03") -(package! evil-escape :pin "f4e9116bfb") -(package! evil-exchange :pin "3030e21ee1") -(package! evil-indent-plus :pin "0c7501e6ef") -(package! evil-lion :pin "6b03593f5d") -(package! evil-nerd-commenter :pin "747e346f11") +(package! evil :pin "d243eae8649272799ec3864fde14c1164f036940") +(package! evil-args :pin "758ad5ae54ad34202064fec192c88151c08cb387") +(package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") +(package! evil-embrace :pin "4379adea032b25e359d01a36301b4a5afdd0d1b7") +(package! evil-escape + :recipe (:host github :repo "hlissner/evil-escape") + :pin "819f1ee1cf3f69a1ae920e6004f2c0baeebbe077") +(package! evil-exchange :pin "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1") +(package! evil-indent-plus :pin "0c7501e6efed661242c3a20e0a6c79a6455c2c40") +(package! evil-lion :pin "6b03593f5dd6e7c9ca02207f9a73615cf94c93ab") +(package! evil-nerd-commenter :pin "1bd2de52011c39777a3e8779b14cee2790dc873b") (package! evil-numbers :recipe (:host github :repo "janpath/evil-numbers") - :pin "c2cfdd1eb1") -(package! evil-snipe :pin "3ec8adfd49") -(package! evil-surround :pin "9b0b17f06c") -(package! evil-textobj-anyblock :pin "ff00980f06") -(package! evil-traces :pin "bc25cae9fa") -(package! evil-visualstar :pin "06c053d8f7") -(package! exato :pin "d5daea3017") + :pin "c2cfdd1eb1f193bea28ee79b191b78309677058a") +(package! evil-snipe :pin "2ba6353bb9253dbbc4193f1d35403e7dcc1317b1") +(package! evil-surround :pin "9b0b17f06cef9bac81ee4800d121265e54718a17") +(package! evil-textobj-anyblock :pin "ff00980f0634f95bf2ad9956b615a155ea8743be") +(package! evil-traces :pin "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462") +(package! evil-visualstar :pin "06c053d8f7381f91c53311b1234872ca96ced752") +(package! exato :pin "d5daea30176d48e74c9d063ac9bfc240ebeb97d0") (package! evil-quick-diff :recipe (:host github :repo "rgrinberg/evil-quick-diff") - :pin "69c883720b") + :pin "69c883720b30a892c63bc89f49d4f0e8b8028908") ;; (when (featurep! +everywhere) @@ -31,4 +33,4 @@ (package! neotree) (autoload 'neotree-make-executor "neotree" nil nil 'macro)) - (package! evil-collection :pin "493d523c9b")) + (package! evil-collection :pin "ba3630476b3927d9d2e3ec75308a28e3a5bd54a8")) diff --git a/modules/editor/file-templates/packages.el b/modules/editor/file-templates/packages.el index 42c98b815..2a16ccb75 100644 --- a/modules/editor/file-templates/packages.el +++ b/modules/editor/file-templates/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/file-templates/packages.el -(package! yasnippet :pin "ac03c2f192") +(package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703") diff --git a/modules/editor/fold/packages.el b/modules/editor/fold/packages.el index 9420d41a5..de5af2df9 100644 --- a/modules/editor/fold/packages.el +++ b/modules/editor/fold/packages.el @@ -3,6 +3,6 @@ (package! hideshow :built-in t) -(package! vimish-fold :pin "d3248a41a7") +(package! vimish-fold :pin "63685239655a151181b9152e45478dad587f86f2") (when (featurep! :editor evil) - (package! evil-vimish-fold :pin "b6e0e6b91b")) + (package! evil-vimish-fold :pin "b6e0e6b91b8cd047e80debef1a536d9d49eef31a")) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 84f6874dd..40ca96f73 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -219,9 +219,11 @@ snippets or single lines." is selected)." (interactive) (call-interactively - (if (use-region-p) - #'+format/region - #'+format/buffer))) + (if (bound-and-true-p lsp-mode) + #'+default/lsp-format-region-or-buffer + (if (use-region-p) + #'+format/region + #'+format/buffer)))) ;; diff --git a/modules/editor/god/packages.el b/modules/editor/god/packages.el index 1dc6a2016..edfcc1033 100644 --- a/modules/editor/god/packages.el +++ b/modules/editor/god/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/god/packages.el -(package! god-mode :pin "1eb6ef3a4f") +(package! god-mode :pin "1eb6ef3a4f67a805c5d6deb1e3895b6c853707d7") diff --git a/modules/editor/lispy/packages.el b/modules/editor/lispy/packages.el index 747c914ec..7f343c5a3 100644 --- a/modules/editor/lispy/packages.el +++ b/modules/editor/lispy/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/lispyville/packages.el -(package! lispy :pin "c7e282ae06") +(package! lispy :pin "cdaa9c70ca39a880163cbbce924bb46cc56b9fa4") (when (featurep! :editor evil) - (package! lispyville :pin "25a70126ea")) + (package! lispyville :pin "25a70126ea807653e0a8c512d4128c90ed673d7a")) diff --git a/modules/editor/multiple-cursors/packages.el b/modules/editor/multiple-cursors/packages.el index 72dfe9061..5e317fe2d 100644 --- a/modules/editor/multiple-cursors/packages.el +++ b/modules/editor/multiple-cursors/packages.el @@ -3,7 +3,7 @@ (cond ((featurep! :editor evil) - (package! evil-multiedit :pin "9f271e0e60") - (package! evil-mc :pin "4d4c0172e4")) + (package! evil-multiedit :pin "9f271e0e6048297692f80ed6c5ae8994ac523abc") + (package! evil-mc :pin "4d4c0172e4c7f80acc1d0e73d5fb3e536929b262")) - ((package! multiple-cursors :pin "b880554d04"))) + ((package! multiple-cursors :pin "b880554d04b8f61165afba7d4de19ac9e39bb7ab"))) diff --git a/modules/editor/objed/packages.el b/modules/editor/objed/packages.el index 49c15be40..5b49d2fbf 100644 --- a/modules/editor/objed/packages.el +++ b/modules/editor/objed/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/objed/packages.el -(package! objed :pin "8dc17701d1") +(package! objed :pin "e89d8dae3b2d4331a4455d2a7b203500537d184d") diff --git a/modules/editor/parinfer/packages.el b/modules/editor/parinfer/packages.el index df109114b..a3badc94c 100644 --- a/modules/editor/parinfer/packages.el +++ b/modules/editor/parinfer/packages.el @@ -11,4 +11,4 @@ ;; separate session: (autoload 'evil-define-key "evil-core" nil nil 'macro)) -(package! parinfer :pin "eaad857ae4") +(package! parinfer :pin "eaad857ae4351f72a561ee3dec8943713510003f") diff --git a/modules/editor/rotate-text/packages.el b/modules/editor/rotate-text/packages.el index 15c7216dd..846641da6 100644 --- a/modules/editor/rotate-text/packages.el +++ b/modules/editor/rotate-text/packages.el @@ -3,4 +3,4 @@ (package! rotate-text :recipe (:host github :repo "debug-ito/rotate-text.el") - :pin "48f193697d") + :pin "48f193697db996855aee1ad2bc99b38c6646fe76") diff --git a/modules/editor/snippets/config.el b/modules/editor/snippets/config.el index 71218a728..6a9e6cc94 100644 --- a/modules/editor/snippets/config.el +++ b/modules/editor/snippets/config.el @@ -102,6 +102,6 @@ us who use yas-minor-mode and enable yasnippet more selectively. This advice swaps `yas-global-mode' with `yas-minor-mode'." :around '(aya-expand aya-open-line) - (cl-letf (((symbol-function #'yas-global-mode) #'yas-minor-mode) - (yas-global-mode yas-minor-mode)) + (letf! ((#'yas-global-mode #'yas-minor-mode) + (yas-global-mode yas-minor-mode)) (apply orig-fn args)))) diff --git a/modules/editor/snippets/packages.el b/modules/editor/snippets/packages.el index fec5e4d36..12b720197 100644 --- a/modules/editor/snippets/packages.el +++ b/modules/editor/snippets/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/snippets/packages.el -(package! yasnippet :pin "5b1217ab08") -(package! auto-yasnippet :pin "db9e0dd433") +(package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703") +(package! auto-yasnippet :pin "db9e0dd4335b2202cd5dac95bbbc87a1032d9bbe") (package! doom-snippets :recipe (:host github :repo "hlissner/doom-snippets" :files ("*.el" "*")) - :pin "feaedeb550") + :pin "422f683adfbec1b01fe00524690b64dc9e702ae0") diff --git a/modules/editor/word-wrap/config.el b/modules/editor/word-wrap/config.el index 2a6af06c7..968e71954 100644 --- a/modules/editor/word-wrap/config.el +++ b/modules/editor/word-wrap/config.el @@ -24,3 +24,7 @@ Otherwise no extra indentation will be used.") '(text-mode markdown-mode markdown-view-mode gfm-mode gfm-view-mode rst-mode latex-mode LaTeX-mode) "Major-modes where `+word-wrap-mode' should not provide extra indentation.") + +(when (memq 'visual-line-mode text-mode-hook) + (remove-hook 'text-mode-hook #'visual-line-mode) + (add-hook 'text-mode-hook #'+word-wrap-mode)) diff --git a/modules/editor/word-wrap/packages.el b/modules/editor/word-wrap/packages.el index 8a82b406d..1e31f226e 100644 --- a/modules/editor/word-wrap/packages.el +++ b/modules/editor/word-wrap/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/word-wrap/packages.el -(package! adaptive-wrap :pin "1810c0ee8d") +(package! adaptive-wrap :pin "1810c0ee8d827dd502ddeaae5bd759d4811fcbce") diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el old mode 100755 new mode 100644 index 56fac7351..3da7048bd --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -31,20 +31,16 @@ (setq insert-directory-program gls) ;; BSD ls doesn't support --group-directories-first (setq args (delete "--group-directories-first" args)))) - (setq dired-listing-switches (string-join args " "))) + (setq dired-listing-switches (string-join args " ")) - (add-hook! 'dired-mode-hook - (defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h () - "Fix #1703: dired over TRAMP displays a blank screen. + (add-hook! 'dired-mode-hook + (defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h () + "Fix #1703: dired over TRAMP displays a blank screen. This is because there's no guarantee the remote system has GNU ls, which is the only variant that supports --group-directories-first." - (when (file-remote-p default-directory) - (setq-local dired-listing-switches - (string-join - (split-string dired-listing-switches - "--group-directories-first") - " "))))) + (when (file-remote-p default-directory) + (setq-local dired-listing-switches (car args)))))) ;; Don't complain about this command being disabled when we use it (put 'dired-find-alternate-file 'disabled nil) diff --git a/modules/emacs/dired/packages.el b/modules/emacs/dired/packages.el index fe6498417..9a483f259 100644 --- a/modules/emacs/dired/packages.el +++ b/modules/emacs/dired/packages.el @@ -1,12 +1,12 @@ ;; -*- no-byte-compile: t; -*- ;;; emacs/dired/packages.el -(package! diredfl :pin "83567d00af") -(package! dired-git-info :pin "b47f2b0c3a") -(package! diff-hl :pin "2cf8b489f3") -(package! dired-rsync :pin "bfd5c155be") +(package! diredfl :pin "83567d00affce66a4e501563eddd0bd436ac48d0") +(package! dired-git-info :pin "b47f2b0c3a6cb9b7a62a4ee2605a492e512d40a9") +(package! diff-hl :pin "a625033fb1dde83f6e4c2fc21f632b22ec34b609") +(package! dired-rsync :pin "bfd5c155be1cb6b71c83e5f41116c81b6532b6d5") (when (featurep! +ranger) - (package! ranger :pin "af6f781a60")) + (package! ranger :pin "ae9b3816a6da927cca5beb62c45400103797a2da")) (when (featurep! +icons) - (package! all-the-icons-dired :pin "816987d339")) -(package! fd-dired :pin "fd4c3f490b") + (package! all-the-icons-dired :pin "fc2dfa1e9eb8bf1c402a675e7089638d702a27a5")) +(package! fd-dired :pin "001cc95effdd5c4d9974b3f2c40b2ddf1f0e3de2") diff --git a/modules/emacs/ibuffer/packages.el b/modules/emacs/ibuffer/packages.el index 037024cc6..a43d06d4b 100644 --- a/modules/emacs/ibuffer/packages.el +++ b/modules/emacs/ibuffer/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; emacs/ibuffer/packages.el -(package! ibuffer-projectile :pin "504b0edaa0") -(package! ibuffer-vc :pin "1249c1e30c") +(package! ibuffer-projectile :pin "504b0edaa0d937ce60ccc8fdf09f2dae0a90fbaf") +(package! ibuffer-vc :pin "1249c1e30cf11badfe032ac3b1058f24ba510ace") diff --git a/modules/emacs/undo/packages.el b/modules/emacs/undo/packages.el index d960bda32..8c21f4904 100644 --- a/modules/emacs/undo/packages.el +++ b/modules/emacs/undo/packages.el @@ -2,6 +2,6 @@ ;;; emacs/undo/packages.el (if (featurep! +tree) - (package! undo-tree :pin "5b6df03781") - (package! undo-fu :pin "0c34b6747e") - (package! undo-fu-session :pin "b808ef0cdc")) + (package! undo-tree :pin "5b6df03781495d8a25695d846b0cce496d3d3058") + (package! undo-fu :pin "0ce9ac36144e80316fff50bfe1bc5dd7e5e7ded6") + (package! undo-fu-session :pin "b808ef0cdcdd2eef221c67eda567eed7fcb3d4af")) diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el index 693554e96..b022a543c 100644 --- a/modules/emacs/vc/packages.el +++ b/modules/emacs/vc/packages.el @@ -5,7 +5,7 @@ (package! vc-annotate :built-in t) (package! smerge-mode :built-in t) -(package! browse-at-remote :pin "6aecae4b5d") -(package! git-timemachine :pin "391eb61050") -(package! gitconfig-mode :pin "55468314a5") -(package! gitignore-mode :pin "55468314a5") +(package! browse-at-remote :pin "6aecae4b5d202e582425fc8aa2c9c2b6a4779f25") +(package! git-timemachine :pin "391eb61050de321101e631fcf373fc70ec6e7700") +(package! gitconfig-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") +(package! gitignore-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") diff --git a/modules/email/mu4e/config.el b/modules/email/mu4e/config.el index 54c5efb61..41544f3a3 100644 --- a/modules/email/mu4e/config.el +++ b/modules/email/mu4e/config.el @@ -92,6 +92,9 @@ ;; Wrap text in messages (setq-hook! 'mu4e-view-mode-hook truncate-lines nil) + ;; Html mails might be better rendered in a browser + (add-to-list 'mu4e-view-actions '("View in browser" . mu4e-action-view-in-browser)) + (when (fboundp 'imagemagick-register-types) (imagemagick-register-types)) diff --git a/modules/email/notmuch/packages.el b/modules/email/notmuch/packages.el index d1f108bf7..63a955ce5 100644 --- a/modules/email/notmuch/packages.el +++ b/modules/email/notmuch/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; email/notmuch/packages.el -(package! notmuch :pin "aba7fb375b") -(package! org-mime :pin "b189976217") +(package! notmuch :pin "ad9c2e91a012920bebfe70bc472d44678abc3259") +(package! org-mime :pin "9f8444603806e6baa94b2b67a23aab0ea52fef97") (when (featurep! :completion ivy) - (package! counsel-notmuch :pin "a4a1562935")) + (package! counsel-notmuch :pin "a4a1562935e4180c42524c51609d1283e9be0688")) (when (featurep! :completion helm) - (package! helm-notmuch :pin "97a01497e0")) + (package! helm-notmuch :pin "97a01497e079a7b6505987e9feba6b603bbec288")) diff --git a/modules/email/wanderlust/packages.el b/modules/email/wanderlust/packages.el index 04963b55b..1188d3005 100644 --- a/modules/email/wanderlust/packages.el +++ b/modules/email/wanderlust/packages.el @@ -4,8 +4,8 @@ ;; HACK These are wanderlust's dependencies (wanderlust depends on semi, semi ;; depends on flim, flim on apel), but they all have non-standard default ;; branches which straight cannot detect without our help. -(package! apel :recipe (:branch "apel-wl") :pin "d146ddbf88") -(package! flim :recipe (:branch "flim-1_14-wl") :pin "e4bd54fd7d") -(package! semi :recipe (:branch "semi-1_14-wl") :pin "16228dc2d1") +(package! apel :recipe (:branch "apel-wl") :pin "d146ddbf8818e81d3577d5eee7825d377bec0c73") +(package! flim :recipe (:branch "flim-1_14-wl") :pin "f303f2f6c124bc8635add96d3326a2209749437b") +(package! semi :recipe (:branch "semi-1_14-wl") :pin "57a948c5f07e57e78ab3c0e6fd76ffcd591bb4ac") -(package! wanderlust :pin "7a919e422a") +(package! wanderlust :pin "7af0d582cd48a37469e0606ea35887740d78c8b5") diff --git a/modules/input/chinese/packages.el b/modules/input/chinese/packages.el index 138c376c4..68bda1d2a 100644 --- a/modules/input/chinese/packages.el +++ b/modules/input/chinese/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; input/chinese/packages.el -(package! pyim :pin "77170724fa") -(package! fcitx :pin "12dc2638dd") -(package! ace-pinyin :pin "8b2e9335b0") -(package! pangu-spacing :pin "f92898949b") +(package! pyim :pin "b934273bb33d6be6aea6e20e68930bc5aaf4a48a") +(package! fcitx :pin "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624") +(package! ace-pinyin :pin "8b2e9335b02486730ea4ceee790130cc5328f9ea") +(package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223") diff --git a/modules/input/japanese/packages.el b/modules/input/japanese/packages.el index 5e86fd79a..126633dcf 100644 --- a/modules/input/japanese/packages.el +++ b/modules/input/japanese/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; input/japanese/packages.el -(package! migemo :pin "f42832c8ac") -(package! avy-migemo :pin "922a6dd82c") -(package! ddskk :pin "f9a2333ec3") -(package! pangu-spacing :pin "f92898949b") +(package! migemo :pin "f42832c8ac462ecbec9a16eb781194f876fba64a") +(package! avy-migemo :pin "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") +(package! ddskk :pin "11d91b4cce988e15d7c5fc4345535c9d7a92d53b") +(package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223") diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index f126695d0..ed980f0b5 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -73,26 +73,36 @@ ((message "WARNING: Couldn't find `inferior-lisp-program' (%s)" inferior-lisp-program))))) - (map! :localleader - :map lisp-mode-map - :desc "Sly" "'" #'sly - :desc "Sly (ask)" ";" (λ!! #'sly '-) - :desc "Expand macro" "m" #'macrostep-expand - (:prefix ("c" . "compile") + (map! (:map sly-db-mode-map + :n "gr" #'sly-db-restart-frame) + (:map sly-inspector-mode-map + :n "gr" #'sly-inspector-reinspect + :n "gR" #'sly-inspector-fetch-all + :n "K" #'sly-inspector-describe-inspectee) + (:map sly-xref-mode-map + :n "gr" #'sly-recompile-xref + :n "gR" #'sly-recompile-all-xrefs) + + (:localleader + :map lisp-mode-map + :desc "Sly" "'" #'sly + :desc "Sly (ask)" ";" (λ!! #'sly '-) + :desc "Expand macro" "m" #'macrostep-expand + (:prefix ("c" . "compile") :desc "Compile file" "c" #'sly-compile-file :desc "Compile/load file" "C" #'sly-compile-and-load-file :desc "Compile toplevel form" "f" #'sly-compile-defun :desc "Load file" "l" #'sly-load-file :desc "Remove notes" "n" #'sly-remove-notes :desc "Compile region" "r" #'sly-compile-region) - (:prefix ("e" . "evaluate") + (:prefix ("e" . "evaluate") :desc "Evaulate buffer" "b" #'sly-eval-buffer :desc "Evaluate last" "e" #'sly-eval-last-expression :desc "Evaluate/print last" "E" #'sly-eval-print-last-expression :desc "Evaluate defun" "f" #'sly-eval-defun :desc "Undefine function" "F" #'sly-undefine-function :desc "Evaluate region" "r" #'sly-eval-region) - (:prefix ("g" . "goto") + (:prefix ("g" . "goto") :desc "Go back" "b" #'sly-pop-find-definition-stack :desc "Go to" "d" #'sly-edit-definition :desc "Go to (other window)" "D" #'sly-edit-definition-other-window @@ -100,7 +110,7 @@ :desc "Previous note" "N" #'sly-previous-note :desc "Next sticker" "s" #'sly-stickers-next-sticker :desc "Previous sticker" "S" #'sly-stickers-prev-sticker) - (:prefix ("h" . "help") + (:prefix ("h" . "help") :desc "Who calls" "<" #'sly-who-calls :desc "Calls who" ">" #'sly-calls-who :desc "Lookup format directive" "~" #'hyperspec-lookup-format @@ -115,22 +125,22 @@ :desc "Who references" "r" #'sly-who-references :desc "Who specializes" "s" #'sly-who-specializes :desc "Who sets" "S" #'sly-who-sets) - (:prefix ("r" . "repl") + (:prefix ("r" . "repl") :desc "Clear REPL" "c" #'sly-mrepl-clear-repl :desc "Quit connection" "q" #'sly-quit-lisp :desc "Restart connection" "r" #'sly-restart-inferior-lisp :desc "Sync REPL" "s" #'sly-mrepl-sync) - (:prefix ("s" . "stickers") + (:prefix ("s" . "stickers") :desc "Toggle breaking stickers" "b" #'sly-stickers-toggle-break-on-stickers :desc "Clear defun stickers" "c" #'sly-stickers-clear-defun-stickers :desc "Clear buffer stickers" "C" #'sly-stickers-clear-buffer-stickers :desc "Fetch stickers" "f" #'sly-stickers-fetch :desc "Replay stickers" "r" #'sly-stickers-replay :desc "Add/remove sticker" "s" #'sly-stickers-dwim) - (:prefix ("t" . "trace") + (:prefix ("t" . "trace") :desc "Toggle" "t" #'sly-toggle-trace-fdefinition :desc "Toggle (fancy)" "T" #'sly-toggle-fancy-trace - :desc "Untrace all" "u" #'sly-untrace-all)) + :desc "Untrace all" "u" #'sly-untrace-all))) (when (featurep! :editor evil +everywhere) (add-hook 'sly-mode-hook #'evil-normalize-keymaps))) diff --git a/modules/lang/dart/packages.el b/modules/lang/dart/packages.el index 30a0f8be8..878d55630 100644 --- a/modules/lang/dart/packages.el +++ b/modules/lang/dart/packages.el @@ -4,7 +4,7 @@ (package! dart-mode :pin "04fcd649f1") (when (featurep! +lsp) - (package! lsp-dart :pin "4cd73b77f4")) + (package! lsp-dart :pin "80f8ecaf62")) (when (featurep! +flutter) (package! flutter :pin "293b7225b9") diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 228a3a8ef..080bfbd02 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -221,6 +221,67 @@ verbosity when editing a file in `doom-private-dir' or `doom-emacs-dir'." (default-value 'flycheck-emacs-lisp-check-form) ")")))) +;;;###autoload +(defun +emacs-lisp-truncate-pin () + "Truncates long SHA1 hashes in `package!' :pin's." + (save-excursion + (goto-char (match-beginning 0)) + (and (stringp (plist-get (sexp-at-point) :pin)) + (search-forward ":pin" nil t) + (let ((start (re-search-forward "\"[^\"]\\{10\\}" nil t)) + (finish (and (re-search-forward "\"" (line-end-position) t) + (match-beginning 0)))) + (when (and start finish) + (put-text-property start finish 'display "..."))))) + nil) + +;;;###autoload +(defun +emacs-lisp-indent-function (indent-point state) + "A replacement for `lisp-indent-function'. + +Indents plists more sensibly. Adapted from +https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned" + (let ((normal-indent (current-column)) + (orig-point (point)) + ;; TODO Refactor `target' usage (ew!) + target) + (goto-char (1+ (elt state 1))) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t) + (cond ((and (elt state 2) + (or (not (looking-at-p "\\sw\\|\\s_")) + (eq (char-after) ?:))) + (unless (> (save-excursion (forward-line 1) (point)) + calculate-lisp-indent-last-sexp) + (goto-char calculate-lisp-indent-last-sexp) + (beginning-of-line) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) + (backward-prefix-chars) + (current-column)) + ((and (save-excursion + (goto-char indent-point) + (skip-syntax-forward " ") + (not (eq (char-after) ?:))) + (save-excursion + (goto-char orig-point) + (and (eq (char-after) ?:) + (eq (char-before) ?\() + (setq target (current-column))))) + (save-excursion + (move-to-column target t) + target)) + ((let* ((function (buffer-substring (point) (progn (forward-sexp 1) (point)))) + (method (or (function-get (intern-soft function) 'lisp-indent-function) + (get (intern-soft function) 'lisp-indent-hook)))) + (cond ((or (eq method 'defun) + (and (null method) + (> (length function) 3) + (string-match-p "\\`def" function))) + (lisp-indent-defform state indent-point)) + ((integerp method) + (lisp-indent-specform method state indent-point normal-indent)) + (method + (funcall method indent-point state)))))))) + ;;;###autoload (defun +emacs-lisp/edebug-instrument-defun-on () "Toggle on instrumentalisation for the function under `defun'." diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7d4bf782d..6f80d6cfd 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -43,7 +43,9 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") mode-name "Elisp" ;; Don't treat autoloads or sexp openers as outline headers, we have ;; hideshow for that. - outline-regexp +emacs-lisp-outline-regexp) + outline-regexp +emacs-lisp-outline-regexp + ;; Fixed indenter that intends plists sensibly. + lisp-indent-function #'+emacs-lisp-indent-function) ;; variable-width indentation is superior in elisp (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) @@ -75,7 +77,9 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") ("^;;;###\\(autodef\\|if\\|package\\)[ \n]" (1 font-lock-warning-face t))) ;; highlight defined, special variables & functions (when +emacs-lisp-enable-extra-fontification - `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))))) + `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))) + + `(("(package!\\_>" (0 (+emacs-lisp-truncate-pin)))))) ;; Recenter window after following definition (advice-add #'elisp-def :after #'doom-recenter-a) diff --git a/modules/lang/java/+lsp.el b/modules/lang/java/+lsp.el index ba7f84eb1..a99a9a7bb 100644 --- a/modules/lang/java/+lsp.el +++ b/modules/lang/java/+lsp.el @@ -3,11 +3,11 @@ (use-package! lsp-java :after lsp-clients - :hook (java-mode-local-vars . lsp!) :preface (setq lsp-java-server-install-dir (concat doom-etc-dir "eclipse.jdt.ls/server/") - lsp-java-workspace-dir (concat doom-etc-dir "java-workspace")) + lsp-java-workspace-dir (concat doom-etc-dir "java-workspace") + lsp-jt-root (concat doom-etc-dir "eclipse.jdt.ls/server/java-test/server/")) + (add-hook! java-mode-local-vars #'lsp!) :config ;; TODO keybinds - ;; TODO treemacs integration (?) ) diff --git a/modules/lang/java/README.org b/modules/lang/java/README.org new file mode 100644 index 000000000..eb4b69098 --- /dev/null +++ b/modules/lang/java/README.org @@ -0,0 +1,114 @@ +#+TITLE: lang/java +#+DATE: January 16, 2017 +#+SINCE: v1.3 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] +- [[#prerequisites][Prerequisites]] + - [[#openjdk-11][OpenJDK 11]] + - [[#ubuntu][Ubuntu]] + - [[#fedora][Fedora]] + - [[#oracle-jdk-11][Oracle JDK 11]] + - [[#ubuntu-1][Ubuntu]] + - [[#fedora-1][Fedora]] +- [[#features][Features]] + - [[#lsp-features][=+lsp= features]] + - [[#meghanada-features][=+meghanada= features]] +- [[#configuration][Configuration]] + +* Description +This module adds [[https://www.java.com][java]] support to Doom Emacs, including =android-mode= and +=groovy-mode=. + +** Module Flags ++ =+lsp= Enables integration for the eclipse.jdt.ls LSP server. ++ =+meghanada= Enables the [[https://github.com/mopemope/meghanada-emacs/tree/master][meghanada-mode]] + +The =+lsp= and =+meghanada= packages are mutually exclusive and do not work +together. At the time of writing the =+meghanada= is already configured whereas +=+lsp= needs to manual configuring. + +* Prerequisites +This module requires the Java SDK. + +** OpenJDK 11 +*** Ubuntu +#+BEGIN_SRC sh +sudo apt-get install openjdk-11-jdk-headless +#+END_SRC +*** Fedora +#+BEGIN_SRC sh +sudo dnf install java-11-openjdk +#+END_SRC + +** Oracle JDK 11 +*** Ubuntu +#+BEGIN_SRC sh +sudo add-apt-repository ppa:linuxuprising/java +sudo apt update +sudo apt install oracle-java11-installer +sudo apt install oracle-java11-set-default +#+END_SRC +*** Fedora +#+BEGIN_SRC sh +curl -O https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz +tar zxvf openjdk-11.0.2_linux-x64_bin.tar.gz +sudo mv jdk-11.0.2/ /usr/local/ +#+END_SRC + +Open =/etc/profile.d/jdk11.sh= as root and add + +#+BEGIN_SRC sh +export JAVA_HOME=/usr/local/jdk-11.0.2 +export PATH=$PATH:$JAVA_HOME/bin +#+END_SRC + +Save the file and source the file + +#+BEGIN_SRC sh +source /etc/profile.d/jdk11.sh +java -version +#+END_SRC + +* Features +** =+lsp= features +According to [[https://github.com/emacs-lsp/lsp-java]] it adds + ++ As you type reporting of parsing and compilation errors (via flycheck/[[https://github.com/emacs-lsp/lsp-ui][lsp-ui]]) ++ Code completion - using [[https://github.com/tigersoldier/company-lsp][company-lsp]] or builtin complete-at-point ++ Javadoc hovers - using [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]] ++ Code actions - using [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]] ++ Code outline - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Imenu.html][imenu]] ++ Code navigation - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html][xref]] ++ Code lens (references/implementations) - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html][xref]] ++ Highlights ++ Code formatting ++ Maven pom.xml project support ++ Limited Gradle support ++ Visual debugger - [[https://github.com/yyoncho/dap-mode/][dap-mode]] ++ Test runner - [[https://github.com/yyoncho/dap-mode/][dap-mode]] ++ Project explorer integration - [[https://github.com/Alexander-Miller/treemacs][treemacs]] ++ Integration with [[https://start.spring.io/][Spring Initializr]] + +** =+meghanada= features +According to [[https://github.com/mopemope/meghanada-emacs/]] it adds + ++ Auto-update server module ++ [[https://gradle.org/][Gradle]] and [[http://maven.apache.org/][Maven]] and Eclipse project support ++ No need build tool's plugin ++ Run build tool task ++ Compile your project ++ Syntax check and analyze java source (=flycheck-meghanada=) ++ Support =Generic Types= ++ Code completion with [[http://company-mode.github.io/][company-mode]] (=company-meghanada=) ++ Optimize import and sort ++ Jump declaration ++ Run [[http://www.junit.org/][JUnit]] test (include test runner) ++ Diagnostic reporting with [[http://flycheck.org/][flycheck]] (=flycheck-meghanada=) ++ Show symbol's type info with =el-doc= ++ Search references ++ Full-featured text search + +* TODO Configuration diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 479116ec7..a897d2dbf 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -135,7 +135,8 @@ (add-hook! '(js2-mode-local-vars-hook typescript-mode-local-vars-hook - web-mode-local-vars-hook) + web-mode-local-vars-hook + rjsx-mode-local-vars-hook) (defun +javascript-init-lsp-or-tide-maybe-h () "Start `lsp' or `tide' in the current buffer. @@ -152,7 +153,7 @@ to tide." (if (not buffer-file-name) ;; necessary because `tide-setup' and `lsp' will error if not a ;; file-visiting buffer - (add-hook 'after-save-hook #'+javascript-init-tide-or-lsp-maybe-h nil 'local) + (add-hook 'after-save-hook #'+javascript-init-lsp-or-tide-maybe-h nil 'local) (or (and (featurep! +lsp) (lsp!)) ;; fall back to tide (if (executable-find "node") @@ -160,7 +161,7 @@ to tide." (progn (tide-setup) tide-mode)) (ignore (doom-log "Couldn't start tide because 'node' is missing")))) - (remove-hook 'after-save-hook #'+javascript-init-tide-or-lsp-maybe-h 'local)))))) + (remove-hook 'after-save-hook #'+javascript-init-lsp-or-tide-maybe-h 'local)))))) (use-package! tide diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 483ef6f47..8e51570d3 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -2,21 +2,21 @@ ;;; lang/javascript/packages.el ;; Major modes -(package! coffee-mode :pin "35a41c7d82") -(package! js2-mode :pin "fe53814dc2") -(package! rjsx-mode :pin "0061587a06") -(package! typescript-mode :pin "102587e458") +(package! coffee-mode :pin "35a41c7d8233eac0b267d9593e67fb8b6235e134") +(package! js2-mode :pin "fe53814dc2a0db2e95ac06083362e43923bf83fc") +(package! rjsx-mode :pin "0061587a06cdc2579a8d0e90863498d96bf982d8") +(package! typescript-mode :pin "102587e458d48ece6335cd708300647f22ec8b8d") ;; Tools -(package! js2-refactor :pin "d4c40b5fc8") -(package! npm-mode :pin "3ee7c0bad5") -(package! add-node-modules-path :pin "f31e69ccb6") +(package! js2-refactor :pin "d4c40b5fc86d3edd7c6a7d83ac86483ee1cb7a28") +(package! npm-mode :pin "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") +(package! add-node-modules-path :pin "f31e69ccb681f882aebb806ce6e9478e3ac39708") ;; Eval -(package! nodejs-repl :pin "6fad7d764f") -(package! skewer-mode :pin "e5bed35193") +(package! nodejs-repl :pin "6fad7d764fa0d818ba497450bd722ae10cb8efed") +(package! skewer-mode :pin "e5bed351939c92a1f788f78398583c2f83f1bb3c") ;; Programming environment -(package! tide :pin "3b45610faa") +(package! tide :pin "3b45610faaab33bc53ae2d44e1e573f19f35a74a") (when (featurep! :tools lookup) - (package! xref-js2 :pin "6f1ed5dae0")) + (package! xref-js2 :pin "6f1ed5dae0c2485416196a51f2fa92f32e4b8262")) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 07003b237..448710520 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -27,11 +27,17 @@ capture, the end position, and the output buffer.") markdown-gfm-additional-languages '("sh") markdown-make-gfm-checkboxes-buttons t - ;; Preview/compilation defaults + ;; `+markdown-compile' offers support for many transpilers (see + ;; `+markdown-compile-functions'), which it tries until one succeeds. markdown-command #'+markdown-compile + ;; This is set to `nil' by default, which causes a wrong-type-arg error + ;; when you use `markdown-open'. These are more sensible defaults. markdown-open-command (cond (IS-MAC "open") (IS-LINUX "xdg-open")) + + ;; A sensible and simple default preamble for markdown exports that + ;; takes after the github asthetic (plus highlightjs syntax coloring). markdown-content-type "application/xhtml+xml" markdown-css-paths '("https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css" @@ -57,6 +63,7 @@ capture, the end position, and the output buffer.") (sp-local-pair '(markdown-mode gfm-mode) "`" "`" :unless '(:add sp-point-before-word-p sp-point-before-same-p)) + ;; Don't trigger autofill in code blocks (see `auto-fill-mode') (setq-hook! 'markdown-mode-hook fill-nobreak-predicate (cons #'markdown-code-block-at-point-p fill-nobreak-predicate)) diff --git a/modules/lang/markdown/packages.el b/modules/lang/markdown/packages.el index 6f82df4ba..dfe2f4572 100644 --- a/modules/lang/markdown/packages.el +++ b/modules/lang/markdown/packages.el @@ -1,13 +1,14 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/markdown/packages.el -(package! markdown-mode :pin "e9dff50d57") -(package! markdown-toc :pin "7038f4f6d5") -(package! edit-indirect :pin "935ded353b") +(package! markdown-mode :pin "c927a114b1b23cf7538181d62fd14679cce7fa25") +(package! markdown-toc :pin "eda9650a1bf0015e52e9678bd92b0a8beb1d7d71") +(package! edit-indirect :pin "935ded353b9ed3da67bc61abf245c21b58d88864") (when (featurep! +grip) - (package! grip-mode :pin "9615c47747")) + (package! grip-mode :pin "9615c4774727a719d38313a679d70f2a2c6aca68")) (when (featurep! :editor evil +everywhere) (package! evil-markdown - :recipe (:host github :repo "Somelauw/evil-markdown") :pin "46cd81b379")) + :recipe (:host github :repo "Somelauw/evil-markdown") + :pin "46cd81b37991c4325fc24015a610f832b0ff995d")) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index ce39dbd09..5026a9b15 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/nix/packages.el -(package! nix-mode :pin "5b5961780f") -(package! nix-update :pin "fc6c39c2da") +(package! nix-mode :pin "5b5961780f3b1c1b62453d2087f775298980f10d") +(package! nix-update :pin "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (when (featurep! :completion company) - (package! company-nixos-options :pin "977b9a505f")) + (package! company-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297")) (when (featurep! :completion helm) - (package! helm-nixos-options :pin "977b9a505f")) + (package! helm-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297")) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index d64372139..d4be3f097 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -50,7 +50,7 @@ you're done. This can be called from an external shell script." (with-selected-frame frame (require 'org-capture) (condition-case ex - (cl-letf (((symbol-function #'pop-to-buffer) #'switch-to-buffer)) + (letf! ((#'pop-to-buffer #'switch-to-buffer)) (switch-to-buffer (doom-fallback-buffer)) (let ((org-capture-initial initial-input) org-capture-entry) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 4a2b58faa..0778284ab 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -4,6 +4,7 @@ '((cpp . C) (C++ . C) (D . C) + (elisp . emacs-lisp) (sh . shell) (bash . shell) (matlab . octave) @@ -94,14 +95,11 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") ("sharp" "\\sharp" nil "" "" "266F" "♯")) - org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-fontify-whole-heading-line t org-footnote-auto-label 'plain org-hide-leading-stars t - org-hide-leading-stars-before-indent-mode t org-image-actual-width nil - org-list-description-max-indent 4 org-priority-faces '((?A . error) (?B . warning) @@ -120,9 +118,6 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default org-refile-use-outline-path 'file org-outline-path-complete-in-steps nil) - ;; Fontify latex blocks and entities, but not natively -- that's too slow - (setq org-highlight-latex-and-related '(latex script entities)) - (plist-put org-format-latex-options :scale 1.5) ; larger previews (add-hook! 'doom-load-theme-hook (defun +org-refresh-latex-background-h () @@ -168,12 +163,6 @@ This forces it to read the background before rendering." ("HOLD" . +org-todo-onhold) ("PROJ" . +org-todo-project))) - (after! org-eldoc - ;; HACK Fix #2972: infinite recursion when eldoc kicks in in an 'org' src - ;; block. - ;; TODO Should be reported upstream! - (puthash "org" "ignore" org-eldoc-local-functions-cache)) - (defadvice! +org-display-link-in-eldoc-a (&rest args) "Display full link in minibuffer when cursor/mouse is over it." :before-until #'org-eldoc-documentation-function @@ -501,6 +490,13 @@ eldoc string." nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) width prefix separator)) + (after! org-eldoc + ;; HACK Fix #2972: infinite recursion when eldoc kicks in in 'org' or + ;; 'python' src blocks. + ;; TODO Should be reported upstream! + (puthash "org" #'ignore org-eldoc-local-functions-cache) + (puthash "python" #'python-eldoc-function org-eldoc-local-functions-cache)) + (defun +org--restart-mode-h () "Restart `org-mode', but only once." (quiet! (org-mode-restart)) @@ -541,11 +537,9 @@ current workspace (and clean them up)." ;; upstream (if ever). (defadvice! +org--fix-inline-images-for-imagemagick-users-a (orig-fn &rest args) :around #'org-display-inline-images - (cl-letf* ((old-create-image (symbol-function #'create-image)) - ((symbol-function #'create-image) - (lambda (file-or-data &optional type data-p &rest props) - (let ((type (if (plist-get props :width) type))) - (apply old-create-image file-or-data type data-p props))))) + (letf! (defun create-image (file-or-data &optional type data-p &rest props) + (let ((type (if (plist-get props :width) type))) + (apply create-image file-or-data type data-p props))) (apply orig-fn args))) (defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid) @@ -797,6 +791,7 @@ compelling reason, so..." :config ;; Make leading stars truly invisible, by rendering them as spaces! (setq org-superstar-leading-bullet ?\s + org-superstar-leading-fallback ?\s org-hide-leading-stars nil) ;; Don't do anything special for item bullets or TODOs by default; these slow ;; down larger org buffers. @@ -813,11 +808,14 @@ compelling reason, so..." (use-package! org-crypt ; built-in :commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry :hook (org-reveal-start . org-decrypt-entry) - :config - (add-hook! 'org-mode-hook - (add-hook 'before-save-hook 'org-encrypt-entries nil t)) - (add-to-list 'org-tags-exclude-from-inheritance "crypt") - (setq org-crypt-key user-mail-address)) + :preface + ;; org-crypt falls back to CRYPTKEY property then `epa-file-encrypt-to', which + ;; is a better default than the empty string `org-crypt-key' defaults to. + (defvar org-crypt-key nil) + (after! org + (add-to-list 'org-tags-exclude-from-inheritance "crypt") + (add-hook! 'org-mode-hook + (add-hook 'before-save-hook 'org-encrypt-entries nil t)))) (use-package! org-clock ; built-in diff --git a/modules/lang/org/contrib/present.el b/modules/lang/org/contrib/present.el index a92ff6572..d05cf8985 100644 --- a/modules/lang/org/contrib/present.el +++ b/modules/lang/org/contrib/present.el @@ -41,20 +41,19 @@ (defadvice! +org-present--narrow-to-subtree-a (orig-fn &rest args) "Narrow to the target subtree when you start the presentation." :around #'org-tree-slide--display-tree-with-narrow - (cl-letf (((symbol-function #'org-narrow-to-subtree) - (lambda () - (save-excursion - (save-match-data - (org-with-limited-levels - (narrow-to-region - (progn - (when (org-before-first-heading-p) - (org-next-visible-heading 1)) - (ignore-errors (org-up-heading-all 99)) - (forward-line 1) - (point)) - (progn (org-end-of-subtree t t) - (when (and (org-at-heading-p) (not (eobp))) - (backward-char 1)) - (point))))))))) + (letf! ((defun org-narrow-to-subtree () + (save-excursion + (save-match-data + (org-with-limited-levels + (narrow-to-region + (progn + (when (org-before-first-heading-p) + (org-next-visible-heading 1)) + (ignore-errors (org-up-heading-all 99)) + (forward-line 1) + (point)) + (progn (org-end-of-subtree t t) + (when (and (org-at-heading-p) (not (eobp))) + (backward-char 1)) + (point)))))))) (apply orig-fn args)))) diff --git a/modules/lang/org/contrib/roam.el b/modules/lang/org/contrib/roam.el index 064f342d1..de0997afc 100644 --- a/modules/lang/org/contrib/roam.el +++ b/modules/lang/org/contrib/roam.el @@ -48,20 +48,7 @@ (cond ((featurep! :completion helm) 'helm) ((featurep! :completion ivy) 'ivy) ((featurep! :completion ido) 'ido) - ('default)) - org-roam-completion-fuzzy-match - (or (featurep! :completion helm +fuzzy) - (featurep! :completion ivy +fuzzy))) - - ;; HACK On first invocation, `org-roam-db-build-cache' builds the cache with a - ;; list of unresolved file paths. If those are symlinks, you will later - ;; end up with duplicate entries in your roam DB (e.g. after - ;; `org-roam-capture'ing to an existing file). - ;; REVIEW When jethrokuan/org-roam#518 is merged - (defadvice! +org-roam-resolve-symlinks-a (args) - :filter-args #'org-roam--list-files - (setcar args (file-truename (car args))) - args) + ('default))) ;; Normally, the org-roam buffer doesn't open until you explicitly call ;; `org-roam'. If `+org-roam-open-buffer-on-find-file' is non-nil, the diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 07fc7a7cf..64b725ff6 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -27,84 +27,84 @@ :recipe (:host github :repo "emacs-straight/org-mode" :files ("*.el" "lisp/*.el" "contrib/lisp/*.el")) - :pin "31068373dc") + :pin "e5eda0beeb3b6b0666550091bcc0df066d52c008") ;; ...And prevent other packages from pulling org; org-plus-contrib satisfies ;; the dependency already: https://github.com/raxod502/straight.el/issues/352 (package! org :recipe (:local-repo nil)) (package! avy) -(package! htmlize :pin "86f22f211e") -(package! org-superstar :pin "09ddc28383") +(package! htmlize :pin "86f22f211e9230857197c42a9823d3f05381deed") +(package! org-superstar :pin "09ddc28383d363a4b353348a433e24535b4af0e3") (package! org-yt :recipe (:host github :repo "TobiasZawada/org-yt") - :pin "40cc1ac76d") -(package! ox-clip :pin "bd36f9fb4e") -(package! toc-org :pin "5deaec41ed") -(package! org-cliplink :pin "82402cae7e") + :pin "40cc1ac76d741055cbefa13860d9f070a7ade001") +(package! ox-clip :pin "bd36f9fb4e3b1b9e8686b993b02ccd780ff75a96") +(package! toc-org :pin "5deaec41ed0e5c51715737d7f74c5ae1b3c00387") +(package! org-cliplink :pin "82402cae7e118d67de7328417fd018a18f95fac2") (when (featurep! :editor evil +everywhere) (package! evil-org :recipe (:host github :repo "hlissner/evil-org-mode") - :pin "9cf661af8f")) + :pin "9cf661af8ff8ea768ef1e55045be14d0468a90f5")) (when (featurep! :tools pdf) - (package! org-pdftools :pin "8cc15bb801")) + (package! org-pdftools :pin "8cc15bb8014ed1f047eecc0abd8bf447f86c0505")) (when (featurep! :tools magit) - (package! orgit :pin "e147f05577")) + (package! orgit :pin "e147f055772cc934fe1f1d8619059badeb647c93")) (when (featurep! +brain) - (package! org-brain :pin "7ffbf6816a")) + (package! org-brain :pin "ae7fe0f628bd093526786ece6917f7a4310e5e4d")) (when (featurep! +dragndrop) - (package! org-download :pin "46417e2bd3")) + (package! org-download :pin "48d3952ad8ebc5ef5a6a77b8c6a4a0da61653036")) (when (featurep! +gnuplot) - (package! gnuplot :pin "f0001c3001") - (package! gnuplot-mode :pin "601f639298")) + (package! gnuplot :pin "f0001c30010b2899e36d7d89046322467e923088") + (package! gnuplot-mode :pin "601f6392986f0cba332c87678d31ae0d0a496ce7")) (when (featurep! +ipython) ; DEPRECATED - (package! ob-ipython :pin "7147455230")) + (package! ob-ipython :pin "7147455230841744fb5b95dcbe03320313a77124")) (when (featurep! +jupyter) - (package! jupyter :pin "785edbbff6")) + (package! jupyter :pin "785edbbff65abb0c929dc2fbd8b8305c77fd529e")) (when (featurep! +journal) - (package! org-journal :pin "8bf06b28d6")) + (package! org-journal :pin "8bf06b28d6f14f52d4968123e2b4b91930c8f947")) (when (featurep! +noter) - (package! org-noter :pin "9ead81d42d")) + (package! org-noter :pin "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d")) (when (featurep! +pomodoro) - (package! org-pomodoro :pin "aa07c11318")) + (package! org-pomodoro :pin "aa07c11318f91219336197e62c47bc7a3d090479")) (when (featurep! +present) (package! centered-window :recipe (:host github :repo "anler/centered-window-mode") - :pin "24f7c5be9d") - (package! org-tree-slide :pin "7bf09a02bd") - (package! org-re-reveal :pin "61549f4c00")) + :pin "f50859941ab5c7cbeaee410f2d38716252b552ac") + (package! org-tree-slide :pin "7bf09a02bd2d8f1ccfcb5209bfb18fbe02d1f44e") + (package! org-re-reveal :pin "61549f4c00284a30e34caa3d76001b233ea5d2ad")) (when (featurep! +roam) - (package! org-roam :pin "963692f353") + (package! org-roam :pin "e698ed7f5378106da8a8fec4537658392157657c") (when (featurep! :completion company) - (package! company-org-roam :pin "0913d86f16"))) + (package! company-org-roam :pin "0913d86f167164e18831206e611f44bb8e7297e3"))) ;;; Babel -(package! ob-async :pin "80a30b96a0") +(package! ob-async :pin "80a30b96a007d419ece12c976a81804ede340311") (when (featurep! :lang crystal) - (package! ob-crystal :pin "d84c1adee4")) + (package! ob-crystal :pin "d84c1adee4b269cdba06a97caedb8071561a09af")) (when (featurep! :lang go) - (package! ob-go :pin "2067ed55f4")) + (package! ob-go :pin "2067ed55f4c1d33a43cb3f6948609d240a8915f5")) (when (featurep! :lang hy) - (package! ob-hy :pin "a42ecaf440")) + (package! ob-hy :pin "a42ecaf440adc03e279afe43ee5ef6093ddd542a")) (when (featurep! :lang nim) - (package! ob-nim :pin "bf1642cb93")) + (package! ob-nim :pin "bf1642cb93f0a898804dc13fd9408d2964403bd2")) (when (featurep! :lang racket) (package! ob-racket :recipe (:host github :repo "DEADB17/ob-racket") - :pin "d8fd51bddb")) + :pin "d8fd51bddb019b0eb68755255f88fc800cfe03cb")) (when (featurep! :lang rest) - (package! ob-restclient :pin "f7449b2068")) + (package! ob-restclient :pin "f7449b2068498fe9d8ab9589e0a638148861533f")) (when (featurep! :lang rust) - (package! ob-rust :pin "6a82587598")) + (package! ob-rust :pin "6a82587598cd097e9642be916243c31f1231b24a")) (when (featurep! :lang scala) - (package! ob-ammonite :pin "39937dff39")) + (package! ob-ammonite :pin "39937dff395e70aff76a4224fa49cf2ec6c57cca")) ;;; Export (when (featurep! +pandoc) - (package! ox-pandoc :pin "aa37dc7e94")) + (package! ox-pandoc :pin "aa37dc7e94213d4ebedb85c384c1ba35007da18e")) (when (featurep! +hugo) (package! ox-hugo :recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t) - :pin "5106b430a1")) + :pin "8f36181977377383cb54803651d93b24e370122d")) (when (featurep! :lang rst) - (package! ox-rst :pin "9158bfd180")) + (package! ox-rst :pin "9158bfd18096c559e0a225ae62ab683f1c98a547")) diff --git a/modules/lang/perl/config.el b/modules/lang/perl/config.el index 9301646b7..aa211f2bc 100644 --- a/modules/lang/perl/config.el +++ b/modules/lang/perl/config.el @@ -2,9 +2,15 @@ ;; There's also `perl-mode' for perl < 6, which is already set up. -(use-package! perl6-detect) + +(use-package! raku-mode + :defer t + :init + (defalias 'perl6-mode #'raku-mode) + :config + (set-repl-handler! 'raku-mode #'run-raku)) -(use-package! flycheck-perl6 +(use-package! flycheck-raku :when (featurep! :checkers syntax) - :after perl6-mode) + :after raku-mode) diff --git a/modules/lang/perl/packages.el b/modules/lang/perl/packages.el index 7c7adfd1d..5be816b9f 100644 --- a/modules/lang/perl/packages.el +++ b/modules/lang/perl/packages.el @@ -1,7 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/perl/packages.el -(package! perl6-mode :pin "88de065795") +(package! raku-mode :pin "d474216840251dc0efe4f4aa4f5c5f66ac26fa74") (when (featurep! :checkers syntax) - (package! flycheck-perl6 :pin "b804702305")) + (package! flycheck-raku + :recipe (:host github :repo "widefox/flycheck-raku") + :pin "046f35abe0c61967157e151126e4dd7ec5d1c004")) diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el index 341191184..2f2424156 100644 --- a/modules/lang/racket/packages.el +++ b/modules/lang/racket/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/racket/packages.el -(package! racket-mode :pin "202cc1b784") +(package! racket-mode :pin "8f3b214a5ea06e6a2a9492e7d20b19badd0c3bdf") diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0abd0522a..125891497 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -22,6 +22,7 @@ (add-hook 'ruby-mode-local-vars-hook #'lsp!)) (after! inf-ruby + (add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h) ;; switch to inf-ruby from compile if we detect a breakpoint has been hit (add-hook 'compilation-filter-hook #'inf-ruby-auto-enter)) @@ -173,6 +174,7 @@ (use-package! projectile-rails :when (featurep! +rails) :hook ((ruby-mode inf-ruby-mode projectile-rails-server-mode) . projectile-rails-mode) + :hook (projectile-rails-server-mode . doom-mark-buffer-as-real-h) :init (setq inf-ruby-console-environment "development") (when (featurep! :lang web) diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index 1c2945cc6..d533bb230 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 "61032eacf0") +(package! rustic :pin "32a962ab2d3f87bde0e12c4e8975fe73d8ba8579") (unless (featurep! +lsp) - (package! racer :pin "a0bdf778f0")) + (package! racer :pin "a0bdf778f01e8c4b8a92591447257422ac0b455b")) diff --git a/modules/lang/scheme/autoload.el b/modules/lang/scheme/autoload.el index 464129d81..47338a66a 100644 --- a/modules/lang/scheme/autoload.el +++ b/modules/lang/scheme/autoload.el @@ -15,15 +15,18 @@ lists properly and names starting with 'default'." (if (and (elt state 2) ;; NOTE looking-at -> looking-at-p (not (looking-at-p "\\sw\\|\\s_"))) - (unless (> (save-excursion (forward-line 1) (point)) - calculate-lisp-indent-last-sexp) - (goto-char calculate-lisp-indent-last-sexp) - (beginning-of-line) - (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) - (backward-prefix-chars) - (current-column) + (progn + ;; NOTE (if (not ...) (progn ...)) -> (unless ... ...) + (unless (> (save-excursion (forward-line 1) (point)) + calculate-lisp-indent-last-sexp) + (goto-char calculate-lisp-indent-last-sexp) + (beginning-of-line) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) + (backward-prefix-chars) + (current-column)) (let* ((function (buffer-substring (point) (progn (forward-sexp 1) (point)))) + ;; NOTE let -> let* & moved `method' def into let bindings (method (or (get (intern-soft function) 'scheme-indent-function) (get (intern-soft function) 'scheme-indent-hook)))) (cond ((or (eq method 'defun) @@ -32,11 +35,12 @@ lists properly and names starting with 'default'." ;; NOTE string-match -> string-match-p ;; NOTE The original regexp is "\\`def" but it will mess ;; indentation with such names as 'default-...'. - (string-match-p "\\`define" function))) + (string-match-p "\\`def" function))) (lisp-indent-defform state indent-point)) ;; NOTE Added this clause to handle alignment of keyword symbols ((and (null method) (> (length function) 1) + ;; NOTE string-match -> string-match-p (string-match-p "\\`:" function)) (let ((lisp-body-indent 1)) (lisp-indent-defform state indent-point))) diff --git a/modules/lang/sh/packages.el b/modules/lang/sh/packages.el index 152e813e5..02c841a71 100644 --- a/modules/lang/sh/packages.el +++ b/modules/lang/sh/packages.el @@ -2,7 +2,7 @@ ;;; lang/sh/packages.el (when (featurep! :completion company) - (package! company-shell :pin "52f3bf26b7")) + (package! company-shell :pin "52f3bf26b74adc30a275f5f4290a1fc72a6876ff")) (when (featurep! +fish) - (package! fish-mode :pin "db257db810")) + (package! fish-mode :pin "db257db81058b0b12f788c324c264cc59b9a5bf4")) diff --git a/modules/lang/solidity/packages.el b/modules/lang/solidity/packages.el index 2f7af778b..4e62183f6 100644 --- a/modules/lang/solidity/packages.el +++ b/modules/lang/solidity/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/solidity/packages.el -(package! solidity-mode :pin "b190993dcb") -(package! company-solidity :pin "b190993dcb") -(package! solidity-flycheck :pin "b190993dcb") +(package! solidity-mode :pin "022b3159832384a7dcdc2168809e698600826047") +(package! company-solidity) +(package! solidity-flycheck) diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index 4057cab08..186bbb800 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/swift/packages.el -(package! swift-mode :pin "1268425311") +(package! swift-mode :pin "2ab9ea1784a12a482ed9e3fb284b7a7658f40fff") (if (featurep! +lsp) - (package! lsp-sourcekit :pin "04d75b6a0b") + (package! lsp-sourcekit :pin "04d75b6a0be5894fea4a55fec0b2ccedf5b3be58") (when (featurep! :completion company) - (package! company-sourcekit :pin "abf9bc5a01")) + (package! company-sourcekit :pin "abf9bc5a0102eb666d3aa6d6bf22f6efcc852781")) (when (featurep! :checkers syntax) - (package! flycheck-swift :pin "4c5ad40125"))) + (package! flycheck-swift :pin "4c5ad401252400a78da395fd56a71e67ff8c2761"))) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 150b5a655..c3d73481c 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -162,4 +162,6 @@ (when (featurep! +lsp) - (add-hook! '(html-mode-hook web-mode-hook) #'lsp!)) + (add-hook! '(html-mode-local-vars-hook + web-mode-local-vars-hook) + #'lsp!)) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index ac223e21b..bb6883894 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -2,23 +2,23 @@ ;;; lang/web/packages.el ;; +html.el -(package! emmet-mode :pin "1acb821e01") -(package! haml-mode :pin "bf5b6c11b1") -(package! pug-mode :pin "685fd3414d") -(package! slim-mode :pin "3636d18ab1") -(when (package! web-mode :pin "b0bb4ab82b") +(package! emmet-mode :pin "1acb821e0142136344ccf40c1e5fb664d7db2e70") +(package! haml-mode :pin "bf5b6c11b1206759d2b28af48765e04882dd1fc4") +(package! pug-mode :pin "685fd3414d89736bf232f5d1a6bed9e0353b98fe") +(package! slim-mode :pin "3636d18ab1c8b316eea71c4732eb44743e2ded87") +(when (package! web-mode :pin "6774c596a9b3988989d3bc96b6194e6f0df1d1b6") (when (featurep! :completion company) - (package! company-web :pin "f0cc9187c9"))) + (package! company-web :pin "f0cc9187c9c34f72ad71f5649a69c74f996bae9a"))) ;; +css.el (package! css-mode :built-in t) -(package! less-css-mode :built-in t :pin "c7fa3d56d8") +(package! less-css-mode :built-in t :pin "c7fa3d56d83206b28657f2e56439dc62280a2bf2") -(package! sass-mode :pin "247a0d4b50") -(package! stylus-mode :pin "4dbde92542") -(package! sws-mode :pin "4dbde92542") -(package! rainbow-mode :pin "3ef813d637") +(package! sass-mode :pin "247a0d4b509f10b28e4687cd8763492bca03599b") +(package! stylus-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e") +(package! sws-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e") +(package! rainbow-mode :pin "f780ddb18c2a73a666d093f606df92058e5601ea") (when (featurep! :completion ivy) - (package! counsel-css :pin "61a38c9d50")) + (package! counsel-css :pin "6427dfcbda0d2bbd81db03f9d6b56b06c260ac02")) (when (featurep! :completion helm) - (package! helm-css-scss :pin "48b996f73a")) + (package! helm-css-scss :pin "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3")) diff --git a/modules/term/eshell/packages.el b/modules/term/eshell/packages.el index 1ca415927..61da48f63 100644 --- a/modules/term/eshell/packages.el +++ b/modules/term/eshell/packages.el @@ -1,12 +1,12 @@ ;; -*- no-byte-compile: t; -*- ;;; term/eshell/packages.el -(package! eshell-up :pin "9c100bae5c") -(package! eshell-z :pin "337cb241e1") -(package! shrink-path :pin "c14882c859") -(package! esh-help :pin "417673ed18") -(package! eshell-did-you-mean :pin "7cb6ef8e22") +(package! eshell-up :pin "9c100bae5c3020e8d9307e4332d3b64e7dc28519") +(package! eshell-z :pin "337cb241e17bd472bd3677ff166a0800f684213c") +(package! shrink-path :pin "c14882c8599aec79a6e8ef2d06454254bb3e1e41") +(package! esh-help :pin "417673ed18a983930a66a6692dbfb288a995cb80") +(package! eshell-did-you-mean :pin "7cb6ef8e2274d0a50a9e114d412307a6543533d5") (when (featurep! :completion company) - (package! fish-completion :pin "1038488181") - (package! bash-completion :pin "96ce14af96")) + (package! fish-completion :pin "10384881817b5ae38cf6197a077a663420090d2c") + (package! bash-completion :pin "96ce14af9674f3e605bacca87abc0c23b8f13cd5")) diff --git a/modules/term/term/packages.el b/modules/term/term/packages.el index f98aec986..b55cfc41c 100644 --- a/modules/term/term/packages.el +++ b/modules/term/term/packages.el @@ -2,4 +2,4 @@ ;;; term/term/packages.el (package! term :built-in t) -(package! multi-term :pin "7307ddd456") +(package! multi-term :pin "7307ddd456db44045206253e5a905d3d8c143d5c") diff --git a/modules/term/vterm/packages.el b/modules/term/vterm/packages.el index de92a1673..e048a3b01 100644 --- a/modules/term/vterm/packages.el +++ b/modules/term/vterm/packages.el @@ -3,4 +3,4 @@ (package! vterm :built-in 'prefer - :pin "aa512b8351") + :pin "e63bd65eece7c5de3a534b7e2fdbe58256ec2da0") diff --git a/modules/tools/ansible/packages.el b/modules/tools/ansible/packages.el index 6ec7c4341..3378a9076 100644 --- a/modules/tools/ansible/packages.el +++ b/modules/tools/ansible/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/ansible/packages.el -(package! ansible :recipe (:nonrecursive t) :pin "c6532e5216") -(package! ansible-doc :pin "86083a7bb2") -(package! jinja2-mode :pin "cfaa7bbe7b") -(package! yaml-mode :pin "cecf4b106b") +(package! ansible :recipe (:nonrecursive t) :pin "c6532e52161a381ed3dddfeaa7c92ae636d3f052") +(package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") +(package! jinja2-mode :pin "cfaa7bbe7bb290cc500440124ce89686f3e26f86") +(package! yaml-mode :pin "cecf4b106b0c4236931b14919fdf87ff3546e2c9") (when (featurep! :completion company) - (package! company-ansible :pin "79dd421b16")) + (package! company-ansible :pin "79dd421b161efa49fbdffad57fa40edb41f484a3")) diff --git a/modules/tools/debugger/packages.el b/modules/tools/debugger/packages.el index 9321e25fb..c94117531 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 "b854e040e0") +(when (package! realgud :pin "e03446f54c7ee0b4ed3ec7300597046cf1de2bb8") (when (featurep! :lang javascript) - (package! realgud-trepan-ni :pin "6e9cac5e80"))) + (package! realgud-trepan-ni :pin "6e9cac5e8097018aadf41c88de541168036cc227"))) (when (featurep! +lsp) - (package! dap-mode :pin "0b9c8f28ad") - (package! posframe :pin "e62e584268")) + (package! dap-mode :pin "04d7e967f21a0ab1e2223e528baf55fe5b663882") + (package! posframe :pin "093b29a53cbeda6d637ccc9ef4dfc47123e79b9e")) diff --git a/modules/tools/direnv/packages.el b/modules/tools/direnv/packages.el index ff4716f38..1424dc52c 100644 --- a/modules/tools/direnv/packages.el +++ b/modules/tools/direnv/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/direnv/packages.el -(package! direnv :pin "1daf479b9b") +(package! direnv :pin "1daf479b9b7600ce9681f2a980deae7fcb2f3d59") diff --git a/modules/tools/docker/packages.el b/modules/tools/docker/packages.el index a40c377f1..f7bab25dd 100644 --- a/modules/tools/docker/packages.el +++ b/modules/tools/docker/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/docker/packages.el -(package! docker :pin "a2092b3b17") -(package! docker-tramp :pin "8e2b671eff") -(package! dockerfile-mode :pin "d31f7685eb") +(package! docker :pin "08745207332d940130a2357eb5c5e00fd88bd6af") +(package! docker-tramp :pin "8e2b671eff7a81af43b76d9dfcf94ddaa8333a23") +(package! dockerfile-mode :pin "d31f7685ebc5832d957e25070a930aa42984327d") diff --git a/modules/tools/editorconfig/packages.el b/modules/tools/editorconfig/packages.el index a1d8ad9ff..0d35f6195 100644 --- a/modules/tools/editorconfig/packages.el +++ b/modules/tools/editorconfig/packages.el @@ -3,4 +3,4 @@ (package! editorconfig :recipe (:nonrecursive t) - :pin "19de0ec1ba") + :pin "19de0ec1bac67c5a76a4dd3d8ffe6c5411ace1af") diff --git a/modules/tools/ein/packages.el b/modules/tools/ein/packages.el index 0e53a4f1d..a9a9325b4 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 "1322d8c7f8") +(package! ein :pin "42134adf3c95b7768e2d725bab39ddb98feafa09") diff --git a/modules/tools/eval/packages.el b/modules/tools/eval/packages.el index aed6e4482..dfdbc665b 100644 --- a/modules/tools/eval/packages.el +++ b/modules/tools/eval/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/eval/packages.el -(package! quickrun :pin "50e07e7698") +(package! quickrun :pin "2e37ce9e4b13359344dbd67fbfd7e39d46b2c6b6") (when (featurep! +overlay) - (package! eros :pin "dd89102792")) + (package! eros :pin "dd8910279226259e100dab798b073a52f9b4233a")) diff --git a/modules/tools/gist/packages.el b/modules/tools/gist/packages.el index 44680cb30..f8a971d9f 100644 --- a/modules/tools/gist/packages.el +++ b/modules/tools/gist/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/gist/packages.el -(package! gist :pin "314fe6ab80") +(package! gist :pin "314fe6ab80fae35b95f0734eceb82f72813b6f41") diff --git a/modules/tools/lookup/packages.el b/modules/tools/lookup/packages.el index 0206f4c1f..e42c7449d 100644 --- a/modules/tools/lookup/packages.el +++ b/modules/tools/lookup/packages.el @@ -8,32 +8,32 @@ (package! helm)) ;; -(package! dumb-jump :pin "d760aa880f") +(package! dumb-jump :pin "d760aa880fc1052570ab0fd7e586eeffb7636af6") (when (featurep! :completion ivy) - (package! ivy-xref :pin "3d4c35fe2b")) + (package! ivy-xref :pin "3d4c35fe2b243d948d8fe02a1f0d76a249d63de9")) (when (featurep! :completion helm) - (package! helm-xref :pin "6b4a8bd91f")) + (package! helm-xref :pin "6b4a8bd91f5eaf82f51bd31b03f6587387fe6983")) ;; For dictionary and online lookup -(package! request :pin "216d570a58") +(package! request :pin "216d570a58d05ef1307edb63d2539bafa5f688c6") (when (featurep! +docsets) - (package! dash-docs :pin "111fd9b970") + (package! dash-docs :pin "111fd9b97001f1ad887b45e5308a14ddd68ce70a") (when (featurep! :completion helm) - (package! helm-dash :pin "7f853bd34d")) + (package! helm-dash :pin "7f853bd34da666f0e9a883011c80f451b06f6c59")) (when (featurep! :completion ivy) - (package! counsel-dash :pin "370d5f6f14"))) + (package! counsel-dash :pin "370d5f6f14b5294d0eb717f7b2a6a8e93df1ed24"))) (when (featurep! +dictionary) (if IS-MAC - (package! osx-dictionary :pin "1b79ff64c7") - (package! define-word :pin "08c71b1ff4") + (package! osx-dictionary :pin "1b79ff64c72485cb078db9ab7ee3256b11a99f4b") + (package! define-word :pin "08c71b1ff4fd07bf0c78d1fcf77efeaafc8f7443") ;; HACK Fix #2945: the main package is broken (see ;; SavchenkoValeriy/emacs-powerthesaurus). We use this fork until it is ;; merged. (package! powerthesaurus :recipe (:host github :repo "maxchaos/emacs-powerthesaurus" :branch "pt-api-change") - :pin "81a262ec0c") + :pin "4a834782a394f2dc70fc02d68b6962b44d87f0cf") (when (featurep! +offline) - (package! wordnut :pin "feac531404") - (package! synosaurus :pin "14d34fc92a")))) + (package! wordnut :pin "feac531404041855312c1a046bde7ea18c674915") + (package! synosaurus :pin "14d34fc92a77c3a916b4d58400424c44ae99cd81")))) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index 3c4aabfaf..51f18346e 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -1,21 +1,5 @@ ;;; tools/lsp/config.el -*- lexical-binding: t; -*- -(defvar +lsp-company-backend 'company-lsp - "What backend to use for lsp-driven autocompletion. - -This can be overridden by `+lsp-capf-blacklist'. - -While `company-capf' does not require the `company-lsp' package and should offer -better performance, it has been integrated into lsp only recently and as of -02/25/2020 is known to cause issues with some language servers. If you wish to -use `company-capf' in general but fall back to `company-lsp' for specific -language servers, set `+lsp-company-backend' to `company-capf' and add the -excluded servers' identifiers to `+lsp-capf-blacklist'.") - -(defvar +lsp-capf-blacklist '(ts-ls gopls) - "Language servers listed here will always use the `company-lsp' backend, -irrespective of what `+lsp-company-backend' is set to.") - (defvar +lsp-defer-shutdown 3 "If non-nil, defer shutdown of LSP servers for this many seconds after last workspace buffer is closed. @@ -40,9 +24,12 @@ working on that project after closing the last buffer.") (setq lsp-flycheck-live-reporting nil) ;; For `lsp-clients' (setq lsp-server-install-dir (concat doom-etc-dir "lsp/") - lsp-groovy-server-install-dir (concat lsp-server-install-dir "lsp-groovy/") lsp-intelephense-storage-path (concat doom-cache-dir "lsp-intelephense/")) + (when (featurep! :config default +bindings) + ;; Let doom bind the lsp keymap. + (setq lsp-keymap-prefix nil)) + ;; Disable LSP's superfluous, expensive and/or debatably unnecessary features. ;; Some servers implement these poorly. Better to just rely on Emacs' native ;; mechanisms and make these opt-in. @@ -58,7 +45,9 @@ working on that project after closing the last buffer.") lsp-enable-semantic-highlighting nil ;; Don't modify our code without our permission lsp-enable-indentation nil - lsp-enable-on-type-formatting nil) + lsp-enable-on-type-formatting nil + ;; capf is the preferred completion mechanism for lsp-mode now + lsp-prefer-capf t) :config (set-popup-rule! "^\\*lsp-help" :size 0.35 :quit t :select t) @@ -114,30 +103,20 @@ This also logs the resolved project root, if found, so we know where we are." (lambda (it) (format "[%s]" (lsp--workspace-print it))) lsp--buffer-workspaces)))))) + (when (featurep! :config default +bindings) + (dolist (leader-key (list doom-leader-key doom-leader-alt-key)) + (let ((lsp-keymap-prefix (concat leader-key " c l"))) + (lsp-enable-which-key-integration)))) + (add-hook! 'lsp-mode-hook (defun +lsp-init-company-h () (if (not (bound-and-true-p company-mode)) (add-hook 'company-mode-hook #'+lsp-init-company-h t t) - (let ((preferred-backend +lsp-company-backend)) - (lsp-foreach-workspace - (when (memq (lsp--client-server-id (lsp--workspace-client lsp--cur-workspace)) - +lsp-capf-blacklist) - (setq preferred-backend 'company-lsp))) - (if (eq 'company-capf preferred-backend) - ;; use capf backend - (progn - (setq-local lsp-enable-completion-at-point t) - (setq-local lsp-prefer-capf t) - (setq-local company-backends - (cons 'company-capf (remq 'company-capf company-backends)))) - ;; use company-lsp backend (may need to be loaded first) - (require 'company-lsp) - (setq-local lsp-enable-completion-at-point nil) - (setq-local lsp-prefer-capf nil) - (setq-local company-backends - (cons 'company-lsp (remq 'company-capf company-backends))) - (setq-default company-lsp-cache-candidates 'auto)) - (remove-hook 'company-mode-hook #'+lsp-init-company-h t)))) + ;; Ensure `company-capf' is at the front of `company-backends' + (setq-local company-backends + (cons 'company-capf + (remq 'company-capf company-backends))) + (remove-hook 'company-mode-hook #'+lsp-init-company-h t))) (defun +lsp-init-flycheck-or-flymake-h () "Set up flycheck-mode or flymake-mode, depending on `lsp-diagnostic-package'." (pcase lsp-diagnostic-package @@ -213,39 +192,6 @@ auto-killed (which is a potentially expensive process)." :references 'lsp-ui-peek-find-references))) -(use-package! company-lsp - :defer t - :config - (setq company-lsp-cache-candidates 'auto) - ;; HACK Fix tigersoldier/company-lsp#128 causing company-lsp results to - ;; display candidates that are unrelated to the prefix. Source: - ;; emacs-lsp/lsp-python-ms#79 - (add-to-list 'company-lsp-filter-candidates '(mspyls . t)) - (defadvice! +company---fix-lsp-caching-on-competion-a (response prefix) - :override #'company-lsp--on-completion - (let* ((incomplete (and (hash-table-p response) (gethash "isIncomplete" response))) - (items (cond ((hash-table-p response) (gethash "items" response)) - ((sequencep response) response))) - (candidates (mapcar (lambda (item) - (company-lsp--make-candidate item prefix)) - (lsp--sort-completions items))) - (server-id (lsp--client-server-id (lsp--workspace-client lsp--cur-workspace))) - (should-filter (or - ;; CHANGE BEGIN - (eq company-lsp-cache-candidates t) - ;; CHANGE END - (and (null company-lsp-cache-candidates) - (company-lsp--get-config company-lsp-filter-candidates server-id))))) - (when (null company-lsp--completion-cache) - (add-hook 'company-completion-cancelled-hook #'company-lsp--cleanup-cache nil t) - (add-hook 'company-completion-finished-hook #'company-lsp--cleanup-cache nil t)) - (when (eq company-lsp-cache-candidates 'auto) - (company-lsp--cache-put prefix (company-lsp--cache-item-new candidates incomplete))) - (if should-filter - (company-lsp--filter-candidates candidates prefix) - candidates)))) - - (use-package! helm-lsp :when (featurep! :completion helm) :commands helm-lsp-workspace-symbol helm-lsp-global-workspace-symbol) diff --git a/modules/tools/lsp/packages.el b/modules/tools/lsp/packages.el index 29c0649a0..095d2c798 100644 --- a/modules/tools/lsp/packages.el +++ b/modules/tools/lsp/packages.el @@ -1,11 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/lsp/packages.el -(package! lsp-mode :pin "4898d35ace") -(package! lsp-ui :pin "242dfe859c") -(when (featurep! :completion company) - (package! company-lsp :pin "f921ffa0cd")) +(package! lsp-mode :pin "941e6062a5b407675e13ba471e9878f4a2dbd10e") +(package! lsp-ui :pin "43f71e3837b07f377444ad631b12f8198c495aa7") (when (featurep! :completion ivy) - (package! lsp-ivy :pin "81e81ced99")) + (package! lsp-ivy :pin "81e81ced99829358674c5a6bbe2c3e15cecd4ed8")) (when (featurep! :completion helm) - (package! helm-lsp :pin "db243993ea")) + (package! helm-lsp :pin "6b5ce182d7c94c62b55b8f7d0c7e643b2c30e560")) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 97ac695ce..f1bd7253d 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(when (package! magit :pin "8de6ecf5c5") +(when (package! magit :pin "d27d6e467857ed4a78c7cf7d609561df789e2a6c") (when (featurep! +forge) - (package! forge :pin "e2da80660a")) - (package! magit-gitflow :pin "cc41b561ec") - (package! magit-todos :pin "a0e5d1f3c7") - (package! github-review :pin "50c6bcc7cf") + (package! forge :pin "e2da80660a0550f613400ce3b238025589800417")) + (package! magit-gitflow :pin "cc41b561ec6eea947fe9a176349fb4f771ed865b") + (package! magit-todos :pin "a0e5d1f3c7dfcb4f18c1b0d57f1746a4872df5c6") + (package! github-review :pin "50c6bcc7cf4d7193577b3f74eea4dd72f2b7795b") (when (featurep! :editor evil +everywhere) - (package! evil-magit :pin "253c644807"))) + (package! evil-magit :pin "253c644807013fe92429acdef418748794b8f254"))) diff --git a/modules/tools/make/packages.el b/modules/tools/make/packages.el index d389186b5..815c945d3 100644 --- a/modules/tools/make/packages.el +++ b/modules/tools/make/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/make/packages.el -(package! makefile-executor :pin "9a7d78f814") +(package! makefile-executor :pin "9a7d78f814a4b372d8f8179819cb1b37b83b1973") diff --git a/modules/tools/pass/packages.el b/modules/tools/pass/packages.el index f998eb0e1..6f9dea011 100644 --- a/modules/tools/pass/packages.el +++ b/modules/tools/pass/packages.el @@ -1,17 +1,17 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/pass/packages.el -(package! pass :pin "919d8e3826") -(package! password-store :pin "88936b11af") -(package! password-store-otp :pin "04998c8578") +(package! pass :pin "919d8e3826d556433ab67d4ee21a509d209d1baa") +(package! password-store :pin "07b169ec32ad6961ed8625a0b932a663abcb01d2") +(package! password-store-otp :pin "04998c8578a060ab4a4e8f46f2ee0aafad4ab4d5") ;; an older version of `auto-source-pass' is built into Emacs 26+, so we must ;; install the new version directly from the source and with a psuedonym. (package! auth-source-pass :recipe (:host github :repo "DamienCassou/auth-password-store") - :pin "ff4940c647") + :pin "ff4940c647786914b3cbef69103d96a4ea334111") (when (featurep! :completion ivy) - (package! ivy-pass :pin "5b523de115")) + (package! ivy-pass :pin "5b523de1151f2109fdd6a8114d0af12eef83d3c5")) (when (featurep! :completion helm) - (package! helm-pass :pin "ed5798f2d8")) + (package! helm-pass :pin "ed5798f2d83937575e8f23fde33323bca9e85131")) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 99956fdea..b1c74e782 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -33,12 +33,10 @@ :around '(pdf-annot-show-annotation pdf-isearch-hl-matches pdf-view-display-region) - (cl-letf* ((old-create-image (symbol-function #'create-image)) - ((symbol-function #'create-image) - (lambda (file-or-data &optional type data-p &rest props) - (apply old-create-image file-or-data type data-p - :width (car (pdf-view-image-size)) - props)))) + (letf! (defun create-image (file-or-data &optional type data-p &rest props) + (apply create-image file-or-data type data-p + :width (car (pdf-view-image-size)) + props)) (apply orig-fn args)))) ;; Handle PDF-tools related popups better diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el index 06ef963d3..046c2ea84 100644 --- a/modules/tools/pdf/packages.el +++ b/modules/tools/pdf/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/pdf/packages.el -(package! pdf-tools :pin "0159cb1ab3") +(package! pdf-tools :pin "d9712989fc4715443f674459199bdffa987054ac") diff --git a/modules/tools/prodigy/packages.el b/modules/tools/prodigy/packages.el index edb10f54c..57dc56a4f 100644 --- a/modules/tools/prodigy/packages.el +++ b/modules/tools/prodigy/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/prodigy/packages.el -(package! prodigy :pin "6ae71f27b0") +(package! prodigy :pin "6ae71f27b09b172f03fb55b9eeef001206baacd3") diff --git a/modules/tools/rgb/packages.el b/modules/tools/rgb/packages.el index 22b018737..d916da671 100644 --- a/modules/tools/rgb/packages.el +++ b/modules/tools/rgb/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/rgb/packages.el -(package! rainbow-mode :pin "3ef813d637") -(package! kurecolor :pin "3fc84840cb") +(package! rainbow-mode :pin "f780ddb18c2a73a666d093f606df92058e5601ea") +(package! kurecolor :pin "3fc84840cbbd75e646cafa2fd3a00004b55e37ec") diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index 25156c92e..a7452abef 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 "2967e7bdc0") +(package! terraform-mode :pin "2967e7bdc05d15617e121052f6e43c61439b9070") (when (featurep! :completion company) - (package! company-terraform :pin "2d11a21fee")) + (package! company-terraform :pin "2d11a21fee2f298e48968e479ddcaeda4d736e12")) diff --git a/modules/tools/upload/packages.el b/modules/tools/upload/packages.el index 4925d1306..d26bd9346 100644 --- a/modules/tools/upload/packages.el +++ b/modules/tools/upload/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/upload/packages.el -(package! ssh-deploy :pin "1bb2f821d4") +(package! ssh-deploy :pin "1bb2f821d4a78d483c147759348a29531486cdc4") diff --git a/modules/ui/deft/packages.el b/modules/ui/deft/packages.el index 18bf7ee99..aa7be392e 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 "f54e8a65a7") +(package! deft :pin "f54e8a65a7e75a029657364055420374df45656d") diff --git a/modules/ui/doom/packages.el b/modules/ui/doom/packages.el index 46e44fbbc..b6e2ac273 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 "8d5ddbbb72") -(package! solaire-mode :pin "adc8c0c60d") +(package! doom-themes :pin "254d476dd6790eaa6b563c5a4da286321ff75d38") +(package! solaire-mode :pin "adc8c0c60d914f6395eba0bee78feedda128b30b") diff --git a/modules/ui/fill-column/packages.el b/modules/ui/fill-column/packages.el index 24adf3078..75c23a2ef 100644 --- a/modules/ui/fill-column/packages.el +++ b/modules/ui/fill-column/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/fill-column/packages.el -(package! hl-fill-column :pin "43cb3c35a9") +(package! hl-fill-column :pin "43cb3c35a92c912b7205b8a36f1ad0ec0a5b4a22") diff --git a/modules/ui/hl-todo/packages.el b/modules/ui/hl-todo/packages.el index 05ef85835..d83551c7d 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 "3bba4591c5") +(package! hl-todo :pin "3bba4591c54951d2abab113ec5e58a6319808ca9") diff --git a/modules/ui/hydra/packages.el b/modules/ui/hydra/packages.el index 539cf3928..782bde9a5 100644 --- a/modules/ui/hydra/packages.el +++ b/modules/ui/hydra/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/hydra/packages.el -(package! hydra :pin "16fa8d109e") +(package! hydra :pin "16fa8d109ec5799931a793b2e866ea9d593bee84") diff --git a/modules/ui/indent-guides/packages.el b/modules/ui/indent-guides/packages.el index 3a6856a27..dab8cc821 100644 --- a/modules/ui/indent-guides/packages.el +++ b/modules/ui/indent-guides/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/indent-guides/packages.el -(package! highlight-indent-guides :pin "1b12c7b440") +(package! highlight-indent-guides :pin "1b12c7b440ff988c7237936187c1375ac4ddc7f4") diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 2450f9e69..1ecaf6403 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -45,7 +45,7 @@ (defvar mouse-wheel-down-event nil) (defvar mouse-wheel-up-event nil) - (add-hook 'doom-change-font-size-hook #'+modeline-resize-for-font-h) + (add-hook 'after-setting-font-hook #'+modeline-resize-for-font-h) (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el index f9427d43e..8e843630b 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 "c177959bbf")) -(package! anzu :pin "3e34fb3df5") + (package! doom-modeline :pin "c177959bbfa7fa6f199b1145c6986e55f462f1c1")) +(package! anzu :pin "3e34fb3df53c0c68e842fa179c327a7395d1901d") (when (featurep! :editor evil) - (package! evil-anzu :pin "9bca6ca14d")) + (package! evil-anzu :pin "9bca6ca14d865e7e005bc02a28a09b4ae74facc9")) diff --git a/modules/ui/nav-flash/packages.el b/modules/ui/nav-flash/packages.el index 12e2a5a1f..3cc02ee6e 100644 --- a/modules/ui/nav-flash/packages.el +++ b/modules/ui/nav-flash/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/nav-flash/packages.el -(package! nav-flash :pin "dbb9121663") +(package! nav-flash :pin "dbb91216637e0a1e8bfd59aa883c75d45db70daf") diff --git a/modules/ui/neotree/packages.el b/modules/ui/neotree/packages.el index 7cf6041ab..77fc8ff45 100644 --- a/modules/ui/neotree/packages.el +++ b/modules/ui/neotree/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/neotree/packages.el -(package! neotree :pin "98fe21334a") +(package! neotree :pin "5e1271655170f4cdc6849258e383c548a4e6e3d0") diff --git a/modules/ui/ophints/packages.el b/modules/ui/ophints/packages.el index 000154257..3070cc9fb 100644 --- a/modules/ui/ophints/packages.el +++ b/modules/ui/ophints/packages.el @@ -2,5 +2,5 @@ ;;; ui/ophints/packages.el (if (featurep! :editor evil) - (package! evil-goggles :pin "08a22058fd") - (package! volatile-highlights :pin "9a20091f0c")) + (package! evil-goggles :pin "08a22058fd6a167f9f1b684c649008caef571459") + (package! volatile-highlights :pin "9a20091f0ce7fc0a6b3e641a6a46d5f3ac4d8392")) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index d6cd059c3..7cc0573c7 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -195,20 +195,18 @@ the command buffer." ;; Fix #897: "cannot open side window" error when TAB-completing file links (defadvice! +popup--helm-hide-org-links-popup-a (orig-fn &rest args) :around #'org-insert-link - (cl-letf* ((old-org-completing-read (symbol-function 'org-completing-read)) - ((symbol-function 'org-completing-read) - (lambda (&rest args) - (when-let (win (get-buffer-window "*Org Links*")) - ;; While helm is opened as a popup, it will mistaken the - ;; *Org Links* popup for the "originated window", and will - ;; target it for actions invoked by the user. However, since - ;; *Org Links* is a popup too (they're dedicated side - ;; windows), Emacs complains about being unable to split a - ;; side window. The simple fix: get rid of *Org Links*! - (delete-window win) - ;; But it must exist for org to clean up later. - (get-buffer-create "*Org Links*")) - (apply old-org-completing-read args)))) + (letf! ((defun org-completing-read (&rest args) + (when-let (win (get-buffer-window "*Org Links*")) + ;; While helm is opened as a popup, it will mistaken the *Org + ;; Links* popup for the "originated window", and will target it + ;; for actions invoked by the user. However, since *Org Links* + ;; is a popup too (they're dedicated side windows), Emacs + ;; complains about being unable to split a side window. The + ;; simple fix: get rid of *Org Links*! + (delete-window win) + ;; ...but it must exist for org to clean up later. + (get-buffer-create "*Org Links*")) + (apply org-completing-read args))) (apply #'funcall-interactively orig-fn args))) ;; Fix left-over popup window when closing persistent help for `helm-M-x' @@ -228,7 +226,6 @@ the command buffer." (when (+popup-window-p win) (select-window win)))) - ;;;###package org (after! org ;; Org has a scorched-earth window management policy I'm not fond of. i.e. it @@ -242,10 +239,8 @@ the command buffer." org-fast-tag-selection org-fast-todo-selection) (if +popup-mode - (cl-letf (((symbol-function #'delete-other-windows) - (symbol-function #'ignore)) - ((symbol-function #'delete-window) - (symbol-function #'ignore))) + (letf! ((#'delete-other-windows #'ignore) + (#'delete-window #'ignore)) (apply orig-fn args)) (apply orig-fn args))) @@ -256,16 +251,14 @@ Ugh, such an ugly hack." :around '(org-fast-tag-selection org-fast-todo-selection) (if +popup-mode - (cl-letf* ((old-fit-buffer-fn (symbol-function #'org-fit-window-to-buffer)) - ((symbol-function #'org-fit-window-to-buffer) - (lambda (&optional window max-height min-height shrink-only) - (when-let (buf (window-buffer window)) - (delete-window window) - (select-window - (setq window (display-buffer-at-bottom buf nil))) - (with-current-buffer buf - (setq mode-line-format nil))) - (funcall old-fit-buffer-fn window max-height min-height shrink-only)))) + (letf! ((defun org-fit-window-to-buffer (&optional window max-height min-height shrink-only) + (when-let (buf (window-buffer window)) + (delete-window window) + (select-window + (setq window (display-buffer-at-bottom buf nil))) + (with-current-buffer buf + (setq mode-line-format nil))) + (funcall org-fit-window-to-buffer window max-height min-height shrink-only))) (apply orig-fn args)) (apply orig-fn args))) @@ -284,8 +277,7 @@ Ugh, such an ugly hack." ;; _then_ hand off the buffer to the pop up manager. (defadvice! +popup--org-src-switch-to-buffer-a (orig-fn &rest args) :around #'org-src-switch-to-buffer - (cl-letf (((symbol-function #'pop-to-buffer-same-window) - (symbol-function #'switch-to-buffer))) + (letf! ((#'pop-to-buffer-same-window #'switch-to-buffer)) (apply orig-fn args)))) @@ -316,8 +308,7 @@ Ugh, such an ugly hack." ;;;###package profiler (defadvice! +popup--profiler-report-find-entry-in-other-window-a (orig-fn function) :around #'profiler-report-find-entry - (cl-letf (((symbol-function 'find-function) - (symbol-function 'find-function-other-window))) + (letf! ((#'find-function #'find-function-other-window)) (funcall orig-fn function))) @@ -337,10 +328,9 @@ Ugh, such an ugly hack." which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window which-key-custom-show-popup-function (lambda (act-popup-dim) - (cl-letf (((symbol-function 'display-buffer-in-side-window) - (lambda (buffer alist) - (+popup-display-buffer-stacked-side-window-fn - buffer (append '((vslot . -9999)) alist))))) + (letf! ((defun display-buffer-in-side-window (buffer alist) + (+popup-display-buffer-stacked-side-window-fn + buffer (append '((vslot . -9999)) alist)))) ;; HACK Fix #2219 where the which-key popup would get cut off. (setcar act-popup-dim (1+ (car act-popup-dim))) (which-key--show-buffer-side-window act-popup-dim)))))) @@ -351,9 +341,8 @@ Ugh, such an ugly hack." (defadvice! +popup--ignore-window-parameters-a (orig-fn &rest args) "Allow *interactive* window moving commands to traverse popups." :around '(windmove-up windmove-down windmove-left windmove-right) - (cl-letf (((symbol-function #'windmove-find-other-window) - (lambda (dir &optional arg window) - (window-in-direction - (pcase dir (`up 'above) (`down 'below) (_ dir)) - window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) + (letf! ((defun windmove-find-other-window (dir &optional arg window) + (window-in-direction + (pcase dir (`up 'above) (`down 'below) (_ dir)) + window (bound-and-true-p +popup-mode) arg windmove-wrap-around t))) (apply orig-fn args))) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 34279daea..aeb35884e 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -436,13 +436,14 @@ window and return that window." (defun +popup/diagnose () "Reveal what popup rule will be used for the current buffer." (interactive) - (or (cl-loop with bname = (buffer-name) - for (pred . action) in display-buffer-alist - if (and (functionp pred) (funcall pred bname action)) - return (cons pred action) - else if (and (stringp pred) (string-match-p pred bname)) - return (cons pred action)) - (message "No popup rule for this buffer"))) + (if-let (rule (cl-loop with bname = (buffer-name) + for (pred . action) in display-buffer-alist + if (and (functionp pred) (funcall pred bname action)) + return (cons pred action) + else if (and (stringp pred) (string-match-p pred bname)) + return (cons pred action))) + (message "Rule matches: %s" rule) + (message "No popup rule for this buffer"))) ;; diff --git a/modules/ui/pretty-code/+fira.el b/modules/ui/pretty-code/+fira.el index f1983a99d..b92f30f3c 100644 --- a/modules/ui/pretty-code/+fira.el +++ b/modules/ui/pretty-code/+fira.el @@ -118,7 +118,7 @@ ("*" . #Xe16f))) (defun +pretty-code-setup-fira-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-fira-code-font-name) + (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-fira-code-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist (mapcar #'+pretty-code--correct-symbol-bounds diff --git a/modules/ui/pretty-code/+hasklig.el b/modules/ui/pretty-code/+hasklig.el index 7b2136ca6..e9d040704 100644 --- a/modules/ui/pretty-code/+hasklig.el +++ b/modules/ui/pretty-code/+hasklig.el @@ -49,7 +49,7 @@ (defun +pretty-code-setup-hasklig-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe129) +pretty-code-hasklig-font-name) + (set-fontset-font t '(#Xe100 . #Xe129) +pretty-code-hasklig-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist (mapcar #'+pretty-code--correct-symbol-bounds diff --git a/modules/ui/pretty-code/+iosevka.el b/modules/ui/pretty-code/+iosevka.el index 315dbd754..9d52fd818 100644 --- a/modules/ui/pretty-code/+iosevka.el +++ b/modules/ui/pretty-code/+iosevka.el @@ -224,7 +224,7 @@ "Defines the character mappings for ligatures for Iosevka.") (defun +pretty-code-setup-iosevka-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe1cc) +pretty-code-iosevka-font-name) + (set-fontset-font t '(#Xe100 . #Xe1cc) +pretty-code-iosevka-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist +pretty-code-iosevka-font-ligatures))) diff --git a/modules/ui/pretty-code/README.org b/modules/ui/pretty-code/README.org index d22e506f7..ef04c37d9 100644 --- a/modules/ui/pretty-code/README.org +++ b/modules/ui/pretty-code/README.org @@ -7,9 +7,15 @@ - [[#description][Description]] - [[#maintainers][Maintainers]] - [[#module-flags][Module Flags]] + - [[#font-ligatures-module-flags][Font ligatures module flags]] - [[#plugins][Plugins]] - [[#prerequisites][Prerequisites]] + - [[#ligatures][Ligatures]] + - [[#emacs-mac-port-or-emacs-28][Emacs-mac port or Emacs 28+]] + - [[#not-emacs-mac-and-emacs--27][Not Emacs-mac and Emacs <= 27]] - [[#features][Features]] + - [[#mathematical-symbols-replacement][Mathematical symbols replacement]] + - [[#coding-ligatures][Coding ligatures]] - [[#configuration][Configuration]] - [[#set-pretty-symbols][~set-pretty-symbols!~]] - [[#troubleshooting][Troubleshooting]] @@ -22,6 +28,11 @@ This module enables ligatures and/or arbitrary symbol substitutions with This module has no dedicated maintainers. ** Module Flags +*** Font ligatures module flags +Those flags are ignored on emacs-mac and on other platforms if running emacs 28+ +with harfbuzz feature. In those cases, ligatures are handled without needing the +extra configuration provided by those flags. + + =+fira= Enables =Fira Code= ligatures. This requires Fira Code Symbol and a patched version of Fira Code (see below). + =+hasklig= Enable =Hasklig= ligatures. This requires a patched version of the @@ -35,8 +46,19 @@ This module has no dedicated maintainers. This module installs no packages. * Prerequisites -For ligatures to work, you must: +** Ligatures +For ligatures to work, you must either: +- Have a recent enough version of Emacs which will compose ligatures + automatically, or +- Use one of our font-specific configurations. + +*** Emacs-mac port or Emacs 28+ +Ligatures are handled without needing additional configuration. If this doesn't +work, report a bug with your current version of emacs and the ligatures which +aren't working. + +*** Not Emacs-mac and Emacs <= 27 1. Enable one of the four ligature font flags: =+fira=, =+hasklig=, =+iosevka= or =+pragmata-pro=. 2. Install the patched version of the associated font with ~M-x @@ -46,6 +68,32 @@ For ligatures to work, you must: * TODO Features # An in-depth list of features, how to use them, and their dependencies. +** TODO Mathematical symbols replacement +** Coding ligatures +This module includes configuration to compose combinations like =->= or =::= +into prettier glyphs (called a ligature). Depending on the current version of +emacs, this is implemented in two different ways : + +- prettify-symbols-mode method :: this is the "legacy" method. It uses a font + which haves the ligatures as separate unicode symbols, and using + prettify-symbols-mode, =->=-like combinations are manually listed and replaced + with the correct symbol. The mapping between =->=-like sequences and unicode + values in the font are font-specific ; therefore =+fira=, =+iosevka=... files + and specific fonts are necessary for it to work. +- composition-function-table method :: regexes are used to match all the usual + sequences which are composed into ligatures. These regexes are passed to emacs + directly, which asks Harfbuzz to shape it. Ligatures are obtained + automatically depending on the capabilities of the font, and no font-specific + configuration is necessary. + +Emacs-mac port implements the /composition-function-table/ method in its code, +nothing is necessary on Doom side; otherwise, Doom implements the +/composition-function-table/ for emacs 28+ built with Harfbuzz support, and the +/prettify-symbols-mode/ method otherwise. + +Even though harfbuzz has been included in emacs 27, there is currently a [[https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-04/msg01121.html][bug +(#40864)]] which prevents a safe usage of /composition-function-table/ method in +emacs 27. * TODO Configuration # How to configure this module, including common problems and how to address them. diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index 6622c8fef..89a1a698b 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -49,17 +49,54 @@ besides what is listed.") "An alist containing a mapping of major modes to its value for `prettify-symbols-alist'.") +;;; Automatic font-specific ligatures +(defvar +prog-ligatures-alist + (eval-when-compile + `((?! . ,(regexp-opt '("!!" "!=" "!=="))) + (?# . ,(regexp-opt '("##" "###" "####" "#(" "#:" "#=" "#?" "#[" "#_" "#_(" "#{"))) + (?$ . ,(regexp-opt '("$>" "$>>"))) + (?% . ,(regexp-opt '("%%" "%%%"))) + (?& . ,(regexp-opt '("&&" "&&&"))) + (?* . ,(regexp-opt '("*" "**" "***" "**/" "*/" "*>"))) + (?+ . ,(regexp-opt '("+" "++" "+++" "+>"))) + (?- . ,(regexp-opt '("--" "---" "-->" "-<" "-<<" "->" "->>" "-}" "-~"))) + (?. . ,(regexp-opt '(".-" ".." "..." "..<" ".="))) + (?/ . ,(regexp-opt '("/*" "/**" "//" "///" "/=" "/==" "/>"))) + (?: . ,(regexp-opt '(":" "::" ":::" ":=" ":<" ":=" ":>"))) + (?0 . "0\\(?:\\(x[a-fA-F0-9]\\).?\\)") ; Tries to match the x in 0xDEADBEEF + ;; (?x . ,(regexp-opt '("x"))) ; Also tries to match the x in 0xDEADBEEF + (?\; . ,(regexp-opt '(";;"))) + (?< . ,(regexp-opt '("