#!/usr/bin/env bash set -Eeuo pipefail INSTALL_DIR="/opt/nvim" BACKUP_DIR="/opt/nvim.backup" BIN_DIR="/usr/local/bin" if [[ $EUID -ne 0 ]]; then exec sudo bash "$0" "$@" fi case "$(dpkg --print-architecture)" in amd64) ARCH="x86_64" ;; arm64) ARCH="arm64" ;; *) echo "Unsupported architecture" >&2 exit 1 ;; esac echo "==> Installing dependencies" apt-get update apt-get install -y curl ca-certificates tar TMP_DIR="$(mktemp -d)" trap 'rm -rf "$TMP_DIR"' EXIT ASSET="nvim-linux-${ARCH}" URL="https://github.com/neovim/neovim/releases/latest/download/${ASSET}.tar.gz" echo "==> Downloading latest Neovim" curl -fL --retry 3 \ "$URL" \ -o "$TMP_DIR/nvim.tar.gz" echo "==> Extracting Neovim" tar -xzf "$TMP_DIR/nvim.tar.gz" -C "$TMP_DIR" "$TMP_DIR/$ASSET/bin/nvim" --version | head -n 1 echo "==> Installing to $INSTALL_DIR" # Remove the previous backup rm -rf "$BACKUP_DIR" # Back up the current installation if [[ -e "$INSTALL_DIR" ]]; then mv "$INSTALL_DIR" "$BACKUP_DIR" fi # Install the new version if ! mv "$TMP_DIR/$ASSET" "$INSTALL_DIR"; then if [[ -d "$BACKUP_DIR" ]]; then mv "$BACKUP_DIR" "$INSTALL_DIR" fi exit 1 fi echo "==> Creating command symlinks" mkdir -p "$BIN_DIR" for cmd in vi vim nvim; do ln -sfn "$INSTALL_DIR/bin/nvim" "$BIN_DIR/$cmd" done echo "==> Configuring update-alternatives" update-alternatives \ --install /usr/bin/vi vi "$INSTALL_DIR/bin/nvim" 100 update-alternatives \ --install /usr/bin/vim vim "$INSTALL_DIR/bin/nvim" 100 update-alternatives \ --install /usr/bin/editor editor "$INSTALL_DIR/bin/nvim" 100 for cmd in vi vim editor; do update-alternatives --set "$cmd" "$INSTALL_DIR/bin/nvim" done echo "==> Setting EDITOR and VISUAL" cat > /etc/profile.d/neovim.sh <<'EOF' export EDITOR=/usr/local/bin/nvim export VISUAL=/usr/local/bin/nvim EOF chmod 644 /etc/profile.d/neovim.sh echo "==> Verifying installation" for cmd in vi vim nvim; do TARGET="$(readlink -f "$BIN_DIR/$cmd")" if [[ "$TARGET" != "$INSTALL_DIR/bin/nvim" ]]; then echo "Verification failed: $cmd" >&2 exit 1 fi printf '%-5s -> %s\n' "$cmd" "$TARGET" done echo "$INSTALL_DIR/bin/nvim" --version | head -n 1 echo echo "Neovim installation completed." echo "Please reopen your shell to refresh the environment."