Further housekeeping, bring the initial load down to under 1500 ms
Some checks failed
/ Test config on 20 (push) Failing after 53s

Make the editor load faster by deferring as much as possible until
later use. For example, LSP load is now deferred until first use and
no longer blocking.

Use only elixir-format from elixir-mode, for similar speed
reasons. The rest of the package has been taken over by the treesitter
version of the mode.
This commit is contained in:
Maciej 2025-01-05 08:04:24 +02:00
parent 3ffb484fd8
commit b0361861b4
Signed by: maciej
GPG key ID: 41D62D42D3B0D765
13 changed files with 297 additions and 328 deletions

File diff suppressed because it is too large Load diff

View file

@ -100,16 +100,18 @@
(use-package exec-path-from-shell (use-package exec-path-from-shell
;; :if (memq window-system '(x mac ns)) ;; :if (memq window-system '(x mac ns))
:ensure t :ensure t
:defer t
:hook ((elpaca-after-init . exec-path-from-shell-initalize))
:config :config
(declare-function exec-path-from-shell-initialize "exec-path-from-shell") (declare-function exec-path-from-shell-initialize "exec-path-from-shell")
(add-to-list 'exec-path "/usr/local/bin") (add-to-list 'exec-path "/usr/local/bin")
(dolist (var '("DEFT_PATH" "LANG" "LC_CTYPE")) (dolist (var '("DEFT_PATH" "LANG" "LC_CTYPE"))
(add-to-list 'exec-path-from-shell-variables var)) (add-to-list 'exec-path-from-shell-variables var)))
(exec-path-from-shell-initialize))
;; (use-package envrc :ensure t :hook (elpaca-after-init . envrc-global-mode)) ;; (use-package envrc :ensure t :hook (elpaca-after-init . envrc-global-mode))
(use-package direnv :ensure t :config (direnv-mode t)) (use-package direnv :ensure t :defer t
:hook ((elpaca-after-init . direnv-mode)))
;; Draw underline lower ;; Draw underline lower
(setopt x-underline-at-descent-line t) (setopt x-underline-at-descent-line t)
@ -121,13 +123,12 @@
indicate-empty-lines nil) indicate-empty-lines nil)
;;;;;;;;;;;;;;;;; Treemacs ;;;;;;;;;;;;;;;;; Treemacs
(use-package treemacs :ensure t (use-package treemacs :ensure t :defer t
:hook ((elpaca-after-init . treemacs-follow-mode)
(elpaca-after-init . treemacs-project-follow-mode))
:commands (treemacs-follow-mode treemacs-project-follow-mode treemacs) :commands (treemacs-follow-mode treemacs-project-follow-mode treemacs)
:bind (:map icejam-keys-mode-map :bind (:map icejam-keys-mode-map
([(hyper b)] . treemacs)) ([(hyper b)] . treemacs)))
:config
(treemacs-follow-mode t)
(treemacs-project-follow-mode t))
(use-package treemacs-all-the-icons :ensure t :defer t (use-package treemacs-all-the-icons :ensure t :defer t
:requires (treemacs) :requires (treemacs)
@ -135,18 +136,14 @@
:config (treemacs-load-theme "all-the-icons")) :config (treemacs-load-theme "all-the-icons"))
;;;;;;;;;;;;;;;;; Record frequency of different commands. Review them later ;;;;;;;;;;;;;;;;; Record frequency of different commands. Review them later
(use-package keyfreq :ensure t (use-package keyfreq :ensure t :defer t
:config :hook ((elpaca-after-init . keyfreq-mode)
(declare-function keyfreq-mode "keyfreq") (elpaca-after-init . keyfreq-autosave-mode)))
(declare-function keyfreq-autosave-mode "keyfreq")
(keyfreq-mode t)
(keyfreq-autosave-mode t))
;;;;;;;;;;;;;;;;; Show hints about key combinations ;;;;;;;;;;;;;;;;; Show hints about key combinations
(use-package which-key :ensure t (use-package which-key :ensure t :defer t
:hook ((elpaca-after-init . which-key-mode))
:config :config
(declare-function which-key-mode "which-key")
(which-key-mode t)
(setopt which-key-idle-delay 0.5)) (setopt which-key-idle-delay 0.5))
;;;;;;;;;;;;;;;;; Use C-n to create a new line ;;;;;;;;;;;;;;;;; Use C-n to create a new line

