Add a post about emacs fast startup
This commit is contained in:
parent
a265fb6141
commit
6487d6dd90
2 changed files with 71 additions and 0 deletions
14
bin/publish.sh
Executable file
14
bin/publish.sh
Executable file
|
@ -0,0 +1,14 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
NOTE="$(notes.sh -l | fzf --tac --with-nth="2..-1" | cut -d " " -f 1)"
|
||||
|
||||
if [ ! -z "$NOTE" ]; then
|
||||
SLUG="$(notes.sh -E $NOTE | grep -m1 "^X-Slug: " | sed -n "s/^X-Slug: \(.*\)$/\1/p")"
|
||||
if [ -z "$SLUG" ]; then
|
||||
echo "X-Slug header expected"
|
||||
exit 1
|
||||
fi
|
||||
DIR="/home/knazarov/dev/knazarov.com/content/posts/$SLUG"
|
||||
mkdir -p "$DIR"
|
||||
notes.sh -E "$NOTE" > "$DIR/note.md"
|
||||
fi
|
57
content/posts/emacs_fast_startup/note.md
Normal file
57
content/posts/emacs_fast_startup/note.md
Normal file
|
@ -0,0 +1,57 @@
|
|||
X-Date: 2024-06-10T21:00:38Z
|
||||
X-Note-Id: f850f802-798d-49e7-ad9b-c0d6a977d4bb
|
||||
Subject: Emacs can start up almost as fast as Vim
|
||||
X-Slug: emacs_fast_startup
|
||||
|
||||
My own configuration which includes a number of plugins can now load in about 200ms.
|
||||
With Vim modal editing emulation through [evil-mode](https://github.com/emacs-evil/evil) it is suitable
|
||||
as default `$EDITOR` in the terminal. This enables convenient editing of git commit messages, or random
|
||||
one-off changes where I usually resorted to plain vim. So much so that I've set `alias vim=emacs -nw`.
|
||||
|
||||
The trick turned out to be quite simple: you need to lazy-load most of the packages. When you run the
|
||||
editor, you're likely only using a subset of extensions like syntax highlighting for the programming language
|
||||
that your initial buffer is in. So no need to spend CPU time on things that you either don't need or use
|
||||
later.
|
||||
|
||||
Latest versions of Emacs have `use-package` module built in that allows to succintly describe configuration
|
||||
of plugins and set the rules of when they should be loaded. Here's an example of configuration for `org-roam`,
|
||||
a plugin I use for note-taking:
|
||||
|
||||
```
|
||||
(use-package org-roam
|
||||
:ensure t
|
||||
:defer t
|
||||
:bind
|
||||
("C-c n l" . org-roam-buffer-toggle)
|
||||
("C-c n i" . org-roam-node-insert)
|
||||
("C-c n f" . org-roam-node-find)
|
||||
("C-c n r" . consult-org-roam-search)
|
||||
("C-c n d" . org-roam-dailies-goto-today)
|
||||
("C-c n w" . org-roam-week)
|
||||
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
Here, `:defer` flag means that the module shouldn't be eagerly loaded. The `:bind` specifies keybindings that
|
||||
should trigger specific actions of this module. As soon as you type those key combinations - only then the module
|
||||
will be loaded.
|
||||
|
||||
Some packages like `which-key` that are not needed immediately, can be loaded with a delay:
|
||||
|
||||
```
|
||||
(use-package which-key
|
||||
:ensure t
|
||||
:defer 2
|
||||
:config
|
||||
(which-key-mode)
|
||||
(which-key-setup-side-window-bottom)
|
||||
)
|
||||
```
|
||||
|
||||
Here, `:defer 2` means "load this plugin 2 seconds after the startup". This allows you to open and start editing a
|
||||
file and the plugin will be loaded in the background.
|
||||
|
||||
Really, it all boils down to carefully using `:defer`, and most of the load time can be shaved off. With so much stuff
|
||||
already in the standard package, you can probably even put emacs to your devserver, `scp` the config there, and
|
||||
it should just work.
|
Loading…
Reference in a new issue