Dev install
./dev-install.sh symlinks the working tree into $XDG_CONFIG_HOME/<appname> and drops a launcher in $HOME/.local/bin. Edits in the checkout are live on the next launch — no reinstall required.
Use it for interactive testing alongside the isolated automated smoke tests.
Source: dev-install.sh.
Quick start
Section titled “Quick start”./dev-install.sh # symlinks repo → ~/.config/blak-devblak-dev # NVIM_APPNAME=blak-dev nvimThat’s it. Open a buffer, :BlakDoctor, exercise the change.
| Flag | Default | What |
|---|---|---|
--appname NAME |
blak-dev |
Use a custom NVIM_APPNAME (and matching launcher name). |
--force, -f |
off | Repoint an existing config symlink. Unrelated launchers are preserved. |
--uninstall, -u |
— | Remove the symlink to this checkout and a script-managed launcher. Leaves runtime data dirs alone. |
--status, -s |
— | Print current install state without changing anything. |
--help, -h |
— | Show usage. |
Environment variables
Section titled “Environment variables”| Var | Default | Same as |
|---|---|---|
BLAK_APPNAME |
blak-dev |
--appname |
BLAK_BIN_DIR |
$HOME/.local/bin |
(launcher location) |
XDG_CONFIG_HOME |
$HOME/.config |
(config parent) |
What it creates
Section titled “What it creates”$XDG_CONFIG_HOME/<appname> symlink → this checkout$BLAK_BIN_DIR/<appname> launcher script (NVIM_APPNAME=<appname> exec nvim)That’s it on the install side. Runtime state lands under the per-appname XDG dirs as Neovim runs:
$XDG_DATA_HOME/<appname>/lazy/ installed plugins$XDG_STATE_HOME/<appname>/blak/ extras.json + rollback snapshots$XDG_CACHE_HOME/<appname>/ cachesDifferent app names keep plugin installations and runtime state separate.
App names linked to the same checkout still share source files, user.lua,
and the plugin lockfile. Use separate checkouts for independent configuration.
Why a symlink
Section titled “Why a symlink”The point of dev-install is the live edit loop. Editing lua/blak/extras/lang/zig.lua in your IDE means the next blak-dev launch picks it up — no git pull && reinstall && pray.
The launcher script carries a small marker comment so --status and --uninstall know it’s safe to operate on (vs. a manually-created launcher of the same name).
Multiple checkouts
Section titled “Multiple checkouts”Want to test two branches at once? Use different appnames:
cd ~/Developer/blak.nvim./dev-install.sh --appname blak-maingit worktree add ../blak-zig -b feature/zigcd ../blak-zig./dev-install.sh --appname blak-zigblak-main # main branchblak-zig # feature branchEach has its own plugin install, its own extras state, and its own rollback snapshots.
Uninstalling
Section titled “Uninstalling”./dev-install.sh --uninstall # removes symlink + launcherThe runtime state dirs ($XDG_DATA_HOME/blak-dev, etc.) are intentionally not removed — they’re expensive to rebuild and might still be useful. Delete them manually if you want a clean slate:
rm -rf ~/.local/share/blak-dev ~/.local/state/blak-dev ~/.cache/blak-devStatus
Section titled “Status”./dev-install.sh --statusPrints whether the symlink exists, where it points, whether the launcher exists, and whether it’s the one this script created.
When to use install.sh vs dev-install.sh
Section titled “When to use install.sh vs dev-install.sh”| Use | Script |
|---|---|
| Trying Blak from the public repo | install.sh |
| Hacking on Blak locally | dev-install.sh |
| Running CI / smoke tests | make smoke (or no install at all, the script sets the runtime path) |