View file

@ -12,11 +12,6 @@
(use-package diminish :ensure t) (use-package diminish :ensure t)
(use-package company :ensure t) (use-package company :ensure t)
;; https://emacs-lsp.github.io/lsp-mode/page/performance/#use-plists-for-deserialization
;; This supposedly makes it faster.
(setenv "LSP_USE_PLISTS" "true")
(use-package lsp-mode :ensure t)
;; Finally, wait for installation of these four packages. ;; Finally, wait for installation of these four packages.
(declare-function elpaca-wait "elpaca") (declare-function elpaca-wait "elpaca")
(elpaca-wait) (elpaca-wait)

View file

@ -4,9 +4,9 @@
;;; Code: ;;; Code:
(require 'icejam-blocking) (require 'icejam-blocking)
(use-package yasnippet :ensure t (use-package yasnippet :ensure t :defer t
:hook ((elpaca-after-init . yas-global-mode))
:config :config
(yas-global-mode t)
(unbind-key "C-c & C-n" yas-minor-mode-map) (unbind-key "C-c & C-n" yas-minor-mode-map)
(unbind-key "C-c & C-s" yas-minor-mode-map) (unbind-key "C-c & C-s" yas-minor-mode-map)
(unbind-key "C-c & C-v" yas-minor-mode-map)) (unbind-key "C-c & C-v" yas-minor-mode-map))
@ -77,7 +77,7 @@
;; Only use RETURN for completion in company ;; Only use RETURN for completion in company
(unbind-key "TAB" company-active-map) (unbind-key "TAB" company-active-map)
;;; Yasnippet configuration ;; Yasnippet configuration
(define-key prog-mode-map (kbd "C-c y") 'company-yasnippet) (define-key prog-mode-map (kbd "C-c y") 'company-yasnippet)
(define-key prog-mode-map (kbd "<f13>") 'icejam-insert-space-and-complete) (define-key prog-mode-map (kbd "<f13>") 'icejam-insert-space-and-complete)
(define-key prog-mode-map (kbd "TAB") 'company-indent-or-complete-common) (define-key prog-mode-map (kbd "TAB") 'company-indent-or-complete-common)

View file

