From 09cb4f6716129bb8267c0812eb1ea2ed3f194430 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:46:11 +0200 Subject: [PATCH] Major refactor & optimization of how modules load their packages Now that we are loading package autoloads files (as part of the generated doom-package-autoload-file when running make autoloads), many :commands properties are redundant. In fact, many def-package! blocks are redundant. In some cases, we can do without a config.el file entirely, and can move into the autoloads file or rely entirely on package autoloads. Also, many settings have been moved in their module's autoloads files, which makes them available ASAP; their use no longer depends on module load order. This gained me a modest ~10% boost in startup speed. --- modules/collab/impatient-mode/autoload.el | 3 +- modules/collab/impatient-mode/config.el | 6 -- modules/completion/company/config.el | 25 ++---- modules/completion/helm/config.el | 3 +- modules/completion/ivy/autoload/ivy.el | 6 +- modules/completion/ivy/config.el | 5 +- modules/config/default/config.el | 9 ++ modules/feature/debugger/config.el | 3 +- modules/feature/eval/config.el | 7 +- modules/feature/evil/autoload/evil.el | 20 +++++ modules/feature/evil/config.el | 38 +-------- modules/feature/lookup/autoload/devdocs.el | 11 +++ modules/feature/lookup/autoload/docsets.el | 40 +++++++++ modules/feature/lookup/config.el | 83 +++++-------------- modules/feature/snippets/config.el | 36 ++++---- modules/feature/snippets/doctor.el | 7 -- modules/feature/spellcheck/config.el | 2 +- modules/feature/spellcheck/packages.el | 14 ++-- modules/feature/syntax-checker/config.el | 22 ++--- modules/feature/version-control/+git.el | 17 +--- modules/feature/workspaces/config.el | 2 +- .../workspaces/test/autoload-workspaces.el | 1 + modules/lang/assembly/autoload.el | 4 + modules/lang/assembly/config.el | 8 -- modules/lang/cc/autoload.el | 7 -- modules/lang/cc/config.el | 34 ++++---- modules/lang/cc/doctor.el | 6 +- modules/lang/clojure/config.el | 10 +-- modules/lang/crystal/config.el | 6 +- modules/lang/csharp/config.el | 9 +- modules/lang/data/config.el | 43 +++------- modules/lang/elixir/config.el | 31 ++++--- modules/lang/elm/config.el | 15 ++-- modules/lang/emacs-lisp/autoload.el | 8 ++ modules/lang/emacs-lisp/config.el | 33 +++----- modules/lang/erlang/config.el | 22 +++-- modules/lang/ess/config.el | 6 +- modules/lang/go/config.el | 30 ++----- modules/lang/haskell/config.el | 15 +--- modules/lang/hy/config.el | 4 +- modules/lang/java/config.el | 4 +- modules/lang/javascript/config.el | 74 ++++++----------- modules/lang/julia/config.el | 1 - modules/lang/latex/config.el | 3 - modules/lang/ledger/config.el | 8 +- modules/lang/lua/config.el | 21 +---- modules/lang/markdown/config.el | 4 +- modules/lang/nim/config.el | 20 +---- modules/lang/nix/config.el | 4 - modules/lang/ocaml/config.el | 8 +- modules/lang/org/config.el | 8 +- modules/lang/plantuml/config.el | 2 +- modules/lang/purescript/config.el | 10 ++- modules/lang/python/config.el | 3 +- modules/lang/rest/config.el | 5 +- modules/lang/ruby/config.el | 27 ++---- modules/lang/rust/config.el | 12 +-- modules/lang/scala/config.el | 22 +++-- modules/lang/sh/config.el | 14 ++-- modules/lang/swift/config.el | 15 ++-- modules/lang/swift/packages.el | 3 + modules/lang/web/+css.el | 32 +++---- modules/lang/web/+html.el | 12 +-- modules/lang/web/packages.el | 6 +- modules/tools/editorconfig/config.el | 11 ++- modules/tools/ein/autoload.el | 30 ++++--- modules/tools/ein/config.el | 62 +++++++------- modules/tools/electric-indent/config.el | 22 ++--- modules/tools/eshell/config.el | 4 +- modules/tools/gist/config.el | 4 +- modules/tools/imenu/config.el | 9 +- modules/tools/magit/config.el | 9 +- modules/tools/password-store/config.el | 27 +++--- modules/tools/password-store/packages.el | 2 +- modules/tools/pdf/config.el | 3 +- modules/tools/prodigy/autoload.el | 20 +++++ modules/tools/prodigy/config.el | 27 +----- modules/tools/rgb/config.el | 3 - modules/tools/rotate-text/autoload.el | 17 ++++ modules/tools/rotate-text/config.el | 22 +---- modules/tools/term/config.el | 18 ++-- modules/ui/doom-dashboard/config.el | 21 ++--- modules/ui/doom-modeline/config.el | 11 +-- modules/ui/doom/config.el | 7 +- modules/ui/evil-goggles/config.el | 2 +- modules/ui/nav-flash/config.el | 2 +- modules/ui/popup/autoload.el | 68 +++++++++++++++ modules/ui/popup/init.el | 61 -------------- modules/ui/unicode/autoload.el | 23 +++++ modules/ui/unicode/config.el | 19 ----- modules/ui/vi-tilde-fringe/autoload.el | 4 + modules/ui/vi-tilde-fringe/config.el | 6 -- modules/ui/window-select/config.el | 7 +- 93 files changed, 644 insertions(+), 846 deletions(-) delete mode 100644 modules/collab/impatient-mode/config.el create mode 100644 modules/feature/lookup/autoload/devdocs.el create mode 100644 modules/feature/lookup/autoload/docsets.el delete mode 100644 modules/feature/snippets/doctor.el create mode 100644 modules/lang/assembly/autoload.el delete mode 100644 modules/lang/assembly/config.el delete mode 100644 modules/lang/nix/config.el create mode 100644 modules/tools/rotate-text/autoload.el delete mode 100644 modules/ui/popup/init.el create mode 100644 modules/ui/unicode/autoload.el delete mode 100644 modules/ui/unicode/config.el create mode 100644 modules/ui/vi-tilde-fringe/autoload.el delete mode 100644 modules/ui/vi-tilde-fringe/config.el diff --git a/modules/collab/impatient-mode/autoload.el b/modules/collab/impatient-mode/autoload.el index 3222b5477..41047d359 100644 --- a/modules/collab/impatient-mode/autoload.el +++ b/modules/collab/impatient-mode/autoload.el @@ -2,9 +2,8 @@ ;;;###autoload (defun +impatient-mode/toggle () - "TODO" + "Toggle `impatient-mode' in the current buffer." (interactive) - (require 'simple-httpd) (unless (process-status "httpd") (httpd-start)) (impatient-mode) diff --git a/modules/collab/impatient-mode/config.el b/modules/collab/impatient-mode/config.el deleted file mode 100644 index 0087bee52..000000000 --- a/modules/collab/impatient-mode/config.el +++ /dev/null @@ -1,6 +0,0 @@ -;;; collab/impatient-mode/config.el -*- lexical-binding: t; -*- - -;; Show off code as you write it - -(def-package! impatient-mode - :commands impatient-mode) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 12a1f352b..ec6113713 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -24,8 +24,7 @@ MODES should be one major-mode symbol or a list of them." ;; (def-package! company - :commands (company-mode global-company-mode company-complete - company-complete-common company-manual-begin company-grab-line) + :commands (company-complete-common company-manual-begin company-grab-line) :init (setq company-idle-delay nil company-tooltip-limit 14 @@ -48,7 +47,8 @@ MODES should be one major-mode symbol or a list of them." (def-package! company :when (featurep! +auto) - :defer pre-command-hook + :defer 2 + :after-call pre-command-hook :config (setq company-idle-delay 0.2)) @@ -73,27 +73,12 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-dict - :commands company-dict + :defer t :config (defun +company|enable-project-dicts (mode &rest _) "Enable per-project dictionaries." (if (symbol-value mode) - (cl-pushnew mode company-dict-minor-mode-list :test #'eq) + (add-to-list 'company-dict-minor-mode-list mode #'eq) (setq company-dict-minor-mode-list (delq mode company-dict-minor-mode-list)))) (add-hook 'doom-project-hook #'+company|enable-project-dicts)) - -;; -;; Included with company.el -;; - -(autoload 'company-capf "company-capf") -(autoload 'company-dabbrev "company-dabbrev") -(autoload 'company-dabbrev-code "company-dabbrev-code") -(autoload 'company-elisp "company-elisp") -(autoload 'company-etags "company-etags") -(autoload 'company-files "company-files") -(autoload 'company-gtags "company-gtags") -(autoload 'company-ispell "company-ispell") -(autoload 'company-yasnippet "company-yasnippet") - diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index b4e6c5282..702208166 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -11,7 +11,8 @@ ;; (def-package! helm-mode - :defer (pre-command-hook . 1) + :defer 1 + :after-call pre-command-hook :config (helm-mode +1) ;; helm is too heavy for find-file-at-point diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index eef638f21..89ce56db5 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -116,9 +116,9 @@ If ARG (universal argument), open selection in other-window." "\\):?\\s-*\\(.+\\)") x) (error - (message! (red "Error matching task in file: (%s) %s" - (error-message-string ex) - (car (split-string x ":")))) + (print! (red "Error matching task in file: (%s) %s" + (error-message-string ex) + (car (split-string x ":")))) nil)) collect `((type . ,(match-string 3 x)) (desc . ,(match-string 4 x)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 51434fb26..9d3f3f705 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -24,7 +24,8 @@ immediately runs it on the current candidate (ending the ivy session)." ;; (def-package! ivy - :defer (pre-command-hook . 1) + :defer 1 + :after-call pre-command-hook :config (setq ivy-height 12 ivy-do-completion-in-region nil @@ -184,7 +185,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! wgrep - :commands (wgrep-setup wgrep-change-to-wgrep-mode) + :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 6d5ba386b..12bd8c5ec 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -35,6 +35,15 @@ (sp-pair "'" nil :unless unless-list) (sp-pair "\"" nil :unless unless-list)) + ;; Major-mode specific fixes + (sp-local-pair 'ruby-mode "{" "}" + :pre-handlers '(:rem sp-ruby-prehandler) + :post-handlers '(:rem sp-ruby-posthandler)) + ;; sp's default rules for these modes are obnoxious, so disable them + (provide 'smartparens-latex) + (provide 'smartparens-elixir) + (provide 'smartparens-lua) + ;; Expand {|} => { | } ;; Expand {|} => { ;; | diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 1b7ef587d..78660ffa8 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,7 +3,8 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" '((size . 20))) + (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" + '((size . 20))) ;; TODO Temporary Ex commands for the debugger ;; (def-tmp-excmd! doom:def-debug-on doom:def-debug-off diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 72b086d15..1549eacb8 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -10,12 +10,7 @@ ;; (def-package! quickrun - :commands (quickrun - quickrun-region - quickrun-with-arg - quickrun-shell - quickrun-compile-only - quickrun-replace-region) + :defer t :init (unless (boundp 'display-line-numbers) (add-hook 'quickrun--mode-hook #'nlinum-mode)) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index f1c41106d..a04891154 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -1,6 +1,21 @@ ;; feature/evil/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) +;;;###autoload +(def-setting! :evil-state (modes state) + "Set the initialize STATE of MODE using `evil-set-initial-state'." + (let ((unquoted-modes (doom-unquote modes))) + (if (listp unquoted-modes) + `(progn + ,@(cl-loop for mode in unquoted-modes + collect `(evil-set-initial-state ',mode ,state))) + `(evil-set-initial-state ,modes ,state)))) + + +;; +;; Commands +;; + ;;;###autoload (defun +evil/visual-indent () "vnoremap < " evil-args-closers))) -(def-package! evil-indent-plus - :commands (evil-indent-plus-i-indent - evil-indent-plus-a-indent - evil-indent-plus-i-indent-up - evil-indent-plus-a-indent-up - evil-indent-plus-i-indent-up-down - evil-indent-plus-a-indent-up-down)) - - -(def-package! evil-textobj-anyblock - :commands (evil-textobj-anyblock-inner-block evil-textobj-anyblock-a-block)) - - ;; ;; Multiple cursors compatibility (for the plugins that use it) ;; diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el new file mode 100644 index 000000000..2b2c4a514 --- /dev/null +++ b/modules/feature/lookup/autoload/devdocs.el @@ -0,0 +1,11 @@ +;;; feature/lookup/autoload/devdocs.el -*- lexical-binding: t; -*- +;;;###if (featurep! +devdocs) + +;;;###autoload +(def-setting! :devdocs (modes docset) + "Map major MODES (one major-mode symbol or a list of them) to a devdocs +DOCSET (a string). + +See `devdocs-alist' for the defaults. " + `(dolist (mode ',modes) + (push (cons mode ,docset) devdocs-alist))) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el new file mode 100644 index 000000000..89fef163c --- /dev/null +++ b/modules/feature/lookup/autoload/docsets.el @@ -0,0 +1,40 @@ +;;; feature/lookup/autoload/docsets.el -*- lexical-binding: t; -*- +;;;###if (featurep! +docsets) + +;;;###autoload +(def-setting! :docset (modes &rest docsets) + "Registers a list of DOCSETS (strings) for MODES (either one major mode +symbol or a list of them). + +If MODES is a minor mode, you can use :add or :remove as the first element of +DOCSETS, to instruct it to append (or remove) those from the docsets already set +by a major-mode, if any. + +Used by `+lookup/in-docsets' and `+lookup/documentation'." + (let* ((modes (doom-unquote modes)) + (ivy-p (featurep! :completion ivy)) + (hook-sym (intern (format "+lookup|%s-docsets--%s" + (cond ((eq ',(car docsets) :add) 'add) + ((eq ',(car docsets) :remove) 'remove) + ('set)) + (string-join docsets "-")))) + (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) + `(progn + (defun ,hook-sym () + (make-variable-buffer-local ',var-sym) + ,(cond ((eq ',(car docsets) :add) + `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) + ((eq ',(car docsets) :remove) + `(setq ,var-sym + (cl-loop with to-delete = (list ,@(cdr docsets)) + for docset in ,var-sym + unless (member docset to-delete) + collect docset))) + (`(setq ,var-sym (list ,@docsets))))) + (add-hook! ,modes #',hook-sym)))) + +;;;###autoload +(autoload 'helm-dash-installed-docsets "helm-dash") + +;;;###autoload +(autoload 'helm-dash-docset-installed-p "helm-dash") diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index b693f44bc..bbabb689a 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -122,33 +122,29 @@ ones." ;; (def-package! dumb-jump - :commands (dumb-jump-go dumb-jump-quick-look - dumb-jump-back dumb-jump-result-follow) + :commands dumb-jump-result-follow :config (setq dumb-jump-default-project doom-emacs-dir dumb-jump-aggressive nil dumb-jump-selector (cond ((featurep! :completion ivy) 'ivy) ((featurep! :completion helm) 'helm) - (t 'popup)))) + ('popup)))) ;; ;; xref ;; -(def-package! xref - :commands (xref-backend-identifier-at-point xref-find-definitions xref-find-references) - :config - ;; By default, `etags--xref-backend' is the default xref backend. No need. - ;; We'll set these up ourselves in other modules. - (setq-default xref-backend-functions '(t)) +;; By default, `etags--xref-backend' is the default xref backend. No need. We'll +;; set these up ourselves in other modules. +(setq-default xref-backend-functions '(t)) - ;; ...however, it breaks `projectile-find-tag', unless we put it back. - (defun +lookup*projectile-find-tag (orig-fn) - (let ((xref-backend-functions '(etags--xref-backend t))) - (funcall orig-fn))) - (advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag)) +;; ...however, it breaks `projectile-find-tag', unless we put it back. +(defun +lookup*projectile-find-tag (orig-fn) + (let ((xref-backend-functions '(etags--xref-backend t))) + (funcall orig-fn))) +(advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag) (def-package! ivy-xref @@ -168,41 +164,9 @@ ones." ;; (when (featurep! +docsets) - (def-setting! :docset (modes &rest docsets) - "Registers a list of DOCSETS (strings) for MODES (either one major mode -symbol or a list of them). - -If MODES is a minor mode, you can use :add or :remove as the first element of -DOCSETS, to instruct it to append (or remove) those from the docsets already set -by a major-mode, if any. - -Used by `+lookup/in-docsets' and `+lookup/documentation'." - (let* ((modes (doom-unquote modes)) - (ivy-p (featurep! :completion ivy)) - (hook-sym (intern (format "+lookup|%s-docsets--%s" - (cond ((eq ',(car docsets) :add) 'add) - ((eq ',(car docsets) :remove) 'remove) - ('set)) - (string-join docsets "-")))) - (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) - `(progn - (defun ,hook-sym () - (make-variable-buffer-local ',var-sym) - ,(cond ((eq ',(car docsets) :add) - `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) - ((eq ',(car docsets) :remove) - `(setq ,var-sym - (cl-loop with to-delete = (list ,@(cdr docsets)) - for docset in ,var-sym - unless (member docset to-delete) - collect docset))) - (`(setq ,var-sym (list ,@docsets))))) - (add-hook! ,modes #',hook-sym)))) - ;; Both packages depend on helm-dash (def-package! helm-dash - :commands (helm-dash helm-dash-install-docset helm-dash-at-point - helm-dash-docset-installed-p helm-dash-installed-docsets) + :defer t :init (setq helm-dash-enable-debugging doom-debug-mode helm-dash-browser-func #'eww) @@ -214,7 +178,7 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (def-package! counsel-dash :when (featurep! :completion ivy) - :commands (counsel-dash counsel-dash-install-docset) + :commands counsel-dash-install-docset :config (setq counsel-dash-min-length 2))) @@ -223,20 +187,11 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." ;; (when (featurep! +devdocs) - (def-setting! :devdocs (modes docset) - "Map major MODES (one major-mode symbol or a list of them) to a devdocs -DOCSET (a string). - -See `devdocs-alist' for the defaults. " - `(dolist (mode ',modes) - (push (cons mode ,docset) devdocs-alist))) - - (def-package! devdocs-lookup - :commands (devdocs-setup devdocs-lookup) - :config - (setq devdocs-subjects - (append '(("SCSS" "scss") - ("GFM" "markdown") - ("Typescript" "typescript")) - devdocs-subjects)))) + (after! devdocs-lookup + (unless (assoc "SCSS" devdocs-subjects) + (setq devdocs-subjects + (append '(("SCSS" "scss") + ("GFM" "markdown") + ("Typescript" "typescript")) + devdocs-subjects))))) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index a9acfadd6..33757e31e 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -1,9 +1,16 @@ ;;; feature/snippets/config.el -*- lexical-binding: t; -*- +(defvar +snippets-dir (expand-file-name "snippets/" doom-private-dir) + "Directory where `yasnippet' will search for your private snippets.") + + +;; +;; Plugins +;; + (def-package! yasnippet - :commands (yas-minor-mode yas-minor-mode-on yas-expand yas-expand-snippet - yas-lookup-snippet yas-insert-snippet yas-new-snippet - yas-visit-snippet-file snippet-mode) + :commands (yas-minor-mode-on yas-expand yas-expand-snippet yas-lookup-snippet + yas-insert-snippet yas-new-snippet yas-visit-snippet-file) :preface (defvar yas-minor-mode-map (let ((map (make-sparse-keymap))) @@ -23,28 +30,25 @@ (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) - ;; Allow nested snippets - yas-triggers-in-field t) + yas-triggers-in-field t) ; Allow nested snippets - (cl-pushnew (expand-file-name "snippets/" doom-private-dir) yas-snippet-dirs - :test #'string=) + (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) (defun +snippets|enable-project-modes (mode &rest _) - "Enable snippets for project modes." + "Automatically enable snippet libraries for project minor modes defined with +`def-project-mode!'." (if (symbol-value mode) (yas-activate-extra-mode mode) (yas-deactivate-extra-mode mode))) (add-hook 'doom-project-hook #'+snippets|enable-project-modes) - ;; fix an error caused by smartparens interfering with yasnippet bindings - (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) - ;; Exit snippets on ESC from normal mode - (add-hook 'doom-escape-hook #'yas-abort-snippet)) + (add-hook 'doom-escape-hook #'yas-abort-snippet) + + (after! smartparens + ;; fix an error caused by smartparens interfering with yasnippet bindings + (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))) -(def-package! auto-yasnippet - :commands (aya-create aya-expand aya-open-line aya-persist-snippet) - :config +(after! auto-yasnippet (setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/"))) - diff --git a/modules/feature/snippets/doctor.el b/modules/feature/snippets/doctor.el deleted file mode 100644 index 8ba004a36..000000000 --- a/modules/feature/snippets/doctor.el +++ /dev/null @@ -1,7 +0,0 @@ -;; -*- lexical-binding: t; no-byte-compile: t; -*- -;;; feature/snippets/doctor.el - -(require 'yasnippet) -(unless (ignore-errors (yas-reload-all) - (yas--get-snippet-tables)) - (warn! "Couldn't find any snippets in any of these directories: %s" yas-snippet-dirs)) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index c1f8b3bb6..2cc8dadb6 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -8,7 +8,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") (def-package! flyspell ; built-in - :commands flyspell-mode + :defer t :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) :config diff --git a/modules/feature/spellcheck/packages.el b/modules/feature/spellcheck/packages.el index bb01a00ba..97172953f 100644 --- a/modules/feature/spellcheck/packages.el +++ b/modules/feature/spellcheck/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/spellcheck/packages.el -(package! flyspell-correct) -(cond ((featurep! :completion ivy) - (package! flyspell-correct-ivy)) - ((featurep! :completion helm) - (package! flyspell-correct-helm)) - (t - (package! flyspell-correct-popup))) +(when (package! flyspell-correct) + (cond ((featurep! :completion ivy) + (package! flyspell-correct-ivy)) + ((featurep! :completion helm) + (package! flyspell-correct-helm)) + (t + (package! flyspell-correct-popup)))) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 29048618e..9bdc0b5fa 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -1,18 +1,11 @@ ;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- -;; Since Doom doesn't use `package-initialize', pkg-info won't get autoloaded -;; when `flycheck-version' needs it, so we need this: -(autoload 'pkg-info-version-info "pkg-info") - (def-package! flycheck - :commands (flycheck-mode flycheck-list-errors flycheck-buffer) + :commands (flycheck-list-errors flycheck-buffer) :config ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) - ;; Popup - (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode) - (after! evil (defun +syntax-checkers|flycheck-buffer () "Flycheck buffer on ESC in normal mode." @@ -20,21 +13,16 @@ (ignore-errors (flycheck-buffer)) nil)) (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer) - - ;; With the option of flychecking the buffer on escape or leaving insert - ;; mode, we don't need auto-flychecking on idle-change (which can feel slow, - ;; esp on computers without SSDs). - (delq 'idle-change flycheck-check-syntax-automatically))) + (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer))) (def-package! flycheck-popup-tip - :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup)) + :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) + :init (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode)) (def-package! flycheck-posframe - :when EMACS26+ - :when (featurep! +childframe) + :when (and EMACS26+ (featurep! +childframe)) :commands flycheck-posframe-show-posframe :config (setq flycheck-posframe-warning-prefix "⚠ " diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 88d610089..8488f9076 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,10 +1,5 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- -;; These don't need `def-package!' blocks because they've already been set up by -;; `doom-initialize'. -(autoload 'gitconfig-mode "gitconfig-mode" nil t) -(autoload 'gitignore-mode "gitignore-mode" nil t) - (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) @@ -59,7 +54,7 @@ (def-package! git-timemachine - :commands (git-timemachine git-timemachine-toggle) + :defer t :config ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of ;; showing revision details in the minibuffer, show them in @@ -67,10 +62,6 @@ (setq git-timemachine-show-minibuffer-details t) (advice-add #'git-timemachine--show-minibuffer-details :override #'+vcs*update-header-line) - ;; Force evil to rehash keybindings for the current state - (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state)) - - -(def-package! git-link - :commands (git-link git-link-commit git-link-homepage)) - + (after! evil + ;; Force evil to rehash keybindings for the current state + (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 4b6d1f4b4..bc1467bcf 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -27,7 +27,7 @@ new project directory.") stored in `persp-save-dir'.") (defun +workspaces-restore-last-session (&rest _) - (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) + (add-hook 'doom-post-init-hook #'+workspace/load-session 'append)) (map-put command-switch-alist '"--restore" #'+workspaces-restore-last-session) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index e7cc2e9bd..6367400ed 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -2,6 +2,7 @@ ;;; feature/workspaces/test/autoload-workspaces.el (require! :feature workspaces) +(doom|init-custom-hooks) (defmacro with-workspace!! (buffer-args &rest body) (declare (indent defun)) diff --git a/modules/lang/assembly/autoload.el b/modules/lang/assembly/autoload.el new file mode 100644 index 000000000..38b582a66 --- /dev/null +++ b/modules/lang/assembly/autoload.el @@ -0,0 +1,4 @@ +;;; lang/assembly/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(map-put auto-mode-alist "\\.hax\\'" 'haxor-mode) diff --git a/modules/lang/assembly/config.el b/modules/lang/assembly/config.el deleted file mode 100644 index 98b879b24..000000000 --- a/modules/lang/assembly/config.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; lang/assembly/config.el -*- lexical-binding: t; -*- - -(def-package! mips-mode :mode "\\.mips$") - -(def-package! haxor-mode :mode "\\.hax$") - -(def-package! nasm-mode :commands nasm-mode) - diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index cf6580425..f063cf11c 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -89,13 +89,6 @@ compilation dbs." nconc (list "-I" path))) (doom-project-root))))) -;;;###autoload -(defun +cc|init-rtags () - "Start an rtags server in c-mode and c++-mode buffers." - (when (and (memq major-mode '(c-mode c++-mode)) - (rtags-executable-find "rtags")) - (rtags-start-process-unless-running))) - ;;;###autoload (defun +cc|cleanup-rtags () "Kill rtags server(s) if there are no C/C++ buffers open." diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 0077083c1..cb02a6558 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -55,10 +55,10 @@ compilation database is present in the project.") :config (set! :electric '(c-mode c++-mode objc-mode java-mode) - :chars '(?\n ?\})) + :chars '(?\n ?\})) (set! :company-backend - '(c-mode c++-mode objc-mode) - '(company-irony-c-headers company-irony)) + '(c-mode c++-mode objc-mode) + '(company-irony-c-headers company-irony)) ;;; Style/formatting ;; C/C++ style settings @@ -101,8 +101,8 @@ compilation database is present in the project.") (label . 0)))) ;;; Keybindings - ;; Completely disable electric keys because it interferes with smartparens and - ;; custom bindings. We'll do this ourselves. + ;; Disable electric keys because it interferes with smartparens and custom + ;; bindings. We'll do it ourselves (mostly). (setq c-tab-always-indent nil c-electric-flag nil) (dolist (key '("#" "}" "/" "*" ";" "," ":" "(" ")" "\177")) @@ -129,6 +129,7 @@ compilation database is present in the project.") (def-package! irony + :when (featurep! +irony) :commands (irony-install-server irony-mode) :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) @@ -172,23 +173,13 @@ compilation database is present in the project.") ;; (def-package! cmake-mode - :mode "/CMakeLists\\.txt$" - :mode "\\.cmake\\$" + :defer t :config (set! :company-backend 'cmake-mode '(company-cmake company-yasnippet))) -(def-package! cuda-mode :mode "\\.cuh?$") +(def-package! opencl-mode :mode "\\.cl\\'") -(def-package! opencl-mode :mode "\\.cl$") - -(def-package! demangle-mode - :hook llvm-mode) - -(def-package! glsl-mode - :mode "\\.glsl$" - :mode "\\.vert$" - :mode "\\.frag$" - :mode "\\.geom$") +(def-package! demangle-mode :hook llvm-mode) ;; @@ -213,7 +204,12 @@ compilation database is present in the project.") (def-package! rtags :commands rtags-executable-find :init - (add-hook! (c-mode c++-mode) #'+cc|init-rtags) + (defun +cc|init-rtags () + "Start an rtags server in c-mode and c++-mode buffers." + (when (and (memq major-mode '(c-mode c++-mode)) + (rtags-executable-find "rtags")) + (rtags-start-process-unless-running))) + (add-hook 'c-mode-common-hook #'+cc|init-rtags) :config (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil diff --git a/modules/lang/cc/doctor.el b/modules/lang/cc/doctor.el index 442798ce4..5f9799ecf 100644 --- a/modules/lang/cc/doctor.el +++ b/modules/lang/cc/doctor.el @@ -7,9 +7,9 @@ (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) ;; irony server -(require 'irony) -(unless (file-directory-p irony-server-install-prefix) - (warn! "Irony server isn't installed. Run M-x irony-install-server")) +(when (require 'irony nil t) + (unless (file-directory-p irony-server-install-prefix) + (warn! "Irony server isn't installed. Run M-x irony-install-server"))) (when (featurep! :completion company) ;; glslangValidator diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 53a18eded..e78813ef5 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,13 +1,7 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- -(def-package! clojure-mode - :mode "\\.clj$" - :mode "\\.edn$" - :mode "\\(?:build\\|profile\\)\\.boot$" - :mode ("\\.cljs$" . clojurescript-mode) - :mode ("\\.cljc$" . clojurec-mode) - :config - (add-hook 'clojure-mode #'rainbow-delimiters-mode)) +;; `clojure-mode' +(add-hook 'clojure-mode #'rainbow-delimiters-mode) (def-package! clj-refactor diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index f1b765e72..717a4137c 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -1,8 +1,7 @@ ;;; lang/crystal/config.el -*- lexical-binding: t; -*- (def-package! crystal-mode - :mode "\\.cr$" - :interpreter "crystal" + :defer t :config (set! :lookup 'crystal-mode :definition #'crystal-def-jump @@ -19,5 +18,4 @@ :config (add-hook 'crystal-mode-hook #'flycheck-mode)) -(def-package! inf-crystal - :commands (inf-crystal crystal-switch-to-inf)) +(def-package! inf-crystal :commands crystal-switch-to-inf) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 306f93b12..c7ecabe28 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,17 +1,16 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -(def-package! csharp-mode :mode "\\.cs$") - -(def-package! shader-mode :mode "\\.shader$") ; unity shaders +(add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) ; unity shaders (def-package! omnisharp - :after csharp-mode + :hook (csharp-mode . omnisharp-mode) + :commands omnisharp-install-server :preface (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (add-hook! csharp-mode #'(flycheck-mode omnisharp-mode)) + (add-hook 'csharp-mode-hook #'flycheck-mode) (defun +csharp|cleanup-omnisharp-server () "Clean up the omnisharp server once you kill the last csharp-mode buffer." diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 60b1af9b2..77e9723de 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,47 +1,30 @@ ;;; lang/data/config.el -*- lexical-binding: t; -*- -(push '("/sxhkdrc" . conf-mode) auto-mode-alist) +;; Built in plugins +(dolist (spec '(("/sxhkdrc\\'" . conf-mode) + ("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) + ("\\.plist\\'" . nxml-mode))) + (map-put auto-mode-alist (car spec) (cdr spec))) + +(set! :company-backend 'nxml-mode '(company-nxml company-yasnippet)) -(def-package! dockerfile-mode - :mode "/Dockerfile$") - +;; +;; Third-party plugins +;; (def-package! graphql-mode - :mode "\\.g\\(?:raph\\)?ql$") - - -(def-package! hexl ; For ROM hacking or debugging - :mode ("\\.hex$" . hexl-mode) - :mode ("\\.nes$" . hexl-mode)) - + :mode "\\.gql\\'") (def-package! json-mode - :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)$" + :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'" :config (when (featurep! :feature syntax-checker) (add-hook 'json-mode-hook #'flycheck-mode)) (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) - -(def-package! nxml-mode - :mode "\\.plist$" - :config - (set! :company-backend 'nxml-mode '(company-nxml company-yasnippet))) - - -(def-package! toml-mode - :mode "\\.toml$") - - (def-package! vimrc-mode - :mode "/\\.?g?vimrc$" - :mode "\\.vimp?$" - :mode "\\.?vimperatorrc$") - - -(def-package! yaml-mode - :mode "\\.ya?ml$") + :mode "\\.?vimperatorrc\\'") ;; diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 590bb545a..6afd25471 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -1,21 +1,18 @@ ;;; lang/elixir/config.el -*- lexical-binding: t; -*- (def-package! elixir-mode - :mode "\\.exs?\\'" - :mode "\\.elixir2\\'" - :init - ;; sp's default elixir rules are obnoxious, so disable them - (provide 'smartparens-elixir) + :defer t :config ;; ...and only complete the basics - (sp-with-modes 'elixir-mode - (sp-local-pair "do" "end" - :when '(("RET" "")) - :unless '(sp-in-comment-p sp-in-string-p) - :skip-match 'sp-elixir-skip-def-p - :post-handlers '("||\n[i]")) - (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) - (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + (after! smartparens + (sp-with-modes 'elixir-mode + (sp-local-pair "do" "end" + :when '(("RET" "")) + :unless '(sp-in-comment-p sp-in-string-p) + :skip-match 'sp-elixir-skip-def-p + :post-handlers '("||\n[i]")) + (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) + (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p))))) (def-package! alchemist @@ -30,13 +27,13 @@ (def-package! alchemist-company :when (featurep! :completion company) - :after elixir-mode + :commands alchemist-company + :init + (set! :company-backend 'elixir-mode '(alchemist-company company-yasnippet)) :config ;; Alchemist doesn't use hook symbols to add these backends, so we have to use ;; the entire closure to get rid of it. (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) (remove-hook 'alchemist-mode-hook fn) - (remove-hook 'alchemist-iex-mode-hook fn)) - - (set! :company-backend 'elixir-mode '(alchemist-company company-yasnippet))) + (remove-hook 'alchemist-iex-mode-hook fn))) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 6bc5f9c00..6cf23914d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -1,13 +1,12 @@ ;;; lang/elm/config.el -*- lexical-binding: t; -*- -(def-package! elm-mode - :mode "\\.elm$" - :config - (load "elm-mode-autoloads" nil t) - (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :company-backend 'elm-mode '(company-elm)) - (set! :repl 'elm-mode #'run-elm-interactive) - (setq elm-format-on-save t)) +;; `elm-mode' +(setq elm-format-on-save t) + +(add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + +(set! :company-backend 'elm-mode 'company-elm) +(set! :repl 'elm-mode #'run-elm-interactive) (def-package! flycheck-elm diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 05e3b6e96..4071df3f1 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -1,5 +1,13 @@ ;;; lang/emacs-lisp/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(autoload 'overseer-test "overseer" nil t) + + +;; +;; Library +;; + ;;;###autoload (defun +emacs-lisp/repl () "Open the Emacs Lisp REPL (`ielm')." diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 20033e171..97172e8b6 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -67,27 +67,17 @@ ;; Plugins ;; -(def-package! auto-compile - :commands auto-compile-on-save-mode - :config - (setq auto-compile-display-buffer nil - auto-compile-use-mode-line nil)) +;; `auto-compile' +(setq auto-compile-display-buffer nil + auto-compile-use-mode-line nil) -(def-package! highlight-quoted - :commands highlight-quoted-mode) +;; `slime' +(setq inferior-lisp-program "clisp") +(after! slime (require 'slime-fuzzy)) -(def-package! slime - :defer t - :config - (setq inferior-lisp-program "clisp") - (require 'slime-fuzzy)) - - -(def-package! macrostep - :commands macrostep-expand - :config +(after! macrostep (map! :map macrostep-keymap :n "RET" #'macrostep-expand :n "e" #'macrostep-expand @@ -104,6 +94,7 @@ :n "q" #'macrostep-collapse-all :n "C" #'macrostep-collapse-all) + ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't ;; apply for the very first invocation (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps)) @@ -111,18 +102,14 @@ (def-package! flycheck-cask :when (featurep! :feature syntax-checker) - :commands flycheck-cask-setup + :defer t :init (add-hook! 'emacs-lisp-mode-hook (add-hook 'flycheck-mode-hook #'flycheck-cask-setup nil t))) -(def-package! overseer - :commands overseer-test) - - -;; ;; +;; Project modes ;; (def-project-mode! +emacs-lisp-ert-mode diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el index 8a180d37a..933c455f4 100644 --- a/modules/lang/erlang/config.el +++ b/modules/lang/erlang/config.el @@ -1,20 +1,19 @@ ;;; private/erlang/config.el -*- lexical-binding: t; -*- -(def-package! erlang - ;; customizations - :mode "\\.erlang$" - ;; rebar files - :mode "/rebar\\.config\\(?:\\.script\\)?$" - ;; erlang configs - :mode "/\\(?:app\\|sys\\)\\.config$") +(dolist (regexp '("\\.erlang$" + ;; rebar files + "/rebar\\.config\\(?:\\.script\\)?$" + ;; erlang configs + "/\\(?:app\\|sys\\)\\.config$")) + (map-put auto-mode-alist regexp 'erlang-mode)) + (def-package! flycheck-rebar3 :when (featurep! :feature syntax-checker) - :after erlang - :config - (flycheck-rebar3-setup)) + :after flycheck + :config (flycheck-rebar3-setup)) + -;; Completion via Ivy (def-package! ivy-erlang-complete :when (featurep! :completion ivy) :hook (erlang-mode . ivy-erlang-complete-init) @@ -23,7 +22,6 @@ (add-hook 'after-save-hook #'ivy-erlang-complete-reparse nil t))) -;; Completion via Company (def-package! company-erlang :when (featurep! :completion company) :hook (erlang-mode . company-erlang-init)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index e08657a08..a1fc837b2 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -79,6 +79,6 @@ :n "cn" #'ess-noweb-next-chunk)))) -(def-package! ess-smart-equals - :hook ((ess-mode . ess-smart-equals-mode) - (inferior-ess-mode . ess-smart-equals-mode))) +;; `ess-smart-equals-mode' +(add-hook! (ess-mode inferior-ess) + #'ess-smart-equals-mode) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 34e4d57d5..f8e8c6050 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -4,10 +4,7 @@ ;; Plugins ;; -(def-package! go-mode - :mode "\\.go$" - :interpreter "go" - :config +(after! go-mode (set! :env "GOPATH" "GOROOT") (set! :repl 'go-mode #'gorepl-run) (set! :lookup 'go-mode @@ -15,11 +12,12 @@ :references #'go-guru-referrers :documentation #'godoc-at-point) - (when (executable-find "goimports") - (setq gofmt-command "goimports")) + (when-let* ((goimports (executable-find "goimports"))) + (setq gofmt-command goimports)) (setq gofmt-show-errors nil) ; Leave it to flycheck - (add-hook 'go-mode-hook #'flycheck-mode) + + (add-hook! 'go-mode-hook #'(flycheck-mode go-eldoc-setup)) (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t)) @@ -70,25 +68,13 @@ :v "r" #'go-play-region)) -(def-package! go-eldoc - :hook (go-mode . go-eldoc-setup)) - - -(def-package! go-guru - :commands (go-guru-describe go-guru-freevars go-guru-implements go-guru-peers - go-guru-referrers go-guru-definition go-guru-pointsto - go-guru-callstack go-guru-whicherrs go-guru-callers go-guru-callees - go-guru-expand-region)) - - (def-package! gorepl-mode - :commands (gorepl-run gorepl-run-load-current-file)) + :commands gorepl-run-load-current-file) (def-package! company-go :when (featurep! :completion company) - :init (setq command-go-gocode-command "gocode") :after go-mode :config - (setq company-go-show-annotation t) - (set! :company-backend 'go-mode '(company-go))) + (set! :company-backend 'go-mode 'company-go) + (setq company-go-show-annotation t)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index a97fa9bff..559b244aa 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -8,18 +8,7 @@ ;; Common plugins ;; -(def-package! haskell-mode - :mode "\\.hs$" - :mode ("\\.ghci$" . ghci-script-mode) - :mode ("\\.cabal$" . haskell-cabal-mode) - :interpreter (("runghc" . haskell-mode) - ("runhaskell" . haskell-mode)) - :config - (load "haskell-mode-autoloads" nil t) +(after! haskell-mode (set! :repl 'haskell-mode #'switch-to-haskell) - (push ".hi" completion-ignored-extensions) - - (autoload 'switch-to-haskell "inf-haskell" nil t) - (after! inf-haskell - (map! :map inferior-haskell-mode-map "ESC ESC" #'+popup/close))) + (add-to-list 'completion-ignored-extensions ".hi")) diff --git a/modules/lang/hy/config.el b/modules/lang/hy/config.el index bc106c784..bd24be0da 100644 --- a/modules/lang/hy/config.el +++ b/modules/lang/hy/config.el @@ -1,8 +1,8 @@ ;;; lang/hy/config.el -*- lexical-binding: t; -*- (def-package! hy-mode - :mode "\\.hy$" + :mode "\\.hy\\'" :interpreter "hy" :config (set! :repl 'hy-mode #'hy-shell-start-or-switch-to-shell) - (set! :company-backend 'hy-mode '(company-hy))) + (set! :company-backend 'hy-mode 'company-hy)) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 8be32f44c..5ace2680a 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -3,8 +3,8 @@ (add-hook 'java-mode-hook #'rainbow-delimiters-mode) (cond ((featurep! +meghanada) (load! +meghanada)) - ;; TODO lang/java +eclim - ;; ((featurep! +eclim) (load! +eclim)) + ;; TODO lang/java +lsp (lsp-java?) + ;; ((featurep! +lsp) (load! +lsp)) ) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index ff5991288..c5721ff22 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -22,6 +22,7 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :electric 'js2-mode :chars '(?\} ?\) ?. ?:)) + (set! :repl 'js2-mode #'+javascript/repl) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) @@ -31,19 +32,10 @@ (map! :map js2-mode-map :localleader - :n "S" #'+javascript/skewer-this-buffer)) - - -(def-package! typescript-mode - :commands typescript-mode - :config - (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'typescript-mode - :chars '(?\} ?\)) :words '("||" "&&"))) + :n "S" #'+javascript/skewer-this-buffer)) (def-package! rjsx-mode - :commands rjsx-mode :mode "components/.+\\.js$" :init (defun +javascript-jsx-file-p () @@ -54,8 +46,7 @@ magic-mode-regexp-match-limit t) (progn (goto-char (match-beginning 1)) (not (sp-point-in-string-or-comment))))) - - (push '(+javascript-jsx-file-p . rjsx-mode) magic-mode-alist) + (map-put magic-mode-alist #'+javascript-jsx-file-p 'rjsx-mode) :config (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook @@ -67,14 +58,19 @@ ;; However, the parser doesn't run immediately, so a fast typist can outrun ;; it, causing issues, so force it to parse. (defun +javascript|reparse (n) - ;; if n != 1, then rjsx-maybe-reparse will be run elsewhere + ;; if n != 1, rjsx-electric-gt calls rjsx-maybe-reparse itself (if (= n 1) (rjsx-maybe-reparse))) (advice-add #'rjsx-electric-gt :before #'+javascript|reparse)) -(def-package! coffee-mode - :defer t ; file extensions registered by autoloads file - :init (setq coffee-indent-like-python-mode t)) +(after! typescript-mode + (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (set! :electric 'typescript-mode + :chars '(?\} ?\)) :words '("||" "&&"))) + + +;; `coffee-mode' +(setq coffee-indent-like-python-mode t) ;; @@ -86,6 +82,7 @@ :hook (typescript-mode . tide-setup) :init (defun +javascript|init-tide-in-web-mode () + "Enable `tide-mode' if in a *.tsx file." (when (string= (file-name-extension (or buffer-file-name "")) "tsx") (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) @@ -156,12 +153,6 @@ :init (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend)) -(def-package! nodejs-repl - :commands nodejs-repl - :init - (set! :repl 'js2-mode #'+javascript/repl)) - - (def-package! js2-refactor :commands (js2r-extract-function js2r-extract-method js2r-introduce-parameter @@ -174,51 +165,38 @@ js2r-debug-this js2r-forward-slurp js2r-forward-barf)) -(def-package! web-beautify - :commands web-beautify-js - :init - (map! :map* (json-mode js2-mode-map) :n "gQ" #'web-beautify-js)) - - (def-package! eslintd-fix - :commands (eslintd-fix-mode eslintd-fix) + :commands eslintd-fix :config (defun +javascript|set-flycheck-executable-to-eslint () (setq flycheck-javascript-eslint-executable eslintd-fix-executable)) (add-hook 'eslintd-fix-mode-hook #'+javascript|set-flycheck-executable-to-eslint)) -(def-package! skewer-mode - :commands (skewer-mode run-skewer) - :config - (map! :map skewer-mode-map +;; `skewer-mode' +(map! (:after skewer-mode + :map skewer-mode-map :localleader :n "sE" #'skewer-eval-last-expression :n "se" #'skewer-eval-defun - :n "sf" #'skewer-load-buffer)) + :n "sf" #'skewer-load-buffer) - -(def-package! skewer-css ; in skewer-mode - :commands skewer-css-mode - :config - (map! :map skewer-css-mode-map + (:after skewer-css + :map skewer-css-mode-map :localleader :n "se" #'skewer-css-eval-current-declaration :n "sr" #'skewer-css-eval-current-rule :n "sb" #'skewer-css-eval-buffer - :n "sc" #'skewer-css-clear-all)) + :n "sc" #'skewer-css-clear-all) - -(def-package! skewer-html ; in skewer-mode - :commands skewer-html-mode - :config - (map! :map skewer-html-mode-map + (:after skewer-html + :map skewer-html-mode-map :localleader :n "se" #'skewer-html-eval-tag)) -(def-package! skewer-repl - :commands skewer-repl) +;; `web-beautify' +(map! :map* (json-mode-map js2-mode-map) :n "gQ" #'web-beautify-js) ;; @@ -226,7 +204,7 @@ ;; (def-project-mode! +javascript-screeps-mode - :match "/screeps\\(-ai\\)?/.+$" + :match "/screeps\\(?:-ai\\)?/.+$" :modes (+javascript-npm-mode) :add-hooks (+javascript|init-screeps-mode) :on-load (load! +screeps)) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 2656fd4c8..c7be5a650 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -1,7 +1,6 @@ ;;; lang/julia/config.el -*- lexical-binding: t; -*- (use-package julia-mode - :mode "\\.jl$" :interpreter "julia" :config (set! :repl 'julia-mode #'+julia/repl) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 29ecefa08..dd33daf0f 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -18,9 +18,6 @@ "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." `(setq +latex-bibtex-dir ,dir)) -;; sp's default latex rules are obnoxious, so disable them -(provide 'smartparens-latex) - ;; ;; Plugins diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 5db4e7c71..0df0dbc5f 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -1,8 +1,7 @@ ;;; lang/ledger/config.el -*- lexical-binding: t; -*- -(def-package! ledger-mode - :mode "\\.ledger$" - :config (setq ledger-clear-whole-transactions 1)) +;; `ledger-mode' +(setq ledger-clear-whole-transactions 1) (def-package! evil-ledger @@ -12,4 +11,5 @@ (def-package! flycheck-ledger :when (featurep! :feature syntax-checker) - :init (add-hook 'ledger-mode-hook #'flycheck-mode)) + :after ledger-mode + :config (add-hook 'ledger-mode-hook #'flycheck-mode)) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 9a2dece5a..d8557f3b3 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,18 +1,12 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- -(def-package! lua-mode - :mode "\\.lua$" - :interpreter "lua" - :init - ;; sp's default lua rules are obnoxious, so disable them. Use snippets - ;; instead! - (provide 'smartparens-lua) - :config +(after! lua-mode (add-hook 'lua-mode-hook #'flycheck-mode) (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) + (set! :company-backend 'lua-mode '(company-lua company-yasnippet)) (def-menu! +lua/build-menu "Build/compilation commands for `lua-mode' buffers." @@ -24,15 +18,8 @@ :n "b" #'+lua/build-menu)) -(def-package! company-lua - :after (:all company lua-mode) - :config - (set! :company-backend 'lua-mode '(company-lua company-yasnippet))) - - -(def-package! moonscript - :mode ("\\.moon$" . moonscript-mode) - :config (defvaralias 'moonscript-indent-offset 'tab-width)) +(after! moonscript + (defvaralias 'moonscript-indent-offset 'tab-width)) ;; diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index b45cbe084..0438171e0 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -1,9 +1,7 @@ ;;; lang/markdown/config.el -*- lexical-binding: t; -*- (def-package! markdown-mode - :mode "/README$" - :mode ("/README\\.md$" . gfm-mode) - :mode "\\.m\\(?:d\\|arkdown\\)$" + :mode ("/README\\(?:\\.\\(?:markdown\\|md\\)\\)?\\'" . gfm-mode) :init (setq markdown-enable-wiki-links t markdown-enable-math t diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 4beffb199..c43aab0aa 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -1,32 +1,20 @@ ;;; lang/nim/config.el -*- lexical-binding: t; -*- -(def-package! nim-mode - :mode "\\.nim\\'" - :mode ("\\.nim\\(ble\\|s\\)\\'" . nimscript-mode) - :config - (load "nim-mode-autoloads" nil t) - ;; NOTE nim-mode autoloads sets up xref - +(after! nim-mode (defun +nim|init-nimsuggest-mode () "Conditionally load `nimsuggest-mode', instead of clumsily erroring out if nimsuggest isn't installed." - (when (executable-find "nimsuggest") + (when (file-executable-p nimsuggest-path) (nimsuggest-mode))) (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) (map! :map nim-mode-map :localleader - :n "b" #'+nim/build-menu) - - (def-menu! +nim/build-menu - "Building commands for `nim-mode' buffers." - '(("Build & run" :exec nim-compile)) - :prompt "Build")) + :n "b" #'nim-compile)) (def-package! flycheck-nim :when (featurep! :feature syntax-checker) :after nim-mode - :config - (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) + :config (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el deleted file mode 100644 index e9d090fc3..000000000 --- a/modules/lang/nix/config.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; lang/nix/config.el -*- lexical-binding: t; -*- - -(def-package! nix-mode - :mode "\\.nix$") diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 22067cffb..bdd4974d2 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,9 +1,13 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- (def-package! tuareg - :mode ("\\.ml[4ilpy]?$" . tuareg-mode)) + :mode ("\\.ml[4ilpy]?\\'" . tuareg-mode)) (def-package! merlin :after tuareg - :hook (tuareg-mode . merlin-mode)) + :hook (tuareg-mode . merlin-mode) + :config + (set! :company-backend 'tuareg-mode 'merlin-compand-backend) + (after! company + (remove-hook 'company-backends 'merlin-compand-backend))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a2c17bb28..ba5449039 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -16,12 +16,8 @@ ;; Plugins ;; -(def-package! toc-org - :commands toc-org-enable - :config (setq toc-org-hrefify-default "org")) - -(def-package! org-bullets - :commands org-bullets-mode) +;; `toc-org' +(setq toc-org-hrefify-default "org") (def-package! evil-org :when (featurep! :feature evil) diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index cb66d1495..a60b92e92 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -1,7 +1,7 @@ ;;; lang/plantuml/config.el -*- lexical-binding: t; -*- (def-package! plantuml-mode - :mode "\\.p\\(?:lant\\)?uml$" + :defer t :init (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index 39eafd64c..579391e8e 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -1,16 +1,18 @@ ;;; lang/purescript/config.el -*- lexical-binding: t; -*- -(def-package! purescript-mode - :mode "\\.purs$" - :config +(after! purescript-mode (add-hook! 'purescript-mode-hook - #'(flycheck-mode purescript-indentation-mode rainbow-delimiters-mode))) + #'(flycheck-mode + purescript-indentation-mode + rainbow-delimiters-mode))) + ;; (def-package! flycheck-purescript ;; :after purescript-mode ;; :config ;; (add-hook 'flycheck-mode-hook #'flycheck-purescript-setup)) + (def-package! psc-ide :hook (purescript-mode . psc-ide-mode)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 4c6fe44f1..4e129b9d3 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -16,7 +16,7 @@ is loaded.") ;; (def-package! python - :commands python-mode + :defer t :init (setq python-environment-directory doom-cache-dir python-indent-guess-indent-offset-verbose nil @@ -73,7 +73,6 @@ environment variables." (def-package! anaconda-mode - :after python :hook python-mode :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index c3781d2b1..117908050 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -1,8 +1,7 @@ ;;; lang/rest/config.el -*- lexical-binding: t; -*- (def-package! restclient - :commands restclient-mode - :mode ("\\.http$" . restclient-mode) + :mode ("\\.http\\'" . restclient-mode) :config (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) (map! :mode restclient-mode @@ -16,4 +15,4 @@ (def-package! company-restclient :when (featurep! :completion company) :after restclient - :config (set! :company-backend 'restclient-mode '(company-restclient))) + :config (set! :company-backend 'restclient-mode 'company-restclient)) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 3d4fd3ae3..5eb32b4fc 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -12,15 +12,12 @@ ;; (def-package! ruby-mode - :mode "\\.rb$" - :mode "\\.rake$" - :mode "\\.gemspec$" - :mode "\\.\\(?:pry\\|irb\\)rc$" - :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" - :interpreter "ruby" + :mode "\\.\\(?:pry\\|irb\\)rc\\'" :config - (set! :company-backend 'ruby-mode '(company-dabbrev-code)) + (set! :company-backend 'ruby-mode 'company-dabbrev-code) (set! :electric 'ruby-mode :words '("else" "end" "elseif")) + (set! :env "RBENV_ROOT") + (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' (setq ruby-deep-indent-paren t) ;; Don't interfere with my custom RET behavior (define-key ruby-mode-map [?\n] nil) @@ -74,10 +71,8 @@ environment variables." (def-package! rspec-mode - :mode ("/\\.rspec$" . text-mode) + :mode ("/\\.rspec\\'" . text-mode) :init - (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :modes (ruby-mode yaml-mode) :files ("/spec/")) (defvar rspec-mode-verifiable-map (make-sparse-keymap)) (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") @@ -96,18 +91,12 @@ environment variables." :n "v" #'rspec-verify)) -(def-package! inf-ruby - :commands (inf-ruby inf-ruby-console-auto) - :init (set! :repl 'ruby-mode 'inf-ruby)) - - (def-package! company-inf-ruby :when (featurep! :completion company) :after inf-ruby - :config (set! :company-backend 'inf-ruby-mode '(company-inf-ruby))) + :config (set! :company-backend 'inf-ruby-mode 'company-inf-ruby)) -(def-package! rake - :commands (rake rake-find-task rake-rerun) - :config (setq rake-completion-system 'default)) +;; `rake' +(setq rake-completion-system 'default) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 9a45ae71e..cd216273f 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,12 +1,6 @@ ;;; lang/rust/config.el -*- lexical-binding: t; -*- -;; -;; Plugins -;; - -(def-package! rust-mode - :mode "\\.rs$" - :config +(after! rust-mode (set! :env "RUST_SRC_PATH") (set! :docset 'rust-mode "Rust") (setq rust-indent-method-chain t) @@ -14,6 +8,7 @@ (map! :map rust-mode-map :localleader :n "b" #'+rust/build-menu) + (def-menu! +rust/build-menu "TODO" '(("cargo run" :exec "cargo run --color always") @@ -40,6 +35,5 @@ (def-package! flycheck-rust :when (featurep! :feature syntax-checker) :after rust-mode - :hook (flycheck-mode . flycheck-rust-setup) - :init (add-hook 'rust-mode-hook #'flycheck-mode)) + :config (add-hook! 'rust-mode-hook #'(flycheck-mode flycheck-rust-setup))) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index b5a2a1bf0..44a39ced9 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -1,26 +1,24 @@ ;;; lang/scala/config.el -*- lexical-binding: t; -*- -(def-package! scala-mode - :mode "\\.s\\(?:cala\\|bt\\)$" - :config (setq scala-indent:align-parameters t)) +(after! scala-mode + (setq scala-indent:align-parameters t) + (add-to-list 'dtrt-indent-hook-mapping-list '(scala-mode c/c++/java scala-indent:step))) -(def-package! sbt-mode :after scala-mode) - - -(def-package! ensime - :commands (ensime ensime-scala-mode-hook) - :hook (scala-mode . ensime-mode) - :config - (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) - +(after! ensime (setq ensime-startup-snapshot-notification nil ensime-startup-notification nil ensime-eldoc-hints 'all ;; let DOOM handle company setup ensime-completion-style nil) + (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) + ;; Fix void-variable imenu-auto-rescan error caused by `ensime--setup-imenu' ;; trying to make imenu variables buffer local before imenu is loaded. (require 'imenu)) + +(def-package! sbt-mode + :after scala-mode + :config (set! :repl 'scala-mode #'run-scala)) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index d100a8c86..21444fb91 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -12,21 +12,19 @@ ;; (def-package! sh-script ; built-in - :mode ("\\.zsh$" . sh-mode) - :mode ("\\.zunit$" . sh-mode) - :mode ("/bspwmrc$" . sh-mode) - :init - (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) + :mode ("\\.zunit\\'" . sh-mode) + :mode ("/bspwmrc\\'" . sh-mode) :config + (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) (set! :electric 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (set! :repl 'sh-mode #'+sh/repl) (setq sh-indent-after-continuation 'always) ;; recognize function names with dashes in them - (push '((sh . ((nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) - (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1)))) - sh-imenu-generic-expression) + (map-put sh-imenu-generic-expression + 'sh '((nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) + (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1))) ;; `sh-set-shell' is chatty about setting up indentation rules (advice-add #'sh-set-shell :around #'doom*shut-up) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index 9daae8f3a..6ba19cf0e 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -1,13 +1,14 @@ ;;; lang/swift/config.el -*- lexical-binding: t; -*- -;; TODO Set up emacs task runners for fruitstrap +;; `swift-mode' +(set! :repl 'swift-mode #'run-swift) -(def-package! swift-mode - :mode "\\.swift$" - :config - (add-hook 'swift-mode-hook #'flycheck-mode) - (set! :repl 'swift-mode #'swift-mode-run-repl) ; TODO test this - (push 'swift flycheck-checkers)) + +(def-package! flycheck-swift + :when (featurep! :feature syntax-checker) + :after swift-mode + :init (add-hook 'swift-mode-hook #'flycheck-mode) + :config (flycheck-swift-setup)) (def-package! company-sourcekit diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index a9cc3a778..73e74da91 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -5,3 +5,6 @@ (when (featurep! :completion company) (package! company-sourcekit)) + +(when (featurep! :feature syntax-checker) + (package! flycheck-swift)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index d49d19292..834a2ae6e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -1,10 +1,5 @@ ;;; lang/web/+css.el -*- lexical-binding: t; -*- -;; css-mode hooks apply to scss and less-css modes -(add-hook 'css-mode-hook #'rainbow-delimiters-mode) -(add-hook! (css-mode sass-mode stylus-mode) - #'(yas-minor-mode-on flycheck-mode highlight-numbers-mode)) - ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) @@ -13,29 +8,36 @@ (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))))) (map! :map* (css-mode-map scss-mode-map less-css-mode-map) - :n "M-R" #'+css/web-refresh-browser - (:localleader - :n "rb" #'+css/toggle-inline-or-block)) + :localleader + :n "rb" #'+css/toggle-inline-or-block) ;; ;; Packages ;; +;; css-mode hooks apply to scss and less-css modes +(add-hook 'css-mode-hook #'rainbow-delimiters-mode) +(add-hook! (css-mode sass-mode stylus-mode) + #'(yas-minor-mode-on + flycheck-mode + highlight-numbers-mode + rainbow-mode)) + + (def-package! counsel-css :when (featurep! :completion ivy) - :commands (counsel-css counsel-css-imenu-setup) + :commands counsel-css :hook (css-mode . counsel-css-imenu-setup) :init (map! :map* (css-mode-map scss-mode-map less-css-mode-map) :localleader :n ";" #'counsel-css)) -(def-package! rainbow-mode - :hook (css-mode sass-mode)) - - -(after! css-mode ; contains both css-mode & scss-mode +(def-package! css-mode ; built-in + :defer t + :config + ;; contains both css-mode & scss-mode (set! :docset 'css-mode "CSS") (set! :docset 'scss-mode "Sass") (unless EMACS26+ @@ -45,7 +47,7 @@ (def-package! sass-mode - :commands sass-mode + :defer t :config (set! :docset 'sass-mode "Sass") (set! :company-backend 'sass-mode 'company-css) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index a01979605..4a27bd0ed 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -14,7 +14,6 @@ :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config - (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) (setq web-mode-enable-html-entities-fontification t web-mode-enable-auto-quoting nil) @@ -91,10 +90,7 @@ :nv "[T" #'web-mode-element-parent)) -(def-package! company-web - :when (featurep! :completion company) - :after web-mode) - - -;; `pug-mode' -(set! :company-backend 'pug-mode '(company-yasnippet)) +;; +(set! :company-backend 'pug-mode 'company-web-jade) +(set! :company-backend 'web-mode 'company-web-html) +(set! :company-backend 'slim-mode 'company-web-slim) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index f89e975d7..9a864d1bc 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -13,9 +13,9 @@ (package! haml-mode) (package! pug-mode) (package! slim-mode) -(package! web-mode) -(when (featurep! :completion company) - (package! company-web)) +(when (package! web-mode) + (when (featurep! :completion company) + (package! company-web))) ;; +css.el (package! less-css-mode) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 2e5d98795..c458b8a2e 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -3,7 +3,8 @@ ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig - :hook (doom-init . editorconfig-mode) + :defer 2 + :after-call doom-before-switch-buffer :config ;; Register missing indent variables (setq editorconfig-indentation-alist @@ -49,9 +50,7 @@ extension, try to guess one." ;; editorconfig to ignore indentation there. I prefer dynamic indentation ;; support built into Emacs. (dolist (mode '(emacs-lisp-mode lisp-mode)) - (map-delete editorconfig-indentation-alist mode))) - - -(def-package! editorconfig-conf-mode - :mode "\\.?editorconfig$") + (map-delete editorconfig-indentation-alist mode)) + ;; + (editorconfig-mode +1)) diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index d30f5119e..303deb947 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -1,9 +1,29 @@ ;;; tools/ein/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :ein-notebook-dir (dir) + "Set the default directory from where to open Jupyter notebooks." + `(setq ein:jupyter-default-notebook-directory ,dir)) + + +;; +;; Library +;; + +(defun +ein--collect-ein-buffer-links () + (let ((end (window-end)) + points) + (save-excursion + (goto-char (window-start)) + (while (re-search-forward "~?/.+\\|\s\\[" end t) + (push (+ (match-beginning 0) 1) points)) + (nreverse points)))) + ;;;###autoload (defun +ein/ace-link-ein () "Ace jump to links in ein notebooklist." (interactive) + (require 'avy) (let ((res (avy-with +ein/ace-link-ein (avy--process (+ein--collect-ein-buffer-links) @@ -13,14 +33,4 @@ (goto-char (1+ res)) (widget-button-press (point))))) -;;;###autoload -(defun +ein--collect-ein-buffer-links () - (interactive) - (let ((end (window-end)) - points) - (save-excursion - (goto-char (window-start)) - (while (re-search-forward "~?/.+\\|\s\\[" end t) - (push (+ (match-beginning 0) 1) points)) - (nreverse points)))) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 812e815a5..e3b469254 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -3,47 +3,49 @@ (defvar +ein-notebook-dir "~/" "Default directory from where Jupyter notebooks are to be opened.") -(def-setting! :ein-notebook-dir (dir) - "Set the default directory from where to open Jupyter notebooks." - `(setq +ein-notebook-dir ,dir)) +;; +;; Plugins +;; (def-package! ein - :commands (ein:notebooklist-open ein:notebooklist-login ein:jupyter-server-start) + :defer t :init - (push (lambda (buf) (string-match-p "^\\*ein: .*" (buffer-name buf))) - doom-real-buffer-functions) (set! :popup "\\*ein: .*" :ignore) - (set! :popup "\\*ein:tb .*" '((side . bottom) (size . 0.3)) '((quit . t) (transient) (select))) - (set! :popup "\\*ein:notebooklist *" '((side . left) (size . 50)) '((select))) - ;; Ace-link on notebook list buffers - (add-hook! 'ein:notebooklist-mode-hook - (map! :map ein:notebooklist-mode-map - "o" #'+ein/ace-link-ein)) - ;; Ein uses request to store http cookies. Store them in the cache dir. - (setq request-storage-directory (concat doom-cache-dir "/request")) + (set! :popup "\\*ein:tb .*" + '((side . bottom) (size . 0.3)) + '((quit . t) (transient) (select))) + (set! :popup "\\*ein:notebooklist *" + '((side . left) (size . 50)) + '((select))) + ;; Auto complete with company (when (featurep! :completion company) (setq ein:completion-backend 'ein:use-company-backend) - (set! :company-backend - '(ein:notebook-multilang-mode - ein:notebook-python-mode - ein:notebook-plain-mode) + (set! :company-backend '(ein:notebook-multilang-mode + ein:notebook-python-mode + ein:notebook-plain-mode) 'ein:company-backend)) :config - ;; Manually load the autoloads of EIN. This takes time... - (load "ein-loaddefs.el" nil t t) - (setq - ;; Slice images into rows so that we can navigate buffers with images more easily - ein:slice-image t - ein:jupyter-default-notebook-directory +ein-notebook-dir - ein:jupyter-default-server-command "jupyter" - ein:jupyter-server-args '("--no-browser") - ein:notebook-modes - '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)) - ;; Avy is required for showing links in the notebook list with ace-link. - (require 'avy) + (setq ein:jupyter-server-args '("--no-browser") + ein:notebook-modes + '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) + ;; Slice images into rows; easier to navigate around images + ein:slice-image t) + + (unless ein:jupyter-default-notebook-directory + (setq ein:jupyter-default-notebook-directory "~/")) + + (defun +ein-buffer-p (buf) + (string-match-p "^\\*ein: .*" (buffer-name buf))) + (add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq) + + ;; Ace-link on notebook list buffers + (map! :after ein-notebooklist + :map ein:notebooklist-mode-map + "o" #'+ein/ace-link-ein) + ;; add hydra (defhydra +ein/hydra (:hint t :color red) " diff --git a/modules/tools/electric-indent/config.el b/modules/tools/electric-indent/config.el index 809b07800..01a1f3f86 100644 --- a/modules/tools/electric-indent/config.el +++ b/modules/tools/electric-indent/config.el @@ -8,16 +8,6 @@ (defvar-local doom-electric-indent-words '() "TODO") -(setq-default electric-indent-chars '(?\n ?\^?)) - -(defun +electric-indent|char (_c) - (when (and (eolp) doom-electric-indent-words) - (save-excursion - (backward-word) - (looking-at-p - (concat "\\<" (regexp-opt doom-electric-indent-words)))))) -(push #'+electric-indent|char electric-indent-functions) - (def-setting! :electric (modes &rest plist) "Declare :words (list of strings) or :chars (lists of chars) in MODES that trigger electric indentation." @@ -34,3 +24,15 @@ trigger electric indentation." ,@(if words `((setq doom-electric-indent-words ',words)))) (add-hook! ,modes #',fn-name)))))) +;; +(after! electric + (setq-default electric-indent-chars '(?\n ?\^?)) + + (defun +electric-indent|char (_c) + (when (and (eolp) doom-electric-indent-words) + (save-excursion + (backward-word) + (looking-at-p + (concat "\\<" (regexp-opt doom-electric-indent-words)))))) + (add-to-list 'electric-indent-functions #'+electric-indent|char)) + diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 26f919bd9..9c522e699 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -1,7 +1,5 @@ ;;; tools/eshell/config.el -*- lexical-binding: t; -*- -;; This is highly experimental. I don't use eshell often, so this may need work. - ;; see: ;; + `+eshell/open': open in current buffer ;; + `+eshell/open-popup': open in a popup @@ -9,7 +7,7 @@ ;; workspaces) (def-package! eshell ; built-in - :commands eshell-mode + :defer t :init (setq eshell-directory-name (let ((dir (concat doom-private-dir "eshell"))) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 46473990a..3e563de26 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -4,9 +4,7 @@ ;; errors. If that happens, try `+gist/kill-cache'. You may have to restart ;; Emacs. -(def-package! gist - :commands (gist-list gist-region-or-buffer-private gist-region-or-buffer) - :config +(after! gist (set! :evil-state 'gist-list-mode 'normal) (defun +gist*list-render (orig-fn &rest args) diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index 58628197d..577476ab9 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -1,13 +1,10 @@ ;;; tools/imenu/config.el -*- lexical-binding: t; -*- -(def-package! imenu-anywhere - :commands (ido-imenu-anywhere ivy-imenu-anywhere helm-imenu-anywhere) - :config (setq imenu-anywhere-delimiter ": ")) +;; `imenu-anywhere' +(setq imenu-anywhere-delimiter ": ") -(def-package! imenu-list - :commands (imenu-list-minor-mode imenu-list-smart-toggle) - :config +(after! imenu-list (setq imenu-list-idle-update-delay 0.5) (set! :popup "^\\*Ilist" diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index db32ca8d1..f5be64dc6 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -2,8 +2,6 @@ (def-package! magit :defer t - :init - (load "magit-autoloads" nil t) :config (setq magit-completing-read-function (if (featurep! :completion ivy) @@ -18,13 +16,11 @@ (map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) -(def-package! magit-blame - :commands magit-blame - :after git-timemachine) +(def-package! magit-blame :after git-timemachine) (def-package! magithub - :commands (magithub-clone magithub-feature-autoinject) + :commands magithub-feature-autoinject :after magit :preface (setq magithub-dir (concat doom-etc-dir "magithub/")) @@ -32,7 +28,6 @@ (setq magithub-clone-default-directory "~/" magithub-preferred-remote-method 'clone_url) :config - (load "magithub-autoloads" nil t) (magithub-feature-autoinject t)) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index f57b69c8d..4fac1bb32 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -11,17 +11,18 @@ ;; Plugins ;; -(def-package! password-store +;; `password-store' +(setq password-store-password-length 12) + + +;; `pass' +(def-package! pass :defer t :config - (setq password-store-password-length 12)) - - -(def-package! pass - :commands pass - :config (set! :evil-state 'pass-mode 'emacs) - (set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit))) + (set! :popup "^\\*Password-Store" + '((side . left) (size . 0.25)) + '((quit))) (map! :map pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry @@ -30,12 +31,6 @@ "C-k" #'pass-next-directory)) -(def-package! helm-pass - :when (featurep! :completion helm) - :commands helm-pass) - - ;; Is built into Emacs 26+ -(def-package! auth-source-pass - :when (featurep! +auth) - :config (auth-source-pass-enable)) +(when (and EMACS26+ (featurep! +auth)) + (auth-source-pass-enable)) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index 6827fc23e..dbc5f2afd 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -4,7 +4,7 @@ (package! pass) (package! password-store) -(when (featurep! +auth) +(when (and EMACS26+ (featurep! +auth)) (package! auth-source-pass)) (when (featurep! :completion helm) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 0dd7c0fc9..100246093 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,8 +1,7 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- (def-package! pdf-tools - :mode ("\\.pdf$" . pdf-view-mode) - :init (load "pdf-tools-autoloads" nil t) + :mode ("\\.pdf\\'" . pdf-view-mode) :config (unless noninteractive (pdf-tools-install)) diff --git a/modules/tools/prodigy/autoload.el b/modules/tools/prodigy/autoload.el index 88781dd3d..6f27d40df 100644 --- a/modules/tools/prodigy/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -1,5 +1,11 @@ ;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :service (&rest plist) + "TODO" + `(after! prodigy + (prodigy-define-service ,@plist))) + ;;;###autoload (defun +prodigy/create () "Interactively create a new prodigy service." @@ -32,3 +38,17 @@ (file-directory-p (plist-get service :project))) collect service into services finally do (setq prodigy-service services))) + +;;;###autoload +(defun +prodigy*services (orig-fn &rest args) + "Adds a new :project property to prodigy services, which hides the service +unless invoked from the relevant project." + (let ((project-root (downcase (doom-project-root))) + (services (apply orig-fn args))) + (if current-prefix-arg + services + (cl-remove-if-not (lambda (service) + (let ((project (plist-get service :project))) + (or (not project) + (file-in-directory-p project-root project)))) + services)))) diff --git a/modules/tools/prodigy/config.el b/modules/tools/prodigy/config.el index 8763db6a3..e9ba7ca32 100644 --- a/modules/tools/prodigy/config.el +++ b/modules/tools/prodigy/config.el @@ -1,38 +1,13 @@ ;;; tools/prodigy/config.el -*- lexical-binding: t; -*- -(def-setting! :service (&rest plist) - "TODO" - `(after! prodigy - (prodigy-define-service ,@plist))) - - -;; -;; Plugins -;; - -(def-package! prodigy - :commands (prodigy prodigy-view-mode prodigy-add-filter) - :config +(after! prodigy (set! :evil-state 'prodigy-mode 'emacs) ;; Make services, etc persistent between Emacs sessions (doom-cache-persist :prodigy '(prodigy-services prodigy-tags prodigy-filters)) - (defun +prodigy*services (orig-fn &rest args) - "Adds a new :project property to prodigy services, which hides the service -unless invoked from the relevant project." - (let ((project-root (downcase (doom-project-root))) - (services (apply orig-fn args))) - (if current-prefix-arg - services - (cl-remove-if-not (lambda (service) - (let ((project (plist-get service :project))) - (or (not project) - (file-in-directory-p project-root project)))) - services)))) (advice-add #'prodigy-services :around #'+prodigy*services) - ;; Keybindings (map! :map prodigy-mode-map "d" #'+prodigy/delete)) diff --git a/modules/tools/rgb/config.el b/modules/tools/rgb/config.el index ffab008eb..08a93d06a 100644 --- a/modules/tools/rgb/config.el +++ b/modules/tools/rgb/config.el @@ -4,9 +4,6 @@ ;; Plugins ;; -(def-package! rainbow-mode) - - (def-package! kurecolor :after rainbow-mode :config diff --git a/modules/tools/rotate-text/autoload.el b/modules/tools/rotate-text/autoload.el new file mode 100644 index 000000000..1cae4ba58 --- /dev/null +++ b/modules/tools/rotate-text/autoload.el @@ -0,0 +1,17 @@ +;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(def-setting! :rotate (modes &rest plist) + "Declare :symbols, :words or :patterns (all lists of strings) that +`rotate-text' will cycle through." + (declare (indent 1)) + (let* ((modes (doom-enlist (doom-unquote modes))) + (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) + `(progn + (defun ,fn-name () + (require 'rotate-text) + (let ((plist (list ,@plist))) + (setq rotate-text-local-symbols (plist-get plist :symbols) + rotate-text-local-words (plist-get plist :words) + rotate-text-local-patterns (plist-get plist :patterns)))) + (add-hook! ,modes #',fn-name)))) diff --git a/modules/tools/rotate-text/config.el b/modules/tools/rotate-text/config.el index 5fb81df5a..df310e3a5 100644 --- a/modules/tools/rotate-text/config.el +++ b/modules/tools/rotate-text/config.el @@ -1,22 +1,4 @@ ;;; tools/rotate-text/config.el -*- lexical-binding: t; -*- -(def-package! rotate-text - :commands (rotate-text rotate-text-backward) - :config - (push '("true" "false") rotate-text-words)) - - -(def-setting! :rotate (modes &rest plist) - "Declare :symbols, :words or :patterns (all lists of strings) that -`rotate-text' will cycle through." - (declare (indent 1)) - (let* ((modes (doom-enlist (doom-unquote modes))) - (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) - `(progn - (defun ,fn-name () - (let ((plist (list ,@plist))) - (setq rotate-text-local-symbols (plist-get plist :symbols) - rotate-text-local-words (plist-get plist :words) - rotate-text-local-patterns (plist-get plist :patterns)))) - (add-hook! ,modes #',fn-name)))) - +(after! rotate-text + (add-to-list 'rotate-text-words '("true" "false"))) diff --git a/modules/tools/term/config.el b/modules/tools/term/config.el index adb1d470b..3263ddcb6 100644 --- a/modules/tools/term/config.el +++ b/modules/tools/term/config.el @@ -1,8 +1,14 @@ ;;; tools/term/config.el -*- lexical-binding: t; -*- -(def-package! multi-term - :commands (multi-term multi-term-next multi-term-prev) - :config - (setq multi-term-program (getenv "SHELL") - multi-term-dedicated-window-height 20 - multi-term-switch-after-close 'PREVIOUS)) +;; `multi-term' +(setq multi-term-dedicated-window-height 20 + multi-term-switch-after-close 'PREVIOUS) + +;; `term' (built-in) +(after! term + (set! :env "SHELL") + + ;; Consider term buffers real + (defun +term-p (buf) + (eq (buffer-local-value 'major-mode buf) 'term-mode)) + (add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 841235faf..acde3ad25 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -114,16 +114,17 @@ Possible values: (defun +doom-dashboard|init () "Initializes Doom's dashboard." - (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) - (add-hook 'window-size-change-functions #'+doom-dashboard|resize) - (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) - (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) - (unless (daemonp) - (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) - ;; `persp-mode' integration: update `default-directory' when switching - (add-hook 'persp-created-functions #'+doom-dashboard|record-project) - (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) - (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project) + (unless noninteractive + (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) + (add-hook 'window-size-change-functions #'+doom-dashboard|resize) + (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) + (unless (daemonp) + (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) + ;; `persp-mode' integration: update `default-directory' when switching + (add-hook 'persp-created-functions #'+doom-dashboard|record-project) + (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) + (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project)) (+doom-dashboard-reload t)) (defun +doom-dashboard|reload-on-kill () diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index f35a3a478..759132f89 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -4,11 +4,7 @@ ;; mode-line. (def-package! anzu - :commands (anzu-mode global-anzu-mode - anzu-query-replace anzu-query-replace-regexp - anzu-query-replace-at-cursor anzu-replace-at-cursor-thing) - :init - (add-transient-hook! #'isearch-mode (require 'anzu)) + :after-call isearch-mode :config (setq anzu-cons-mode-line-p nil anzu-minimum-input-length 1 @@ -35,10 +31,7 @@ (def-package! evil-anzu - :defer t - :init - (add-transient-hook! #'evil-ex-start-search (require 'evil-anzu)) - (add-transient-hook! #'evil-ex-start-word-search (require 'evil-anzu))) + :after-call (evil-ex-start-search evil-ex-start-word-search)) ;; fish-style modeline diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 3f8561302..b68313bef 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -22,10 +22,11 @@ ;; (def-package! doom-themes - :config + :defer t + :init (unless doom-theme (setq doom-theme 'doom-one)) - + :config ;; Reload common faces when reloading doom-themes live (defun +doom*reload-common (&rest _) (load "doom-themes-common.el" nil t)) (advice-add #'doom//reload-theme :before #'+doom*reload-common) @@ -41,7 +42,7 @@ (def-package! solaire-mode - :commands (solaire-mode turn-on-solaire-mode solaire-mode-swap-bg) + :defer t :init (defun +doom|solaire-mode-swap-bg-maybe () (when-let* ((rule (assq doom-theme +doom-solaire-themes))) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 1a17d0ebe..e48f8a08a 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -2,7 +2,7 @@ (def-package! evil-goggles :when (featurep! :feature evil) - :defer pre-command-hook + :after-call pre-command-hook :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index a1519f993..3ab42ec28 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -1,7 +1,7 @@ ;;; ui/nav-flash/config.el -*- lexical-binding: t; -*- (def-package! nav-flash - :commands nav-flash-show + :defer t :init ;; NOTE In :feature lookup `recenter' is hooked to a bunch of jumping ;; commands, which will trigger nav-flash. diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 844e3d1ef..c1e318514 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -1,5 +1,73 @@ ;;; ui/popup/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defvar +popup--display-buffer-alist nil) + +;;;###autoload +(def-setting! :popup (condition &optional alist parameters) + "Register a popup rule. + +CONDITION can be a regexp string or a function. See `display-buffer' for a list +of possible entries for ALIST, which tells the display system how to initialize +the popup window. PARAMETERS is an alist of window parameters. See +`+popup-window-parameters' for a list of custom parameters provided by the popup +module. + +ALIST supports one custom parameter: `size', which will resolve to +`window-height' or `window-width' depending on `side'." + `(progn + (+popup-define ,condition ,alist ,parameters) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) + +;;;###autoload +(def-setting! :popups (&rest rules) + "Register multiple popup rules with :popup setting (`doom--set:popup'). For +example: + + (set! :popups + (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" + `(progn + ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) + +;;;###autoload +(defsubst +popup-define (condition &optional alist parameters) + "Define a popup rule. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +If CONDITION is met, the buffer will be displayed in a popup window with ALIST +and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may +contain and `+popup-window-parameters' for what window parameters that the popup +module supports. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used." + (declare (indent 1)) + (push (if (eq alist :ignore) + (list condition nil) + `(,condition + (+popup-buffer) + ,@alist + (window-parameters ,@parameters))) + +popup--display-buffer-alist)) + + +;; +;; Library +;; + (defvar +popup--populate-wparams (not EMACS26+)) (defvar +popup--inhibit-transient nil) (defvar +popup--inhibit-select nil) diff --git a/modules/ui/popup/init.el b/modules/ui/popup/init.el deleted file mode 100644 index 8b6b99f16..000000000 --- a/modules/ui/popup/init.el +++ /dev/null @@ -1,61 +0,0 @@ -;;; ui/popup/init.el -*- lexical-binding: t; -*- - -(defvar +popup--display-buffer-alist nil) - -(defun +popup-define (condition &optional alist parameters) - "Define a popup rule. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -If CONDITION is met, the buffer will be displayed in a popup window with ALIST -and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may -contain and `+popup-window-parameters' for what window parameters that the popup -module supports. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used." - (declare (indent 1)) - (push (if (eq alist :ignore) - (list condition nil) - `(,condition - (+popup-buffer) - ,@alist - (window-parameters ,@parameters))) - +popup--display-buffer-alist)) - -;; -(def-setting! :popup (condition &optional alist parameters) - "Register a popup rule. - -CONDITION can be a regexp string or a function. See `display-buffer' for a list -of possible entries for ALIST, which tells the display system how to initialize -the popup window. PARAMETERS is an alist of window parameters. See -`+popup-window-parameters' for a list of custom parameters provided by the popup -module. - -ALIST supports one custom parameter: `size', which will resolve to -`window-height' or `window-width' depending on `side'." - `(progn - (+popup-define ,condition ,alist ,parameters) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - -(def-setting! :popups (&rest rules) - "Register multiple popup rules with :popup setting (`doom--set:popup'). For -example: - - (set! :popups - (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" - `(progn - ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) diff --git a/modules/ui/unicode/autoload.el b/modules/ui/unicode/autoload.el new file mode 100644 index 000000000..1af675c04 --- /dev/null +++ b/modules/ui/unicode/autoload.el @@ -0,0 +1,23 @@ +;;; ui/unicode/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook 'doom-post-init-hook #'+unicode|init-fonts) + +;;;###autoload +(defun +unicode|init-fonts () + "Set up `unicode-fonts' to eventually run; accomodating the daemon, if +necessary." + (setq-default bidi-display-reordering t + doom-unicode-font nil) + (if initial-window-system + (+unicode|setup-fonts (selected-frame)) + (add-hook 'after-make-frame-functions #'+unicode|setup-fonts))) + +;;;###autoload +(defun +unicode|setup-fonts (&optional frame) + "Initialize `unicode-fonts', if in a GUI session." + (when (and frame (display-graphic-p frame)) + (with-selected-frame frame + (require 'unicode-fonts) + ;; NOTE will impact startup time on first run + (unicode-fonts-setup)))) diff --git a/modules/ui/unicode/config.el b/modules/ui/unicode/config.el deleted file mode 100644 index a41ae6554..000000000 --- a/modules/ui/unicode/config.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; ui/unicode/config.el -*- lexical-binding: t; -*- - -(def-package! unicode-fonts - :init - (setq-default bidi-display-reordering t - doom-unicode-font nil) - - (defun +unicode|init-fonts (&optional frame) - "Initialize `unicode-fonts', if in a GUI session." - (when (and frame (display-graphic-p frame)) - (with-selected-frame frame - (require 'unicode-fonts) - ;; NOTE will impact startup time on first run - (unicode-fonts-setup)))) - - (add-hook! 'after-init-hook - (if initial-window-system - (+unicode|init-fonts (selected-frame)) - (add-hook 'after-make-frame-functions #'+unicode|init-fonts)))) diff --git a/modules/ui/vi-tilde-fringe/autoload.el b/modules/ui/vi-tilde-fringe/autoload.el new file mode 100644 index 000000000..ab9029cfc --- /dev/null +++ b/modules/ui/vi-tilde-fringe/autoload.el @@ -0,0 +1,4 @@ +;;; ui/vi-tilde-fringe/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook! (prog-mode text-mode conf-mode) #'vi-tilde-fringe-mode) diff --git a/modules/ui/vi-tilde-fringe/config.el b/modules/ui/vi-tilde-fringe/config.el deleted file mode 100644 index 1f099b7aa..000000000 --- a/modules/ui/vi-tilde-fringe/config.el +++ /dev/null @@ -1,6 +0,0 @@ -;;; ui/vi-tilde-fringe/config.el -*- lexical-binding: t; -*- - -;; indicators for empty lines past EOF -(def-package! vi-tilde-fringe - :hook ((prog-mode text-mode conf-mode) . vi-tilde-fringe-mode)) - diff --git a/modules/ui/window-select/config.el b/modules/ui/window-select/config.el index b055bb779..3989310e3 100644 --- a/modules/ui/window-select/config.el +++ b/modules/ui/window-select/config.el @@ -2,9 +2,7 @@ (def-package! switch-window :when (featurep! +switch-window) - :commands (switch-window switch-window-then-maximize switch-window-then-split-below - switch-window-then-split-right switch-window-then-delete - switch-window-then-swap-buffer) + :defer t :init (define-key global-map [remap other-window] #'switch-window) :config @@ -14,8 +12,7 @@ (def-package! ace-window :unless (featurep! +switch-window) - :commands (ace-window ace-swap-window ace-delete-window - ace-select-window ace-delete-other-windows) + :defer t :init (define-key global-map [remap other-window] #'ace-window) :config