1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# emacs_setup
Git-tracked Emacs configuration. `emacs.el` is the source of truth;
`~/.emacs` is a symlink to it, so the live config is always the latest
version in this repo.
## Layout
| File | Purpose |
|--------------|--------------------------------------------------|
| `emacs.el` | The init file itself (what `~/.emacs` points to) |
| `check.sh` | Validate the config loads cleanly |
| `install.sh` | Back up old config, symlink `~/.emacs` → `emacs.el` |
| `backups/` | Pre-install backups (gitignored) |
## Usage
```sh
./install.sh # one-time: symlink ~/.emacs -> emacs.el (backs up the old file)
./check.sh # or: make check -- run before committing
make status # see uncommitted drift
```
### Workflow after installing
- Edit the config either in Emacs (`C-x C-f ~/.emacs`) or here — same file.
- Changes made by `M-x customize` (custom-set-variables) land directly
in this working tree; review with `git diff`, commit when happy.
- To try a change: save, `./check.sh`, then restart Emacs.
- To roll back: `git checkout <commit> -- emacs.el` — the symlink picks
it up immediately, no reinstall.
- To restore the pre-repo config entirely: copy the newest file from
`backups/` back to `~/.emacs` (replacing the symlink).
## Findings from the initial check (2026-09-10)
Fixed in a follow-up commit:
1. **Missing `lexical-binding` cookie** — startup warning on every launch. Added
`-*- lexical-binding: t; -*-` to line 1 (verified the file loads cleanly
under lexical binding).
2. **Unguarded Verilog LSP client** — the config registers `verible-verilog-ls`
and hooks `lsp` into `verilog-mode`, but the binary is not installed, so
opening Verilog files errored. Now registered only when the binary exists
(`executable-find`). Install `verible` to re-enable.
3. **Harmless native-comp warnings** — packages like go-mode reference
lsp-mode/eglot functions they don't require; the resulting
`(native-compiler)` warnings cluttered *Warnings*. Now suppressed
(`warning-suppress-types`, after the custom block).
## Python: per-project micromamba environments
Python LSP is deliberately NOT enabled globally (see the comment on the
eglot `use-package` form): mode hooks run before `.dir-locals.el` applies,
so a global hook would always connect to the system pylsp. Instead each
micromamba project carries a `.dir-locals.el` that points the interpreter,
`exec-path` and eglot at the env, then starts eglot.
New project setup:
```sh
micromamba create -n ENVNAME -c conda-forge python=3.12 python-lsp-server <libs>
cp templates/python-project-dir-locals.el <project>/.dir-locals.el # edit env path
```
First time you open a file in the project, Emacs asks to trust the `eval`
forms — answer `!` (trust always).
`~/Projects/vkeHF` is set up this way with env `vkehf`
(numpy, control, matplotlib, python-lsp-server); verified that eglot spawns
`~/.local/share/mamba/envs/vkehf/bin/pylsp`.
Known quirks left as-is (deliberate-looking choices — revisit if annoying):
- **`lsp-mode` and `eglot` are both active**: lsp-mode owns C/C++/Verilog/VHDL/
LaTeX, eglot owns Java/Scala/Clojure (Python is per-project, see above).
The C/C++ overlap is noted in the config itself. Works, but pick one
eventually.
- **`jdtls` is not installed**, so Java files will fail to start eglot.
Install `jdtls` (or drop java-mode from the eglot hook).
- **`flycheck-c/c++-gcc-executable` is set to `/usr/bin/avr-gcc`** in
`custom-set-variables` — flycheck uses avr-gcc for *all* C files, not just
AVR projects. Consider moving it to per-project `.dir-locals.el`.
- helm and vertico/consult are both configured (two completion stacks);
helm is only used for gtags navigation.
|