@ -32,7 +32,8 @@
(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
;; Actual orderless ;; Actual orderless
(use-package vertico :ensure t (use-package vertico :ensure t :defer t
:hook ((elpaca-after-init . vertico-mode))
:config :config
(setopt vertico-scroll-margin 1) ;; Scroll on N-1 (setopt vertico-scroll-margin 1) ;; Scroll on N-1
(setopt vertico-count 15) ;; Show 5 more candidates (setopt vertico-count 15) ;; Show 5 more candidates
@ -41,22 +42,17 @@
;; Add working page up /down ;; Add working page up /down
(keymap-set vertico-map "<next>" 'vertico-scroll-up) (keymap-set vertico-map "<next>" 'vertico-scroll-up)
(keymap-set vertico-map "<prior>" 'vertico-scroll-down) (keymap-set vertico-map "<prior>" 'vertico-scroll-down))
(declare-function vertico-mode "vertico")
(vertico-mode t))
(use-package orderless :ensure t (use-package orderless :ensure t
:config :config
(setopt completion-styles '(orderless partial-completion basic)) ;; Fallback to basic if orderless does not work. ;; Fallback to basic if orderless does not work.
(setopt completion-styles '(orderless partial-completion basic))
(setopt completion-category-defaults nil) (setopt completion-category-defaults nil)
(setopt completion-category-overrides '((file (styles partial-completion))))) (setopt completion-category-overrides '((file (styles partial-completion)))))
(use-package marginalia :ensure t :defer t
(use-package marginalia :ensure t :hook ((elpaca-after-init . marginalia-mode)))
:config
(declare-function marginalia-mode "marginalia")
(marginalia-mode t))
(use-package consult :ensure t (use-package consult :ensure t
:config :config
@ -70,7 +66,11 @@
("M-g g" . consult-goto-line) ("M-g g" . consult-goto-line)
("C-c a" . consult-ripgrep))) ("C-c a" . consult-ripgrep)))
(use-package helpful :ensure t) (use-package helpful :ensure t :defer t
:bind (([remap describe-key] . helpful-key)
([remap describe-variable] . helpful-variable)
([remap describe-function] . helpful-callable)
([remap describe-command] . helpful-command)))
(provide 'icejam-completing-read) (provide 'icejam-completing-read)
;;; icejam-completing-read.el ends here ;;; icejam-completing-read.el ends here

View file

@ -6,7 +6,7 @@
(require 'icejam-keys-mode) (require 'icejam-keys-mode)
(require 'icejam-transient) (require 'icejam-transient)
(use-package deft :ensure t (use-package deft :ensure t :defer t
:config :config
(setopt deft-directory (substitute-in-file-name "$DEFT_PATH") (setopt deft-directory (substitute-in-file-name "$DEFT_PATH")
deft-default-extension "md" deft-default-extension "md"

View file

@ -2,7 +2,7 @@
;;; Commentary: ;;; Commentary:
;;; Code: ;;; Code:
;; Use flycheck globally to check syntax and compile languages ;; Use flycheck checks with flymake.
(use-package flymake-flycheck :ensure t :defer t :config (use-package flymake-flycheck :ensure t :defer t :config
(setq-default (setq-default
flycheck-disabled-checkers flycheck-disabled-checkers
@ -10,36 +10,18 @@
'(emacs-lisp emacs-lisp-checkdoc '(emacs-lisp emacs-lisp-checkdoc
emacs-lisp-package sh-shellcheck)))) emacs-lisp-package sh-shellcheck))))
;; Use flymake, the built in linter/checker.
(use-package flymake :ensure nil (use-package flymake :ensure nil
:defer t
:config :config
(setopt flymake-mode-line-lighter "Fly") ;; Show 'Fly' in mode line ;; Show 'Fly' in mode line.
(setopt elisp-flymake-byte-compile-load-path load-path) ;; Use the same load-path as normal configuration (setopt flymake-mode-line-lighter "Fly")
;; Use the same load-path as normal configuration. This makes the errors that
;; appear in elisp files less jarring.
(setopt elisp-flymake-byte-compile-load-path load-path)
:hook ((prog-mode . flymake-mode) :hook ((prog-mode . flymake-mode)
(text-mode . flymake-mode) (text-mode . flymake-mode)
(flymake-mode . flymake-flycheck-auto))) (flymake-mode . flymake-flycheck-auto)))
;; (use-package flycheck :ensure t
;; :custom ((flycheck-emacs-lisp-load-path 'inherit))
;; :config
;; (global-flycheck-mode t)
;; (setopt flycheck-emacs-lisp-load-path 'inherit)
;; (unbind-key "C-c ! C-c" flycheck-mode-map)
;; (unbind-key "C-c ! C-w" flycheck-mode-map)
;; (unbind-key "C-c ! ?" flycheck-mode-map)
;; (unbind-key "C-c ! C" flycheck-mode-map)
;; (unbind-key "C-c ! H" flycheck-mode-map)
;; (unbind-key "C-c ! V" flycheck-mode-map)
;; (unbind-key "C-c ! c" flycheck-mode-map)
;; (unbind-key "C-c ! e" flycheck-mode-map)
;; (unbind-key "C-c ! h" flycheck-mode-map)
;; (unbind-key "C-c ! i" flycheck-mode-map)
;; (unbind-key "C-c ! l" flycheck-mode-map)
;; (unbind-key "C-c ! n" flycheck-mode-map)
;; (unbind-key "C-c ! p" flycheck-mode-map)
;; (unbind-key "C-c ! s" flycheck-mode-map)
;; (unbind-key "C-c ! v" flycheck-mode-map)
;; (unbind-key "C-c ! x" flycheck-mode-map))
(provide 'icejam-flycheck) (provide 'icejam-flycheck)
;;; icejam-flycheck.el ends here ;;; icejam-flycheck.el ends here

View file

@ -3,7 +3,7 @@
;;; Highlight misspelled words ;;; Highlight misspelled words
;;; Code: ;;; Code:
(use-package ispell :ensure nil (use-package ispell :ensure nil :defer t
:config :config
(setopt ispell-program-name "aspell") (setopt ispell-program-name "aspell")
(setopt ispell-extra-args '("--run-together" "--run-together-limit=5" "--run-together-min=2"))) (setopt ispell-extra-args '("--run-together" "--run-together-limit=5" "--run-together-min=2")))

View file

@ -4,8 +4,11 @@
;;; Code: ;;; Code:
(require 'icejam-blocking) (require 'icejam-blocking)
;; (use-package lsp-mode :ensure (:depth 5) :requires (company)) ;; https://emacs-lsp.github.io/lsp-mode/page/performance/#use-plists-for-deserialization
(with-eval-after-load 'lsp-mode ;; This supposedly makes it faster.
(setenv "LSP_USE_PLISTS" "true")
(use-package lsp-mode :ensure t :defer t
:config
(add-to-list 'lsp-disabled-clients '(typescript-ts-mode . vue-semantic-server)) (add-to-list 'lsp-disabled-clients '(typescript-ts-mode . vue-semantic-server))
(add-to-list 'lsp-disabled-clients '(js-mode . vue-semantic-server)) (add-to-list 'lsp-disabled-clients '(js-mode . vue-semantic-server))
(add-to-list 'lsp-disabled-clients '(css-mode . vue-semantic-server)) (add-to-list 'lsp-disabled-clients '(css-mode . vue-semantic-server))
@ -60,8 +63,8 @@
(unbind-key "s-l s r" lsp-mode-map) (unbind-key "s-l s r" lsp-mode-map)
(unbind-key "s-l s s" lsp-mode-map)) (unbind-key "s-l s s" lsp-mode-map))
(use-package lsp-ui :ensure t :after (lsp-mode)) (use-package lsp-ui :ensure t :after (lsp-mode) :defer t
(with-eval-after-load 'lsp-ui :config
(setopt lsp-ui-doc-enable t (setopt lsp-ui-doc-enable t
lsp-ui-header t lsp-ui-header t
lsp-ui-delay 0.5 ;; Wait half a second to display documentation lsp-ui-delay 0.5 ;; Wait half a second to display documentation
@ -69,7 +72,7 @@
lsp-ui-doc-include-signature t)) lsp-ui-doc-include-signature t))
;; Lsp debugger mode ;; Lsp debugger mode
(use-package dap-mode :ensure t :after (lsp-mode lsp-ui)) (use-package dap-mode :ensure t :after (lsp-mode lsp-ui) :defer t)
(provide 'icejam-lsp) (provide 'icejam-lsp)
;;; icejam-lsp.el ends here ;;; icejam-lsp.el ends here

View file

@ -12,10 +12,9 @@
(global-eldoc-mode t) (global-eldoc-mode t)
;; Revert tag tables without asking ;; Revert tag tables without asking
(use-package etags :ensure nil (use-package etags :ensure nil :defer t
:config :config
(setopt tags-revert-without-query t) ;; Revert tags without query (setopt tags-revert-without-query t))
)
;;; Show trailing whitespace and remove whitespace on save ;;; Show trailing whitespace and remove whitespace on save
(use-package whitespace :ensure nil (use-package whitespace :ensure nil
@ -32,20 +31,19 @@
;; Use colorful, matching parens ;; Use colorful, matching parens
;; Rework the code below to enumerate each hook separately: ;; Rework the code below to enumerate each hook separately:
(use-package rainbow-delimiters :ensure t (use-package rainbow-delimiters :ensure t :defer t
:hook ((prog-mode . rainbow-delimiters-mode) :hook ((prog-mode . rainbow-delimiters-mode)
(text-mode . rainbow-delimiters-mode)) (text-mode . rainbow-delimiters-mode)
:config (elpaca-after-init . electric-pair-mode)
(electric-pair-mode t) (elpaca-after-init . show-paren-mode)))
(show-paren-mode t))
;;; Show hex (#aaa) colors as colors ;;; Show hex (#aaa) colors as colors
(use-package rainbow-mode :ensure t (use-package rainbow-mode :ensure t :defer t
:hook ((prog-mode . rainbow-mode) :hook ((prog-mode . rainbow-mode)
(text-mode . rainbow-mode))) (text-mode . rainbow-mode)))
;; Dash integration ;; Dash integration
(use-package dash-at-point :ensure t) (use-package dash-at-point :ensure t :defer t)
(with-eval-after-load 'dash-at-point (with-eval-after-load 'dash-at-point
(add-to-list 'dash-at-point-mode-alist '(enh-ruby-mode . "ruby,rubygems,rails")) (add-to-list 'dash-at-point-mode-alist '(enh-ruby-mode . "ruby,rubygems,rails"))
(add-to-list 'dash-at-point-mode-alist '(elixir-ts-mode . "elixir,hex"))) (add-to-list 'dash-at-point-mode-alist '(elixir-ts-mode . "elixir,hex")))
@ -61,13 +59,11 @@
(setq-local tab-width step) (setq-local tab-width step)
(setq-local tab-stop-list (number-sequence step 200 step))) (setq-local tab-stop-list (number-sequence step 200 step)))
(use-package column-enforce-mode :ensure t (use-package column-enforce-mode :ensure t :defer t
:config :hook (elpaca-after-init . global-column-enforce-mode))
(declare-function global-column-enforce-mode "column-enforce-mode")
(global-column-enforce-mode t))
;; PCRE to Emacs regex translations ;; PCRE to Emacs regex translations
(use-package pcre2el :ensure t) (use-package pcre2el :ensure t :defer t)
;; Visual regexp ;; Visual regexp
(use-package visual-regexp-steroids :ensure t :after (pcre2el) (use-package visual-regexp-steroids :ensure t :after (pcre2el)

View file

@ -11,12 +11,14 @@
;;; Code: ;;; Code:
(use-package tree-sitter-langs :ensure t (use-package tree-sitter-langs :ensure t :defer t
:config :commands tree-sitter-langs--bin-dir
(declare-function tree-sitter-langs--bin-dir "tree-sitter-langs") :hook
(add-to-list 'treesit-extra-load-path (tree-sitter-langs--bin-dir)) (elpaca-after-init . (lambda () (add-to-list
'treesit-extra-load-path
(tree-sitter-langs--bin-dir)))))
(defun icejam-tree-sitter-symlink-grammar-objects () (defun icejam-tree-sitter-symlink-grammar-objects ()
"Create symlinks for treesitter grammars. "Create symlinks for treesitter grammars.
Tree-sitter-langs-build releases grammars as LANG.so. Treesit needs Tree-sitter-langs-build releases grammars as LANG.so. Treesit needs
libtree-sitter-LANG.so" libtree-sitter-LANG.so"
@ -29,7 +31,7 @@ libtree-sitter-LANG.so"
(file-name-nondirectory file)))) (file-name-nondirectory file))))
(if (memq system-type '(ms-dos windows-nt cygwin)) (if (memq system-type '(ms-dos windows-nt cygwin))
(copy-file file target) (copy-file file target)
(make-symbolic-link file target)))))) (make-symbolic-link file target)))))
(provide 'icejam-tree-sitter) (provide 'icejam-tree-sitter)
;;; icejam-tree-sitter.el ends here ;;; icejam-tree-sitter.el ends here

