Fix LazyVim.sh shell branches, backups, and nvm detection

- swap the crossed branch tests (fish branch checked ~/.bashrc, bash branch
  checked ~/.config/fish/config.fish - each never matched its shell)
- install fisher/nvm.fish via 'fish -c' instead of calling fisher from bash
- timestamped backups (nvim.bak-YYYYmmdd-HHMMSS) instead of rm -rf of all
  *.bak dirs first - a re-run no longer destroys the original backup
- check git clone result and point at the preserved backup on failure
- load nvm by sourcing its init script (nvm is a function; 'command -v nvm'
  never succeeded, so the whole block was dead code)
- guard nvm init sourcing under set +u, fall back to system nodejs
- idempotent rc appends (grep guard), tty-guarded Ctrl+C grace period
- set -euo pipefail with guarded/unguarded audit
- typos: prerequisites, secconds
This commit is contained in:
alvinlollo
2026-10-08 14:08:20 +11:00
parent 99d94ab615
commit 696badb67a
+104 -88
View File
@@ -1,14 +1,18 @@
#!/usr/bin/bash #!/usr/bin/bash
set -euo pipefail
# Detect fish shell and ask user to switch to bash (bash-only syntax) # Detect fish shell and ask user to switch to bash (bash-only syntax)
if [ -n "${FISH_VERSION:-}" ] || case "$SHELL" in *fish*) ;; *) false ;; esac; then if [ -n "${FISH_VERSION:-}" ] || case "${SHELL:-}" in *fish*) ;; *) false ;; esac; then
echo "Warning: fish shell detected." echo "Warning: fish shell detected."
echo "This script is written for bash and may have syntax issues under fish." echo "This script is written for bash and may have syntax issues under fish."
echo "Please switch to bash first and re-run it, e.g.: bash $0" echo "Please switch to bash first and re-run it, e.g.: bash $0"
read -r -p "Press Enter to continue anyway, or Ctrl+C to cancel..." </dev/tty || true if [ -t 0 ] && [ -e /dev/tty ]; then
read -r -p "Press Enter to continue anyway, or Ctrl+C to cancel..." </dev/tty || true
fi
fi fi
# Install prerequisetes # Install prerequisites
if command -v pacman >/dev/null; then if command -v pacman >/dev/null; then
echo "pacman detected. Installing prerequisites" echo "pacman detected. Installing prerequisites"
# sclip is not packaged for arch, tree-sitter-cli ships the tree-sitter binary # sclip is not packaged for arch, tree-sitter-cli ships the tree-sitter binary
@@ -48,61 +52,34 @@ elif command -v apt >/dev/null; then
else else
echo "Cannot proceed: pacman or apt is required" echo "Cannot proceed: pacman or apt is required"
echo "This script supports arch based and debian based systems" echo "This script supports arch based and debian based systems"
echo "+ sleep 10" && sleep 10
exit 1 exit 1
fi fi
echo "" echo ""
echo 'This script will move your current nvim config to ~/.config/nvim.bak' echo 'This script will back up your current nvim config with a timestamped name, e.g. ~/.config/nvim.bak-20261008-130000'
echo "Press CTRL+C within 10 secconds if you don't want these actions to be made" if [ -t 0 ]; then
sleep 10 echo "Press CTRL+C within 10 seconds if you don't want these actions to be made"
sleep 10
fi
echo "" echo ""
# Remove old backups # Back up current nvim directories with a timestamp so a re-run never
# Remove existing .bak directories first to ensure a clean slate # destroys the user's original backup (old behaviour deleted *.bak first)
echo " Checking for and removing old Neovim backup directories..." STAMP="$(date +%Y%m%d-%H%M%S)"
# Use $HOME for reliable path expansion backup_if_exists() {
if [ -e "$HOME/.config/nvim.bak" ]; then local src="$1"
echo "Path $HOME/.config/nvim.bak exists. Removing..." if [ -e "$src" ]; then
rm -rf "$HOME/.config/nvim.bak" echo " Backing up $src -> ${src}.bak-$STAMP"
fi mv "$src" "${src}.bak-$STAMP"
fi
}
if [ -e "$HOME/.local/share/nvim.bak" ]; then
echo "Path $HOME/.local/share/nvim.bak exists. Removing..."
rm -rf "$HOME/.local/share/nvim.bak"
fi
if [ -e "$HOME/.local/state/nvim.bak" ]; then
echo "Path $HOME/.local/state/nvim.bak exists. Removing..."
rm -rf "$HOME/.local/state/nvim.bak"
fi
if [ -e "$HOME/.cache/nvim.bak" ]; then
echo "Path $HOME/.cache/nvim.bak exists. Removing..."
rm -rf "$HOME/.cache/nvim.bak"
fi
# Remove the current nvim config and create a new backup
echo ""
echo " Backing up current Neovim configuration..." echo " Backing up current Neovim configuration..."
if [ -d "$HOME/.config/nvim" ]; then # Check if nvim config exists before moving backup_if_exists "$HOME/.config/nvim"
mv "$HOME/.config/nvim" "$HOME/.config/nvim.bak" backup_if_exists "$HOME/.local/share/nvim"
else backup_if_exists "$HOME/.local/state/nvim"
echo "No existing ~/.config/nvim found to back up." backup_if_exists "$HOME/.cache/nvim"
fi
echo ""
echo " Backing up Neovim share, state, and cache directories..."
if [ -d "$HOME/.local/share/nvim" ]; then
mv "$HOME/.local/share/nvim" "$HOME/.local/share/nvim.bak"
fi
if [ -d "$HOME/.local/state/nvim" ]; then
mv "$HOME/.local/state/nvim" "$HOME/.local/state/nvim.bak"
fi
if [ -d "$HOME/.cache/nvim" ]; then
mv "$HOME/.cache/nvim" "$HOME/.cache/nvim.bak"
fi
# Remove any leftover # Remove any leftover
if [ -e "$HOME/.config/.nvim" ]; then if [ -e "$HOME/.config/.nvim" ]; then
@@ -113,51 +90,90 @@ fi
# Install LazyVim # Install LazyVim
echo "" echo ""
git clone https://github.com/alvinlollo/LazyVim ~/.config/nvim if ! git clone https://github.com/alvinlollo/LazyVim "$HOME/.config/nvim"; then
echo "error: failed to clone https://github.com/alvinlollo/LazyVim into ~/.config/nvim" >&2
# Check if nvm is in shell path echo "Your previous config is preserved in ~/.config/nvim.bak-$STAMP (if one existed)." >&2
if command -v nvm &>/dev/null; then exit 1
# Get current shell name
CURRENT_SHELL=$(basename -- "$SHELL")
# 2. Source the correct configuration file safely
if [ "$CURRENT_SHELL" = "fish" ] && [ -f ~/.bashrc ]; then
# Check if fish is installed first, then check for fisher
if command -v fish &>/dev/null && fish -c "functions -q fisher" &>/dev/null; then
fisher install jorgebucaran/nvm.fish
source ~/.config/fish/config.fish
else
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source
fisher install jorgebucaran/fisher
fisher install jorgebucaran/nvm.fish
source ~/.config/fish/config.fish
fi
elif [ "$CURRENT_SHELL" = "zsh" ] && [ -f ~/.zshrc ]; then
echo -e "export NVM_DIR=\"$HOME/.nvm\"\n[ -s \"/usr/share/nvm/nvm.sh\" ] && \. \"/usr/share/nvm/nvm.sh\"\n[ -s \"/usr/share/nvm/init-nvm.sh\" ] && \. \"/usr/share/nvm/init-nvm.sh\"" >>~/.zshrc
source ~/.zshrc
elif [ "$CURRENT_SHELL" = "bash" ] && [ -f ~/.config/fish/config.fish ]; then
echo "source /usr/share/nvm/init-nvm.sh" >>~/.bashrc
source ~/.bashrc
else
echo "Unsupported or unreadable shell configuration: $CURRENT_SHELL"
echo "Failed to add NVM to shell path. Please add it manually to your shell configuration file."
fi
fi fi
# Use NVM to install the latest LTS version of Node.js # Load nvm into this shell if it exists. nvm is a shell function, so
if command -v nvm &>/dev/null; then # 'command -v nvm' only works after its init script has been sourced.
NVM_LOADED=false
for nvm_init in "$HOME/.nvm/nvm.sh" /usr/share/nvm/nvm.sh /usr/share/nvm/init-nvm.sh; do
if [ -f "$nvm_init" ]; then
set +u # nvm's init script is not always nounset-safe
# shellcheck disable=SC1090
if ! . "$nvm_init"; then
set -u
continue # try the next candidate
fi
set -u
NVM_LOADED=true
break
fi
done
CURRENT_SHELL=$(basename -- "${SHELL:-/bin/bash}")
case "$CURRENT_SHELL" in
fish)
# fish cannot source nvm.sh - it uses the nvm.fish plugin instead
if [ -f "$HOME/.config/fish/config.fish" ]; then
if ! fish -c 'type -q fisher' 2>/dev/null; then
fisher_src="$(mktemp)"
if ! curl -fsSL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish -o "$fisher_src"; then
echo "error: failed to download fisher.fish" >&2
rm -f "$fisher_src"
exit 1
fi
fish -c "source '$fisher_src' && fisher install jorgebucaran/fisher"
rm -f "$fisher_src"
fi
fish -c 'fisher install jorgebucaran/nvm.fish'
else
echo "No ~/.config/fish/config.fish found, skipping fish plugin setup"
fi
;;
zsh)
if [ -f "$HOME/.zshrc" ]; then
if ! grep -q 'nvm.sh' "$HOME/.zshrc"; then
printf '%s\n' \
'export NVM_DIR="$HOME/.nvm"' \
'[ -s "/usr/share/nvm/nvm.sh" ] && . "/usr/share/nvm/nvm.sh"' \
'[ -s "/usr/share/nvm/init-nvm.sh" ] && . "/usr/share/nvm/init-nvm.sh"' >>"$HOME/.zshrc"
fi
else
echo "No ~/.zshrc found, skipping nvm shell wiring"
fi
;;
bash)
if [ -f "$HOME/.bashrc" ]; then
if ! grep -q 'nvm.sh\|init-nvm.sh' "$HOME/.bashrc"; then
printf '%s\n' \
'export NVM_DIR="$HOME/.nvm"' \
'[ -s "/usr/share/nvm/nvm.sh" ] && . "/usr/share/nvm/nvm.sh"' \
'[ -s "/usr/share/nvm/init-nvm.sh" ] && . "/usr/share/nvm/init-nvm.sh"' >>"$HOME/.bashrc"
fi
else
echo "No ~/.bashrc found, skipping nvm shell wiring"
fi
;;
*)
echo "Unsupported or unreadable shell configuration: $CURRENT_SHELL"
echo "Failed to add NVM to shell path. Please add it manually to your shell configuration file."
;;
esac
# Use nvm (when loaded) to install the latest LTS version of Node.js
if [ "$NVM_LOADED" = true ]; then
nvm install lts nvm install lts
nvm use lts nvm use lts
elif command -v node >/dev/null; then elif command -v node >/dev/null; then
echo "nvm not found, using system Node.js $(node --version)" echo "nvm not available, using system Node.js $(node --version)"
else else
echo "No Node.js installation found." echo "No Node.js installation found."
echo "Source your nvm install (e.g. . /usr/share/nvm/nvm.sh) or install nodejs, then re-run this script." echo "Install nvm (Arch: pacman -S nvm) or nodejs, then re-run this script."
exit 1 exit 1
fi fi
echo "LazyVim setup complete."