Like 0

simbafs revised this gist 1 week ago · 7477f26

1 file changed, 109 insertions

neovim.sh (file created)
@@ -0,0 +1,109 @@
1 +
2 + #!/usr/bin/env bash
3 + set -Eeuo pipefail
4 +
5 + INSTALL_DIR="/opt/nvim"
6 + BACKUP_DIR="/opt/nvim.backup"
7 + BIN_DIR="/usr/local/bin"
8 +
9 + if [[ $EUID -ne 0 ]]; then
10 + exec sudo bash "$0" "$@"
11 + fi
12 +
13 + case "$(dpkg --print-architecture)" in
14 + amd64) ARCH="x86_64" ;;
15 + arm64) ARCH="arm64" ;;
16 + *)
17 + echo "Unsupported architecture" >&2
18 + exit 1
19 + ;;
20 + esac
21 +
22 + echo "==> Installing dependencies"
23 + apt-get update
24 + apt-get install -y curl ca-certificates tar
25 +
26 + TMP_DIR="$(mktemp -d)"
27 + trap 'rm -rf "$TMP_DIR"' EXIT
28 +
29 + ASSET="nvim-linux-${ARCH}"
30 + URL="https://github.com/neovim/neovim/releases/latest/download/${ASSET}.tar.gz"
31 +
32 + echo "==> Downloading latest Neovim"
33 + curl -fL --retry 3 \
34 + "$URL" \
35 + -o "$TMP_DIR/nvim.tar.gz"
36 +
37 + echo "==> Extracting Neovim"
38 + tar -xzf "$TMP_DIR/nvim.tar.gz" -C "$TMP_DIR"
39 +
40 + "$TMP_DIR/$ASSET/bin/nvim" --version | head -n 1
41 +
42 + echo "==> Installing to $INSTALL_DIR"
43 +
44 + # Remove the previous backup
45 + rm -rf "$BACKUP_DIR"
46 +
47 + # Back up the current installation
48 + if [[ -e "$INSTALL_DIR" ]]; then
49 + mv "$INSTALL_DIR" "$BACKUP_DIR"
50 + fi
51 +
52 + # Install the new version
53 + if ! mv "$TMP_DIR/$ASSET" "$INSTALL_DIR"; then
54 + if [[ -d "$BACKUP_DIR" ]]; then
55 + mv "$BACKUP_DIR" "$INSTALL_DIR"
56 + fi
57 + exit 1
58 + fi
59 +
60 + echo "==> Creating command symlinks"
61 + mkdir -p "$BIN_DIR"
62 +
63 + for cmd in vi vim nvim; do
64 + ln -sfn "$INSTALL_DIR/bin/nvim" "$BIN_DIR/$cmd"
65 + done
66 +
67 + echo "==> Configuring update-alternatives"
68 +
69 + update-alternatives \
70 + --install /usr/bin/vi vi "$INSTALL_DIR/bin/nvim" 100
71 +
72 + update-alternatives \
73 + --install /usr/bin/vim vim "$INSTALL_DIR/bin/nvim" 100
74 +
75 + update-alternatives \
76 + --install /usr/bin/editor editor "$INSTALL_DIR/bin/nvim" 100
77 +
78 + for cmd in vi vim editor; do
79 + update-alternatives --set "$cmd" "$INSTALL_DIR/bin/nvim"
80 + done
81 +
82 + echo "==> Setting EDITOR and VISUAL"
83 +
84 + cat > /etc/profile.d/neovim.sh <<'EOF'
85 + export EDITOR=/usr/local/bin/nvim
86 + export VISUAL=/usr/local/bin/nvim
87 + EOF
88 +
89 + chmod 644 /etc/profile.d/neovim.sh
90 +
91 + echo "==> Verifying installation"
92 +
93 + for cmd in vi vim nvim; do
94 + TARGET="$(readlink -f "$BIN_DIR/$cmd")"
95 +
96 + if [[ "$TARGET" != "$INSTALL_DIR/bin/nvim" ]]; then
97 + echo "Verification failed: $cmd" >&2
98 + exit 1
99 + fi
100 +
101 + printf '%-5s -> %s\n' "$cmd" "$TARGET"
102 + done
103 +
104 + echo
105 + "$INSTALL_DIR/bin/nvim" --version | head -n 1
106 +
107 + echo
108 + echo "Neovim installation completed."
109 + echo "Please reopen your shell to refresh the environment."