9ec1adb3e7
CI / cargo fmt --check (push) Successful in 37s
CI / cargo clippy (push) Successful in 35s
CI / cargo test (push) Successful in 32s
CI / cargo fmt --check (pull_request) Successful in 29s
CI / cargo clippy (pull_request) Successful in 46s
CI / cargo test (pull_request) Successful in 52s
CI / editor keymaps (push) Successful in 1m36s
CI / editor keymaps (pull_request) Successful in 1m21s
Relocate start-nvim.sh, start-vim.sh and test-personal-wiki.sh from the repo root into scripts/, alongside the existing test harnesses. Each script now derives REPO_ROOT one level up, test-personal-wiki.sh execs the moved start-vim.sh, and the README + usage comments point at the new paths. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
198 lines
5.7 KiB
Bash
Executable File
198 lines
5.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: ./scripts/start-vim.sh [extra args...]
|
|
# ./scripts/start-vim.sh # open the scratch wiki's index
|
|
# ./scripts/start-vim.sh path/to/note.wiki # open a specific file
|
|
# NUWIKI_DEV_WIKI=/tmp/foo ./scripts/start-vim.sh
|
|
# NUWIKI_DEV_NO_LSP=1 ./scripts/start-vim.sh # skip vim-lsp setup
|
|
# NUWIKI_DEV_NO_SEED=1 ./scripts/start-vim.sh # use WIKI_DIR as-is (no scratch seeding)
|
|
# NUWIKI_DEV_SKIP_BUILD=1 ./scripts/start-vim.sh # reuse the cached binary
|
|
#
|
|
# The release binary is rebuilt on every launch so source changes
|
|
# always reach the running LSP. `cargo build --release` is incremental,
|
|
# so this is a fast no-op when nothing changed. Set
|
|
# NUWIKI_DEV_SKIP_BUILD=1 to skip the build step entirely.
|
|
#
|
|
# 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 [[ "${NUWIKI_DEV_SKIP_BUILD:-0}" == "1" ]]; then
|
|
if [[ ! -x "$bin" ]]; then
|
|
log "NUWIKI_DEV_SKIP_BUILD=1 but $bin is missing — building anyway"
|
|
else
|
|
log "NUWIKI_DEV_SKIP_BUILD=1 — using existing $bin"
|
|
return
|
|
fi
|
|
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 (built $(date -r "$built" '+%Y-%m-%d %H:%M:%S'))"
|
|
}
|
|
|
|
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() {
|
|
if [[ "${NUWIKI_DEV_NO_SEED:-0}" == "1" ]]; then
|
|
log "NUWIKI_DEV_NO_SEED=1 — skipping wiki seed (using $WIKI_DIR as-is)"
|
|
return
|
|
fi
|
|
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
|
|
|
|
" Status messages go to :messages so they don't trigger "Press ENTER".
|
|
echomsg '[nuwiki-dev] ready — wiki root: $WIKI_DIR'
|
|
echomsg '[nuwiki-dev] :LspStatus for 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 "$@"
|