dev: minimal-config launchers for nvim/vim plugin testing
CI / cargo fmt --check (push) Successful in 28s
CI / cargo clippy (push) Successful in 1m8s
CI / cargo test (push) Successful in 1m27s

Two scripts at the repo root that spin up an isolated editor session
against this checkout, so changes to the plugin or LSP can be smoke-
tested without polluting the user's real (n)vim install:

- start-nvim.sh — builds nuwiki-ls in release mode, symlinks it into
  `bin/`, seeds a scratch wiki under `$XDG_CACHE_HOME/nuwiki-dev/wiki`,
  generates a minimal `init.lua` that prepends this repo to
  `runtimepath`, points `vim.env.XDG_*` at the dev cache so the host's
  Neovim state is untouched, and execs `nvim --clean -u <init>`.

- start-vim.sh — same shape for Vim. Clones vim-lsp + async.vim into
  the dev cache on first run so the LSP path is actually exercisable
  (the plugin's autoload layer prefers vim-lsp). Opt-out via
  `NUWIKI_DEV_NO_LSP=1` for syntax-only testing.

Both scripts:
- Are idempotent (skip cargo build / git clone / wiki seed when their
  outputs are already in place).
- Pass through extra args to the editor; default to opening the
  scratch wiki's index page.
- Accept `NUWIKI_DEV_WIKI=<path>` to point at a custom sandbox.
- Seed `index.wiki` + `Notes.wiki` with smoke-test content covering
  wikilinks, anchors, checkboxes, tags, and the `:Vimwiki*` command
  surface.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 22:04:11 +00:00
parent 63e5b6d514
commit cf94f99d3c
2 changed files with 327 additions and 0 deletions
Executable
+180
View File
@@ -0,0 +1,180 @@
#!/usr/bin/env bash
#
# start-vim.sh — launch Vim with a minimal config that loads nuwiki.
#
# The plugin's Vim path (autoload/nuwiki/lsp.vim) prefers `vim-lsp` and
# falls back to `coc.nvim`. This script clones vim-lsp + async.vim into
# the dev cache on first run so the LSP integration is exercisable
# without polluting your real Vim install.
#
# Usage: ./start-vim.sh [extra args...]
# ./start-vim.sh # open the scratch wiki's index
# ./start-vim.sh path/to/note.wiki # open a specific file
# NUWIKI_DEV_WIKI=/tmp/foo ./start-vim.sh
# NUWIKI_DEV_NO_LSP=1 ./start-vim.sh # skip vim-lsp setup
#
# Tested with Vim 9.1+. State (viminfo/sessions) lives under
# $XDG_CACHE_HOME/nuwiki-dev/ so your real Vim install stays untouched.
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEV_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/nuwiki-dev"
WIKI_DIR="${NUWIKI_DEV_WIKI:-$DEV_DIR/wiki}"
VIMRC="$DEV_DIR/vimrc"
VIM_STATE="$DEV_DIR/vim-state"
VIM_LSP_DIR="$DEV_DIR/vim-lsp"
ASYNC_DIR="$DEV_DIR/async.vim"
log() { printf '\033[1;34m[nuwiki-dev]\033[0m %s\n' "$*"; }
ensure_binary() {
local bin="$REPO_ROOT/bin/nuwiki-ls"
local built="$REPO_ROOT/target/release/nuwiki-ls"
if [[ -x "$bin" ]]; then
return
fi
log "building nuwiki-ls (release)…"
cargo build --release -p nuwiki-ls --manifest-path "$REPO_ROOT/Cargo.toml"
mkdir -p "$REPO_ROOT/bin"
ln -sf "$built" "$bin"
log "binary ready: $bin"
}
clone_if_missing() {
local repo_url="$1"
local dest="$2"
if [[ -d "$dest/.git" ]]; then
return
fi
if ! command -v git >/dev/null 2>&1; then
log "git not found — skipping $repo_url"
return 1
fi
log "cloning $repo_url$dest"
git clone --depth 1 "$repo_url" "$dest" >/dev/null 2>&1
}
ensure_vim_lsp() {
if [[ "${NUWIKI_DEV_NO_LSP:-0}" == "1" ]]; then
log "NUWIKI_DEV_NO_LSP=1 — skipping vim-lsp setup"
return
fi
mkdir -p "$DEV_DIR"
clone_if_missing https://github.com/prabirshrestha/vim-lsp.git "$VIM_LSP_DIR" || true
clone_if_missing https://github.com/prabirshrestha/async.vim.git "$ASYNC_DIR" || true
}
seed_wiki() {
mkdir -p "$WIKI_DIR" "$WIKI_DIR/diary"
if [[ ! -f "$WIKI_DIR/index.wiki" ]]; then
cat > "$WIKI_DIR/index.wiki" <<'EOF'
= Welcome to nuwiki =
This is a scratch wiki created by start-vim.sh. Edit, run commands,
or jump to the linked pages to test the plugin.
== Smoke test ==
- [[Notes]]
- [[diary/]]
- [ ] Toggle me with :VimwikiToggleListItem
- [ ] Inspect the LSP via :LspStatus
== Commands to try ==
- :VimwikiTOC
- :VimwikiGenerateLinks
- :VimwikiCheckLinks
- :VimwikiMakeDiaryNote
== Tags ==
:smoke-test:sandbox:
EOF
fi
if [[ ! -f "$WIKI_DIR/Notes.wiki" ]]; then
cat > "$WIKI_DIR/Notes.wiki" <<'EOF'
= Notes =
A second page so [[index]] has somewhere to point.
== Section one ==
Anchor target for cross-page link follows.
EOF
fi
}
write_vimrc() {
mkdir -p "$DEV_DIR"
cat > "$VIMRC" <<EOF
" start-vim.sh: generated minimal config for nuwiki development.
" Regenerated on every launch; edit start-vim.sh, not this file.
" Confine state to the dev cache so we never touch the user's real Vim
" install.
set viminfo='100,n$VIM_STATE/viminfo
let &directory = '$VIM_STATE/swap//'
let &backupdir = '$VIM_STATE/backup//'
let &undodir = '$VIM_STATE/undo//'
" Make Vim look for runtime paths in the dev cache.
set nocompatible
let &runtimepath = '$REPO_ROOT' . ',' . &runtimepath
let &runtimepath .= ',$VIM_LSP_DIR'
let &runtimepath .= ',$ASYNC_DIR'
let g:nuwiki_binary_path = '$REPO_ROOT/bin/nuwiki-ls'
let g:nuwiki_wiki_root = '$WIKI_DIR'
let g:nuwiki_file_extension = '.wiki'
let g:nuwiki_syntax = 'vimwiki'
let g:nuwiki_log_level = 'info'
filetype plugin indent on
syntax enable
set hidden
set termguicolors
set number
set signcolumn=yes
set noswapfile
set nobackup
set nowritebackup
let mapleader = ' '
" Auto-detect filetype for .wiki files (the plugin ships ftdetect, but
" --clean disables those — copy the rule here).
augroup NuwikiFtdetect
autocmd!
autocmd BufRead,BufNewFile *.wiki setfiletype vimwiki
augroup END
" If vim-lsp is on the runtimepath, the plugin's autoload entry point
" registers the server automatically. Triggering it on FileType keeps
" the script's responsibility minimal.
augroup NuwikiStart
autocmd!
autocmd FileType vimwiki call nuwiki#lsp#start()
augroup END
echo '[nuwiki-dev] ready — wiki root: $WIKI_DIR'
echo '[nuwiki-dev] :LspStatus for client diagnostics, :messages for log'
EOF
}
main() {
ensure_binary
ensure_vim_lsp
seed_wiki
write_vimrc
mkdir -p "$VIM_STATE/swap" "$VIM_STATE/backup" "$VIM_STATE/undo"
log "launching: vim --clean -u $VIMRC"
if [[ $# -gt 0 ]]; then
exec vim --clean -u "$VIMRC" "$@"
else
exec vim --clean -u "$VIMRC" "$WIKI_DIR/index.wiki"
fi
}
main "$@"