Merge branch 'develop' into eshell-improvements

This commit is contained in:
Steven vanZyl 2020-05-06 10:33:39 -04:00 committed by GitHub
commit a70cfce520
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
153 changed files with 2327 additions and 1920 deletions

View file

@ -15,12 +15,13 @@ labels: is:update re:packages
> >
> OR, if multiple packages are bumped in one commit: > 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-mode@91e37a6 -> emacs-lsp/lsp-mode@c8188ef
> emacs-lsp/lsp-ui@cf6906c -> emacs-lsp/lsp-ui@582e153 > 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 > 4. You've included links to relevant issues, if any
> 5. You've deleted this template > 5. You've deleted this template

View file

@ -6,7 +6,7 @@
:; DOOMBASE="$(dirname "$0")/.." :; DOOMBASE="$(dirname "$0")/.."
:; [ "$1" = -d ] || [ "$1" = --debug ] && { shift; export DEBUG=1; } :; [ "$1" = -d ] || [ "$1" = --debug ] && { shift; export DEBUG=1; }
:; [ "$1" = run ] && { cd "$DOOMBASE"; shift; exec $EMACS -q --no-splash -l bin/doom "$@"; exit 0; } :; [ "$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 :; exit 0
(let* ((load-prefer-newer t) (let* ((load-prefer-newer t)
@ -15,6 +15,13 @@
(user-emacs-directory (user-emacs-directory
(abbreviate-file-name (or emacsdir (expand-file-name "../" loaddir))))) (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) (push (expand-file-name "core" user-emacs-directory) load-path)
(require 'core) (require 'core)
(require 'core-cli) (require 'core-cli)

View file

@ -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)))

View file

@ -46,10 +46,7 @@ ready to be pasted in a bug report on github."
(require 'core-packages) (require 'core-packages)
(let ((default-directory doom-emacs-dir) (let ((default-directory doom-emacs-dir)
(doom-modules (doom-modules))) (doom-modules (doom-modules)))
(cl-letf (letf! (defun sh (&rest args) (cdr (apply #'doom-call-process args)))
(((symbol-function 'sh)
(lambda (&rest args)
(cdr (apply #'doom-call-process args)))))
`((emacs `((emacs
(version . ,emacs-version) (version . ,emacs-version)
(features ,@system-configuration-features) (features ,@system-configuration-features)

View file

@ -38,6 +38,7 @@
(LaTeX-mode :lang latex) (LaTeX-mode :lang latex)
(ledger-mode :lang ledger) (ledger-mode :lang ledger)
(lua-mode :lang lua) (lua-mode :lang lua)
(moonscript-mode :lang lua)
(markdown-mode :lang markdown) (markdown-mode :lang markdown)
(gfm-mode :lang markdown) (gfm-mode :lang markdown)
(nim-mode :lang nim) (nim-mode :lang nim)
@ -45,6 +46,7 @@
(taureg-mode :lang ocaml) (taureg-mode :lang ocaml)
(org-mode :lang org) (org-mode :lang org)
(perl-mode :lang perl) (perl-mode :lang perl)
(raku-mode :lang perl)
(php-mode :lang php) (php-mode :lang php)
(hack-mode :lang php) (hack-mode :lang php)
(plantuml-mode :lang plantuml) (plantuml-mode :lang plantuml)
@ -53,7 +55,9 @@
(restclient-mode :lang rest) (restclient-mode :lang rest)
(ruby-mode :lang ruby) (ruby-mode :lang ruby)
(rust-mode :lang rust) (rust-mode :lang rust)
(rustic-mode :lang rust)
(scala-mode :lang scala) (scala-mode :lang scala)
(scheme-mode :lang scheme)
(sh-mode :lang sh) (sh-mode :lang sh)
(swift-mode :lang swift) (swift-mode :lang swift)
(web-mode :lang web) (web-mode :lang web)
@ -131,7 +135,8 @@ selection of all minor-modes, active or not."
(list (or (+org-get-global-property "TITLE") (list (or (+org-get-global-property "TITLE")
(file-relative-name (buffer-file-name))))) (file-relative-name (buffer-file-name)))))
path 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) tags)
" ") " ")

View file

@ -101,11 +101,10 @@ If DIR is not a project, it will be indexed (but not cached)."
(unless (file-readable-p dir) (unless (file-readable-p dir)
(error "Directory %S isn't readable" dir)) (error "Directory %S isn't readable" dir))
(let* ((default-directory (file-truename (expand-file-name dir))) (let* ((default-directory (file-truename (expand-file-name dir)))
(project-root (doom-project-root default-directory)) (projectile-project-root (doom-project-root default-directory))
(projectile-project-root default-directory)
(projectile-enable-caching projectile-enable-caching)) (projectile-enable-caching projectile-enable-caching))
(cond ((and project-root (file-equal-p project-root projectile-project-root)) (cond ((and projectile-project-root (file-equal-p projectile-project-root default-directory))
(unless (doom-project-p projectile-project-root) (unless (doom-project-p default-directory)
;; Disable caching if this is not a real project; caching ;; Disable caching if this is not a real project; caching
;; non-projects easily has the potential to inflate the projectile ;; non-projects easily has the potential to inflate the projectile
;; cache beyond reason. ;; cache beyond reason.

View file

@ -130,8 +130,11 @@
(interactive "P") (interactive "P")
(setq doom-autosave-session nil) (setq doom-autosave-session nil)
(doom/quicksave-session) (doom/quicksave-session)
(restart-emacs (save-some-buffers nil t)
(append (if debug (list "--debug-init")) (letf! ((#'save-buffers-kill-emacs #'kill-emacs)
(when (boundp 'chemacs-current-emacs-profile) (confirm-kill-emacs))
(list "--with-profile" chemacs-current-emacs-profile)) (restart-emacs
(list "--restore")))) (append (if debug (list "--debug-init"))
(when (boundp 'chemacs-current-emacs-profile)
(list "--with-profile" chemacs-current-emacs-profile))
(list "--restore")))))

142
core/autoload/store.el Normal file
View file

@ -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)))

View file

@ -32,14 +32,16 @@ one wants that.")
(cl-check-type file string) (cl-check-type file string)
(and (print! (start "Generating core autoloads...")) (and (print! (start "Generating core autoloads..."))
(doom-cli--write-autoloads (doom-cli--write-autoloads
file (doom-cli--generate-autoloads file
(cl-loop for dir (doom-cli--generate-emacs-version-check)
in (append (list doom-core-dir) (doom-cli--generate-autoloads
(cdr (doom-module-load-path 'all-p)) (cl-loop for dir
(list doom-private-dir)) in (append (list doom-core-dir)
if (doom-glob dir "autoload.el") collect it (cdr (doom-module-load-path 'all-p))
if (doom-glob dir "autoload/*.el") append it) (list doom-private-dir))
'scan)) if (doom-glob dir "autoload.el") collect it
if (doom-glob dir "autoload/*.el") append it)
'scan))
(print! (start "Byte-compiling core autoloads file...")) (print! (start "Byte-compiling core autoloads file..."))
(doom-cli--byte-compile-file file) (doom-cli--byte-compile-file file)
(print! (success "Generated %s") (print! (success "Generated %s")
@ -105,6 +107,12 @@ one wants that.")
(print! "M-x doom/restart") (print! "M-x doom/restart")
(print! "M-x doom/reload"))) (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) (defun doom-cli--generate-var-cache (vars)
`((setq ,@(cl-loop for var in vars `((setq ,@(cl-loop for var in vars
append `(,var ',(symbol-value var)))))) append `(,var ',(symbol-value var))))))

View file

@ -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" "# run 'doom sync'. To create a safe-to-edit envvar file use:\n#\n"
"# doom env -o ~/.doom.d/myenv\n#\n" "# doom env -o ~/.doom.d/myenv\n#\n"
"# And load it with (doom-load-envvars-file \"~/.doom.d/myenv\").\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" "# (doom-load-envvars-file \"path/to/this/file\")\n#\n"
"# Use 'doom env -o path/to/this/file' to regenerate it.")) "# 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 ;; We assume that this noninteractive session was spawned from the
;; user's interactive shell, therefore we just dump ;; user's interactive shell, therefore we just dump
;; `process-environment' to a file. ;; `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 "="))) (if (cl-find-if (doom-rpartial #'string-match-p (car (split-string env "=")))
doom-env-ignored-vars) doom-env-ignored-vars)
(print! (info "Ignoring %s") env) (print! (info "Ignoring %s") env)
(insert env "\n"))) (insert env "\0\n")))
(print! (success "Successfully generated %S") (print! (success "Successfully generated %S")
(path env-file)) (path env-file))
t)))))) t))))))

View file

@ -258,7 +258,7 @@ BODY will be run when this dispatcher is called."
(print! "%2s) %s" (1+ (length options)) (print! "%2s) %s" (1+ (length options))
(if (cl-find-if (doom-rpartial #'string-match-p desc) (if (cl-find-if (doom-rpartial #'string-match-p desc)
doom--cli-straight-discard-options) doom--cli-straight-discard-options)
(concat desc " (Recommended)") (green (concat desc " (Recommended)"))
desc)))) desc))))
(terpri) (terpri)
(let* ((options (let* ((options

View file

@ -293,10 +293,7 @@ possible."
`pp' can be expensive for longer lists, and there's no reason to prettify cache `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'." files, so we replace calls to `pp' with the much faster `prin1'."
:around #'save-place-alist-to-file :around #'save-place-alist-to-file
(cl-letf (((symbol-function #'pp) #'prin1)) (letf! ((#'pp #'prin1)) (funcall orig-fn))))
(funcall orig-fn)))
(save-place-mode +1))
(use-package! server (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." `nim-mode'. This prevents them from leaving Emacs in a broken state."
:around #'dtrt-indent-mode :around #'dtrt-indent-mode
(let ((dtrt-indent-run-after-smie dtrt-indent-run-after-smie)) (let ((dtrt-indent-run-after-smie dtrt-indent-run-after-smie))
(cl-letf* ((old-smie-config-guess (symbol-function 'smie-config-guess)) (letf! ((defun symbol-config--guess (beg end)
(old-smie-config--guess (symbol-function 'symbol-config--guess)) (funcall symbol-config--guess beg (min end 10000)))
((symbol-function 'symbol-config--guess) (defun smie-config-guess ()
(lambda (beg end) (condition-case e (funcall smie-config-guess)
(funcall old-smie-config--guess beg (min end 10000)))) (error (setq dtrt-indent-run-after-smie t)
((symbol-function 'smie-config-guess) (message "[WARNING] Indent detection: %s"
(lambda () (error-message-string e))
(condition-case e (funcall old-smie-config-guess) (message ""))))) ; warn silently
(error (setq dtrt-indent-run-after-smie t)
(message "[WARNING] Indent detection: %s"
(error-message-string e))
(message "")))))) ; warn silently
(funcall orig-fn arg))))) (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) (defun doom-use-helpful-a (orig-fn &rest args)
"Force ORIG-FN to use helpful instead of the old describe-* commands." "Force ORIG-FN to use helpful instead of the old describe-* commands."
(cl-letf (((symbol-function #'describe-function) #'helpful-function) (letf! ((#'describe-function #'helpful-function)
((symbol-function #'describe-variable) #'helpful-variable)) (#'describe-variable #'helpful-variable))
(apply orig-fn args))) (apply orig-fn args)))
(after! apropos (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 () (defun doom-init-smartparens-in-minibuffer-maybe-h ()
"Enable `smartparens-mode' in the minibuffer, during `eval-expression', "Enable `smartparens-mode' in the minibuffer, during `eval-expression',
`pp-eval-expression' or `evil-ex'." `pp-eval-expression' or `evil-ex'."
(when (memq this-command '(eval-expression pp-eval-expression evil-ex)) (and (memq this-command '(eval-expression pp-eval-expression evil-ex))
(smartparens-mode)))) smartparens-global-mode
(smartparens-mode))))
;; You're likely writing lisp in the minibuffer, therefore, disable these ;; You're likely writing lisp in the minibuffer, therefore, disable these
;; quote pairs, which lisps doesn't use for strings: ;; quote pairs, which lisps doesn't use for strings:

View file

@ -221,16 +221,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See
else do (error "not a valid state: %s" l))) 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 ;; specials
(defvar doom--map-forms nil) (defvar doom--map-forms nil)
(defvar doom--map-fn nil) (defvar doom--map-fn nil)

View file

@ -1,8 +1,5 @@
;;; core-lib.el -*- lexical-binding: t; -*- ;;; core-lib.el -*- lexical-binding: t; -*-
(require 'cl-lib)
(require 'subr-x)
;; ;;
;;; Helpers ;;; Helpers
@ -85,6 +82,60 @@ Accepts the same arguments as `message'."
format-string) format-string)
,@args)))) ,@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) (defalias 'doom-partial #'apply-partially)
(defun doom-rpartial (fn &rest args) (defun doom-rpartial (fn &rest args)
@ -119,6 +170,11 @@ aliases."
(call-interactively command)))) (call-interactively command))))
(defalias 'lambda!! 'λ!!) (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! () (defun file! ()
"Return the emacs lisp file this macro is called from." "Return the emacs lisp file this macro is called from."
(cond ((bound-and-true-p byte-compile-current-file)) (cond ((bound-and-true-p byte-compile-current-file))
@ -128,10 +184,129 @@ aliases."
(buffer-file-name) (buffer-file-name)
((error "Cannot get this file-path")))) ((error "Cannot get this file-path"))))
(defun dir! () (defmacro letenv! (envvars &rest body)
"Returns the directory of the emacs lisp file this macro is called from." "Lexically bind ENVVARS in BODY, like `let' but for `process-environment'."
(when-let (path (file!)) (declare (indent 1))
(directory-file-name (file-name-directory path)))) `(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) (defmacro after! (package &rest body)
"Evaluate BODY after PACKAGE have loaded. "Evaluate BODY after PACKAGE have loaded.
@ -183,58 +358,84 @@ This is a wrapper around `eval-after-load' that:
(setq body `((after! ,next ,@body)))) (setq body `((after! ,next ,@body))))
(car body)))))) (car body))))))
(defmacro setq! (&rest settings) (defun doom--handle-load-error (e target path)
"A stripped-down `customize-set-variable' with the syntax of `setq'. (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 (defmacro load! (filename &optional path noerror)
property in its `defcustom' declaration). This trigger setters. `setq' does "Load a file relative to the current executing file (`load-file-name').
not."
(macroexp-progn
(cl-loop for (var val) on settings by 'cddr
collect `(funcall (or (get ',var 'custom-set) #'set)
',var ,val))))
(defmacro pushnew! (place &rest values) FILENAME is either a file path string or a form that should evaluate to such a
"Push VALUES sequentially into PLACE, if they aren't already present. string at run time. PATH is where to look for the file (a string representing a
This is a variadic `cl-pushnew'." directory path). If omitted, the lookup is relative to either `load-file-name',
(let ((var (make-symbol "result"))) `byte-compile-current-file' or `buffer-file-name' (checked in that order).
`(dolist (,var (list ,@values) (with-no-warnings ,place))
(cl-pushnew ,var ,place :test #'equal))))
(defmacro prependq! (sym &rest lists) If NOERROR is non-nil, don't throw an error if the file doesn't exist."
"Prepend LISTS to SYM in place." (let* ((path (or path
`(setq ,sym (append ,@lists ,sym))) (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) (defmacro defer-until! (condition &rest body)
"Append LISTS to SYM in place." "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to
`(setq ,sym (append ,sym ,@lists))) 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) (defmacro defer-feature! (feature &optional fn)
"`delq' ELT from LIST in-place. "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)." Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at
`(setq ,list startup, which will prematurely trigger `after!' (and `with-eval-after-load')
(delq ,(if fetcher blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet,
`(funcall ,fetcher ,elt ,list) then wait until FEATURE-hook (or MODE-hook, if FN is provided) is triggered to
elt) reverse this and trigger `after!' blocks at a more reasonable time."
,list))) (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 ;;; Hooks
(defvar doom--transient-counter 0) (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) in (doom--setq-hook-fns hooks vars 'singles)
collect `(remove-hook ',hook #',fn)))) 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 ;;; Definers
(defmacro defadvice! (symbol arglist &optional docstring &rest body) (defmacro defadvice! (symbol arglist &optional docstring &rest body)
"Define an advice called SYMBOL and add it to PLACES. "Define an advice called SYMBOL and add it to PLACES.

View file

@ -211,13 +211,15 @@ those directories. The first returned path is always `doom-private-dir'."
(declare (pure t) (side-effect-free t)) (declare (pure t) (side-effect-free t))
(append (list doom-private-dir) (append (list doom-private-dir)
(if module-dirs (if module-dirs
(doom-files-in (if (listp module-dirs) (mapcar (lambda (m) (doom-module-locate-path (car m) (cdr m)))
module-dirs (doom-files-in (if (listp module-dirs)
doom-modules-dirs) module-dirs
:type 'dirs doom-modules-dirs)
:mindepth 1 :map #'doom-module-from-path
:depth 1) :type 'dirs
(cl-loop for plist being the hash-values of (doom-modules) :mindepth 1
:depth 1))
(cl-loop for plist being the hash-values of doom-modules
collect (plist-get plist :path))) collect (plist-get plist :path)))
nil)) nil))

View file

@ -269,9 +269,13 @@ elsewhere."
recipe recipe
;; Expand :local-repo from current directory ;; Expand :local-repo from current directory
(when local-repo (when local-repo
(plist-put! plist :recipe (plist-put!
(plist-put recipe :local-repo plist :recipe
(expand-file-name local-repo ,(dir!))))))) (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 (error
(signal 'doom-package-error (signal 'doom-package-error
(cons ,(symbol-name name) (cons ,(symbol-name name)

View file

@ -43,7 +43,7 @@ Emacs.")
;; REVIEW Resolve the project root once, when the file/buffer is opened. This ;; REVIEW Resolve the project root once, when the file/buffer is opened. This
;; speeds up projectile's project root resolution by leaps, but does ;; speeds up projectile's project root resolution by leaps, but does
;; put you at risk of having a stale project root. ;; 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 ;; In case the user saves the file to a new location
after-save-hook after-save-hook
;; ...or makes external changes then returns to Emacs ;; ...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. ;; .gitignore. This is recommended in the projectile docs.
((executable-find doom-projectile-fd-binary) ((executable-find doom-projectile-fd-binary)
(setq projectile-generic-command (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) doom-projectile-fd-binary)
projectile-git-command projectile-generic-command projectile-git-command projectile-generic-command
projectile-git-submodule-command nil 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 ;; Otherwise, resort to ripgrep, which is also faster than find
((executable-find "rg") ((executable-find "rg")
(setq projectile-generic-command (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 (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-command projectile-generic-command
projectile-git-submodule-command nil projectile-git-submodule-command nil
;; ensure Windows users get rg's benefits ;; ensure Windows users get rg's benefits

View file

@ -54,6 +54,9 @@ examples.
It is recommended you don't set specify a font-size, as to inherit `doom-font's It is recommended you don't set specify a font-size, as to inherit `doom-font's
size.") size.")
(defvar doom-unicode-extra-fonts nil
"Fonts to inject into the unicode charset before `doom-unicode-font'.")
;; ;;
;;; Custom hooks ;;; Custom hooks
@ -85,48 +88,51 @@ size.")
(defvar doom--last-frame nil) (defvar doom--last-frame nil)
(defun doom-run-switch-window-hooks-h () (defun doom-run-switch-window-hooks-h ()
(let ((gc-cons-threshold most-positive-fixnum)) (unless (or doom-inhibit-switch-window-hooks
(unless (or doom-inhibit-switch-window-hooks (eq doom--last-window (selected-window))
(eq doom--last-window (selected-window)) (minibufferp))
(minibufferp)) (let ((gc-cons-threshold most-positive-fixnum)
(let ((doom-inhibit-switch-window-hooks t) (doom-inhibit-switch-window-hooks t)
(inhibit-redisplay t)) (inhibit-redisplay t))
(run-hooks 'doom-switch-window-hook) (run-hooks 'doom-switch-window-hook)
(setq doom--last-window (selected-window)))))) (setq doom--last-window (selected-window)))))
(defun doom-run-switch-frame-hooks-h (&rest _) (defun doom-run-switch-frame-hooks-h (&rest _)
(unless (or doom-inhibit-switch-frame-hooks (unless (or doom-inhibit-switch-frame-hooks
(eq doom--last-frame (selected-frame)) (eq doom--last-frame (selected-frame))
(frame-parameter nil 'parent-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) (run-hooks 'doom-switch-frame-hook)
(setq doom--last-frame (selected-frame))))) (setq doom--last-frame (selected-frame)))))
(defun doom-run-switch-buffer-hooks-a (orig-fn buffer-or-name &rest args) (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
(if (or doom-inhibit-switch-buffer-hooks (and buffer-or-name
(eq (current-buffer) (get-buffer buffer-or-name)) (eq (current-buffer)
(and (eq orig-fn #'switch-to-buffer) (car args))) (get-buffer buffer-or-name)))
(apply orig-fn buffer-or-name args) (and (eq orig-fn #'switch-to-buffer) (car args)))
(let ((doom-inhibit-switch-buffer-hooks t) (apply orig-fn buffer-or-name args)
(inhibit-redisplay t)) (let ((gc-cons-threshold most-positive-fixnum)
(when-let (buffer (apply orig-fn buffer-or-name args)) (doom-inhibit-switch-buffer-hooks t)
(with-current-buffer (if (windowp buffer) (inhibit-redisplay t))
(window-buffer buffer) (when-let (buffer (apply orig-fn buffer-or-name args))
buffer) (with-current-buffer (if (windowp buffer)
(run-hooks 'doom-switch-buffer-hook)) (window-buffer buffer)
buffer))))) buffer)
(run-hooks 'doom-switch-buffer-hook))
buffer))))
(defun doom-run-switch-to-next-prev-buffer-hooks-a (orig-fn &rest args) (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
(if doom-inhibit-switch-buffer-hooks (apply orig-fn args)
(apply orig-fn args) (let ((gc-cons-threshold most-positive-fixnum)
(let ((doom-inhibit-switch-buffer-hooks t) (doom-inhibit-switch-buffer-hooks t)
(inhibit-redisplay t)) (inhibit-redisplay t))
(when-let (buffer (apply orig-fn args)) (when-let (buffer (apply orig-fn args))
(with-current-buffer buffer (with-current-buffer buffer
(run-hooks 'doom-switch-buffer-hook)) (run-hooks 'doom-switch-buffer-hook))
buffer))))) buffer))))
(defun doom-protect-fallback-buffer-h () (defun doom-protect-fallback-buffer-h ()
"Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." "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 '(tool-bar-lines . 0))
(add-to-list 'default-frame-alist '(vertical-scroll-bars))) (add-to-list 'default-frame-alist '(vertical-scroll-bars)))
(when IS-MAC (when! IS-MAC
;; Curse Lion and its sudden but inevitable fullscreen mode! ;; Curse Lion and its sudden but inevitable fullscreen mode!
;; NOTE Meaningless to railwaycat's emacs-mac build ;; NOTE Meaningless to railwaycat's emacs-mac build
(setq ns-use-native-fullscreen nil) (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))))) (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 (use-package! hl-line
;; Highlights the current line ;; Highlights the current line
:hook ((prog-mode text-mode conf-mode special-mode) . hl-line-mode) :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-wicon
all-the-icons-material all-the-icons-material
all-the-icons-alltheicon) all-the-icons-alltheicon)
:preface
(setq doom-unicode-extra-fonts
(list "Weather Icons"
"github-octicons"
"FontAwesome"
"all-the-icons"
"file-icons"
"Material Icons"))
:config :config
(cond ((daemonp) (cond ((daemonp)
(defadvice! doom--disable-all-the-icons-in-tty-a (orig-fn &rest args) (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)) (set-face-attribute 'fixed-pitch-serif nil :font doom-serif-font))
(when doom-variable-pitch-font (when doom-variable-pitch-font
(set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font)) (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font))
(when (and doom-unicode-font (fboundp 'set-fontset-font)) (when (fboundp 'set-fontset-font)
(set-fontset-font t 'unicode doom-unicode-font nil 'prepend))) (dolist (font (append doom-unicode-extra-fonts (doom-enlist doom-unicode-font)))
(set-fontset-font t 'unicode font nil 'prepend))))
((debug error) ((debug error)
(if (string-prefix-p "Font not available: " (error-message-string e)) (if (string-prefix-p "Font not available: " (error-message-string e))
(lwarn 'doom-ui :warning (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 (unless no-enable
(setq doom-theme theme (setq doom-theme theme
doom-init-theme-p t) 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)) (mapc #'disable-theme (remq theme custom-enabled-themes))
(run-hooks 'doom-load-theme-hook)) (run-hooks 'doom-load-theme-hook))
result))) result)))
(unless EMACS27+ (when! (not EMACS27+)
;; DEPRECATED Not needed in Emacs 27 ;; DEPRECATED Not needed in Emacs 27
(defadvice! doom--prefer-compiled-theme-a (orig-fn &rest args) (defadvice! doom--prefer-compiled-theme-a (orig-fn &rest args)
"Have `load-theme' prioritize the byte-compiled theme. "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 :around #'load-theme
(if (or (null after-init-time) (if (or (null after-init-time)
doom--prefer-theme-elc) doom--prefer-theme-elc)
(cl-letf* ((old-locate-file (symbol-function 'locate-file)) (letf! (defun locate-file (filename path &optional _suffixes predicate)
((symbol-function 'locate-file) (funcall locate-file filename path '("c" "") predicate))
(lambda (filename path &optional _suffixes predicate)
(funcall old-locate-file filename path '("c" "") predicate))))
(apply orig-fn args)) (apply orig-fn args))
(apply orig-fn args)))) (apply orig-fn args))))

View file

@ -14,6 +14,10 @@
(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos)))
(defconst IS-BSD (or IS-MAC (eq system-type 'berkeley-unix))) (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' ;; Ensure `doom-core-dir' is in `load-path'
(add-to-list 'load-path (file-name-directory load-file-name)) (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)) (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h))
;; Just the bare necessities ;; Just the bare necessities
(require 'subr-x)
(require 'cl-lib)
(require 'core-lib) (require 'core-lib)
@ -207,27 +213,22 @@ users).")
;; https://www.keylength.com/en/4/ ;; https://www.keylength.com/en/4/
gnutls-min-prime-bits 3072 gnutls-min-prime-bits 3072
tls-checktrust gnutls-verify-error tls-checktrust gnutls-verify-error
;; Emacs is built with `gnutls' by default, so `tls-program' would not ;; Emacs is built with `gnutls' by default, so `tls-program' would not be
;; be used in that case. Otherwiese, people have reasons to not go with ;; used in that case. Otherwise, people have reasons to not go with
;; `gnutls', we use `openssl' instead. ;; `gnutls', we use `openssl' instead. For more details, see
;; For more details, see https://redd.it/8sykl1 ;; https://redd.it/8sykl1
tls-program '("openssl s_client -connect %h:%p -CAfile %t -nbio -no_ssl3 -no_tls1 -no_tls1_1 -ign_eof" 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 \ "gnutls-cli -p %p --dh-bits=3072 --ocsp --x509cafile=%t \
--strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h" --strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h"
;; compatibility fallbacks ;; compatibility fallbacks
"gnutls-cli -p %p %h")) "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 ;; This file stores usernames, passwords, and other such treasures for the
;; aspiring malicious third party. ;; 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")) "~/.authinfo.gpg"))
;; Emacs on Windows frequently confuses HOME (C:\Users\<NAME>) 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 ;; Don't litter `doom-emacs-dir'. We don't use `no-littering' because it's a
;; mote too opinionated for our needs. ;; mote too opinionated for our needs.
(setq abbrev-file-name (concat doom-local-dir "abbrev.el") (setq abbrev-file-name (concat doom-local-dir "abbrev.el")
@ -274,11 +275,6 @@ users).")
;; quickly self-correct. ;; quickly self-correct.
(setq fast-but-imprecise-scrolling t) (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 ;; 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 ;; 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). ;; fonts that are larger than the system default (which would resize the frame).
@ -288,7 +284,7 @@ users).")
(setq ffap-machine-p-known 'reject) (setq ffap-machine-p-known 'reject)
;; Font compacting can be terribly expensive, especially for rendering icon ;; 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. ;; been determined, but we inhibit it there anyway.
(setq inhibit-compacting-font-caches t) (setq inhibit-compacting-font-caches t)
@ -432,17 +428,6 @@ If this is a daemon session, load them all immediately instead."
;; ;;
;;; Bootstrap helpers ;;; 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) (defun doom-display-benchmark-h (&optional return-p)
"Display a benchmark including number of packages and modules loaded. "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 (setq doom-init-time
(float-time (time-subtract (current-time) before-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) (defun doom-initialize (&optional force-p noerror)
"Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). "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 Module config.el files
~/.doom.d/config.el ~/.doom.d/config.el
`doom-init-modules-hook' `doom-init-modules-hook'
`doom-after-init-hook' (`after-init-hook') `doom-after-init-modules-hook' (`after-init-hook')
`emacs-startup-hook' `emacs-startup-hook'
`doom-init-ui-hook' `doom-init-ui-hook'
`window-setup-hook' `window-setup-hook'

View file

@ -2,47 +2,44 @@
;;; core/packages.el ;;; core/packages.el
;; core.el ;; core.el
(package! auto-minor-mode :pin "17cfa1b548") (package! auto-minor-mode :pin "17cfa1b54800fdef2975c0c0531dad34846a5065")
(package! gcmh :pin "b1bde50891") (package! gcmh :pin "b1bde5089169a74f62033d027e06e98cbeedd43f")
;; core-ui.el ;; core-ui.el
(package! all-the-icons :pin "0b74fc3618") (package! all-the-icons :pin "0b74fc361817e885580c3f3408079f949f5830e1")
(package! hide-mode-line :pin "88888825b5") (package! hide-mode-line :pin "88888825b5b27b300683e662fa3be88d954b1cea")
(package! highlight-numbers :pin "8b4744c7f4") (package! highlight-numbers :pin "8b4744c7f46c72b1d3d599d4fb75ef8183dee307")
(package! rainbow-delimiters :pin "5125f4e476") (package! rainbow-delimiters :pin "5125f4e47604ad36c3eb4706310fcafac729ca8c")
(package! restart-emacs :pin "9aa90d3df9") (package! restart-emacs :pin "9aa90d3df9e08bc420e1c9845ee3ff568e911bd9")
;; core-editor.el ;; core-editor.el
(package! better-jumper :pin "6d240032ca") (package! better-jumper :pin "6d240032ca213ccb3347e25f26c29b6822bf03a7")
(package! dtrt-indent :pin "9163cd990f") (package! dtrt-indent :pin "9163cd990fb1f43dafed3948c6e406c13a45a6be")
(package! helpful :pin "c54e9ddbd6") (package! helpful :pin "c54e9ddbd6a77858048c1a4c4b549de98af8f88e")
(when IS-MAC (when IS-MAC
(package! ns-auto-titlebar :pin "1efc30d385")) (package! ns-auto-titlebar :pin "1efc30d38509647b417f05587fd7003457719256"))
(package! pcre2el :pin "0b5b2a2c17") (package! pcre2el :pin "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d")
(package! smartparens :pin "555626a43f") (package! smartparens :pin "555626a43f9bb1985aa9a0eb675f2b88b29702c8")
(package! so-long (package! so-long
:built-in 'prefer ; included in Emacs 27+ :built-in 'prefer ; included in Emacs 27+
;; REVIEW so-long is slated to be published to ELPA eventually, but until then ;; 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 ;; I've created my own mirror for it because git.savannah.gnu.org runs
;; on a potato. ;; on a potato.
:recipe (:host github :repo "hlissner/emacs-so-long") :recipe (:host github :repo "hlissner/emacs-so-long")
:pin "ed666b0716") :pin "ed666b0716f60e8988c455804de24b55919e71ca")
(package! ws-butler (package! ws-butler
;; Use my fork of ws-butler, which has a few choice improvements and ;; Use my fork of ws-butler, which has a few choice improvements and
;; optimizations (the original has been abandoned). ;; optimizations (the original has been abandoned).
:recipe (:host github :repo "hlissner/ws-butler") :recipe (:host github :repo "hlissner/ws-butler")
:pin "2bb49d3ee7") :pin "2bb49d3ee7d2cba133bc7e9cdac416cd1c5e4fe0")
(unless IS-WINDOWS (unless IS-WINDOWS
(package! clipetty (package! clipetty
:recipe (:host github :repo "spudlyo/clipetty") :recipe (:host github :repo "spudlyo/clipetty")
:pin "7ee3f9c52f")) :pin "01b39044b9b65fa4ea7d3166f8b1ffab6f740362"))
;; core-projects.el ;; core-projects.el
(package! projectile :pin "eec569dc32") (package! projectile :pin "5cd261dd75f4d711c0016617621349e2a98b43aa")
;; core-keybinds.el ;; core-keybinds.el
(package! general :pin "14ad4c888b") (package! general :pin "42e38034cd2305fa7432866323c923979d8f9b06")
(package! which-key :pin "8b49ae978c") (package! which-key :pin "8b49ae978cceca65967f3544c236f32964ddbed0")
;; autoload/cache.el
(package! persistent-soft :pin "a1e0ddf2a1")

View file

@ -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 ** Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
;; add to ~/.doom.d/config.el ;; 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 (cl-destructuring-bind ((left . top) width height fullscreen) dims
(setq initial-frame-alist (setq initial-frame-alist
(append 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)))))) (fullscreen . ,fullscreen))))))
(defun save-frame-dimensions () (defun save-frame-dimensions ()
(doom-cache-set 'last-frame-size (doom-store-set 'last-frame-size
(list (frame-position) (list (frame-position)
(frame-width) (frame-width)
(frame-height) (frame-height)

View file

@ -17,6 +17,7 @@ us know!
- [[#on-linux][On Linux]] - [[#on-linux][On Linux]]
- [[#arch-linux][Arch Linux:]] - [[#arch-linux][Arch Linux:]]
- [[#ubuntu][Ubuntu:]] - [[#ubuntu][Ubuntu:]]
- [[#fedora][Fedora:]]
- [[#nixos][NixOS]] - [[#nixos][NixOS]]
- [[#on-macos][On macOS]] - [[#on-macos][On macOS]]
- [[#with-homebrew][With Homebrew]] - [[#with-homebrew][With Homebrew]]
@ -143,6 +144,14 @@ apt-get update
apt-get install emacs26 apt-get install emacs26
#+END_SRC #+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 **** NixOS
On NixOS Emacs 26.3 can be installed via ~nix-env -Ai nixos.emacs~, or 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~: 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 #+begin_quote
I recommend you add =~/.emacs.d/bin= to your ~PATH~ so you can call =doom= 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 directly and from anywhere. Accomplish this by adding this to your .bashrc or
.zshrc file: .zshrc file: ~export PATH=~/.emacs.d/bin:$PATH~
~export PATH="$HOME/.emacs.d/bin:$PATH"~
#+end_quote #+end_quote
*** Install Doom Manually *** Install Doom Manually

View file

@ -42,10 +42,10 @@
org-gcal-fetch org-gcal-fetch
org-gcal-post-at-point org-gcal-post-at-point
org-gcal-delete-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 :config
;; hack to avoid the deferred.el error ;; hack to avoid the deferred.el error
(defun org-gcal--notify (title mes) (defun org-gcal--notify (title mes)
(message "org-gcal::%s - %s" title mes))) (message "org-gcal::%s - %s" title mes)))
;; (use-package! alert)

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; app/calendar/packages.el ;;; app/calendar/packages.el
(package! calfw :pin "03abce9762") (package! calfw :pin "03abce97620a4a7f7ec5f911e669da9031ab9088")
(package! calfw-org :pin "03abce9762") (package! calfw-org :pin "03abce97620a4a7f7ec5f911e669da9031ab9088")
(package! org-gcal :pin "6821e34967") (package! org-gcal :pin "2ee2b31547e6f4e33db70fb812d552e55d612fd6")

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; app/irc/packages.el ;;; app/irc/packages.el
(package! circe :pin "e5bf5f8974") (package! circe :pin "e5bf5f89741a9c43aa406491e94dd8d58c302fb4")
(package! circe-notifications :pin "291149ac12") (package! circe-notifications :pin "291149ac12877bbd062da993479d3533a26862b0")

View file

@ -101,10 +101,9 @@
;;;###autoload ;;;###autoload
(defun +rss-put-sliced-image-fn (spec alt &optional flags) (defun +rss-put-sliced-image-fn (spec alt &optional flags)
"TODO" "TODO"
(cl-letf (((symbol-function #'insert-image) (letf! (defun insert-image (image &optional alt _area _slice)
(lambda (image &optional alt _area _slice) (let ((height (cdr (image-size image t))))
(let ((height (cdr (image-size image t)))) (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1)))
(insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1)))))
(shr-put-image spec alt flags))) (shr-put-image spec alt flags)))
;;;###autoload ;;;###autoload

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; app/rss/packages.el ;;; app/rss/packages.el
(package! elfeed :pin "d0405e6386") (package! elfeed :pin "d0405e63863e54a01200740a6717ac875eceabc1")
(package! elfeed-org :pin "77b6bbf222") (package! elfeed-org :pin "77b6bbf222487809813de260447d31c4c59902c9")

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; app/twitter/packages.el ;;; app/twitter/packages.el
(package! twittering-mode :pin "114891e8fd") (package! twittering-mode :pin "114891e8fdb4f06b1326a6cf795e49c205cf9e29")
(package! avy :pin "3bf83140fa") (package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd")

View file

@ -8,15 +8,16 @@
:init (setq langtool-default-language "en-US") :init (setq langtool-default-language "en-US")
:config :config
(unless (or langtool-bin (unless (or langtool-bin
langtool-language-tool-jar) langtool-language-tool-jar
(setq langtool-language-tool-jar langtool-java-classpath)
(cond (IS-MAC (cond (IS-MAC
(setq langtool-language-tool-jar
(locate-file "libexec/languagetool-commandline.jar" (locate-file "libexec/languagetool-commandline.jar"
(doom-files-in "/usr/local/Cellar/languagetool" (doom-files-in "/usr/local/Cellar/languagetool"
:type 'dirs :type 'dirs
:depth 2))) :depth 2))))
(IS-LINUX (IS-LINUX
"/usr/share/java/languagetool/languagetool-commandline.jar"))))) (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*")))))
;; Detects weasel words, passive voice and duplicates. Proselint would be a ;; Detects weasel words, passive voice and duplicates. Proselint would be a

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; checkers/grammar/packages.el ;;; checkers/grammar/packages.el
(package! langtool :pin "a71ed02ce0") (package! langtool :pin "a71ed02ce06920ae3cafd6708de1c21811ce14c3")
(package! writegood-mode :pin "b71757ec33") (package! writegood-mode :pin "b71757ec337e226909fb0422f0224e31acc71733")

View file

@ -1,11 +1,11 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; checkers/spell/packages.el ;;; checkers/spell/packages.el
(package! flyspell-correct :pin "e765d1a3d9") (package! flyspell-correct :pin "fd8ac7a4f922ce5ea1cc5d4583a7d584847cb6b5")
(cond ((featurep! :completion ivy) (cond ((featurep! :completion ivy)
(package! flyspell-correct-ivy :pin "e765d1a3d9")) (package! flyspell-correct-ivy))
((featurep! :completion helm) ((featurep! :completion helm)
(package! flyspell-correct-helm :pin "e765d1a3d9")) (package! flyspell-correct-helm))
((package! flyspell-correct-popup :pin "e765d1a3d9"))) ((package! flyspell-correct-popup)))
(package! flyspell-lazy :pin "3ebf68cc9e") (package! flyspell-lazy :pin "3ebf68cc9eb10c972a2de8d7861cbabbbce69570")

View file

@ -1,9 +1,9 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; checkers/syntax/packages.el ;;; checkers/syntax/packages.el
(package! flycheck :pin "f19a51c0f1") (package! flycheck :pin "246e1d4380721ca03962464f11d02dd1372860ce")
(package! flycheck-popup-tip :pin "ef86aad907") (package! flycheck-popup-tip :pin "ef86aad907f27ca076859d8d9416f4f7727619c6")
(when (featurep! +childframe) (when (featurep! +childframe)
(package! flycheck-posframe :pin "2b3e94c2e4")) (package! flycheck-posframe :pin "2b3e94c2e427ec9831c513007460c5ea9e2225a3"))
;; TODO flymake? ;; TODO flymake?

View file

@ -11,9 +11,26 @@
company-require-match 'never company-require-match 'never
company-global-modes company-global-modes
'(not erc-mode message-mode help-mode gud-mode) '(not erc-mode message-mode help-mode gud-mode)
company-backends '(company-capf)
company-frontends '(company-pseudo-tooltip-frontend 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 :config
(when (featurep! :editor evil) (when (featurep! :editor evil)
(add-hook 'company-mode-hook #'evil-normalize-keymaps) (add-hook 'company-mode-hook #'evil-normalize-keymaps)
@ -106,6 +123,8 @@
(ElispFeature . ,(all-the-icons-material "stars" :face 'all-the-icons-orange)) (ElispFeature . ,(all-the-icons-material "stars" :face 'all-the-icons-orange))
(ElispFace . ,(all-the-icons-material "format_paint" :face 'all-the-icons-pink))))) (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) (defun +company-box-icons--elisp-fn (candidate)
(when (derived-mode-p 'emacs-lisp-mode) (when (derived-mode-p 'emacs-lisp-mode)
(let ((sym (intern candidate))) (let ((sym (intern candidate)))

View file

@ -1,8 +1,8 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; completion/company/packages.el ;;; completion/company/packages.el
(package! company :pin "61ddd9afb5") (package! company :pin "6333fc4ebbbf4d28e834de8715561e984f149ecb")
(package! company-dict :pin "cd7b8394f6") (package! company-dict :pin "cd7b8394f6014c57897f65d335d6b2bd65dab1f4")
(package! company-prescient :pin "53307731f3") (package! company-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63")
(when (featurep! +childframe) (when (featurep! +childframe)
(package! company-box :pin "8fc6168f2d")) (package! company-box :pin "3814fcb14e92f4b85b19e664e216a7c8d5c7144d"))

View file

@ -1,19 +1,19 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; completion/helm/packages.el ;;; completion/helm/packages.el
(package! helm :pin "d978f20f4c") (package! helm :pin "b6db9fb47a8900704394e63b795f4a54cb4701a8")
(package! helm-rg :pin "785a80fe5c") (package! helm-rg :pin "785a80fe5cc87e27c5ea3d00a70049028d9e2847")
(package! helm-c-yasnippet :pin "65ca732b51") (package! helm-c-yasnippet :pin "65ca732b510bfc31636708aebcfe4d2d845b59b0")
(package! helm-company :pin "6eb5c2d730") (package! helm-company :pin "6eb5c2d730a60e394e005b47c1db018697094dde")
(package! helm-describe-modes (package! helm-describe-modes
:recipe (:host github :repo "emacs-helm/helm-describe-modes") :recipe (:host github :repo "emacs-helm/helm-describe-modes")
:pin "11fb36af11") :pin "11fb36af119b784539d31c6160002de1957408aa")
(package! helm-projectile :pin "5328b74ddd") (package! helm-projectile :pin "5328b74dddcee8d1913803ca8167868831a07463")
(package! swiper-helm :pin "93fb6db87b") (package! swiper-helm :pin "93fb6db87bc6a5967898b5fd3286954cc72a0008")
(when (featurep! +fuzzy) (when (featurep! +fuzzy)
(package! helm-flx :pin "6640fac5cb")) (package! helm-flx :pin "6640fac5cb16bee73c95b8ed1248a4e5e113690e"))
(when (featurep! +childframe) (when (featurep! +childframe)
(package! posframe :pin "e62e584268")) (package! posframe :pin "093b29a53cbeda6d637ccc9ef4dfc47123e79b9e"))
(when (featurep! :lang org) (when (featurep! :lang org)
(package! helm-org :pin "b7a18dfc17")) (package! helm-org :pin "b7a18dfc17e8b933956d61d68c435eee03a96c24"))
(package! helm-descbinds :pin "b725159823") (package! helm-descbinds :pin "b72515982396b6e336ad7beb6767e95a80fca192")

View file

@ -33,7 +33,7 @@
(map! :map (ido-common-completion-map ido-file-completion-map) (map! :map (ido-common-completion-map ido-file-completion-map)
"C-w" #'ido-delete-backward-word-updir "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-n" #'ido-next-match
"C-p" #'ido-prev-match "C-p" #'ido-prev-match
[down] #'ido-next-match [down] #'ido-next-match

View file

@ -1,8 +1,8 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; completion/ido/packages.el ;;; completion/ido/packages.el
(package! flx-ido :pin "17f5c9cb2a") (package! flx-ido :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5")
(package! ido-completing-read+ :pin "98d3a6e56b") (package! ido-completing-read+ :pin "98d3a6e56b1d3652da7b47f49f76d77f82ea80ba")
(package! ido-sort-mtime :pin "f638ff0c92") (package! ido-sort-mtime :pin "f638ff0c922af862f5211779f2311a27fde428eb")
(package! ido-vertical-mode :pin "16c4c1a112") (package! ido-vertical-mode :pin "16c4c1a112796ee0bcf401ea39d3e2643a89feaf")
(package! crm-custom :pin "f1aaccf643") (package! crm-custom :pin "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d")

View file

@ -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)))) (ivy-rich-counsel-function-docstring (:face font-lock-doc-face))))
;; Apply switch buffer transformers to `counsel-projectile-switch-to-buffer' as well ;; Apply switch buffer transformers to `counsel-projectile-switch-to-buffer' as well
'counsel-projectile-switch-to-buffer '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 ;; Remove built-in coloring of buffer list; we do our own
(setq ivy-switch-buffer-faces-alist nil) (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 :override #'counsel--find-return-list
(cl-destructuring-bind (find-program . args) (cl-destructuring-bind (find-program . args)
(cond ((executable-find doom-projectile-fd-binary) (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") ((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 (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" "/")))) (if IS-WINDOWS (list "--path-separator" "/"))))
((cons find-program args))) ((cons find-program args)))
(unless (listp args) (unless (listp args)

View file

@ -1,23 +1,23 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; completion/ivy/packages.el ;;; completion/ivy/packages.el
(package! swiper :pin "64f05f4735") (package! swiper :pin "9e0803cdb5b47e4e1844e8281516b46589ef26c7")
(package! ivy) (package! ivy)
(package! ivy-hydra) (package! ivy-hydra)
(package! counsel) (package! counsel)
(package! amx :pin "e512e74e83") (package! amx :pin "7fb7b874291e0cdeb1f0acb18564a686ec86788d")
(package! counsel-projectile :pin "b556ed8995") (package! counsel-projectile :pin "b556ed8995f375e57496f3482aef4b0def565de8")
(package! ivy-rich :pin "596874d146") (package! ivy-rich :pin "3f818b201769bc13cc75aa73645217e374136aca")
(package! wgrep :pin "5977b8e000") (package! wgrep :pin "5977b8e00051c9003ca96e9d35133e0dea68db2c")
(if (featurep! +prescient) (if (featurep! +prescient)
(package! ivy-prescient :pin "53307731f3") (package! ivy-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63")
(when (featurep! +fuzzy) (when (featurep! +fuzzy)
(package! flx :pin "17f5c9cb2a"))) (package! flx :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5")))
(when (featurep! +childframe) (when (featurep! +childframe)
(package! ivy-posframe :pin "ae9bafe94f")) (package! ivy-posframe :pin "ae9bafe94fe6b77b6fe45766ae6172646f6a5d50"))
(when (featurep! +icons) (when (featurep! +icons)
(package! all-the-icons-ivy :pin "a70cbfa1ef")) (package! all-the-icons-ivy :pin "a70cbfa1effe36efc946a823a580cec686d5e88d"))

View file

@ -27,362 +27,363 @@
;;; <leader> c --- code ;;; <leader> c --- code
(:prefix-map ("c" . "code") (:prefix-map ("c" . "code")
:desc "Compile" "c" #'compile :desc "Compile" "c" #'compile
:desc "Recompile" "C" #'recompile :desc "Recompile" "C" #'recompile
:desc "Jump to definition" "d" #'+lookup/definition :desc "Jump to definition" "d" #'+lookup/definition
:desc "Jump to references" "D" #'+lookup/references :desc "Jump to references" "D" #'+lookup/references
:desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region
:desc "Evaluate & replace region" "E" #'+eval/region-and-replace :desc "Evaluate & replace region" "E" #'+eval/region-and-replace
:desc "Format buffer/region" "f" #'+format/region-or-buffer :desc "Format buffer/region" "f" #'+format/region-or-buffer
:desc "Jump to documentation" "k" #'+lookup/documentation :desc "Jump to documentation" "k" #'+lookup/documentation
:desc "Send to repl" "s" #'+eval/send-region-to-repl :desc "Send to repl" "s" #'+eval/send-region-to-repl
:desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace
:desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines
:desc "List errors" "x" #'flymake-show-diagnostics-buffer :desc "List errors" "x" #'flymake-show-diagnostics-buffer
(:when (featurep! :tools flycheck) (:when (featurep! :checkers syntax)
:desc "List errors" "x" #'flycheck-list-errors) :desc "List errors" "x" #'flycheck-list-errors)
(:when (featurep! :tools lsp) (:when (featurep! :tools lsp)
:desc "LSP Code actions" "a" #'lsp-execute-code-action :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 Organize imports" "i" #'lsp-organize-imports
:desc "LSP Rename" "r" #'lsp-rename :desc "LSP Rename" "r" #'lsp-rename
(:after lsp-mode
:desc "LSP" "l" lsp-command-map)
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
:desc "Jump to symbol in current workspace" "j" #'lsp-ivy-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) :desc "Jump to symbol in any workspace" "J" #'lsp-ivy-global-workspace-symbol)
(:when (featurep! :completion helm) (:when (featurep! :completion helm)
:desc "Jump to symbol in current workspace" "j" #'helm-lsp-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))) :desc "Jump to symbol in any workspace" "J" #'helm-lsp-global-workspace-symbol)))
;;; <leader> f --- file ;;; <leader> f --- file
(:prefix-map ("f" . "file") (:prefix-map ("f" . "file")
:desc "Copy this file" "C" #'doom/copy-this-file :desc "Copy this file" "C" #'doom/copy-this-file
:desc "Find file in private config" "C" #'doom/find-file-in-private-config :desc "Find file in private config" "C" #'doom/find-file-in-private-config
:desc "Delete this file" "D" #'doom/delete-this-file :desc "Delete this file" "D" #'doom/delete-this-file
:desc "Find file in emacs.d" "e" #'+default/find-in-emacsd :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd
:desc "Browse emacs.d" "E" #'+default/browse-emacsd :desc "Browse emacs.d" "E" #'+default/browse-emacsd
:desc "Find file from here" "f" #'+default/find-file-under-here :desc "Find file from here" "f" #'+default/find-file-under-here
:desc "Rename/move this file" "m" #'doom/move-this-file :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 "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 files" "r" #'recentf-open-files
:desc "Recent project files" "R" #'projectile-recentf :desc "Recent project files" "R" #'projectile-recentf
:desc "Sudo this file" "s" #'doom/sudo-this-file :desc "Sudo this file" "s" #'doom/sudo-this-file
:desc "Sudo find file" "S" #'doom/sudo-find-file :desc "Sudo find file" "S" #'doom/sudo-find-file
:desc "Yank filename" "y" #'+default/yank-buffer-filename :desc "Yank filename" "y" #'+default/yank-buffer-filename
:desc "Open scratch buffer" "x" #'doom/open-scratch-buffer :desc "Open scratch buffer" "x" #'doom/open-scratch-buffer
:desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer
(:when (featurep! :tools editorconfig) (:when (featurep! :tools editorconfig)
:desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig)) :desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig))
;;; <leader> r --- remote ;;; <leader> r --- remote
(:when (featurep! :tools upload) (:when (featurep! :tools upload)
(:prefix-map ("r" . "remote") (:prefix-map ("r" . "remote")
:desc "Upload local" "u" #'ssh-deploy-upload-handler :desc "Upload local" "u" #'ssh-deploy-upload-handler
:desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced
:desc "Download remote" "d" #'ssh-deploy-download-handler :desc "Download remote" "d" #'ssh-deploy-download-handler
:desc "Diff local & remote" "D" #'ssh-deploy-diff-handler :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler
:desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler
:desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler))
;;; <leader> s --- search ;;; <leader> s --- search
(:prefix-map ("s" . "search") (:prefix-map ("s" . "search")
:desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point :desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point
:desc "Search buffer" "b" #'swiper :desc "Search buffer" "b" #'swiper
:desc "Search current directory" "d" #'+default/search-cwd :desc "Search current directory" "d" #'+default/search-cwd
:desc "Search other directory" "D" #'+default/search-other-cwd :desc "Search other directory" "D" #'+default/search-other-cwd
:desc "Locate file" "f" #'locate :desc "Locate file" "f" #'locate
:desc "Jump to symbol" "i" #'imenu :desc "Jump to symbol" "i" #'imenu
:desc "Jump to visible link" "l" #'link-hint-open-link :desc "Jump to visible link" "l" #'link-hint-open-link
:desc "Jump to link" "L" #'ffap-menu :desc "Jump to link" "L" #'ffap-menu
:desc "Jump list" "j" #'evil-show-jumps :desc "Jump list" "j" #'evil-show-jumps
:desc "Jump to mark" "m" #'evil-show-marks :desc "Jump to mark" "m" #'evil-show-marks
:desc "Search project" "p" #'+default/search-project :desc "Search project" "p" #'+default/search-project
:desc "Search other project" "P" #'+default/search-other-project :desc "Search other project" "P" #'+default/search-other-project
:desc "Search buffer" "s" #'swiper-isearch :desc "Search buffer" "s" #'swiper-isearch
:desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point) :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point)
;;; <leader> g --- lookup ;;; <leader> g --- lookup
(:when (featurep! :tools lookup) (:when (featurep! :tools lookup)
(:prefix-map ("g" . "lookup") (:prefix-map ("g" . "lookup")
"k" #'+lookup/documentation "k" #'+lookup/documentation
"d" #'+lookup/definition "d" #'+lookup/definition
"D" #'+lookup/references "D" #'+lookup/references
"f" #'+lookup/file "f" #'+lookup/file
"o" #'+lookup/online-select "o" #'+lookup/online-select
"i" #'+lookup/in-docsets "i" #'+lookup/in-docsets
"I" #'+lookup/in-all-docsets)) "I" #'+lookup/in-all-docsets))
;;; <leader> i --- insert ;;; <leader> i --- insert
(:prefix-map ("i" . "insert") (:prefix-map ("i" . "insert")
:desc "Current file name" "f" #'+default/insert-file-path :desc "Current file name" "f" #'+default/insert-file-path
:desc "Current file path" "F" (λ!! #'+default/insert-file-path t) :desc "Current file path" "F" (λ!! #'+default/insert-file-path t)
:desc "Snippet" "s" #'yas-insert-snippet :desc "Snippet" "s" #'yas-insert-snippet
:desc "Unicode" "u" #'unicode-chars-list-chars :desc "Unicode" "u" #'unicode-chars-list-chars
:desc "From clipboard" "y" #'+default/yank-pop) :desc "From clipboard" "y" #'+default/yank-pop)
;;; <leader> n --- notes ;;; <leader> n --- notes
(:prefix-map ("n" . "notes") (:prefix-map ("n" . "notes")
:desc "Search notes for symbol" "." #'+default/search-notes-for-symbol-at-point :desc "Search notes for symbol" "." #'+default/search-notes-for-symbol-at-point
:desc "Org agenda" "a" #'org-agenda :desc "Org agenda" "a" #'org-agenda
(:when (featurep! :tools biblio) (:when (featurep! :tools biblio)
:desc "Bibliographic entries" "b" :desc "Bibliographic entries" "b"
(cond ((featurep! :completion ivy) #'ivy-bibtex) (cond ((featurep! :completion ivy) #'ivy-bibtex)
((featurep! :completion helm) #'helm-bibtex))) ((featurep! :completion helm) #'helm-bibtex)))
:desc "Toggle org-clock" "c" #'+org/toggle-clock :desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel :desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft :desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter) (:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter) :desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes :desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes :desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link :desc "Org store link" "l" #'org-store-link
:desc "Tags search" "m" #'org-tags-view :desc "Tags search" "m" #'org-tags-view
:desc "Org capture" "n" #'org-capture :desc "Org capture" "n" #'org-capture
:desc "Goto capture" "N" #'org-capture-goto-target :desc "Goto capture" "N" #'org-capture-goto-target
:desc "Active org-clock" "o" #'org-clock-goto :desc "Active org-clock" "o" #'org-clock-goto
:desc "Todo list" "t" #'org-todo-list :desc "Todo list" "t" #'org-todo-list
:desc "Search notes" "s" #'+default/org-notes-search :desc "Search notes" "s" #'+default/org-notes-search
:desc "Search org agenda headlines" "S" #'+default/org-notes-headlines :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines
:desc "View search" "v" #'org-search-view :desc "View search" "v" #'org-search-view
:desc "Org export to clipboard" "y" #'+org/export-to-clipboard :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 "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text
(:when (featurep! :lang org +journal) (:when (featurep! :lang org +journal)
(:prefix ("j" . "journal") (:prefix ("j" . "journal")
:desc "New Entry" "j" #'org-journal-new-entry :desc "New Entry" "j" #'org-journal-new-entry
:desc "Search Forever" "s" #'org-journal-search-forever)) :desc "Search Forever" "s" #'org-journal-search-forever))
(:when (featurep! :lang org +roam) (:when (featurep! :lang org +roam)
(:prefix ("r" . "roam") (:prefix ("r" . "roam")
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture :desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file :desc "Find file" "f" #'org-roam-find-file
:desc "Show graph" "g" #'org-roam-graph :desc "Show graph" "g" #'org-roam-graph
:desc "Insert" "i" #'org-roam-insert :desc "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam :desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date") (:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-dailies-date :desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-dailies-today :desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-dailies-tomorrow :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-dailies-yesterday)))) :desc "Yesterday" "y" #'org-roam-dailies-yesterday))))
;;; <leader> o --- open ;;; <leader> o --- open
"o" nil ; we need to unbind it first as Org claims this prefix "o" nil ; we need to unbind it first as Org claims this prefix
(:prefix-map ("o" . "open") (:prefix-map ("o" . "open")
:desc "Browser" "b" #'browse-url-of-file :desc "Browser" "b" #'browse-url-of-file
:desc "Debugger" "d" #'+debugger/start :desc "Debugger" "d" #'+debugger/start
:desc "New frame" "f" #'make-frame :desc "New frame" "f" #'make-frame
:desc "REPL" "r" #'+eval/open-repl-other-window :desc "REPL" "r" #'+eval/open-repl-other-window
:desc "REPL (same window)" "R" #'+eval/open-repl-same-window :desc "REPL (same window)" "R" #'+eval/open-repl-same-window
:desc "Dired" "-" #'dired-jump :desc "Dired" "-" #'dired-jump
(:when (featurep! :ui neotree) (:when (featurep! :ui neotree)
:desc "Project sidebar" "p" #'+neotree/open :desc "Project sidebar" "p" #'+neotree/open
:desc "Find file in project sidebar" "P" #'+neotree/find-this-file) :desc "Find file in project sidebar" "P" #'+neotree/find-this-file)
(:when (featurep! :ui treemacs) (:when (featurep! :ui treemacs)
:desc "Project sidebar" "p" #'+treemacs/toggle :desc "Project sidebar" "p" #'+treemacs/toggle
:desc "Find file in project rsidebar" "P" #'+treemacs/find-file) :desc "Find file in project rsidebar" "P" #'treemacs-find-file)
(:when (featurep! :term shell) (:when (featurep! :term shell)
:desc "Toggle shell popup" "t" #'+shell/toggle :desc "Toggle shell popup" "t" #'+shell/toggle
:desc "Open shell here" "T" #'+shell/here) :desc "Open shell here" "T" #'+shell/here)
(:when (featurep! :term term) (:when (featurep! :term term)
:desc "Toggle terminal popup" "t" #'+term/toggle :desc "Toggle terminal popup" "t" #'+term/toggle
:desc "Open terminal here" "T" #'+term/here) :desc "Open terminal here" "T" #'+term/here)
(:when (featurep! :term vterm) (:when (featurep! :term vterm)
:desc "Toggle vterm popup" "t" #'+vterm/toggle :desc "Toggle vterm popup" "t" #'+vterm/toggle
:desc "Open vterm here" "T" #'+vterm/here) :desc "Open vterm here" "T" #'+vterm/here)
(:when (featurep! :term eshell) (:when (featurep! :term eshell)
:desc "Toggle eshell popup" "e" #'+eshell/toggle :desc "Toggle eshell popup" "e" #'+eshell/toggle
:desc "Open eshell here" "E" #'+eshell/here) :desc "Open eshell here" "E" #'+eshell/here)
(:when (featurep! :tools macos) (:when (featurep! :tools macos)
:desc "Reveal in Finder" "o" #'+macos/reveal-in-finder :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder
:desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder
:desc "Send to Transmit" "u" #'+macos/send-to-transmit :desc "Send to Transmit" "u" #'+macos/send-to-transmit
:desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit
:desc "Send to Launchbar" "l" #'+macos/send-to-launchbar :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar
:desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar)
(:when (featurep! :tools docker) (:when (featurep! :tools docker)
:desc "Docker" "D" #'docker)) :desc "Docker" "D" #'docker))
;;; <leader> p --- project ;;; <leader> p --- project
(:prefix ("p" . "project") (:prefix ("p" . "project")
:desc "Search project for symbol" "." #'+default/search-project-for-symbol-at-point :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 "Find file in other project" "F" #'doom/find-file-in-other-project
:desc "Search project" "s" #'+default/search-project :desc "Search project" "s" #'+default/search-project
:desc "List project tasks" "t" #'magit-todos-list :desc "List project tasks" "t" #'magit-todos-list
:desc "Open project scratch buffer" "x" #'doom/open-project-scratch-buffer :desc "Open project scratch buffer" "x" #'doom/open-project-scratch-buffer
:desc "Switch to project scratch buffer" "X" #'doom/switch-to-project-scratch-buffer :desc "Switch to project scratch buffer" "X" #'doom/switch-to-project-scratch-buffer
;; later expanded by projectile ;; later expanded by projectile
(:prefix ("4" . "in other window")) (:prefix ("4" . "in other window"))
(:prefix ("5" . "in other frame"))) (:prefix ("5" . "in other frame")))
;;; <leader> q --- quit/restart ;;; <leader> q --- quit/restart
(:prefix-map ("q" . "quit/restart") (:prefix-map ("q" . "quit/restart")
:desc "Restart emacs server" "d" #'+default/restart-server :desc "Restart emacs server" "d" #'+default/restart-server
:desc "Delete frame" "f" #'delete-frame :desc "Delete frame" "f" #'delete-frame
:desc "Clear current frame" "F" #'doom/kill-all-buffers :desc "Clear current frame" "F" #'doom/kill-all-buffers
:desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs
:desc "Quit Emacs" "q" #'kill-emacs :desc "Quit Emacs" "q" #'kill-emacs
:desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal
:desc "Quick save current session" "s" #'doom/quicksave-session :desc "Quick save current session" "s" #'doom/quicksave-session
:desc "Restore last session" "l" #'doom/quickload-session :desc "Restore last session" "l" #'doom/quickload-session
:desc "Save session to file" "S" #'doom/save-session :desc "Save session to file" "S" #'doom/save-session
:desc "Restore session from file" "L" #'doom/load-session :desc "Restore session from file" "L" #'doom/load-session
:desc "Restart & restore Emacs" "r" #'doom/restart-and-restore :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
:desc "Restart Emacs" "R" #'doom/restart) :desc "Restart Emacs" "R" #'doom/restart)
;;; <leader> & --- snippets ;;; <leader> & --- snippets
(:prefix-map ("&" . "snippets") (:prefix-map ("&" . "snippets")
:desc "New snippet" "n" #'yas-new-snippet :desc "New snippet" "n" #'yas-new-snippet
:desc "Insert snippet" "i" #'yas-insert-snippet :desc "Insert snippet" "i" #'yas-insert-snippet
:desc "Find global snippet" "/" #'yas-visit-snippet-file :desc "Find global snippet" "/" #'yas-visit-snippet-file
:desc "Reload snippets" "r" #'yas-reload-all :desc "Reload snippets" "r" #'yas-reload-all
:desc "Create Temp Template" "c" #'aya-create :desc "Create Temp Template" "c" #'aya-create
:desc "Use Temp Template" "e" #'aya-expand) :desc "Use Temp Template" "e" #'aya-expand)
;;; <leader> t --- toggle ;;; <leader> t --- toggle
(:prefix-map ("t" . "toggle") (:prefix-map ("t" . "toggle")
:desc "Big mode" "b" #'doom-big-font-mode :desc "Big mode" "b" #'doom-big-font-mode
:desc "Flymake" "f" #'flymake-mode :desc "Flymake" "f" #'flymake-mode
:desc "Frame fullscreen" "F" #'toggle-frame-fullscreen :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen
:desc "Indent style" "I" #'doom/toggle-indent-style :desc "Indent style" "I" #'doom/toggle-indent-style
:desc "Line numbers" "l" #'doom/toggle-line-numbers :desc "Line numbers" "l" #'doom/toggle-line-numbers
:desc "Word-wrap mode" "w" #'+word-wrap-mode :desc "Word-wrap mode" "w" #'+word-wrap-mode
(:when (featurep! :tools flycheck) (:when (featurep! :checkers syntax)
:desc "Flycheck" "f" #'flycheck-mode) :desc "Flycheck" "f" #'flycheck-mode)
(:when (featurep! :ui indent-guides) (:when (featurep! :ui indent-guides)
:desc "Indent guides" "i" #'highlight-indent-guides-mode) :desc "Indent guides" "i" #'highlight-indent-guides-mode)
(:when (featurep! :lang org +present) (:when (featurep! :lang org +present)
:desc "org-tree-slide mode" "p" #'+org-present/start) :desc "org-tree-slide mode" "p" #'+org-present/start)
:desc "Read-only mode" "r" #'read-only-mode :desc "Read-only mode" "r" #'read-only-mode
(:when (featurep! :tools flyspell) (:when (featurep! :checkers spell)
:desc "Flyspell" "s" #'flyspell-mode) :desc "Flyspell" "s" #'flyspell-mode)
(:when (featurep! :lang org +pomodoro) (:when (featurep! :lang org +pomodoro)
:desc "Pomodoro timer" "t" #'org-pomodoro) :desc "Pomodoro timer" "t" #'org-pomodoro)
(:when (featurep! :ui zen) (:when (featurep! :ui zen)
:desc "Zen mode" "z" #'writeroom-mode)) :desc "Zen mode" "z" #'writeroom-mode))
;;; <leader> v --- versioning ;;; <leader> v --- versioning
(:prefix-map ("v" . "versioning") (:prefix-map ("v" . "versioning")
:desc "Git revert file" "R" #'vc-revert :desc "Git revert file" "R" #'vc-revert
:desc "Kill link to remote" "y" #'browse-at-remote-kill :desc "Kill link to remote" "y" #'browse-at-remote-kill
:desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage :desc "Kill link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage
(:when (featurep! :ui vc-gutter) (:when (featurep! :ui vc-gutter)
:desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git revert hunk" "r" #'git-gutter:revert-hunk
:desc "Git stage hunk" "s" #'git-gutter:stage-hunk :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
:desc "Git time machine" "t" #'git-timemachine-toggle :desc "Git time machine" "t" #'git-timemachine-toggle
:desc "Jump to next hunk" "n" #'git-gutter:next-hunk :desc "Jump to next hunk" "n" #'git-gutter:next-hunk
:desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk) :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk)
(:when (featurep! :tools magit) (:when (featurep! :tools magit)
:desc "Magit dispatch" "/" #'magit-dispatch :desc "Magit dispatch" "/" #'magit-dispatch
:desc "Forge dispatch" "'" #'forge-dispatch :desc "Forge dispatch" "'" #'forge-dispatch
:desc "Magit status" "g" #'magit-status :desc "Magit status" "g" #'magit-status
:desc "Magit file delete" "x" #'magit-file-delete :desc "Magit file delete" "x" #'magit-file-delete
:desc "Magit blame" "B" #'magit-blame-addition :desc "Magit blame" "B" #'magit-blame-addition
:desc "Magit clone" "C" #'magit-clone :desc "Magit clone" "C" #'magit-clone
:desc "Magit fetch" "F" #'magit-fetch :desc "Magit fetch" "F" #'magit-fetch
:desc "Magit buffer log" "L" #'magit-log :desc "Magit buffer log" "L" #'magit-log
:desc "Git stage file" "S" #'magit-stage-file :desc "Git stage file" "S" #'magit-stage-file
:desc "Git unstage file" "U" #'magit-unstage-file :desc "Git unstage file" "U" #'magit-unstage-file
(:prefix ("f" . "find") (:prefix ("f" . "find")
:desc "Find file" "f" #'magit-find-file :desc "Find file" "f" #'magit-find-file
:desc "Find gitconfig file" "g" #'magit-find-git-config-file :desc "Find gitconfig file" "g" #'magit-find-git-config-file
:desc "Find commit" "c" #'magit-show-commit :desc "Find commit" "c" #'magit-show-commit
:desc "Find issue" "i" #'forge-visit-issue :desc "Find issue" "i" #'forge-visit-issue
:desc "Find pull request" "p" #'forge-visit-pullreq) :desc "Find pull request" "p" #'forge-visit-pullreq)
(:prefix ("o" . "open in browser") (:prefix ("o" . "open in browser")
:desc "Browse file or region" "." #'browse-at-remote :desc "Browse file or region" "." #'browse-at-remote
:desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage
:desc "Browse remote" "r" #'forge-browse-remote :desc "Browse remote" "r" #'forge-browse-remote
:desc "Browse commit" "c" #'forge-browse-commit :desc "Browse commit" "c" #'forge-browse-commit
:desc "Browse an issue" "i" #'forge-browse-issue :desc "Browse an issue" "i" #'forge-browse-issue
:desc "Browse a pull request" "p" #'forge-browse-pullreq :desc "Browse a pull request" "p" #'forge-browse-pullreq
:desc "Browse issues" "I" #'forge-browse-issues :desc "Browse issues" "I" #'forge-browse-issues
:desc "Browse pull requests" "P" #'forge-browse-pullreqs) :desc "Browse pull requests" "P" #'forge-browse-pullreqs)
(:prefix ("l" . "list") (:prefix ("l" . "list")
(:when (featurep! :tools gist) (:when (featurep! :tools gist)
:desc "List gists" "g" #'+gist:list) :desc "List gists" "g" #'+gist:list)
:desc "List repositories" "r" #'magit-list-repositories :desc "List repositories" "r" #'magit-list-repositories
:desc "List submodules" "s" #'magit-list-submodules :desc "List submodules" "s" #'magit-list-submodules
:desc "List issues" "i" #'forge-list-issues :desc "List issues" "i" #'forge-list-issues
:desc "List pull requests" "p" #'forge-list-pullreqs :desc "List pull requests" "p" #'forge-list-pullreqs
:desc "List notifications" "n" #'forge-list-notifications) :desc "List notifications" "n" #'forge-list-notifications)
(:prefix ("c" . "create") (:prefix ("c" . "create")
:desc "Initialize repo" "r" #'magit-init :desc "Initialize repo" "r" #'magit-init
:desc "Clone repo" "R" #'magit-clone :desc "Clone repo" "R" #'magit-clone
:desc "Commit" "c" #'magit-commit-create :desc "Commit" "c" #'magit-commit-create
:desc "Fixup" "f" #'magit-commit-fixup :desc "Fixup" "f" #'magit-commit-fixup
:desc "Issue" "i" #'forge-create-issue :desc "Issue" "i" #'forge-create-issue
:desc "Pull request" "p" #'forge-create-pullreq))) :desc "Pull request" "p" #'forge-create-pullreq)))
;;; <leader> w --- workspaces/windows ;;; <leader> w --- workspaces/windows
(:prefix-map ("w" . "workspaces/windows") (:prefix-map ("w" . "workspaces/windows")
:desc "Autosave session" "a" #'doom/quicksave-session :desc "Autosave session" "a" #'doom/quicksave-session
:desc "Display workspaces" "d" #'+workspace/display :desc "Display workspaces" "d" #'+workspace/display
:desc "Rename workspace" "r" #'+workspace/rename :desc "Rename workspace" "r" #'+workspace/rename
:desc "Create workspace" "c" #'+workspace/new :desc "Create workspace" "c" #'+workspace/new
:desc "Delete workspace" "k" #'+workspace/delete :desc "Delete workspace" "k" #'+workspace/delete
:desc "Save session" "s" #'doom/save-session :desc "Save session" "s" #'doom/save-session
:desc "Save workspace" "S" #'+workspace/save :desc "Save workspace" "S" #'+workspace/save
:desc "Load session" "l" #'doom/load-session :desc "Load session" "l" #'doom/load-session
:desc "Load last autosaved session" "L" #'doom/quickload-session :desc "Load last autosaved session" "L" #'doom/quickload-session
:desc "Switch to other workspace" "o" #'+workspace/other :desc "Switch to other workspace" "o" #'+workspace/other
:desc "Undo window config" "u" #'winner-undo :desc "Undo window config" "u" #'winner-undo
:desc "Redo window config" "U" #'winner-redo :desc "Redo window config" "U" #'winner-redo
:desc "Switch to left workspace" "p" #'+workspace/switch-left :desc "Switch to left workspace" "p" #'+workspace/switch-left
:desc "Switch to right workspace" "n" #'+workspace/switch-right :desc "Switch to right workspace" "n" #'+workspace/switch-right
:desc "Switch to" "w" #'+workspace/switch-to :desc "Switch to" "w" #'+workspace/switch-to
:desc "Switch to workspace 1" "1" #'+workspace/switch-to-0 :desc "Switch to workspace 1" "1" #'+workspace/switch-to-0
:desc "Switch to workspace 2" "2" #'+workspace/switch-to-1 :desc "Switch to workspace 2" "2" #'+workspace/switch-to-1
:desc "Switch to workspace 3" "3" #'+workspace/switch-to-2 :desc "Switch to workspace 3" "3" #'+workspace/switch-to-2
:desc "Switch to workspace 4" "4" #'+workspace/switch-to-3 :desc "Switch to workspace 4" "4" #'+workspace/switch-to-3
:desc "Switch to workspace 5" "5" #'+workspace/switch-to-4 :desc "Switch to workspace 5" "5" #'+workspace/switch-to-4
:desc "Switch to workspace 6" "6" #'+workspace/switch-to-5 :desc "Switch to workspace 6" "6" #'+workspace/switch-to-5
:desc "Switch to workspace 7" "7" #'+workspace/switch-to-6 :desc "Switch to workspace 7" "7" #'+workspace/switch-to-6
:desc "Switch to workspace 8" "8" #'+workspace/switch-to-7 :desc "Switch to workspace 8" "8" #'+workspace/switch-to-7
:desc "Switch to workspace 9" "9" #'+workspace/switch-to-8 :desc "Switch to workspace 9" "9" #'+workspace/switch-to-8
:desc "Switch to last workspace" "0" #'+workspace/switch-to-final) :desc "Switch to last workspace" "0" #'+workspace/switch-to-final)
;;; <leader> m --- multiple cursors ;;; <leader> m --- multiple cursors
(:when (featurep! :editor multiple-cursors) (:when (featurep! :editor multiple-cursors)
(:prefix-map ("m" . "multiple cursors") (:prefix-map ("m" . "multiple cursors")
:desc "Edit lines" "l" #'mc/edit-lines :desc "Edit lines" "l" #'mc/edit-lines
:desc "Mark next" "n" #'mc/mark-next-like-this :desc "Mark next" "n" #'mc/mark-next-like-this
:desc "Unmark next" "N" #'mc/unmark-next-like-this :desc "Unmark next" "N" #'mc/unmark-next-like-this
:desc "Mark previous" "p" #'mc/mark-previous-like-this :desc "Mark previous" "p" #'mc/mark-previous-like-this
:desc "Unmark previous" "P" #'mc/unmark-previous-like-this :desc "Unmark previous" "P" #'mc/unmark-previous-like-this
:desc "Mark all" "t" #'mc/mark-all-like-this :desc "Mark all" "t" #'mc/mark-all-like-this
:desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim
:desc "Edit line endings" "e" #'mc/edit-ends-of-lines :desc "Edit line endings" "e" #'mc/edit-ends-of-lines
:desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines
:desc "Mark tag" "s" #'mc/mark-sgml-tag-pair :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair
:desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun
:desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click)) :desc "Add cursor w/mouse" "<mouse-1>" #'mc/add-cursor-on-click))
;; APPs ;; APPs
;;; <leader> M --- mu4e ;;; <leader> M --- mu4e
(:when (featurep! :email mu4e) (:when (featurep! :email mu4e)
(:prefix-map ("M" . "mu4e") (:prefix-map ("M" . "mu4e")
:desc "Open email app" "M" #'=mu4e :desc "Open email app" "M" #'=mu4e
:desc "Compose email" "c" #'+mu4e/compose)) :desc "Compose email" "c" #'+mu4e/compose))
;;; <leader> I --- IRC ;;; <leader> I --- IRC
(:when (featurep! :app irc) (:when (featurep! :app irc)
(:prefix-map ("I" . "irc") (:prefix-map ("I" . "irc")
:desc "Open irc app" "I" #'=irc :desc "Open irc app" "I" #'=irc
:desc "Next unread buffer" "a" #'tracking-next-buffer :desc "Next unread buffer" "a" #'tracking-next-buffer
:desc "Quit irc" "q" #'+irc/quit :desc "Quit irc" "q" #'+irc/quit
:desc "Reconnect all" "r" #'circe-reconnect-all :desc "Reconnect all" "r" #'circe-reconnect-all
:desc "Send message" "s" #'+irc/send-message :desc "Send message" "s" #'+irc/send-message
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
:desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel)))
;;; <leader> T --- twitter ;;; <leader> T --- twitter
(:when (featurep! :app twitter) (:when (featurep! :app twitter)
(:prefix-map ("T" . "twitter") (:prefix-map ("T" . "twitter")
:desc "Open twitter app" "T" #'=twitter :desc "Open twitter app" "T" #'=twitter
:desc "Quit twitter" "q" #'+twitter/quit :desc "Quit twitter" "q" #'+twitter/quit
:desc "Rerender twits" "r" #'+twitter/rerender-all :desc "Rerender twits" "r" #'+twitter/rerender-all
:desc "Ace link" "l" #'+twitter/ace-link))) :desc "Ace link" "l" #'+twitter/ace-link)))
;; ;;
@ -541,4 +542,4 @@
;;; treemacs ;;; treemacs
(:when (featurep! :ui treemacs) (:when (featurep! :ui treemacs)
"<f9>" #'+treemacs/toggle "<f9>" #'+treemacs/toggle
"<C-f9>" #'+treemacs/find-file)) "<C-f9>" #'treemacs-find-file))

View file

@ -26,6 +26,9 @@
"C-k" #'previous-line "C-k" #'previous-line
"C-S-j" #'scroll-up-command "C-S-j" #'scroll-up-command
"C-S-k" #'scroll-down-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 (define-key! read-expression-map
"C-j" #'next-line-or-history-element "C-j" #'next-line-or-history-element
"C-k" #'previous-line-or-history-element))) "C-k" #'previous-line-or-history-element)))
@ -54,42 +57,42 @@
:i "C-j" #'+default/newline ; default behavior :i "C-j" #'+default/newline ; default behavior
(:after help :map help-mode-map (:after help :map help-mode-map
:n "o" #'link-hint-open-link) :n "o" #'link-hint-open-link)
(:after helpful :map helpful-mode-map (:after helpful :map helpful-mode-map
:n "o" #'link-hint-open-link) :n "o" #'link-hint-open-link)
(:after info :map Info-mode-map (:after info :map Info-mode-map
:n "o" #'link-hint-open-link) :n "o" #'link-hint-open-link)
(:after apropos :map apropos-mode-map (:after apropos :map apropos-mode-map
:n "o" #'link-hint-open-link :n "o" #'link-hint-open-link
:n "TAB" #'forward-button :n "TAB" #'forward-button
:n [tab] #'forward-button :n [tab] #'forward-button
:n [backtab] #'backward-button) :n [backtab] #'backward-button)
(:after view :map view-mode-map (:after view :map view-mode-map
[escape] #'View-quit-all) [escape] #'View-quit-all)
(:after man :map Man-mode-map (:after man :map Man-mode-map
:n "q" #'kill-current-buffer) :n "q" #'kill-current-buffer)
(:after (evil-org evil-easymotion) (:after (evil-org evil-easymotion)
:map evil-org-mode-map :map evil-org-mode-map
:m "gsh" #'+org/goto-visible) :m "gsh" #'+org/goto-visible)
(:when (featurep! :editor multiple-cursors) (:when (featurep! :editor multiple-cursors)
:prefix "gz" :prefix "gz"
:nv "d" #'evil-mc-make-and-goto-next-match :nv "d" #'evil-mc-make-and-goto-next-match
:nv "D" #'evil-mc-make-and-goto-prev-match :nv "D" #'evil-mc-make-and-goto-prev-match
:nv "j" #'evil-mc-make-cursor-move-next-line :nv "j" #'evil-mc-make-cursor-move-next-line
:nv "k" #'evil-mc-make-cursor-move-prev-line :nv "k" #'evil-mc-make-cursor-move-prev-line
:nv "m" #'evil-mc-make-all-cursors :nv "m" #'evil-mc-make-all-cursors
:nv "n" #'evil-mc-make-and-goto-next-cursor :nv "n" #'evil-mc-make-and-goto-next-cursor
:nv "N" #'evil-mc-make-and-goto-last-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-prev-cursor
:nv "P" #'evil-mc-make-and-goto-first-cursor :nv "P" #'evil-mc-make-and-goto-first-cursor
:nv "q" #'evil-mc-undo-all-cursors :nv "q" #'evil-mc-undo-all-cursors
:nv "t" #'+multiple-cursors/evil-mc-toggle-cursors :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors
:nv "u" #'evil-mc-undo-last-added-cursor :nv "u" #'evil-mc-undo-last-added-cursor
:nv "z" #'+multiple-cursors/evil-mc-make-cursor-here :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here
:v "I" #'evil-mc-make-cursor-in-visual-selection-beg :v "I" #'evil-mc-make-cursor-in-visual-selection-beg
:v "A" #'evil-mc-make-cursor-in-visual-selection-end) :v "A" #'evil-mc-make-cursor-in-visual-selection-end)
;; misc ;; misc
:n "C-S-f" #'toggle-frame-fullscreen :n "C-S-f" #'toggle-frame-fullscreen
@ -107,119 +110,119 @@
;;; :completion ;;; :completion
(map! (:when (featurep! :completion company) (map! (:when (featurep! :completion company)
:i "C-@" #'+company/complete :i "C-@" #'+company/complete
:i "C-SPC" #'+company/complete :i "C-SPC" #'+company/complete
(:after company (:after company
(:map company-active-map (:map company-active-map
"C-w" nil ; don't interfere with `evil-delete-backward-word' "C-w" nil ; don't interfere with `evil-delete-backward-word'
"C-n" #'company-select-next "C-n" #'company-select-next
"C-p" #'company-select-previous "C-p" #'company-select-previous
"C-j" #'company-select-next "C-j" #'company-select-next
"C-k" #'company-select-previous "C-k" #'company-select-previous
"C-h" #'company-show-doc-buffer "C-h" #'company-show-doc-buffer
"C-u" #'company-previous-page "C-u" #'company-previous-page
"C-d" #'company-next-page "C-d" #'company-next-page
"C-s" #'company-filter-candidates "C-s" #'company-filter-candidates
"C-S-s" (cond ((featurep! :completion helm) #'helm-company) "C-S-s" (cond ((featurep! :completion helm) #'helm-company)
((featurep! :completion ivy) #'counsel-company)) ((featurep! :completion ivy) #'counsel-company))
"C-SPC" #'company-complete-common "C-SPC" #'company-complete-common
"TAB" #'company-complete-common-or-cycle "TAB" #'company-complete-common-or-cycle
[tab] #'company-complete-common-or-cycle [tab] #'company-complete-common-or-cycle
[backtab] #'company-select-previous [backtab] #'company-select-previous
[f1] nil) [f1] nil)
(:map company-search-map ; applies to `company-filter-map' too (:map company-search-map ; applies to `company-filter-map' too
"C-n" #'company-select-next-or-abort "C-n" #'company-select-next-or-abort
"C-p" #'company-select-previous-or-abort "C-p" #'company-select-previous-or-abort
"C-j" #'company-select-next-or-abort "C-j" #'company-select-next-or-abort
"C-k" #'company-select-previous-or-abort "C-k" #'company-select-previous-or-abort
"C-s" (λ! (company-search-abort) (company-filter-candidates)) "C-s" (λ! (company-search-abort) (company-filter-candidates))
[escape] #'company-search-abort)) [escape] #'company-search-abort))
;; TAB auto-completion in term buffers ;; TAB auto-completion in term buffers
(:after comint :map comint-mode-map (:after comint :map comint-mode-map
"TAB" #'company-complete "TAB" #'company-complete
[tab] #'company-complete)) [tab] #'company-complete))
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
(:after ivy (:after ivy
:map ivy-minibuffer-map :map ivy-minibuffer-map
"C-SPC" #'ivy-call-and-recenter ; preview file "C-SPC" #'ivy-call-and-recenter ; preview file
"C-l" #'ivy-alt-done "C-l" #'ivy-alt-done
"C-v" #'yank) "C-v" #'yank)
(:after counsel (:after counsel
:map counsel-ag-map :map counsel-ag-map
"C-SPC" #'ivy-call-and-recenter ; preview "C-SPC" #'ivy-call-and-recenter ; preview
"C-l" #'ivy-done "C-l" #'ivy-done
[C-return] #'+ivy/git-grep-other-window-action)) [C-return] #'+ivy/git-grep-other-window-action))
(:when (featurep! :completion helm) (:when (featurep! :completion helm)
(:after helm :map helm-map (:after helm :map helm-map
[remap next-line] #'helm-next-line [remap next-line] #'helm-next-line
[remap previous-line] #'helm-previous-line [remap previous-line] #'helm-previous-line
[left] #'left-char [left] #'left-char
[right] #'right-char [right] #'right-char
"C-S-f" #'helm-previous-page "C-S-f" #'helm-previous-page
"C-S-n" #'helm-next-source "C-S-n" #'helm-next-source
"C-S-p" #'helm-previous-source "C-S-p" #'helm-previous-source
(:when (featurep! :editor evil +everywhere) (:when (featurep! :editor evil +everywhere)
"C-j" #'helm-next-line "C-j" #'helm-next-line
"C-k" #'helm-previous-line "C-k" #'helm-previous-line
"C-S-j" #'helm-next-source "C-S-j" #'helm-next-source
"C-S-k" #'helm-previous-source) "C-S-k" #'helm-previous-source)
"C-u" #'helm-delete-minibuffer-contents "C-u" #'helm-delete-minibuffer-contents
"C-s" #'helm-minibuffer-history "C-s" #'helm-minibuffer-history
;; Swap TAB and C-z ;; Swap TAB and C-z
"TAB" #'helm-execute-persistent-action "TAB" #'helm-execute-persistent-action
[tab] #'helm-execute-persistent-action [tab] #'helm-execute-persistent-action
"C-z" #'helm-select-action) "C-z" #'helm-select-action)
(:after helm-ag :map helm-ag-map (:after helm-ag :map helm-ag-map
"C--" #'+helm-do-ag-decrease-context "C--" #'+helm-do-ag-decrease-context
"C-=" #'+helm-do-ag-increase-context "C-=" #'+helm-do-ag-increase-context
[left] nil [left] nil
[right] nil) [right] nil)
(:after helm-files :map (helm-find-files-map helm-read-file-map) (:after helm-files :map (helm-find-files-map helm-read-file-map)
[C-return] #'helm-ff-run-switch-other-window [C-return] #'helm-ff-run-switch-other-window
"C-w" #'helm-find-files-up-one-level) "C-w" #'helm-find-files-up-one-level)
(:after helm-locate :map helm-generic-files-map (:after helm-locate :map helm-generic-files-map
[C-return] #'helm-ff-run-switch-other-window) [C-return] #'helm-ff-run-switch-other-window)
(:after helm-buffers :map helm-buffer-map (:after helm-buffers :map helm-buffer-map
[C-return] #'helm-buffer-switch-other-window) [C-return] #'helm-buffer-switch-other-window)
(:after helm-occur :map helm-occur-map (:after helm-occur :map helm-occur-map
[C-return] #'helm-occur-run-goto-line-ow) [C-return] #'helm-occur-run-goto-line-ow)
(:after helm-grep :map helm-grep-map (:after helm-grep :map helm-grep-map
[C-return] #'helm-grep-run-other-window-action))) [C-return] #'helm-grep-run-other-window-action)))
;;; :ui ;;; :ui
(map! (:when (featurep! :ui popup) (map! (:when (featurep! :ui popup)
"C-`" #'+popup/toggle "C-`" #'+popup/toggle
"C-~" #'+popup/raise "C-~" #'+popup/raise
"C-x p" #'+popup/other) "C-x p" #'+popup/other)
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
:n "C-t" #'+workspace/new :n "C-t" #'+workspace/new
:n "C-S-t" #'+workspace/display :n "C-S-t" #'+workspace/display
:g "M-1" #'+workspace/switch-to-0 :g "M-1" #'+workspace/switch-to-0
:g "M-2" #'+workspace/switch-to-1 :g "M-2" #'+workspace/switch-to-1
:g "M-3" #'+workspace/switch-to-2 :g "M-3" #'+workspace/switch-to-2
:g "M-4" #'+workspace/switch-to-3 :g "M-4" #'+workspace/switch-to-3
:g "M-5" #'+workspace/switch-to-4 :g "M-5" #'+workspace/switch-to-4
:g "M-6" #'+workspace/switch-to-5 :g "M-6" #'+workspace/switch-to-5
:g "M-7" #'+workspace/switch-to-6 :g "M-7" #'+workspace/switch-to-6
:g "M-8" #'+workspace/switch-to-7 :g "M-8" #'+workspace/switch-to-7
:g "M-9" #'+workspace/switch-to-8 :g "M-9" #'+workspace/switch-to-8
:g "M-0" #'+workspace/switch-to-final :g "M-0" #'+workspace/switch-to-final
(:when IS-MAC (:when IS-MAC
:g "s-t" #'+workspace/new :g "s-t" #'+workspace/new
:g "s-T" #'+workspace/display :g "s-T" #'+workspace/display
:n "s-1" #'+workspace/switch-to-0 :n "s-1" #'+workspace/switch-to-0
:n "s-2" #'+workspace/switch-to-1 :n "s-2" #'+workspace/switch-to-1
:n "s-3" #'+workspace/switch-to-2 :n "s-3" #'+workspace/switch-to-2
:n "s-4" #'+workspace/switch-to-3 :n "s-4" #'+workspace/switch-to-3
:n "s-5" #'+workspace/switch-to-4 :n "s-5" #'+workspace/switch-to-4
:n "s-6" #'+workspace/switch-to-5 :n "s-6" #'+workspace/switch-to-5
:n "s-7" #'+workspace/switch-to-6 :n "s-7" #'+workspace/switch-to-6
:n "s-8" #'+workspace/switch-to-7 :n "s-8" #'+workspace/switch-to-7
:n "s-9" #'+workspace/switch-to-8 :n "s-9" #'+workspace/switch-to-8
:n "s-0" #'+workspace/switch-to-final))) :n "s-0" #'+workspace/switch-to-final)))
;;; :editor ;;; :editor
(map! (:when (featurep! :editor format) (map! (:when (featurep! :editor format)
@ -267,12 +270,12 @@
:desc "help" "h" help-map :desc "help" "h" help-map
(:when (featurep! :ui popup) (:when (featurep! :ui popup)
:desc "Toggle last popup" "~" #'+popup/toggle) :desc "Toggle last popup" "~" #'+popup/toggle)
:desc "Find file" "." #'find-file :desc "Find file" "." #'find-file
:desc "Switch buffer" "," #'switch-to-buffer :desc "Switch buffer" "," #'switch-to-buffer
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
:desc "Switch workspace buffer" "," #'persp-switch-to-buffer :desc "Switch workspace buffer" "," #'persp-switch-to-buffer
:desc "Switch buffer" "<" #'switch-to-buffer) :desc "Switch buffer" "<" #'switch-to-buffer)
:desc "Switch to last buffer" "`" #'evil-switch-to-windows-last-buffer :desc "Switch to last buffer" "`" #'evil-switch-to-windows-last-buffer
:desc "Resume last search" "'" :desc "Resume last search" "'"
(cond ((featurep! :completion ivy) #'ivy-resume) (cond ((featurep! :completion ivy) #'ivy-resume)
@ -285,365 +288,367 @@
;;; <leader> TAB --- workspace ;;; <leader> TAB --- workspace
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
(:prefix-map ("TAB" . "workspace") (:prefix-map ("TAB" . "workspace")
:desc "Display tab bar" "TAB" #'+workspace/display :desc "Display tab bar" "TAB" #'+workspace/display
:desc "Switch workspace" "." #'+workspace/switch-to :desc "Switch workspace" "." #'+workspace/switch-to
:desc "Switch to last workspace" "`" #'+workspace/other :desc "Switch to last workspace" "`" #'+workspace/other
:desc "New workspace" "n" #'+workspace/new :desc "New workspace" "n" #'+workspace/new
:desc "Load workspace from file" "l" #'+workspace/load :desc "Load workspace from file" "l" #'+workspace/load
:desc "Save workspace to file" "s" #'+workspace/save :desc "Save workspace to file" "s" #'+workspace/save
:desc "Delete session" "x" #'+workspace/kill-session :desc "Delete session" "x" #'+workspace/kill-session
:desc "Delete this workspace" "d" #'+workspace/delete :desc "Delete this workspace" "d" #'+workspace/delete
:desc "Rename workspace" "r" #'+workspace/rename :desc "Rename workspace" "r" #'+workspace/rename
:desc "Restore last session" "R" #'+workspace/restore-last-session :desc "Restore last session" "R" #'+workspace/restore-last-session
:desc "Next workspace" "]" #'+workspace/switch-right :desc "Next workspace" "]" #'+workspace/switch-right
:desc "Previous workspace" "[" #'+workspace/switch-left :desc "Previous workspace" "[" #'+workspace/switch-left
:desc "Switch to 1st workspace" "1" #'+workspace/switch-to-0 :desc "Switch to 1st workspace" "1" #'+workspace/switch-to-0
:desc "Switch to 2nd workspace" "2" #'+workspace/switch-to-1 :desc "Switch to 2nd workspace" "2" #'+workspace/switch-to-1
:desc "Switch to 3rd workspace" "3" #'+workspace/switch-to-2 :desc "Switch to 3rd workspace" "3" #'+workspace/switch-to-2
:desc "Switch to 4th workspace" "4" #'+workspace/switch-to-3 :desc "Switch to 4th workspace" "4" #'+workspace/switch-to-3
:desc "Switch to 5th workspace" "5" #'+workspace/switch-to-4 :desc "Switch to 5th workspace" "5" #'+workspace/switch-to-4
:desc "Switch to 6th workspace" "6" #'+workspace/switch-to-5 :desc "Switch to 6th workspace" "6" #'+workspace/switch-to-5
:desc "Switch to 7th workspace" "7" #'+workspace/switch-to-6 :desc "Switch to 7th workspace" "7" #'+workspace/switch-to-6
:desc "Switch to 8th workspace" "8" #'+workspace/switch-to-7 :desc "Switch to 8th workspace" "8" #'+workspace/switch-to-7
:desc "Switch to 9th workspace" "9" #'+workspace/switch-to-8 :desc "Switch to 9th workspace" "9" #'+workspace/switch-to-8
:desc "Switch to final workspace" "0" #'+workspace/switch-to-final)) :desc "Switch to final workspace" "0" #'+workspace/switch-to-final))
;;; <leader> b --- buffer ;;; <leader> b --- buffer
(:prefix-map ("b" . "buffer") (:prefix-map ("b" . "buffer")
:desc "Toggle narrowing" "-" #'doom/toggle-narrow-buffer :desc "Toggle narrowing" "-" #'doom/toggle-narrow-buffer
:desc "Previous buffer" "[" #'previous-buffer :desc "Previous buffer" "[" #'previous-buffer
:desc "Next buffer" "]" #'next-buffer :desc "Next buffer" "]" #'next-buffer
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
:desc "Switch workspace buffer" "b" #'persp-switch-to-buffer :desc "Switch workspace buffer" "b" #'persp-switch-to-buffer
:desc "Switch buffer" "B" #'switch-to-buffer) :desc "Switch buffer" "B" #'switch-to-buffer)
(:unless (featurep! :ui workspaces) (:unless (featurep! :ui workspaces)
:desc "Switch buffer" "b" #'switch-to-buffer) :desc "Switch buffer" "b" #'switch-to-buffer)
:desc "Kill buffer" "d" #'kill-current-buffer :desc "Kill buffer" "d" #'kill-current-buffer
:desc "ibuffer" "i" #'ibuffer :desc "ibuffer" "i" #'ibuffer
:desc "Kill buffer" "k" #'kill-current-buffer :desc "Kill buffer" "k" #'kill-current-buffer
:desc "Kill all buffers" "K" #'doom/kill-all-buffers :desc "Kill all buffers" "K" #'doom/kill-all-buffers
:desc "Switch to last buffer" "l" #'evil-switch-to-windows-last-buffer :desc "Switch to last buffer" "l" #'evil-switch-to-windows-last-buffer
:desc "Set bookmark" "m" #'bookmark-set :desc "Set bookmark" "m" #'bookmark-set
:desc "Delete bookmark" "M" #'bookmark-delete :desc "Delete bookmark" "M" #'bookmark-delete
:desc "Next buffer" "n" #'next-buffer :desc "Next buffer" "n" #'next-buffer
:desc "New empty buffer" "N" #'evil-buffer-new :desc "New empty buffer" "N" #'evil-buffer-new
:desc "Kill other buffers" "O" #'doom/kill-other-buffers :desc "Kill other buffers" "O" #'doom/kill-other-buffers
:desc "Previous buffer" "p" #'previous-buffer :desc "Previous buffer" "p" #'previous-buffer
:desc "Revert buffer" "r" #'revert-buffer :desc "Revert buffer" "r" #'revert-buffer
:desc "Save buffer" "s" #'basic-save-buffer :desc "Save buffer" "s" #'basic-save-buffer
:desc "Save all buffers" "S" #'evil-write-all :desc "Save all buffers" "S" #'evil-write-all
:desc "Save buffer as root" "u" #'doom/sudo-save-buffer :desc "Save buffer as root" "u" #'doom/sudo-save-buffer
:desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer
:desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer
:desc "Bury buffer" "z" #'bury-buffer :desc "Bury buffer" "z" #'bury-buffer
:desc "Kill buried buffers" "Z" #'doom/kill-buried-buffers) :desc "Kill buried buffers" "Z" #'doom/kill-buried-buffers)
;;; <leader> c --- code ;;; <leader> c --- code
(:prefix-map ("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 "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 :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 "LSP Rename" "r" #'lsp-rename
:desc "Send to repl" "s" #'+eval/send-region-to-repl (:after lsp-mode
:desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace :desc "LSP" "l" lsp-command-map))
:desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines :desc "Send to repl" "s" #'+eval/send-region-to-repl
:desc "List errors" "x" #'flymake-show-diagnostics-buffer :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace
(:when (featurep! :checkers syntax) :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines
:desc "List errors" "x" #'flycheck-list-errors)) :desc "List errors" "x" #'flymake-show-diagnostics-buffer
(:when (featurep! :checkers syntax)
:desc "List errors" "x" #'flycheck-list-errors))
;;; <leader> f --- file ;;; <leader> f --- file
(:prefix-map ("f" . "file") (:prefix-map ("f" . "file")
:desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig
:desc "Copy this file" "C" #'doom/copy-this-file :desc "Copy this file" "C" #'doom/copy-this-file
:desc "Find directory" "d" #'dired :desc "Find directory" "d" #'dired
:desc "Delete this file" "D" #'doom/delete-this-file :desc "Delete this file" "D" #'doom/delete-this-file
:desc "Find file in emacs.d" "e" #'+default/find-in-emacsd :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd
:desc "Browse emacs.d" "E" #'+default/browse-emacsd :desc "Browse emacs.d" "E" #'+default/browse-emacsd
:desc "Find file" "f" #'find-file :desc "Find file" "f" #'find-file
:desc "Find file from here" "F" #'+default/find-file-under-here :desc "Find file from here" "F" #'+default/find-file-under-here
:desc "Locate file" "l" #'locate :desc "Locate file" "l" #'locate
:desc "Find file in private config" "p" #'doom/find-file-in-private-config :desc "Find file in private config" "p" #'doom/find-file-in-private-config
:desc "Browse private config" "P" #'doom/open-private-config :desc "Browse private config" "P" #'doom/open-private-config
:desc "Recent files" "r" #'recentf-open-files :desc "Recent files" "r" #'recentf-open-files
:desc "Rename/move file" "R" #'doom/move-this-file :desc "Rename/move file" "R" #'doom/move-this-file
:desc "Save file" "s" #'save-buffer :desc "Save file" "s" #'save-buffer
:desc "Save file as..." "S" #'write-file :desc "Save file as..." "S" #'write-file
:desc "Sudo find file" "u" #'doom/sudo-find-file :desc "Sudo find file" "u" #'doom/sudo-find-file
:desc "Sudo this file" "U" #'doom/sudo-this-file :desc "Sudo this file" "U" #'doom/sudo-this-file
:desc "Yank filename" "y" #'+default/yank-buffer-filename) :desc "Yank filename" "y" #'+default/yank-buffer-filename)
;;; <leader> g --- git/version control ;;; <leader> g --- git/version control
(:prefix-map ("g" . "git") (:prefix-map ("g" . "git")
:desc "Revert file" "R" #'vc-revert :desc "Revert file" "R" #'vc-revert
:desc "Copy link to remote" "y" #'browse-at-remote-kill :desc "Copy link to remote" "y" #'browse-at-remote-kill
:desc "Copy link to homepage" "Y" #'+vc/browse-at-remote-kill-homepage :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) (:when (featurep! :ui hydra)
:desc "SMerge" "m" #'+vc/smerge-hydra/body) :desc "VCGutter" "." #'+vc/gutter-hydra/body)
(:when (featurep! :ui vc-gutter) :desc "Revert hunk" "r" #'git-gutter:revert-hunk
(:when (featurep! :ui hydra) :desc "Git stage hunk" "s" #'git-gutter:stage-hunk
:desc "VCGutter" "." #'+vc/gutter-hydra/body) :desc "Git time machine" "t" #'git-timemachine-toggle
:desc "Revert hunk" "r" #'git-gutter:revert-hunk :desc "Jump to next hunk" "]" #'git-gutter:next-hunk
:desc "Git stage hunk" "s" #'git-gutter:stage-hunk :desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk)
:desc "Git time machine" "t" #'git-timemachine-toggle (:when (featurep! :tools magit)
:desc "Jump to next hunk" "]" #'git-gutter:next-hunk :desc "Magit dispatch" "/" #'magit-dispatch
:desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk) :desc "Forge dispatch" "'" #'forge-dispatch
(:when (featurep! :tools magit) :desc "Magit switch branch" "b" #'magit-branch-checkout
:desc "Magit dispatch" "/" #'magit-dispatch :desc "Magit status" "g" #'magit-status
:desc "Forge dispatch" "'" #'forge-dispatch :desc "Magit file delete" "D" #'magit-file-delete
:desc "Magit switch branch" "b" #'magit-branch-checkout :desc "Magit blame" "B" #'magit-blame-addition
:desc "Magit status" "g" #'magit-status :desc "Magit clone" "C" #'magit-clone
:desc "Magit file delete" "D" #'magit-file-delete :desc "Magit fetch" "F" #'magit-fetch
:desc "Magit blame" "B" #'magit-blame-addition :desc "Magit buffer log" "L" #'magit-log
:desc "Magit clone" "C" #'magit-clone :desc "Git stage file" "S" #'magit-stage-file
:desc "Magit fetch" "F" #'magit-fetch :desc "Git unstage file" "U" #'magit-unstage-file
:desc "Magit buffer log" "L" #'magit-log (:prefix ("f" . "find")
:desc "Git stage file" "S" #'magit-stage-file :desc "Find file" "f" #'magit-find-file
:desc "Git unstage file" "U" #'magit-unstage-file :desc "Find gitconfig file" "g" #'magit-find-git-config-file
(:prefix ("f" . "find") :desc "Find commit" "c" #'magit-show-commit
:desc "Find file" "f" #'magit-find-file :desc "Find issue" "i" #'forge-visit-issue
:desc "Find gitconfig file" "g" #'magit-find-git-config-file :desc "Find pull request" "p" #'forge-visit-pullreq)
:desc "Find commit" "c" #'magit-show-commit (:prefix ("o" . "open in browser")
:desc "Find issue" "i" #'forge-visit-issue :desc "Browse file or region" "o" #'browse-at-remote
:desc "Find pull request" "p" #'forge-visit-pullreq) :desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage
(:prefix ("o" . "open in browser") :desc "Browse remote" "r" #'forge-browse-remote
:desc "Browse file or region" "o" #'browse-at-remote :desc "Browse commit" "c" #'forge-browse-commit
:desc "Browse homepage" "h" #'+vc/browse-at-remote-homepage :desc "Browse an issue" "i" #'forge-browse-issue
:desc "Browse remote" "r" #'forge-browse-remote :desc "Browse a pull request" "p" #'forge-browse-pullreq
:desc "Browse commit" "c" #'forge-browse-commit :desc "Browse issues" "I" #'forge-browse-issues
:desc "Browse an issue" "i" #'forge-browse-issue :desc "Browse pull requests" "P" #'forge-browse-pullreqs)
:desc "Browse a pull request" "p" #'forge-browse-pullreq (:prefix ("l" . "list")
:desc "Browse issues" "I" #'forge-browse-issues (:when (featurep! :tools gist)
:desc "Browse pull requests" "P" #'forge-browse-pullreqs) :desc "List gists" "g" #'+gist:list)
(:prefix ("l" . "list") :desc "List repositories" "r" #'magit-list-repositories
(:when (featurep! :tools gist) :desc "List submodules" "s" #'magit-list-submodules
:desc "List gists" "g" #'+gist:list) :desc "List issues" "i" #'forge-list-issues
:desc "List repositories" "r" #'magit-list-repositories :desc "List pull requests" "p" #'forge-list-pullreqs
:desc "List submodules" "s" #'magit-list-submodules :desc "List notifications" "n" #'forge-list-notifications)
:desc "List issues" "i" #'forge-list-issues (:prefix ("c" . "create")
:desc "List pull requests" "p" #'forge-list-pullreqs :desc "Initialize repo" "r" #'magit-init
:desc "List notifications" "n" #'forge-list-notifications) :desc "Clone repo" "R" #'magit-clone
(:prefix ("c" . "create") :desc "Commit" "c" #'magit-commit-create
:desc "Initialize repo" "r" #'magit-init :desc "Fixup" "f" #'magit-commit-fixup
:desc "Clone repo" "R" #'magit-clone :desc "Branch" "b" #'magit-branch-and-checkout
:desc "Commit" "c" #'magit-commit-create :desc "Issue" "i" #'forge-create-issue
:desc "Fixup" "f" #'magit-commit-fixup :desc "Pull request" "p" #'forge-create-pullreq)))
:desc "Branch" "b" #'magit-branch-and-checkout
:desc "Issue" "i" #'forge-create-issue
:desc "Pull request" "p" #'forge-create-pullreq)))
;;; <leader> i --- insert ;;; <leader> i --- insert
(:prefix-map ("i" . "insert") (:prefix-map ("i" . "insert")
:desc "Current file name" "f" #'+default/insert-file-path :desc "Current file name" "f" #'+default/insert-file-path
:desc "Current file path" "F" (λ!! #'+default/insert-file-path t) :desc "Current file path" "F" (λ!! #'+default/insert-file-path t)
:desc "Evil ex path" "p" (λ! (evil-ex "R!echo ")) :desc "Evil ex path" "p" (λ! (evil-ex "R!echo "))
:desc "From evil register" "r" #'evil-ex-registers :desc "From evil register" "r" #'evil-ex-registers
:desc "Snippet" "s" #'yas-insert-snippet :desc "Snippet" "s" #'yas-insert-snippet
:desc "Unicode" "u" #'unicode-chars-list-chars :desc "Unicode" "u" #'unicode-chars-list-chars
:desc "From clipboard" "y" #'+default/yank-pop) :desc "From clipboard" "y" #'+default/yank-pop)
;;; <leader> n --- notes ;;; <leader> n --- notes
(:prefix-map ("n" . "notes") (:prefix-map ("n" . "notes")
:desc "Search notes for symbol" "*" #'+default/search-notes-for-symbol-at-point :desc "Search notes for symbol" "*" #'+default/search-notes-for-symbol-at-point
:desc "Org agenda" "a" #'org-agenda :desc "Org agenda" "a" #'org-agenda
(:when (featurep! :tools biblio) (:when (featurep! :tools biblio)
:desc "Bibliographic entries" "b" :desc "Bibliographic entries" "b"
(cond ((featurep! :completion ivy) #'ivy-bibtex) (cond ((featurep! :completion ivy) #'ivy-bibtex)
((featurep! :completion helm) #'helm-bibtex))) ((featurep! :completion helm) #'helm-bibtex)))
:desc "Toggle org-clock" "c" #'+org/toggle-clock :desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel :desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft :desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter) (:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter) :desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes :desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes :desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link :desc "Org store link" "l" #'org-store-link
:desc "Tags search" "m" #'org-tags-view :desc "Tags search" "m" #'org-tags-view
:desc "Org capture" "n" #'org-capture :desc "Org capture" "n" #'org-capture
:desc "Goto capture" "N" #'org-capture-goto-target :desc "Goto capture" "N" #'org-capture-goto-target
:desc "Active org-clock" "o" #'org-clock-goto :desc "Active org-clock" "o" #'org-clock-goto
:desc "Todo list" "t" #'org-todo-list :desc "Todo list" "t" #'org-todo-list
:desc "Search notes" "s" #'+default/org-notes-search :desc "Search notes" "s" #'+default/org-notes-search
:desc "Search org agenda headlines" "S" #'+default/org-notes-headlines :desc "Search org agenda headlines" "S" #'+default/org-notes-headlines
:desc "View search" "v" #'org-search-view :desc "View search" "v" #'org-search-view
:desc "Org export to clipboard" "y" #'+org/export-to-clipboard :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 "Org export to clipboard as RTF" "Y" #'+org/export-to-clipboard-as-rich-text
(:when (featurep! :lang org +roam) (:when (featurep! :lang org +roam)
(:prefix ("r" . "roam") (:prefix ("r" . "roam")
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture :desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file :desc "Find file" "f" #'org-roam-find-file
:desc "Show graph" "g" #'org-roam-graph :desc "Show graph" "g" #'org-roam-graph
:desc "Insert" "i" #'org-roam-insert :desc "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam :desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date") (:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-dailies-date :desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-dailies-today :desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-dailies-tomorrow :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-dailies-yesterday))) :desc "Yesterday" "y" #'org-roam-dailies-yesterday)))
(:when (featurep! :lang org +journal) (:when (featurep! :lang org +journal)
(:prefix ("j" . "journal") (:prefix ("j" . "journal")
:desc "New Entry" "j" #'org-journal-new-entry :desc "New Entry" "j" #'org-journal-new-entry
:desc "Search Forever" "s" #'org-journal-search-forever))) :desc "Search Forever" "s" #'org-journal-search-forever)))
;;; <leader> o --- open ;;; <leader> o --- open
(:prefix-map ("o" . "open") (:prefix-map ("o" . "open")
:desc "Org agenda" "A" #'org-agenda :desc "Org agenda" "A" #'org-agenda
(:prefix ("a" . "org agenda") (:prefix ("a" . "org agenda")
:desc "Agenda" "a" #'org-agenda :desc "Agenda" "a" #'org-agenda
:desc "Todo list" "t" #'org-todo-list :desc "Todo list" "t" #'org-todo-list
:desc "Tags search" "m" #'org-tags-view :desc "Tags search" "m" #'org-tags-view
:desc "View search" "v" #'org-search-view) :desc "View search" "v" #'org-search-view)
:desc "Default browser" "b" #'browse-url-of-file :desc "Default browser" "b" #'browse-url-of-file
:desc "Start debugger" "d" #'+debugger/start :desc "Start debugger" "d" #'+debugger/start
:desc "New frame" "f" #'make-frame :desc "New frame" "f" #'make-frame
:desc "REPL" "r" #'+eval/open-repl-other-window :desc "REPL" "r" #'+eval/open-repl-other-window
:desc "REPL (same window)" "R" #'+eval/open-repl-same-window :desc "REPL (same window)" "R" #'+eval/open-repl-same-window
:desc "Dired" "-" #'dired-jump :desc "Dired" "-" #'dired-jump
(:when (featurep! :ui neotree) (:when (featurep! :ui neotree)
:desc "Project sidebar" "p" #'+neotree/open :desc "Project sidebar" "p" #'+neotree/open
:desc "Find file in project sidebar" "P" #'+neotree/find-this-file) :desc "Find file in project sidebar" "P" #'+neotree/find-this-file)
(:when (featurep! :ui treemacs) (:when (featurep! :ui treemacs)
:desc "Project sidebar" "p" #'+treemacs/toggle :desc "Project sidebar" "p" #'+treemacs/toggle
:desc "Find file in project sidebar" "P" #'+treemacs/find-file) :desc "Find file in project sidebar" "P" #'treemacs-find-file)
(:when (featurep! :term shell) (:when (featurep! :term shell)
:desc "Toggle shell popup" "t" #'+shell/toggle :desc "Toggle shell popup" "t" #'+shell/toggle
:desc "Open shell here" "T" #'+shell/here) :desc "Open shell here" "T" #'+shell/here)
(:when (featurep! :term term) (:when (featurep! :term term)
:desc "Toggle terminal popup" "t" #'+term/toggle :desc "Toggle terminal popup" "t" #'+term/toggle
:desc "Open terminal here" "T" #'+term/here) :desc "Open terminal here" "T" #'+term/here)
(:when (featurep! :term vterm) (:when (featurep! :term vterm)
:desc "Toggle vterm popup" "t" #'+vterm/toggle :desc "Toggle vterm popup" "t" #'+vterm/toggle
:desc "Open vterm here" "T" #'+vterm/here) :desc "Open vterm here" "T" #'+vterm/here)
(:when (featurep! :term eshell) (:when (featurep! :term eshell)
:desc "Toggle eshell popup" "e" #'+eshell/toggle :desc "Toggle eshell popup" "e" #'+eshell/toggle
:desc "Open eshell here" "E" #'+eshell/here) :desc "Open eshell here" "E" #'+eshell/here)
(:when (featurep! :tools macos) (:when (featurep! :tools macos)
:desc "Reveal in Finder" "o" #'+macos/reveal-in-finder :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder
:desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder
:desc "Send to Transmit" "u" #'+macos/send-to-transmit :desc "Send to Transmit" "u" #'+macos/send-to-transmit
:desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit
:desc "Send to Launchbar" "l" #'+macos/send-to-launchbar :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar
:desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar)
(:when (featurep! :tools docker) (:when (featurep! :tools docker)
:desc "Docker" "D" #'docker)) :desc "Docker" "D" #'docker))
;;; <leader> p --- project ;;; <leader> p --- project
(:prefix-map ("p" . "project") (:prefix-map ("p" . "project")
:desc "Browse project" "." #'+default/browse-project :desc "Browse project" "." #'+default/browse-project
:desc "Browse other project" ">" #'doom/browse-in-other-project :desc "Browse other project" ">" #'doom/browse-in-other-project
:desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root
:desc "Add new project" "a" #'projectile-add-known-project :desc "Add new project" "a" #'projectile-add-known-project
:desc "Switch to project buffer" "b" #'projectile-switch-to-buffer :desc "Switch to project buffer" "b" #'projectile-switch-to-buffer
:desc "Compile in project" "c" #'projectile-compile-project :desc "Compile in project" "c" #'projectile-compile-project
:desc "Repeat last command" "C" #'projectile-repeat-last-command :desc "Repeat last command" "C" #'projectile-repeat-last-command
:desc "Remove known project" "d" #'projectile-remove-known-project :desc "Remove known project" "d" #'projectile-remove-known-project
:desc "Discover projects in folder" "D" #'+default/discover-projects :desc "Discover projects in folder" "D" #'+default/discover-projects
:desc "Edit project .dir-locals" "e" #'projectile-edit-dir-locals :desc "Edit project .dir-locals" "e" #'projectile-edit-dir-locals
:desc "Find file in project" "f" #'projectile-find-file :desc "Find file in project" "f" #'projectile-find-file
:desc "Find file in other project" "F" #'doom/find-file-in-other-project :desc "Find file in other project" "F" #'doom/find-file-in-other-project
:desc "Configure project" "g" #'projectile-configure-project :desc "Configure project" "g" #'projectile-configure-project
:desc "Invalidate project cache" "i" #'projectile-invalidate-cache :desc "Invalidate project cache" "i" #'projectile-invalidate-cache
:desc "Kill project buffers" "k" #'projectile-kill-buffers :desc "Kill project buffers" "k" #'projectile-kill-buffers
:desc "Find other file" "o" #'projectile-find-other-file :desc "Find other file" "o" #'projectile-find-other-file
:desc "Switch project" "p" #'projectile-switch-project :desc "Switch project" "p" #'projectile-switch-project
:desc "Find recent project files" "r" #'projectile-recentf :desc "Find recent project files" "r" #'projectile-recentf
:desc "Run project" "R" #'projectile-run-project :desc "Run project" "R" #'projectile-run-project
:desc "Save project files" "s" #'projectile-save-project-buffers :desc "Save project files" "s" #'projectile-save-project-buffers
:desc "List project tasks" "t" #'magit-todos-list :desc "List project tasks" "t" #'magit-todos-list
:desc "Test project" "T" #'projectile-test-project :desc "Test project" "T" #'projectile-test-project
:desc "Pop up scratch buffer" "x" #'doom/open-project-scratch-buffer :desc "Pop up scratch buffer" "x" #'doom/open-project-scratch-buffer
:desc "Switch to scratch buffer" "X" #'doom/switch-to-project-scratch-buffer) :desc "Switch to scratch buffer" "X" #'doom/switch-to-project-scratch-buffer)
;;; <leader> q --- quit/session ;;; <leader> q --- quit/session
(:prefix-map ("q" . "quit/session") (:prefix-map ("q" . "quit/session")
:desc "Restart emacs server" "d" #'+default/restart-server :desc "Restart emacs server" "d" #'+default/restart-server
:desc "Delete frame" "f" #'delete-frame :desc "Delete frame" "f" #'delete-frame
:desc "Clear current frame" "F" #'doom/kill-all-buffers :desc "Clear current frame" "F" #'doom/kill-all-buffers
:desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs :desc "Kill Emacs (and daemon)" "K" #'save-buffers-kill-emacs
:desc "Quit Emacs" "q" #'save-buffers-kill-terminal :desc "Quit Emacs" "q" #'save-buffers-kill-terminal
:desc "Quit Emacs without saving" "Q" #'evil-quit-all-with-error-code :desc "Quit Emacs without saving" "Q" #'evil-quit-all-with-error-code
:desc "Quick save current session" "s" #'doom/quicksave-session :desc "Quick save current session" "s" #'doom/quicksave-session
:desc "Restore last session" "l" #'doom/quickload-session :desc "Restore last session" "l" #'doom/quickload-session
:desc "Save session to file" "S" #'doom/save-session :desc "Save session to file" "S" #'doom/save-session
:desc "Restore session from file" "L" #'doom/load-session :desc "Restore session from file" "L" #'doom/load-session
:desc "Restart & restore Emacs" "r" #'doom/restart-and-restore :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore
:desc "Restart Emacs" "R" #'doom/restart) :desc "Restart Emacs" "R" #'doom/restart)
;;; <leader> r --- remote ;;; <leader> r --- remote
(:when (featurep! :tools upload) (:when (featurep! :tools upload)
(:prefix-map ("r" . "remote") (:prefix-map ("r" . "remote")
:desc "Upload local" "u" #'ssh-deploy-upload-handler :desc "Upload local" "u" #'ssh-deploy-upload-handler
:desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced
:desc "Download remote" "d" #'ssh-deploy-download-handler :desc "Download remote" "d" #'ssh-deploy-download-handler
:desc "Diff local & remote" "D" #'ssh-deploy-diff-handler :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler
:desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler
:desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler))
;;; <leader> s --- search ;;; <leader> s --- search
(:prefix-map ("s" . "search") (:prefix-map ("s" . "search")
:desc "Search buffer" "b" #'swiper :desc "Search buffer" "b" #'swiper
:desc "Search current directory" "d" #'+default/search-cwd :desc "Search current directory" "d" #'+default/search-cwd
:desc "Search other directory" "D" #'+default/search-other-cwd :desc "Search other directory" "D" #'+default/search-other-cwd
:desc "Locate file" "f" #'locate :desc "Locate file" "f" #'locate
:desc "Jump to symbol" "i" #'imenu :desc "Jump to symbol" "i" #'imenu
:desc "Jump to visible link" "l" #'link-hint-open-link :desc "Jump to visible link" "l" #'link-hint-open-link
:desc "Jump to link" "L" #'ffap-menu :desc "Jump to link" "L" #'ffap-menu
:desc "Jump list" "j" #'evil-show-jumps :desc "Jump list" "j" #'evil-show-jumps
:desc "Jump to bookmark" "m" #'bookmark-jump :desc "Jump to bookmark" "m" #'bookmark-jump
:desc "Look up online" "o" #'+lookup/online :desc "Look up online" "o" #'+lookup/online
:desc "Look up online (w/ prompt)" "O" #'+lookup/online-select :desc "Look up online (w/ prompt)" "O" #'+lookup/online-select
:desc "Look up in local docsets" "k" #'+lookup/in-docsets :desc "Look up in local docsets" "k" #'+lookup/in-docsets
:desc "Look up in all docsets" "K" #'+lookup/in-all-docsets :desc "Look up in all docsets" "K" #'+lookup/in-all-docsets
:desc "Search project" "p" #'+default/search-project :desc "Search project" "p" #'+default/search-project
:desc "Search other project" "P" #'+default/search-other-project :desc "Search other project" "P" #'+default/search-other-project
:desc "Jump to mark" "r" #'evil-show-marks :desc "Jump to mark" "r" #'evil-show-marks
:desc "Search buffer" "s" #'swiper-isearch :desc "Search buffer" "s" #'swiper-isearch
:desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point :desc "Search buffer for thing at point" "S" #'swiper-isearch-thing-at-point
:desc "Dictionary" "t" #'+lookup/dictionary-definition :desc "Dictionary" "t" #'+lookup/dictionary-definition
:desc "Thesaurus" "T" #'+lookup/synonyms) :desc "Thesaurus" "T" #'+lookup/synonyms)
;;; <leader> t --- toggle ;;; <leader> t --- toggle
(:prefix-map ("t" . "toggle") (:prefix-map ("t" . "toggle")
:desc "Big mode" "b" #'doom-big-font-mode :desc "Big mode" "b" #'doom-big-font-mode
:desc "Flymake" "f" #'flymake-mode :desc "Flymake" "f" #'flymake-mode
(:when (featurep! :checkers syntax) (:when (featurep! :checkers syntax)
:desc "Flycheck" "f" #'flycheck-mode) :desc "Flycheck" "f" #'flycheck-mode)
:desc "Frame fullscreen" "F" #'toggle-frame-fullscreen :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen
:desc "Evil goggles" "g" #'evil-goggles-mode :desc "Evil goggles" "g" #'evil-goggles-mode
(:when (featurep! :ui indent-guides) (:when (featurep! :ui indent-guides)
:desc "Indent guides" "i" #'highlight-indent-guides-mode) :desc "Indent guides" "i" #'highlight-indent-guides-mode)
:desc "Indent style" "I" #'doom/toggle-indent-style :desc "Indent style" "I" #'doom/toggle-indent-style
:desc "Line numbers" "l" #'doom/toggle-line-numbers :desc "Line numbers" "l" #'doom/toggle-line-numbers
(:when (featurep! :lang org +present) (:when (featurep! :lang org +present)
:desc "org-tree-slide mode" "p" #'org-tree-slide-mode) :desc "org-tree-slide mode" "p" #'org-tree-slide-mode)
:desc "Read-only mode" "r" #'read-only-mode :desc "Read-only mode" "r" #'read-only-mode
(:when (featurep! :checkers spell) (:when (featurep! :checkers spell)
:desc "Flyspell" "s" #'flyspell-mode) :desc "Flyspell" "s" #'flyspell-mode)
(:when (featurep! :lang org +pomodoro) (:when (featurep! :lang org +pomodoro)
:desc "Pomodoro timer" "t" #'org-pomodoro) :desc "Pomodoro timer" "t" #'org-pomodoro)
:desc "Soft line wrapping" "w" #'visual-line-mode :desc "Soft line wrapping" "w" #'visual-line-mode
(:when (featurep! :editor word-wrap) (:when (featurep! :editor word-wrap)
:desc "Soft line wrapping" "w" #'+word-wrap-mode) :desc "Soft line wrapping" "w" #'+word-wrap-mode)
:desc "Zen mode" "z" #'writeroom-mode)) :desc "Zen mode" "z" #'writeroom-mode))
(after! which-key (after! which-key
(let ((prefix-re (regexp-opt (list doom-leader-key doom-leader-alt-key)))) (let ((prefix-re (regexp-opt (list doom-leader-key doom-leader-alt-key))))

View file

@ -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. "Conduct a text search in the current project root.
If prefix ARG is set, prompt for a known project to search from." If prefix ARG is set, prompt for a known project to search from."
(interactive "P") (interactive "P")
(let* ((disabled-command-function nil) (let* ((projectile-project-root nil)
(disabled-command-function nil)
(default-directory (default-directory
(if arg (if arg
(if-let (projects (projectile-relevant-known-projects)) (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 (interactive
(list (rxt-quote-pcre (or (doom-thing-at-point-or-region) "")) (list (rxt-quote-pcre (or (doom-thing-at-point-or-region) ""))
current-prefix-arg)) current-prefix-arg))
(let ((default-directory (let* ((projectile-project-root nil)
(if arg (default-directory
(if-let (projects (projectile-relevant-known-projects)) (if arg
(completing-read "Switch to project: " projects (if-let (projects (projectile-relevant-known-projects))
nil t nil nil (doom-project-root)) (completing-read "Switch to project: " projects
(user-error "There are no known projects")) nil t nil nil (doom-project-root))
default-directory))) (user-error "There are no known projects"))
default-directory)))
(cond ((featurep! :completion ivy) (cond ((featurep! :completion ivy)
(+ivy/project-search nil symbol)) (+ivy/project-search nil symbol))
((featurep! :completion helm) ((featurep! :completion helm)

View file

@ -50,21 +50,6 @@ If `buffer-file-name' isn't set, uses `default-directory'."
(abbreviate-file-name path) (abbreviate-file-name path)
(file-name-nondirectory 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 () (defun doom--backward-delete-whitespace-to-column ()
"Delete back to the previous column of whitespace, or as much whitespace as "Delete back to the previous column of whitespace, or as much whitespace as

View file

@ -1,5 +1,8 @@
;;; config/default/config.el -*- lexical-binding: t; -*- ;;; 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 (defvar +default-minibuffer-maps
(append '(minibuffer-local-map (append '(minibuffer-local-map
minibuffer-local-ns-map minibuffer-local-ns-map
@ -220,8 +223,28 @@
;; f) do none of this when inside a string ;; f) do none of this when inside a string
(advice-add #'delete-backward-char :override #'+default--delete-backward-char-a)) (advice-add #'delete-backward-char :override #'+default--delete-backward-char-a))
;; Makes `newline-and-indent' continue comments (and more reliably) ;; HACK Makes `newline-and-indent' continue comments (and more reliably).
(advice-add #'newline-and-indent :override #'+default--newline-indent-and-continue-comments-a)) ;; 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)))
;; ;;

View file

@ -1,9 +1,9 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; config/default/packages.el ;;; config/default/packages.el
(package! avy :pin "3bf83140fa") (package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd")
(package! drag-stuff :pin "6d06d846cd") (package! drag-stuff :pin "6d06d846cd37c052d79acd0f372c13006aa7e7c8")
(package! link-hint :pin "0d9cabcdb7") (package! link-hint :pin "7440704cacb5c0fab35fff8ec59d30fbea17f44a")
(unless (featurep! :editor evil) (unless (featurep! :editor evil)
(package! expand-region :pin "ea6b4cbb99")) (package! expand-region :pin "ea6b4cbb9985ddae532bd2faf9bb00570c9f2781"))

View file

@ -123,8 +123,7 @@ more information on modifiers."
(not (eq this-command 'evil-open-below)) (not (eq this-command 'evil-open-below))
(evil-insert-state-p)) (evil-insert-state-p))
(funcall orig-fn count) (funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-below) (letf! (defun evil-insert-newline-below () (+evil--insert-newline))
(lambda () (+evil--insert-newline))))
(let ((evil-auto-indent evil-auto-indent)) (let ((evil-auto-indent evil-auto-indent))
(funcall orig-fn count))))) (funcall orig-fn count)))))
@ -134,8 +133,7 @@ more information on modifiers."
(not (eq this-command 'evil-open-above)) (not (eq this-command 'evil-open-above))
(evil-insert-state-p)) (evil-insert-state-p))
(funcall orig-fn count) (funcall orig-fn count)
(cl-letf (((symbol-function 'evil-insert-newline-above) (letf! (defun evil-insert-newline-above () (+evil--insert-newline 'above))
(lambda () (+evil--insert-newline 'above))))
(let ((evil-auto-indent evil-auto-indent)) (let ((evil-auto-indent evil-auto-indent))
(funcall orig-fn count))))) (funcall orig-fn count)))))

View file

@ -280,8 +280,13 @@ directives. By default, this only recognizes C directives.")
evil-escape-delay 0.15) evil-escape-delay 0.15)
(evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape)
:config :config
;; no `evil-escape' in minibuffer ;; no `evil-escape' in minibuffer, unless `evil-collection-setup-minibuffer'
(add-hook 'evil-escape-inhibit-functions #'minibufferp) ;; 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 ;; so that evil-escape-mode-hook runs, and can be toggled by evil-mc
(evil-escape-mode +1)) (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-encode
:m "[y" #'+evil:c-string-decode :m "[y" #'+evil:c-string-decode
(:when (featurep! :lang web) (:when (featurep! :lang web)
:m "]x" #'+web:encode-html-entities :m "]x" #'+web:encode-html-entities
:m "[x" #'+web:decode-html-entities) :m "[x" #'+web:decode-html-entities)
(:when (featurep! :ui vc-gutter) (:when (featurep! :ui vc-gutter)
:m "]d" #'git-gutter:next-hunk :m "]d" #'git-gutter:next-hunk
:m "[d" #'git-gutter:previous-hunk) :m "[d" #'git-gutter:previous-hunk)
(:when (featurep! :ui hl-todo) (:when (featurep! :ui hl-todo)
:m "]t" #'hl-todo-next :m "]t" #'hl-todo-next
:m "[t" #'hl-todo-previous) :m "[t" #'hl-todo-previous)
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
:n "gt" #'+workspace:switch-next :n "gt" #'+workspace:switch-next
:n "gT" #'+workspace:switch-previous :n "gT" #'+workspace:switch-previous
:n "]w" #'+workspace/switch-right :n "]w" #'+workspace/switch-right
:n "[w" #'+workspace/switch-left) :n "[w" #'+workspace/switch-left)
(:when (featurep! :ui tabs) (:when (featurep! :ui tabs)
:n "gt" #'centaur-tabs-forward :n "gt" #'centaur-tabs-forward
:n "gT" #'centaur-tabs-backward) :n "gT" #'centaur-tabs-backward)
;; custom vim-unmpaired-esque keys ;; custom vim-unmpaired-esque keys
:m "]#" #'+evil/next-preproc-directive :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/dec-at-pt-incremental
:v "g+" #'evil-numbers/inc-at-pt :v "g+" #'evil-numbers/inc-at-pt
(:when (featurep! :tools lookup) (:when (featurep! :tools lookup)
:nv "K" #'+lookup/documentation :nv "K" #'+lookup/documentation
:nv "gd" #'+lookup/definition :nv "gd" #'+lookup/definition
:nv "gD" #'+lookup/references :nv "gD" #'+lookup/references
:nv "gf" #'+lookup/file) :nv "gf" #'+lookup/file)
(:when (featurep! :tools eval) (:when (featurep! :tools eval)
:nv "gr" #'+eval:region :nv "gr" #'+eval:region
:n "gR" #'+eval/buffer :n "gR" #'+eval/buffer
:v "gR" #'+eval:replace-region :v "gR" #'+eval:replace-region
;; Restore these keybinds, since the blacklisted/overwritten gr/gR will ;; Restore these keybinds, since the blacklisted/overwritten gr/gR will
;; undo them: ;; undo them:
(:after dired (:after dired
:map dired-mode-map :map dired-mode-map
:n "gr" #'revert-buffer) :n "gr" #'revert-buffer)
(:after notmuch (:after notmuch
:map notmuch-common-keymap :map notmuch-common-keymap
:n "gr" #'notmuch-refresh-this-buffer :n "gr" #'notmuch-refresh-this-buffer
:n "gR" #'notmuch-poll-and-refresh-this-buffer) :n "gR" #'notmuch-poll-and-refresh-this-buffer)
(:after elfeed (:after elfeed
:map elfeed-search-update--force :map elfeed-search-mode-map
:n "gr" #'elfeed-search-update--force :n "gr" #'elfeed-search-update--force
:n "gR" #'elfeed-search-fetch)) :n "gR" #'elfeed-search-fetch))
:nv "z=" #'flyspell-correct-at-point :nv "z=" #'flyspell-correct-at-point
;; custom evil keybinds ;; custom evil keybinds
@ -504,30 +509,30 @@ To change these keys see `+evil-repeat-keys'."
;; window management (prefix "C-w") ;; window management (prefix "C-w")
(:map evil-window-map (:map evil-window-map
;; Navigation ;; Navigation
"C-h" #'evil-window-left "C-h" #'evil-window-left
"C-j" #'evil-window-down "C-j" #'evil-window-down
"C-k" #'evil-window-up "C-k" #'evil-window-up
"C-l" #'evil-window-right "C-l" #'evil-window-right
"C-w" #'other-window "C-w" #'other-window
;; Swapping windows ;; Swapping windows
"H" #'+evil/window-move-left "H" #'+evil/window-move-left
"J" #'+evil/window-move-down "J" #'+evil/window-move-down
"K" #'+evil/window-move-up "K" #'+evil/window-move-up
"L" #'+evil/window-move-right "L" #'+evil/window-move-right
"C-S-w" #'ace-swap-window "C-S-w" #'ace-swap-window
;; Window undo/redo ;; Window undo/redo
(:prefix "m" (:prefix "m"
"m" #'doom/window-maximize-buffer "m" #'doom/window-maximize-buffer
"v" #'doom/window-maximize-vertically "v" #'doom/window-maximize-vertically
"s" #'doom/window-maximize-horizontally) "s" #'doom/window-maximize-horizontally)
"u" #'winner-undo "u" #'winner-undo
"C-u" #'winner-undo "C-u" #'winner-undo
"C-r" #'winner-redo "C-r" #'winner-redo
"o" #'doom/window-enlargen "o" #'doom/window-enlargen
;; Delete window ;; Delete window
"d" #'evil-window-delete "d" #'evil-window-delete
"C-C" #'ace-delete-window) "C-C" #'ace-delete-window)
;; text objects ;; text objects
:textobj "a" #'evil-inner-arg #'evil-outer-arg :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') ;; evil-easymotion (see `+evil/easymotion')
(:after evil-easymotion (:after evil-easymotion
:m "gs" evilem-map :m "gs" evilem-map
(:map evilem-map (:map evilem-map
"a" (evilem-create #'evil-forward-arg) "a" (evilem-create #'evil-forward-arg)
"A" (evilem-create #'evil-backward-arg) "A" (evilem-create #'evil-backward-arg)
"s" #'evil-avy-goto-char-2 "s" #'evil-avy-goto-char-2
"SPC" (λ!! #'evil-avy-goto-char-timer t) "SPC" (λ!! #'evil-avy-goto-char-timer t)
"/" #'evil-avy-goto-char-timer)) "/" #'evil-avy-goto-char-timer))
;; evil-snipe ;; evil-snipe
(:after evil-snipe (:after evil-snipe
:map evil-snipe-parent-transient-map :map evil-snipe-parent-transient-map
"C-;" (λ! (require 'evil-easymotion) "C-;" (λ! (require 'evil-easymotion)
(call-interactively (call-interactively
(evilem-create #'evil-snipe-repeat (evilem-create #'evil-snipe-repeat
:bind ((evil-snipe-scope 'whole-buffer) :bind ((evil-snipe-scope 'whole-buffer)
(evil-snipe-enable-highlight) (evil-snipe-enable-highlight)
(evil-snipe-enable-incremental-highlight)))))) (evil-snipe-enable-incremental-highlight))))))
;; evil-surround ;; evil-surround
:v "S" #'evil-surround-region :v "S" #'evil-surround-region
@ -574,13 +579,13 @@ To change these keys see `+evil-repeat-keys'."
;; Omni-completion ;; Omni-completion
(:when (featurep! :completion company) (:when (featurep! :completion company)
(:prefix "C-x" (:prefix "C-x"
:i "C-l" #'+company/whole-lines :i "C-l" #'+company/whole-lines
:i "C-k" #'+company/dict-or-keywords :i "C-k" #'+company/dict-or-keywords
:i "C-f" #'company-files :i "C-f" #'company-files
:i "C-]" #'company-etags :i "C-]" #'company-etags
:i "s" #'company-ispell :i "s" #'company-ispell
:i "C-s" #'company-yasnippet :i "C-s" #'company-yasnippet
:i "C-o" #'company-capf :i "C-o" #'company-capf
:i "C-n" #'+company/dabbrev :i "C-n" #'+company/dabbrev
:i "C-p" #'+company/dabbrev-code-previous))) :i "C-p" #'+company/dabbrev-code-previous)))

View file

@ -260,7 +260,8 @@ and complains if a module is loaded too early (during startup)."
(+evil-collection-init '(occur replace))) (+evil-collection-init '(occur replace)))
(add-transient-hook! 'minibuffer-setup-hook (add-transient-hook! 'minibuffer-setup-hook
(when evil-collection-setup-minibuffer (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' ;; HACK Do this ourselves because evil-collection break's `eval-after-load'
;; load order by loading their target plugin before applying keys. This ;; load order by loading their target plugin before applying keys. This

View file

@ -1,27 +1,29 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/evil/packages.el ;;; editor/evil/packages.el
(package! evil :pin "8aa6337fa8") (package! evil :pin "d243eae8649272799ec3864fde14c1164f036940")
(package! evil-args :pin "758ad5ae54") (package! evil-args :pin "758ad5ae54ad34202064fec192c88151c08cb387")
(package! evil-easymotion :pin "79c13ed3bc") (package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9")
(package! evil-embrace :pin "4379adea03") (package! evil-embrace :pin "4379adea032b25e359d01a36301b4a5afdd0d1b7")
(package! evil-escape :pin "f4e9116bfb") (package! evil-escape
(package! evil-exchange :pin "3030e21ee1") :recipe (:host github :repo "hlissner/evil-escape")
(package! evil-indent-plus :pin "0c7501e6ef") :pin "819f1ee1cf3f69a1ae920e6004f2c0baeebbe077")
(package! evil-lion :pin "6b03593f5d") (package! evil-exchange :pin "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1")
(package! evil-nerd-commenter :pin "747e346f11") (package! evil-indent-plus :pin "0c7501e6efed661242c3a20e0a6c79a6455c2c40")
(package! evil-lion :pin "6b03593f5dd6e7c9ca02207f9a73615cf94c93ab")
(package! evil-nerd-commenter :pin "1bd2de52011c39777a3e8779b14cee2790dc873b")
(package! evil-numbers (package! evil-numbers
:recipe (:host github :repo "janpath/evil-numbers") :recipe (:host github :repo "janpath/evil-numbers")
:pin "c2cfdd1eb1") :pin "c2cfdd1eb1f193bea28ee79b191b78309677058a")
(package! evil-snipe :pin "3ec8adfd49") (package! evil-snipe :pin "2ba6353bb9253dbbc4193f1d35403e7dcc1317b1")
(package! evil-surround :pin "9b0b17f06c") (package! evil-surround :pin "9b0b17f06cef9bac81ee4800d121265e54718a17")
(package! evil-textobj-anyblock :pin "ff00980f06") (package! evil-textobj-anyblock :pin "ff00980f0634f95bf2ad9956b615a155ea8743be")
(package! evil-traces :pin "bc25cae9fa") (package! evil-traces :pin "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462")
(package! evil-visualstar :pin "06c053d8f7") (package! evil-visualstar :pin "06c053d8f7381f91c53311b1234872ca96ced752")
(package! exato :pin "d5daea3017") (package! exato :pin "d5daea30176d48e74c9d063ac9bfc240ebeb97d0")
(package! evil-quick-diff (package! evil-quick-diff
:recipe (:host github :repo "rgrinberg/evil-quick-diff") :recipe (:host github :repo "rgrinberg/evil-quick-diff")
:pin "69c883720b") :pin "69c883720b30a892c63bc89f49d4f0e8b8028908")
;; ;;
(when (featurep! +everywhere) (when (featurep! +everywhere)
@ -31,4 +33,4 @@
(package! neotree) (package! neotree)
(autoload 'neotree-make-executor "neotree" nil nil 'macro)) (autoload 'neotree-make-executor "neotree" nil nil 'macro))
(package! evil-collection :pin "493d523c9b")) (package! evil-collection :pin "ba3630476b3927d9d2e3ec75308a28e3a5bd54a8"))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/file-templates/packages.el ;;; editor/file-templates/packages.el
(package! yasnippet :pin "ac03c2f192") (package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703")

View file

@ -3,6 +3,6 @@
(package! hideshow :built-in t) (package! hideshow :built-in t)
(package! vimish-fold :pin "d3248a41a7") (package! vimish-fold :pin "63685239655a151181b9152e45478dad587f86f2")
(when (featurep! :editor evil) (when (featurep! :editor evil)
(package! evil-vimish-fold :pin "b6e0e6b91b")) (package! evil-vimish-fold :pin "b6e0e6b91b8cd047e80debef1a536d9d49eef31a"))

View file

@ -219,9 +219,11 @@ snippets or single lines."
is selected)." is selected)."
(interactive) (interactive)
(call-interactively (call-interactively
(if (use-region-p) (if (bound-and-true-p lsp-mode)
#'+format/region #'+default/lsp-format-region-or-buffer
#'+format/buffer))) (if (use-region-p)
#'+format/region
#'+format/buffer))))
;; ;;

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/god/packages.el ;;; editor/god/packages.el
(package! god-mode :pin "1eb6ef3a4f") (package! god-mode :pin "1eb6ef3a4f67a805c5d6deb1e3895b6c853707d7")

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/lispyville/packages.el ;;; editor/lispyville/packages.el
(package! lispy :pin "c7e282ae06") (package! lispy :pin "cdaa9c70ca39a880163cbbce924bb46cc56b9fa4")
(when (featurep! :editor evil) (when (featurep! :editor evil)
(package! lispyville :pin "25a70126ea")) (package! lispyville :pin "25a70126ea807653e0a8c512d4128c90ed673d7a"))

View file

@ -3,7 +3,7 @@
(cond (cond
((featurep! :editor evil) ((featurep! :editor evil)
(package! evil-multiedit :pin "9f271e0e60") (package! evil-multiedit :pin "9f271e0e6048297692f80ed6c5ae8994ac523abc")
(package! evil-mc :pin "4d4c0172e4")) (package! evil-mc :pin "4d4c0172e4c7f80acc1d0e73d5fb3e536929b262"))
((package! multiple-cursors :pin "b880554d04"))) ((package! multiple-cursors :pin "b880554d04b8f61165afba7d4de19ac9e39bb7ab")))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/objed/packages.el ;;; editor/objed/packages.el
(package! objed :pin "8dc17701d1") (package! objed :pin "e89d8dae3b2d4331a4455d2a7b203500537d184d")

View file

@ -11,4 +11,4 @@
;; separate session: ;; separate session:
(autoload 'evil-define-key "evil-core" nil nil 'macro)) (autoload 'evil-define-key "evil-core" nil nil 'macro))
(package! parinfer :pin "eaad857ae4") (package! parinfer :pin "eaad857ae4351f72a561ee3dec8943713510003f")

View file

@ -3,4 +3,4 @@
(package! rotate-text (package! rotate-text
:recipe (:host github :repo "debug-ito/rotate-text.el") :recipe (:host github :repo "debug-ito/rotate-text.el")
:pin "48f193697d") :pin "48f193697db996855aee1ad2bc99b38c6646fe76")

View file

@ -102,6 +102,6 @@
us who use yas-minor-mode and enable yasnippet more selectively. This advice us who use yas-minor-mode and enable yasnippet more selectively. This advice
swaps `yas-global-mode' with `yas-minor-mode'." swaps `yas-global-mode' with `yas-minor-mode'."
:around '(aya-expand aya-open-line) :around '(aya-expand aya-open-line)
(cl-letf (((symbol-function #'yas-global-mode) #'yas-minor-mode) (letf! ((#'yas-global-mode #'yas-minor-mode)
(yas-global-mode yas-minor-mode)) (yas-global-mode yas-minor-mode))
(apply orig-fn args)))) (apply orig-fn args))))

View file

@ -1,10 +1,10 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/snippets/packages.el ;;; editor/snippets/packages.el
(package! yasnippet :pin "5b1217ab08") (package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703")
(package! auto-yasnippet :pin "db9e0dd433") (package! auto-yasnippet :pin "db9e0dd4335b2202cd5dac95bbbc87a1032d9bbe")
(package! doom-snippets (package! doom-snippets
:recipe (:host github :recipe (:host github
:repo "hlissner/doom-snippets" :repo "hlissner/doom-snippets"
:files ("*.el" "*")) :files ("*.el" "*"))
:pin "feaedeb550") :pin "422f683adfbec1b01fe00524690b64dc9e702ae0")

View file

@ -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 '(text-mode markdown-mode markdown-view-mode gfm-mode gfm-view-mode rst-mode
latex-mode LaTeX-mode) latex-mode LaTeX-mode)
"Major-modes where `+word-wrap-mode' should not provide extra indentation.") "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))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/word-wrap/packages.el ;;; editor/word-wrap/packages.el
(package! adaptive-wrap :pin "1810c0ee8d") (package! adaptive-wrap :pin "1810c0ee8d827dd502ddeaae5bd759d4811fcbce")

16
modules/emacs/dired/config.el Executable file → Normal file
View file

@ -31,20 +31,16 @@
(setq insert-directory-program gls) (setq insert-directory-program gls)
;; BSD ls doesn't support --group-directories-first ;; BSD ls doesn't support --group-directories-first
(setq args (delete "--group-directories-first" args)))) (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 (add-hook! 'dired-mode-hook
(defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h () (defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h ()
"Fix #1703: dired over TRAMP displays a blank screen. "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 This is because there's no guarantee the remote system has GNU ls, which is the
only variant that supports --group-directories-first." only variant that supports --group-directories-first."
(when (file-remote-p default-directory) (when (file-remote-p default-directory)
(setq-local dired-listing-switches (setq-local dired-listing-switches (car args))))))
(string-join
(split-string dired-listing-switches
"--group-directories-first")
" ")))))
;; Don't complain about this command being disabled when we use it ;; Don't complain about this command being disabled when we use it
(put 'dired-find-alternate-file 'disabled nil) (put 'dired-find-alternate-file 'disabled nil)

View file

@ -1,12 +1,12 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; emacs/dired/packages.el ;;; emacs/dired/packages.el
(package! diredfl :pin "83567d00af") (package! diredfl :pin "83567d00affce66a4e501563eddd0bd436ac48d0")
(package! dired-git-info :pin "b47f2b0c3a") (package! dired-git-info :pin "b47f2b0c3a6cb9b7a62a4ee2605a492e512d40a9")
(package! diff-hl :pin "2cf8b489f3") (package! diff-hl :pin "a625033fb1dde83f6e4c2fc21f632b22ec34b609")
(package! dired-rsync :pin "bfd5c155be") (package! dired-rsync :pin "bfd5c155be1cb6b71c83e5f41116c81b6532b6d5")
(when (featurep! +ranger) (when (featurep! +ranger)
(package! ranger :pin "af6f781a60")) (package! ranger :pin "ae9b3816a6da927cca5beb62c45400103797a2da"))
(when (featurep! +icons) (when (featurep! +icons)
(package! all-the-icons-dired :pin "816987d339")) (package! all-the-icons-dired :pin "fc2dfa1e9eb8bf1c402a675e7089638d702a27a5"))
(package! fd-dired :pin "fd4c3f490b") (package! fd-dired :pin "001cc95effdd5c4d9974b3f2c40b2ddf1f0e3de2")

View file

@ -1,5 +1,5 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; emacs/ibuffer/packages.el ;;; emacs/ibuffer/packages.el
(package! ibuffer-projectile :pin "504b0edaa0") (package! ibuffer-projectile :pin "504b0edaa0d937ce60ccc8fdf09f2dae0a90fbaf")
(package! ibuffer-vc :pin "1249c1e30c") (package! ibuffer-vc :pin "1249c1e30cf11badfe032ac3b1058f24ba510ace")

View file

@ -2,6 +2,6 @@
;;; emacs/undo/packages.el ;;; emacs/undo/packages.el
(if (featurep! +tree) (if (featurep! +tree)
(package! undo-tree :pin "5b6df03781") (package! undo-tree :pin "5b6df03781495d8a25695d846b0cce496d3d3058")
(package! undo-fu :pin "0c34b6747e") (package! undo-fu :pin "0ce9ac36144e80316fff50bfe1bc5dd7e5e7ded6")
(package! undo-fu-session :pin "b808ef0cdc")) (package! undo-fu-session :pin "b808ef0cdcdd2eef221c67eda567eed7fcb3d4af"))

View file

@ -5,7 +5,7 @@
(package! vc-annotate :built-in t) (package! vc-annotate :built-in t)
(package! smerge-mode :built-in t) (package! smerge-mode :built-in t)
(package! browse-at-remote :pin "6aecae4b5d") (package! browse-at-remote :pin "6aecae4b5d202e582425fc8aa2c9c2b6a4779f25")
(package! git-timemachine :pin "391eb61050") (package! git-timemachine :pin "391eb61050de321101e631fcf373fc70ec6e7700")
(package! gitconfig-mode :pin "55468314a5") (package! gitconfig-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217")
(package! gitignore-mode :pin "55468314a5") (package! gitignore-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217")

View file

@ -92,6 +92,9 @@
;; Wrap text in messages ;; Wrap text in messages
(setq-hook! 'mu4e-view-mode-hook truncate-lines nil) (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) (when (fboundp 'imagemagick-register-types)
(imagemagick-register-types)) (imagemagick-register-types))

View file

@ -1,9 +1,9 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; email/notmuch/packages.el ;;; email/notmuch/packages.el
(package! notmuch :pin "aba7fb375b") (package! notmuch :pin "ad9c2e91a012920bebfe70bc472d44678abc3259")
(package! org-mime :pin "b189976217") (package! org-mime :pin "9f8444603806e6baa94b2b67a23aab0ea52fef97")
(when (featurep! :completion ivy) (when (featurep! :completion ivy)
(package! counsel-notmuch :pin "a4a1562935")) (package! counsel-notmuch :pin "a4a1562935e4180c42524c51609d1283e9be0688"))
(when (featurep! :completion helm) (when (featurep! :completion helm)
(package! helm-notmuch :pin "97a01497e0")) (package! helm-notmuch :pin "97a01497e079a7b6505987e9feba6b603bbec288"))

View file

@ -4,8 +4,8 @@
;; HACK These are wanderlust's dependencies (wanderlust depends on semi, semi ;; HACK These are wanderlust's dependencies (wanderlust depends on semi, semi
;; depends on flim, flim on apel), but they all have non-standard default ;; depends on flim, flim on apel), but they all have non-standard default
;; branches which straight cannot detect without our help. ;; branches which straight cannot detect without our help.
(package! apel :recipe (:branch "apel-wl") :pin "d146ddbf88") (package! apel :recipe (:branch "apel-wl") :pin "d146ddbf8818e81d3577d5eee7825d377bec0c73")
(package! flim :recipe (:branch "flim-1_14-wl") :pin "e4bd54fd7d") (package! flim :recipe (:branch "flim-1_14-wl") :pin "f303f2f6c124bc8635add96d3326a2209749437b")
(package! semi :recipe (:branch "semi-1_14-wl") :pin "16228dc2d1") (package! semi :recipe (:branch "semi-1_14-wl") :pin "57a948c5f07e57e78ab3c0e6fd76ffcd591bb4ac")
(package! wanderlust :pin "7a919e422a") (package! wanderlust :pin "7af0d582cd48a37469e0606ea35887740d78c8b5")

View file

@ -1,7 +1,7 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; input/chinese/packages.el ;;; input/chinese/packages.el
(package! pyim :pin "77170724fa") (package! pyim :pin "b934273bb33d6be6aea6e20e68930bc5aaf4a48a")
(package! fcitx :pin "12dc2638dd") (package! fcitx :pin "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624")
(package! ace-pinyin :pin "8b2e9335b0") (package! ace-pinyin :pin "8b2e9335b02486730ea4ceee790130cc5328f9ea")
(package! pangu-spacing :pin "f92898949b") (package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223")

View file

@ -1,7 +1,7 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; input/japanese/packages.el ;;; input/japanese/packages.el
(package! migemo :pin "f42832c8ac") (package! migemo :pin "f42832c8ac462ecbec9a16eb781194f876fba64a")
(package! avy-migemo :pin "922a6dd82c") (package! avy-migemo :pin "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7")
(package! ddskk :pin "f9a2333ec3") (package! ddskk :pin "11d91b4cce988e15d7c5fc4345535c9d7a92d53b")
(package! pangu-spacing :pin "f92898949b") (package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223")

View file

@ -73,26 +73,36 @@
((message "WARNING: Couldn't find `inferior-lisp-program' (%s)" ((message "WARNING: Couldn't find `inferior-lisp-program' (%s)"
inferior-lisp-program))))) inferior-lisp-program)))))
(map! :localleader (map! (:map sly-db-mode-map
:map lisp-mode-map :n "gr" #'sly-db-restart-frame)
:desc "Sly" "'" #'sly (:map sly-inspector-mode-map
:desc "Sly (ask)" ";" (λ!! #'sly '-) :n "gr" #'sly-inspector-reinspect
:desc "Expand macro" "m" #'macrostep-expand :n "gR" #'sly-inspector-fetch-all
(:prefix ("c" . "compile") :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 file" "c" #'sly-compile-file
:desc "Compile/load file" "C" #'sly-compile-and-load-file :desc "Compile/load file" "C" #'sly-compile-and-load-file
:desc "Compile toplevel form" "f" #'sly-compile-defun :desc "Compile toplevel form" "f" #'sly-compile-defun
:desc "Load file" "l" #'sly-load-file :desc "Load file" "l" #'sly-load-file
:desc "Remove notes" "n" #'sly-remove-notes :desc "Remove notes" "n" #'sly-remove-notes
:desc "Compile region" "r" #'sly-compile-region) :desc "Compile region" "r" #'sly-compile-region)
(:prefix ("e" . "evaluate") (:prefix ("e" . "evaluate")
:desc "Evaulate buffer" "b" #'sly-eval-buffer :desc "Evaulate buffer" "b" #'sly-eval-buffer
:desc "Evaluate last" "e" #'sly-eval-last-expression :desc "Evaluate last" "e" #'sly-eval-last-expression
:desc "Evaluate/print last" "E" #'sly-eval-print-last-expression :desc "Evaluate/print last" "E" #'sly-eval-print-last-expression
:desc "Evaluate defun" "f" #'sly-eval-defun :desc "Evaluate defun" "f" #'sly-eval-defun
:desc "Undefine function" "F" #'sly-undefine-function :desc "Undefine function" "F" #'sly-undefine-function
:desc "Evaluate region" "r" #'sly-eval-region) :desc "Evaluate region" "r" #'sly-eval-region)
(:prefix ("g" . "goto") (:prefix ("g" . "goto")
:desc "Go back" "b" #'sly-pop-find-definition-stack :desc "Go back" "b" #'sly-pop-find-definition-stack
:desc "Go to" "d" #'sly-edit-definition :desc "Go to" "d" #'sly-edit-definition
:desc "Go to (other window)" "D" #'sly-edit-definition-other-window :desc "Go to (other window)" "D" #'sly-edit-definition-other-window
@ -100,7 +110,7 @@
:desc "Previous note" "N" #'sly-previous-note :desc "Previous note" "N" #'sly-previous-note
:desc "Next sticker" "s" #'sly-stickers-next-sticker :desc "Next sticker" "s" #'sly-stickers-next-sticker
:desc "Previous sticker" "S" #'sly-stickers-prev-sticker) :desc "Previous sticker" "S" #'sly-stickers-prev-sticker)
(:prefix ("h" . "help") (:prefix ("h" . "help")
:desc "Who calls" "<" #'sly-who-calls :desc "Who calls" "<" #'sly-who-calls
:desc "Calls who" ">" #'sly-calls-who :desc "Calls who" ">" #'sly-calls-who
:desc "Lookup format directive" "~" #'hyperspec-lookup-format :desc "Lookup format directive" "~" #'hyperspec-lookup-format
@ -115,22 +125,22 @@
:desc "Who references" "r" #'sly-who-references :desc "Who references" "r" #'sly-who-references
:desc "Who specializes" "s" #'sly-who-specializes :desc "Who specializes" "s" #'sly-who-specializes
:desc "Who sets" "S" #'sly-who-sets) :desc "Who sets" "S" #'sly-who-sets)
(:prefix ("r" . "repl") (:prefix ("r" . "repl")
:desc "Clear REPL" "c" #'sly-mrepl-clear-repl :desc "Clear REPL" "c" #'sly-mrepl-clear-repl
:desc "Quit connection" "q" #'sly-quit-lisp :desc "Quit connection" "q" #'sly-quit-lisp
:desc "Restart connection" "r" #'sly-restart-inferior-lisp :desc "Restart connection" "r" #'sly-restart-inferior-lisp
:desc "Sync REPL" "s" #'sly-mrepl-sync) :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 "Toggle breaking stickers" "b" #'sly-stickers-toggle-break-on-stickers
:desc "Clear defun stickers" "c" #'sly-stickers-clear-defun-stickers :desc "Clear defun stickers" "c" #'sly-stickers-clear-defun-stickers
:desc "Clear buffer stickers" "C" #'sly-stickers-clear-buffer-stickers :desc "Clear buffer stickers" "C" #'sly-stickers-clear-buffer-stickers
:desc "Fetch stickers" "f" #'sly-stickers-fetch :desc "Fetch stickers" "f" #'sly-stickers-fetch
:desc "Replay stickers" "r" #'sly-stickers-replay :desc "Replay stickers" "r" #'sly-stickers-replay
:desc "Add/remove sticker" "s" #'sly-stickers-dwim) :desc "Add/remove sticker" "s" #'sly-stickers-dwim)
(:prefix ("t" . "trace") (:prefix ("t" . "trace")
:desc "Toggle" "t" #'sly-toggle-trace-fdefinition :desc "Toggle" "t" #'sly-toggle-trace-fdefinition
:desc "Toggle (fancy)" "T" #'sly-toggle-fancy-trace :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) (when (featurep! :editor evil +everywhere)
(add-hook 'sly-mode-hook #'evil-normalize-keymaps))) (add-hook 'sly-mode-hook #'evil-normalize-keymaps)))

View file

@ -4,7 +4,7 @@
(package! dart-mode :pin "04fcd649f1") (package! dart-mode :pin "04fcd649f1")
(when (featurep! +lsp) (when (featurep! +lsp)
(package! lsp-dart :pin "4cd73b77f4")) (package! lsp-dart :pin "80f8ecaf62"))
(when (featurep! +flutter) (when (featurep! +flutter)
(package! flutter :pin "293b7225b9") (package! flutter :pin "293b7225b9")

View file

@ -221,6 +221,67 @@ verbosity when editing a file in `doom-private-dir' or `doom-emacs-dir'."
(default-value 'flycheck-emacs-lisp-check-form) (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 ;;;###autoload
(defun +emacs-lisp/edebug-instrument-defun-on () (defun +emacs-lisp/edebug-instrument-defun-on ()
"Toggle on instrumentalisation for the function under `defun'." "Toggle on instrumentalisation for the function under `defun'."

View file

@ -43,7 +43,9 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.")
mode-name "Elisp" mode-name "Elisp"
;; Don't treat autoloads or sexp openers as outline headers, we have ;; Don't treat autoloads or sexp openers as outline headers, we have
;; hideshow for that. ;; 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 ;; variable-width indentation is superior in elisp
(add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) (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))) ("^;;;###\\(autodef\\|if\\|package\\)[ \n]" (1 font-lock-warning-face t)))
;; highlight defined, special variables & functions ;; highlight defined, special variables & functions
(when +emacs-lisp-enable-extra-fontification (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 ;; Recenter window after following definition
(advice-add #'elisp-def :after #'doom-recenter-a) (advice-add #'elisp-def :after #'doom-recenter-a)

View file

@ -3,11 +3,11 @@
(use-package! lsp-java (use-package! lsp-java
:after lsp-clients :after lsp-clients
:hook (java-mode-local-vars . lsp!)
:preface :preface
(setq lsp-java-server-install-dir (concat doom-etc-dir "eclipse.jdt.ls/server/") (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 :config
;; TODO keybinds ;; TODO keybinds
;; TODO treemacs integration (?)
) )

View file

@ -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

View file

@ -135,7 +135,8 @@
(add-hook! '(js2-mode-local-vars-hook (add-hook! '(js2-mode-local-vars-hook
typescript-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 () (defun +javascript-init-lsp-or-tide-maybe-h ()
"Start `lsp' or `tide' in the current buffer. "Start `lsp' or `tide' in the current buffer.
@ -152,7 +153,7 @@ to tide."
(if (not buffer-file-name) (if (not buffer-file-name)
;; necessary because `tide-setup' and `lsp' will error if not a ;; necessary because `tide-setup' and `lsp' will error if not a
;; file-visiting buffer ;; 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!)) (or (and (featurep! +lsp) (lsp!))
;; fall back to tide ;; fall back to tide
(if (executable-find "node") (if (executable-find "node")
@ -160,7 +161,7 @@ to tide."
(progn (tide-setup) tide-mode)) (progn (tide-setup) tide-mode))
(ignore (ignore
(doom-log "Couldn't start tide because 'node' is missing")))) (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 (use-package! tide

View file

@ -2,21 +2,21 @@
;;; lang/javascript/packages.el ;;; lang/javascript/packages.el
;; Major modes ;; Major modes
(package! coffee-mode :pin "35a41c7d82") (package! coffee-mode :pin "35a41c7d8233eac0b267d9593e67fb8b6235e134")
(package! js2-mode :pin "fe53814dc2") (package! js2-mode :pin "fe53814dc2a0db2e95ac06083362e43923bf83fc")
(package! rjsx-mode :pin "0061587a06") (package! rjsx-mode :pin "0061587a06cdc2579a8d0e90863498d96bf982d8")
(package! typescript-mode :pin "102587e458") (package! typescript-mode :pin "102587e458d48ece6335cd708300647f22ec8b8d")
;; Tools ;; Tools
(package! js2-refactor :pin "d4c40b5fc8") (package! js2-refactor :pin "d4c40b5fc86d3edd7c6a7d83ac86483ee1cb7a28")
(package! npm-mode :pin "3ee7c0bad5") (package! npm-mode :pin "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb")
(package! add-node-modules-path :pin "f31e69ccb6") (package! add-node-modules-path :pin "f31e69ccb681f882aebb806ce6e9478e3ac39708")
;; Eval ;; Eval
(package! nodejs-repl :pin "6fad7d764f") (package! nodejs-repl :pin "6fad7d764fa0d818ba497450bd722ae10cb8efed")
(package! skewer-mode :pin "e5bed35193") (package! skewer-mode :pin "e5bed351939c92a1f788f78398583c2f83f1bb3c")
;; Programming environment ;; Programming environment
(package! tide :pin "3b45610faa") (package! tide :pin "3b45610faaab33bc53ae2d44e1e573f19f35a74a")
(when (featurep! :tools lookup) (when (featurep! :tools lookup)
(package! xref-js2 :pin "6f1ed5dae0")) (package! xref-js2 :pin "6f1ed5dae0c2485416196a51f2fa92f32e4b8262"))

View file

@ -27,11 +27,17 @@ capture, the end position, and the output buffer.")
markdown-gfm-additional-languages '("sh") markdown-gfm-additional-languages '("sh")
markdown-make-gfm-checkboxes-buttons t markdown-make-gfm-checkboxes-buttons t
;; Preview/compilation defaults ;; `+markdown-compile' offers support for many transpilers (see
;; `+markdown-compile-functions'), which it tries until one succeeds.
markdown-command #'+markdown-compile 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 markdown-open-command
(cond (IS-MAC "open") (cond (IS-MAC "open")
(IS-LINUX "xdg-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-content-type "application/xhtml+xml"
markdown-css-paths markdown-css-paths
'("https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css" '("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) "`" "`" (sp-local-pair '(markdown-mode gfm-mode) "`" "`"
:unless '(:add sp-point-before-word-p sp-point-before-same-p)) :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 (setq-hook! 'markdown-mode-hook
fill-nobreak-predicate (cons #'markdown-code-block-at-point-p fill-nobreak-predicate (cons #'markdown-code-block-at-point-p
fill-nobreak-predicate)) fill-nobreak-predicate))

View file

@ -1,13 +1,14 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/markdown/packages.el ;;; lang/markdown/packages.el
(package! markdown-mode :pin "e9dff50d57") (package! markdown-mode :pin "c927a114b1b23cf7538181d62fd14679cce7fa25")
(package! markdown-toc :pin "7038f4f6d5") (package! markdown-toc :pin "eda9650a1bf0015e52e9678bd92b0a8beb1d7d71")
(package! edit-indirect :pin "935ded353b") (package! edit-indirect :pin "935ded353b9ed3da67bc61abf245c21b58d88864")
(when (featurep! +grip) (when (featurep! +grip)
(package! grip-mode :pin "9615c47747")) (package! grip-mode :pin "9615c4774727a719d38313a679d70f2a2c6aca68"))
(when (featurep! :editor evil +everywhere) (when (featurep! :editor evil +everywhere)
(package! evil-markdown (package! evil-markdown
:recipe (:host github :repo "Somelauw/evil-markdown") :pin "46cd81b379")) :recipe (:host github :repo "Somelauw/evil-markdown")
:pin "46cd81b37991c4325fc24015a610f832b0ff995d"))

View file

@ -1,11 +1,11 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/nix/packages.el ;;; lang/nix/packages.el
(package! nix-mode :pin "5b5961780f") (package! nix-mode :pin "5b5961780f3b1c1b62453d2087f775298980f10d")
(package! nix-update :pin "fc6c39c2da") (package! nix-update :pin "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-nixos-options :pin "977b9a505f")) (package! company-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297"))
(when (featurep! :completion helm) (when (featurep! :completion helm)
(package! helm-nixos-options :pin "977b9a505f")) (package! helm-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297"))

View file

@ -50,7 +50,7 @@ you're done. This can be called from an external shell script."
(with-selected-frame frame (with-selected-frame frame
(require 'org-capture) (require 'org-capture)
(condition-case ex (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)) (switch-to-buffer (doom-fallback-buffer))
(let ((org-capture-initial initial-input) (let ((org-capture-initial initial-input)
org-capture-entry) org-capture-entry)

View file

@ -4,6 +4,7 @@
'((cpp . C) '((cpp . C)
(C++ . C) (C++ . C)
(D . C) (D . C)
(elisp . emacs-lisp)
(sh . shell) (sh . shell)
(bash . shell) (bash . shell)
(matlab . octave) (matlab . octave)
@ -94,14 +95,11 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default
org-entities-user org-entities-user
'(("flat" "\\flat" nil "" "" "266D" "") '(("flat" "\\flat" nil "" "" "266D" "")
("sharp" "\\sharp" nil "" "" "266F" "")) ("sharp" "\\sharp" nil "" "" "266F" ""))
org-fontify-done-headline t
org-fontify-quote-and-verse-blocks t org-fontify-quote-and-verse-blocks t
org-fontify-whole-heading-line t org-fontify-whole-heading-line t
org-footnote-auto-label 'plain org-footnote-auto-label 'plain
org-hide-leading-stars t org-hide-leading-stars t
org-hide-leading-stars-before-indent-mode t
org-image-actual-width nil org-image-actual-width nil
org-list-description-max-indent 4
org-priority-faces org-priority-faces
'((?A . error) '((?A . error)
(?B . warning) (?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-refile-use-outline-path 'file
org-outline-path-complete-in-steps nil) 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 (plist-put org-format-latex-options :scale 1.5) ; larger previews
(add-hook! 'doom-load-theme-hook (add-hook! 'doom-load-theme-hook
(defun +org-refresh-latex-background-h () (defun +org-refresh-latex-background-h ()
@ -168,12 +163,6 @@ This forces it to read the background before rendering."
("HOLD" . +org-todo-onhold) ("HOLD" . +org-todo-onhold)
("PROJ" . +org-todo-project))) ("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) (defadvice! +org-display-link-in-eldoc-a (&rest args)
"Display full link in minibuffer when cursor/mouse is over it." "Display full link in minibuffer when cursor/mouse is over it."
:before-until #'org-eldoc-documentation-function :before-until #'org-eldoc-documentation-function
@ -501,6 +490,13 @@ eldoc string."
nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) nil 'face `(:foreground ,(face-foreground face nil t) :weight bold)))
width prefix separator)) 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 () (defun +org--restart-mode-h ()
"Restart `org-mode', but only once." "Restart `org-mode', but only once."
(quiet! (org-mode-restart)) (quiet! (org-mode-restart))
@ -541,11 +537,9 @@ current workspace (and clean them up)."
;; upstream (if ever). ;; upstream (if ever).
(defadvice! +org--fix-inline-images-for-imagemagick-users-a (orig-fn &rest args) (defadvice! +org--fix-inline-images-for-imagemagick-users-a (orig-fn &rest args)
:around #'org-display-inline-images :around #'org-display-inline-images
(cl-letf* ((old-create-image (symbol-function #'create-image)) (letf! (defun create-image (file-or-data &optional type data-p &rest props)
((symbol-function #'create-image) (let ((type (if (plist-get props :width) type)))
(lambda (file-or-data &optional type data-p &rest props) (apply create-image file-or-data type data-p props)))
(let ((type (if (plist-get props :width) type)))
(apply old-create-image file-or-data type data-p props)))))
(apply orig-fn args))) (apply orig-fn args)))
(defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid) (defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid)
@ -797,6 +791,7 @@ compelling reason, so..."
:config :config
;; Make leading stars truly invisible, by rendering them as spaces! ;; Make leading stars truly invisible, by rendering them as spaces!
(setq org-superstar-leading-bullet ?\s (setq org-superstar-leading-bullet ?\s
org-superstar-leading-fallback ?\s
org-hide-leading-stars nil) org-hide-leading-stars nil)
;; Don't do anything special for item bullets or TODOs by default; these slow ;; Don't do anything special for item bullets or TODOs by default; these slow
;; down larger org buffers. ;; down larger org buffers.
@ -813,11 +808,14 @@ compelling reason, so..."
(use-package! org-crypt ; built-in (use-package! org-crypt ; built-in
:commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry :commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry
:hook (org-reveal-start . org-decrypt-entry) :hook (org-reveal-start . org-decrypt-entry)
:config :preface
(add-hook! 'org-mode-hook ;; org-crypt falls back to CRYPTKEY property then `epa-file-encrypt-to', which
(add-hook 'before-save-hook 'org-encrypt-entries nil t)) ;; is a better default than the empty string `org-crypt-key' defaults to.
(add-to-list 'org-tags-exclude-from-inheritance "crypt") (defvar org-crypt-key nil)
(setq org-crypt-key user-mail-address)) (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 (use-package! org-clock ; built-in

View file

@ -41,20 +41,19 @@
(defadvice! +org-present--narrow-to-subtree-a (orig-fn &rest args) (defadvice! +org-present--narrow-to-subtree-a (orig-fn &rest args)
"Narrow to the target subtree when you start the presentation." "Narrow to the target subtree when you start the presentation."
:around #'org-tree-slide--display-tree-with-narrow :around #'org-tree-slide--display-tree-with-narrow
(cl-letf (((symbol-function #'org-narrow-to-subtree) (letf! ((defun org-narrow-to-subtree ()
(lambda () (save-excursion
(save-excursion (save-match-data
(save-match-data (org-with-limited-levels
(org-with-limited-levels (narrow-to-region
(narrow-to-region (progn
(progn (when (org-before-first-heading-p)
(when (org-before-first-heading-p) (org-next-visible-heading 1))
(org-next-visible-heading 1)) (ignore-errors (org-up-heading-all 99))
(ignore-errors (org-up-heading-all 99)) (forward-line 1)
(forward-line 1) (point))
(point)) (progn (org-end-of-subtree t t)
(progn (org-end-of-subtree t t) (when (and (org-at-heading-p) (not (eobp)))
(when (and (org-at-heading-p) (not (eobp))) (backward-char 1))
(backward-char 1)) (point))))))))
(point)))))))))
(apply orig-fn args)))) (apply orig-fn args))))

View file

@ -48,20 +48,7 @@
(cond ((featurep! :completion helm) 'helm) (cond ((featurep! :completion helm) 'helm)
((featurep! :completion ivy) 'ivy) ((featurep! :completion ivy) 'ivy)
((featurep! :completion ido) 'ido) ((featurep! :completion ido) 'ido)
('default)) ('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)
;; Normally, the org-roam buffer doesn't open until you explicitly call ;; 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 ;; `org-roam'. If `+org-roam-open-buffer-on-find-file' is non-nil, the

View file

@ -27,84 +27,84 @@
:recipe (:host github :recipe (:host github
:repo "emacs-straight/org-mode" :repo "emacs-straight/org-mode"
:files ("*.el" "lisp/*.el" "contrib/lisp/*.el")) :files ("*.el" "lisp/*.el" "contrib/lisp/*.el"))
:pin "31068373dc") :pin "e5eda0beeb3b6b0666550091bcc0df066d52c008")
;; ...And prevent other packages from pulling org; org-plus-contrib satisfies ;; ...And prevent other packages from pulling org; org-plus-contrib satisfies
;; the dependency already: https://github.com/raxod502/straight.el/issues/352 ;; the dependency already: https://github.com/raxod502/straight.el/issues/352
(package! org :recipe (:local-repo nil)) (package! org :recipe (:local-repo nil))
(package! avy) (package! avy)
(package! htmlize :pin "86f22f211e") (package! htmlize :pin "86f22f211e9230857197c42a9823d3f05381deed")
(package! org-superstar :pin "09ddc28383") (package! org-superstar :pin "09ddc28383d363a4b353348a433e24535b4af0e3")
(package! org-yt (package! org-yt
:recipe (:host github :repo "TobiasZawada/org-yt") :recipe (:host github :repo "TobiasZawada/org-yt")
:pin "40cc1ac76d") :pin "40cc1ac76d741055cbefa13860d9f070a7ade001")
(package! ox-clip :pin "bd36f9fb4e") (package! ox-clip :pin "bd36f9fb4e3b1b9e8686b993b02ccd780ff75a96")
(package! toc-org :pin "5deaec41ed") (package! toc-org :pin "5deaec41ed0e5c51715737d7f74c5ae1b3c00387")
(package! org-cliplink :pin "82402cae7e") (package! org-cliplink :pin "82402cae7e118d67de7328417fd018a18f95fac2")
(when (featurep! :editor evil +everywhere) (when (featurep! :editor evil +everywhere)
(package! evil-org (package! evil-org
:recipe (:host github :repo "hlissner/evil-org-mode") :recipe (:host github :repo "hlissner/evil-org-mode")
:pin "9cf661af8f")) :pin "9cf661af8ff8ea768ef1e55045be14d0468a90f5"))
(when (featurep! :tools pdf) (when (featurep! :tools pdf)
(package! org-pdftools :pin "8cc15bb801")) (package! org-pdftools :pin "8cc15bb8014ed1f047eecc0abd8bf447f86c0505"))
(when (featurep! :tools magit) (when (featurep! :tools magit)
(package! orgit :pin "e147f05577")) (package! orgit :pin "e147f055772cc934fe1f1d8619059badeb647c93"))
(when (featurep! +brain) (when (featurep! +brain)
(package! org-brain :pin "7ffbf6816a")) (package! org-brain :pin "ae7fe0f628bd093526786ece6917f7a4310e5e4d"))
(when (featurep! +dragndrop) (when (featurep! +dragndrop)
(package! org-download :pin "46417e2bd3")) (package! org-download :pin "48d3952ad8ebc5ef5a6a77b8c6a4a0da61653036"))
(when (featurep! +gnuplot) (when (featurep! +gnuplot)
(package! gnuplot :pin "f0001c3001") (package! gnuplot :pin "f0001c30010b2899e36d7d89046322467e923088")
(package! gnuplot-mode :pin "601f639298")) (package! gnuplot-mode :pin "601f6392986f0cba332c87678d31ae0d0a496ce7"))
(when (featurep! +ipython) ; DEPRECATED (when (featurep! +ipython) ; DEPRECATED
(package! ob-ipython :pin "7147455230")) (package! ob-ipython :pin "7147455230841744fb5b95dcbe03320313a77124"))
(when (featurep! +jupyter) (when (featurep! +jupyter)
(package! jupyter :pin "785edbbff6")) (package! jupyter :pin "785edbbff65abb0c929dc2fbd8b8305c77fd529e"))
(when (featurep! +journal) (when (featurep! +journal)
(package! org-journal :pin "8bf06b28d6")) (package! org-journal :pin "8bf06b28d6f14f52d4968123e2b4b91930c8f947"))
(when (featurep! +noter) (when (featurep! +noter)
(package! org-noter :pin "9ead81d42d")) (package! org-noter :pin "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d"))
(when (featurep! +pomodoro) (when (featurep! +pomodoro)
(package! org-pomodoro :pin "aa07c11318")) (package! org-pomodoro :pin "aa07c11318f91219336197e62c47bc7a3d090479"))
(when (featurep! +present) (when (featurep! +present)
(package! centered-window (package! centered-window
:recipe (:host github :repo "anler/centered-window-mode") :recipe (:host github :repo "anler/centered-window-mode")
:pin "24f7c5be9d") :pin "f50859941ab5c7cbeaee410f2d38716252b552ac")
(package! org-tree-slide :pin "7bf09a02bd") (package! org-tree-slide :pin "7bf09a02bd2d8f1ccfcb5209bfb18fbe02d1f44e")
(package! org-re-reveal :pin "61549f4c00")) (package! org-re-reveal :pin "61549f4c00284a30e34caa3d76001b233ea5d2ad"))
(when (featurep! +roam) (when (featurep! +roam)
(package! org-roam :pin "963692f353") (package! org-roam :pin "e698ed7f5378106da8a8fec4537658392157657c")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-org-roam :pin "0913d86f16"))) (package! company-org-roam :pin "0913d86f167164e18831206e611f44bb8e7297e3")))
;;; Babel ;;; Babel
(package! ob-async :pin "80a30b96a0") (package! ob-async :pin "80a30b96a007d419ece12c976a81804ede340311")
(when (featurep! :lang crystal) (when (featurep! :lang crystal)
(package! ob-crystal :pin "d84c1adee4")) (package! ob-crystal :pin "d84c1adee4b269cdba06a97caedb8071561a09af"))
(when (featurep! :lang go) (when (featurep! :lang go)
(package! ob-go :pin "2067ed55f4")) (package! ob-go :pin "2067ed55f4c1d33a43cb3f6948609d240a8915f5"))
(when (featurep! :lang hy) (when (featurep! :lang hy)
(package! ob-hy :pin "a42ecaf440")) (package! ob-hy :pin "a42ecaf440adc03e279afe43ee5ef6093ddd542a"))
(when (featurep! :lang nim) (when (featurep! :lang nim)
(package! ob-nim :pin "bf1642cb93")) (package! ob-nim :pin "bf1642cb93f0a898804dc13fd9408d2964403bd2"))
(when (featurep! :lang racket) (when (featurep! :lang racket)
(package! ob-racket (package! ob-racket
:recipe (:host github :repo "DEADB17/ob-racket") :recipe (:host github :repo "DEADB17/ob-racket")
:pin "d8fd51bddb")) :pin "d8fd51bddb019b0eb68755255f88fc800cfe03cb"))
(when (featurep! :lang rest) (when (featurep! :lang rest)
(package! ob-restclient :pin "f7449b2068")) (package! ob-restclient :pin "f7449b2068498fe9d8ab9589e0a638148861533f"))
(when (featurep! :lang rust) (when (featurep! :lang rust)
(package! ob-rust :pin "6a82587598")) (package! ob-rust :pin "6a82587598cd097e9642be916243c31f1231b24a"))
(when (featurep! :lang scala) (when (featurep! :lang scala)
(package! ob-ammonite :pin "39937dff39")) (package! ob-ammonite :pin "39937dff395e70aff76a4224fa49cf2ec6c57cca"))
;;; Export ;;; Export
(when (featurep! +pandoc) (when (featurep! +pandoc)
(package! ox-pandoc :pin "aa37dc7e94")) (package! ox-pandoc :pin "aa37dc7e94213d4ebedb85c384c1ba35007da18e"))
(when (featurep! +hugo) (when (featurep! +hugo)
(package! ox-hugo (package! ox-hugo
:recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t) :recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t)
:pin "5106b430a1")) :pin "8f36181977377383cb54803651d93b24e370122d"))
(when (featurep! :lang rst) (when (featurep! :lang rst)
(package! ox-rst :pin "9158bfd180")) (package! ox-rst :pin "9158bfd18096c559e0a225ae62ab683f1c98a547"))

View file

@ -2,9 +2,15 @@
;; There's also `perl-mode' for perl < 6, which is already set up. ;; 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) :when (featurep! :checkers syntax)
:after perl6-mode) :after raku-mode)

View file

@ -1,7 +1,9 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/perl/packages.el ;;; lang/perl/packages.el
(package! perl6-mode :pin "88de065795") (package! raku-mode :pin "d474216840251dc0efe4f4aa4f5c5f66ac26fa74")
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(package! flycheck-perl6 :pin "b804702305")) (package! flycheck-raku
:recipe (:host github :repo "widefox/flycheck-raku")
:pin "046f35abe0c61967157e151126e4dd7ec5d1c004"))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/racket/packages.el ;;; lang/racket/packages.el
(package! racket-mode :pin "202cc1b784") (package! racket-mode :pin "8f3b214a5ea06e6a2a9492e7d20b19badd0c3bdf")

View file

@ -22,6 +22,7 @@
(add-hook 'ruby-mode-local-vars-hook #'lsp!)) (add-hook 'ruby-mode-local-vars-hook #'lsp!))
(after! inf-ruby (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 ;; switch to inf-ruby from compile if we detect a breakpoint has been hit
(add-hook 'compilation-filter-hook #'inf-ruby-auto-enter)) (add-hook 'compilation-filter-hook #'inf-ruby-auto-enter))
@ -173,6 +174,7 @@
(use-package! projectile-rails (use-package! projectile-rails
:when (featurep! +rails) :when (featurep! +rails)
:hook ((ruby-mode inf-ruby-mode projectile-rails-server-mode) . projectile-rails-mode) :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 :init
(setq inf-ruby-console-environment "development") (setq inf-ruby-console-environment "development")
(when (featurep! :lang web) (when (featurep! :lang web)

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/rust/packages.el ;;; lang/rust/packages.el
(package! rustic :pin "61032eacf0") (package! rustic :pin "32a962ab2d3f87bde0e12c4e8975fe73d8ba8579")
(unless (featurep! +lsp) (unless (featurep! +lsp)
(package! racer :pin "a0bdf778f0")) (package! racer :pin "a0bdf778f01e8c4b8a92591447257422ac0b455b"))

View file

@ -15,15 +15,18 @@ lists properly and names starting with 'default'."
(if (and (elt state 2) (if (and (elt state 2)
;; NOTE looking-at -> looking-at-p ;; NOTE looking-at -> looking-at-p
(not (looking-at-p "\\sw\\|\\s_"))) (not (looking-at-p "\\sw\\|\\s_")))
(unless (> (save-excursion (forward-line 1) (point)) (progn
calculate-lisp-indent-last-sexp) ;; NOTE (if (not ...) (progn ...)) -> (unless ... ...)
(goto-char calculate-lisp-indent-last-sexp) (unless (> (save-excursion (forward-line 1) (point))
(beginning-of-line) calculate-lisp-indent-last-sexp)
(parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) (goto-char calculate-lisp-indent-last-sexp)
(backward-prefix-chars) (beginning-of-line)
(current-column) (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t))
(backward-prefix-chars)
(current-column))
(let* ((function (buffer-substring (let* ((function (buffer-substring
(point) (progn (forward-sexp 1) (point)))) (point) (progn (forward-sexp 1) (point))))
;; NOTE let -> let* & moved `method' def into let bindings
(method (or (get (intern-soft function) 'scheme-indent-function) (method (or (get (intern-soft function) 'scheme-indent-function)
(get (intern-soft function) 'scheme-indent-hook)))) (get (intern-soft function) 'scheme-indent-hook))))
(cond ((or (eq method 'defun) (cond ((or (eq method 'defun)
@ -32,11 +35,12 @@ lists properly and names starting with 'default'."
;; NOTE string-match -> string-match-p ;; NOTE string-match -> string-match-p
;; NOTE The original regexp is "\\`def" but it will mess ;; NOTE The original regexp is "\\`def" but it will mess
;; indentation with such names as 'default-...'. ;; indentation with such names as 'default-...'.
(string-match-p "\\`define" function))) (string-match-p "\\`def" function)))
(lisp-indent-defform state indent-point)) (lisp-indent-defform state indent-point))
;; NOTE Added this clause to handle alignment of keyword symbols ;; NOTE Added this clause to handle alignment of keyword symbols
((and (null method) ((and (null method)
(> (length function) 1) (> (length function) 1)
;; NOTE string-match -> string-match-p
(string-match-p "\\`:" function)) (string-match-p "\\`:" function))
(let ((lisp-body-indent 1)) (let ((lisp-body-indent 1))
(lisp-indent-defform state indent-point))) (lisp-indent-defform state indent-point)))

View file

@ -2,7 +2,7 @@
;;; lang/sh/packages.el ;;; lang/sh/packages.el
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-shell :pin "52f3bf26b7")) (package! company-shell :pin "52f3bf26b74adc30a275f5f4290a1fc72a6876ff"))
(when (featurep! +fish) (when (featurep! +fish)
(package! fish-mode :pin "db257db810")) (package! fish-mode :pin "db257db81058b0b12f788c324c264cc59b9a5bf4"))

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/solidity/packages.el ;;; lang/solidity/packages.el
(package! solidity-mode :pin "b190993dcb") (package! solidity-mode :pin "022b3159832384a7dcdc2168809e698600826047")
(package! company-solidity :pin "b190993dcb") (package! company-solidity)
(package! solidity-flycheck :pin "b190993dcb") (package! solidity-flycheck)

View file

@ -1,11 +1,11 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/swift/packages.el ;;; lang/swift/packages.el
(package! swift-mode :pin "1268425311") (package! swift-mode :pin "2ab9ea1784a12a482ed9e3fb284b7a7658f40fff")
(if (featurep! +lsp) (if (featurep! +lsp)
(package! lsp-sourcekit :pin "04d75b6a0b") (package! lsp-sourcekit :pin "04d75b6a0be5894fea4a55fec0b2ccedf5b3be58")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-sourcekit :pin "abf9bc5a01")) (package! company-sourcekit :pin "abf9bc5a0102eb666d3aa6d6bf22f6efcc852781"))
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(package! flycheck-swift :pin "4c5ad40125"))) (package! flycheck-swift :pin "4c5ad401252400a78da395fd56a71e67ff8c2761")))

View file

@ -162,4 +162,6 @@
(when (featurep! +lsp) (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!))

View file

@ -2,23 +2,23 @@
;;; lang/web/packages.el ;;; lang/web/packages.el
;; +html.el ;; +html.el
(package! emmet-mode :pin "1acb821e01") (package! emmet-mode :pin "1acb821e0142136344ccf40c1e5fb664d7db2e70")
(package! haml-mode :pin "bf5b6c11b1") (package! haml-mode :pin "bf5b6c11b1206759d2b28af48765e04882dd1fc4")
(package! pug-mode :pin "685fd3414d") (package! pug-mode :pin "685fd3414d89736bf232f5d1a6bed9e0353b98fe")
(package! slim-mode :pin "3636d18ab1") (package! slim-mode :pin "3636d18ab1c8b316eea71c4732eb44743e2ded87")
(when (package! web-mode :pin "b0bb4ab82b") (when (package! web-mode :pin "6774c596a9b3988989d3bc96b6194e6f0df1d1b6")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-web :pin "f0cc9187c9"))) (package! company-web :pin "f0cc9187c9c34f72ad71f5649a69c74f996bae9a")))
;; +css.el ;; +css.el
(package! css-mode :built-in t) (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! sass-mode :pin "247a0d4b509f10b28e4687cd8763492bca03599b")
(package! stylus-mode :pin "4dbde92542") (package! stylus-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e")
(package! sws-mode :pin "4dbde92542") (package! sws-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e")
(package! rainbow-mode :pin "3ef813d637") (package! rainbow-mode :pin "f780ddb18c2a73a666d093f606df92058e5601ea")
(when (featurep! :completion ivy) (when (featurep! :completion ivy)
(package! counsel-css :pin "61a38c9d50")) (package! counsel-css :pin "6427dfcbda0d2bbd81db03f9d6b56b06c260ac02"))
(when (featurep! :completion helm) (when (featurep! :completion helm)
(package! helm-css-scss :pin "48b996f73a")) (package! helm-css-scss :pin "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3"))

Some files were not shown because too many files have changed in this diff Show more