Files
nuwiki/start-vim.sh
T
gffranco cf94f99d3c
CI / cargo fmt --check (push) Successful in 28s
CI / cargo clippy (push) Successful in 1m8s
CI / cargo test (push) Successful in 1m27s
dev: minimal-config launchers for nvim/vim plugin testing
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>
2026-05-11 22:04:11 +00:00

181 lines
4.7 KiB
Bash
Executable File

#!/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 "$@"