View file

@ -9,17 +9,12 @@
(declare-function lsp "lsp-mode" nil) (declare-function lsp "lsp-mode" nil)
(declare-function column-enforce-n "column-enforce-mode" (number)) (declare-function column-enforce-n "column-enforce-mode" (number))
;; Elixir mode is used for formatting through elixir-format function, ;; Only load the elixir-format from elixir mode.
;; so it needs to be loaded without deferring. One it is, we can (use-package elixir-format :defer t
;; make it so that treesit takes over. :ensure (:type git :host github :repo "elixir-editors/emacs-elixir" :files ("elixir-format.el")))
(use-package elixir-mode :ensure t
:config
(add-to-list 'auto-mode-alist '("\\.exs\\'" . elixir-ts-mode))
(add-to-list 'auto-mode-alist '("\\.ex\\'" . elixir-ts-mode)))
(use-package elixir-ts-mode :ensure t (use-package elixir-ts-mode :ensure t :defer t
:after (elixir-mode lsp-mode lsp-ui) :after (elixir-format lsp-mode lsp-ui))
:defer t)
(transient-define-prefix icejam-elixir-lang-menu () (transient-define-prefix icejam-elixir-lang-menu ()
"Elixir Buffer Commands." "Elixir Buffer Commands."

View file

@ -8,7 +8,7 @@
;; a warning from the byte compiler. ;; a warning from the byte compiler.
(declare-function elpaca-installed-p "elpaca") (declare-function elpaca-installed-p "elpaca")
(unless (elpaca-installed-p 'markdown-mode) (unless (elpaca-installed-p 'markdown-mode)
(use-package markdown-mode :ensure t)) (use-package markdown-mode :ensure t :defer t))
(with-eval-after-load 'markdown-mode (with-eval-after-load 'markdown-mode
(setq-default markdown-command "pandoc")) (setq-default markdown-command "pandoc"))