/
/
/
My dotfile repo. It sets aliases and installs generic applications for my user.
1#!/bin/bash
2
3home_dir="${HOME:-/home/$(id -un)}"
4temp_dir=${home_dir}/tmp
5#code_dir=${home_dir}/personal/misc_code
6code_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/.."
7local_bin_dir=${home_dir}/.local/bin
8local_app_dir=${home_dir}/.local/share/applications
9local_icon_dir=${home_dir}/.local/share/icons/hicolor/apps
10local_lib_dir=${home_dir}/.local/lib
11font_dir=${home_dir}/.fonts
12
13
14mkdir -p ${code_dir}
15mkdir -p ${local_bin_dir}
16mkdir -p ${local_app_dir}
17mkdir -p ${local_icon_dir}
18mkdir -p ${local_lib_dir}
19mkdir -p ${temp_dir}
20mkdir -p ${font_dir}
21mkdir -p ${home_dir}/.local/opt/
22
23wget -nc -O ${temp_dir}/nerdfont.zip 'https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/FiraCode.zip'
24
25# Install nvim based on architecture
26# Install / reinstall nvim latest stable based on architecture
27arch="$(uname -m)"
28case "$arch" in
29 x86_64)
30 echo "[nvim] Installing latest x86_64 binary..."
31 nvim_asset="nvim-linux-x86_64"
32 ;;
33 aarch64)
34 echo "[nvim] Installing latest ARM64 binary..."
35 nvim_asset="nvim-linux-arm64"
36 ;;
37 *)
38 echo "[nvim] Unsupported architecture: $arch"
39 exit 1
40 ;;
41esac
42
43nvim_tar="${nvim_asset}.tar.gz"
44nvim_url="https://github.com/neovim/neovim/releases/latest/download/${nvim_tar}"
45
46# Clean old installs from your previous script layout
47rm -rf "${home_dir}/.local/opt/nvim-linux64"
48rm -rf "${home_dir}/.local/opt/nvim-linux-x86_64"
49rm -rf "${home_dir}/.local/opt/nvim-linux-arm64"
50
51# Do not use wget -nc here; for reinstall/update we WANT to overwrite the tarball
52curl -fL -o "${temp_dir}/${nvim_tar}" "${nvim_url}"
53
54tar xzf "${temp_dir}/${nvim_tar}" -C "${home_dir}/.local/opt/"
55
56ln -sf "${home_dir}/.local/opt/${nvim_asset}/bin/nvim" "${local_bin_dir}/nvim"
57
58"${local_bin_dir}/nvim" --version | head -n 1
59
60unzip -nq ${temp_dir}/nerdfont.zip -d ${font_dir}
61fc-cache -f -v
62
63bash -c "$(curl -sLo- https://superfile.dev/install.sh)"
64
65git clone --depth=1 -b 0.50.0 https://github.com/junegunn/fzf.git ${code_dir}/fzf
66git clone --depth=1 -b v1.20.0 https://github.com/romkatv/powerlevel10k.git ${code_dir}/powerlevel10k
67git clone --depth=1 https://github.com/xuyuan/fri.git ${code_dir}/fri
68git clone --depth=1 -b v1.4.4 https://github.com/so-fancy/diff-so-fancy.git ${code_dir}/diff-so-fancy
69git clone --depth=1 -b v0.9.4 https://github.com/ajeetdsouza/zoxide.git ${code_dir}/zoxide
70git clone --depth=1 https://github.com/tmux-plugins/tpm ${home_dir}/.tmux/plugins/tpm
71
72if ! command -v cargo >/dev/null 2>&1; then
73 echo "[setup] Installing Rust toolchain (userspace) ..."
74 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
75 # Load cargo for this script run
76 . "${home_dir}/.cargo/env"
77fi
78
79# Architecture detection for binary downloads
80arch="$(uname -m)"
81case "$arch" in
82 x86_64) rust_arch="x86_64-unknown-linux-gnu" ;;
83 aarch64) rust_arch="aarch64-unknown-linux-gnu" ;;
84 *)
85 echo "[rust-tools] Unsupported architecture: $arch, skipping rust tools installation"
86 exit 1
87 ;;
88esac
89
90if [ "$arch" = "x86_64" ] || [ "$arch" = "aarch64" ]; then
91 echo "[rust-tools] Installing pre-compiled binaries for $arch ..."
92
93 # Download and extract eza
94 echo "[eza] Downloading binary..."
95 mkdir -p "${temp_dir}/eza"
96
97 if curl -fsSL "https://github.com/eza-community/eza/releases/download/v0.23.0/eza_${rust_arch}.tar.gz" \
98 | tar xz -C "${temp_dir}/eza" \
99 && [ -f "${temp_dir}/eza/eza" ]; then
100
101 cp "${temp_dir}/eza/eza" "${local_bin_dir}/eza"
102 chmod +x "${local_bin_dir}/eza"
103 echo "[eza] Binary installed successfully"
104
105 else
106 echo "[eza] Binary download failed, falling back to cargo install"
107 cargo install --locked --root "${home_dir}/.local" eza
108 fi
109
110 # Download and extract bat
111 echo "[bat] Downloading binary..."
112 mkdir -p "${temp_dir}/bat"
113 if curl -fsSL "https://github.com/sharkdp/bat/releases/download/v0.24.0/bat-v0.24.0-${rust_arch}.tar.gz" \
114 | tar xz --strip-components=1 -C "${temp_dir}/bat" \
115 && [ -f "${temp_dir}/bat/bat" ]; then
116 cp "${temp_dir}/bat/bat" "${local_bin_dir}/bat"
117 chmod +x "${local_bin_dir}/bat"
118 echo "[bat] Binary installed successfully"
119 else
120 echo "[bat] Binary install failed"
121 if [ "${ALLOW_CARGO_FALLBACK:-0}" = "1" ] && command -v cargo >/dev/null 2>&1; then
122 cargo install --locked --root "${home_dir}/.local" bat
123 else
124 echo "[bat] Skipping cargo fallback"
125 fi
126 fi
127
128 # Download and extract ripgrep
129 echo "[ripgrep] Downloading binary..."
130 mkdir -p "${temp_dir}/ripgrep"
131 if curl -fsSL "https://github.com/BurntSushi/ripgrep/releases/download/14.1.1/ripgrep-14.1.1-${rust_arch}.tar.gz" | tar xz --strip-components=1 -C "${temp_dir}/ripgrep" && [ -f "${temp_dir}/ripgrep/rg" ]; then
132 cp "${temp_dir}/ripgrep/rg" "${local_bin_dir}/rg"
133 chmod +x "${local_bin_dir}/rg"
134 echo "[ripgrep] Binary installed successfully"
135 else
136 echo "[ripgrep] Binary download failed, falling back to cargo install"
137 cargo install --locked --root "${home_dir}/.local" ripgrep
138 fi
139
140 echo "[fd] Downloading binary..."
141 mkdir -p "${temp_dir}/fd"
142 if curl -fsSL "https://github.com/sharkdp/fd/releases/download/v10.2.0/fd-v10.2.0-${rust_arch}.tar.gz" | tar xz --strip-components=1 -C "${temp_dir}/fd" && [ -f "${temp_dir}/fd/fd" ]; then
143 cp "${temp_dir}/fd/fd" "${local_bin_dir}/fd"
144 chmod +x "${local_bin_dir}/fd"
145 echo "[fd] Binary installed successfully"
146 else
147 echo "[fd] Binary download failed, falling back to cargo install"
148 cargo install --locked --root "${home_dir}/.local" fd-find
149 fi
150
151fi
152
153NODE_VERSION="${NODE_VERSION:-v20.17.0}"
154
155arch="$(uname -m)"
156case "$arch" in
157 x86_64) node_arch="x64" ;;
158 aarch64) node_arch="arm64" ;;
159 *)
160 echo "[node] Unsupported architecture: $arch"; exit 1 ;;
161esac
162
163node_base="node-${NODE_VERSION}-linux-${node_arch}"
164node_tar="${node_base}.tar.xz"
165node_url="https://nodejs.org/dist/${NODE_VERSION}/${node_tar}"
166
167if [ ! -x "${home_dir}/.local/opt/${node_base}/bin/node" ]; then
168 echo "[node] downloading ${node_url}"
169 curl -fsSL -o "${temp_dir}/${node_tar}" "${node_url}"
170 echo "[node] installing to ~/.local/opt/${node_base}"
171 tar -xJf "${temp_dir}/${node_tar}" -C "${home_dir}/.local/opt/"
172fi
173
174ln -sf "${home_dir}/.local/opt/${node_base}/bin/node" "${local_bin_dir}/node"
175ln -sf "${home_dir}/.local/opt/${node_base}/bin/npm" "${local_bin_dir}/npm"
176ln -sf "${home_dir}/.local/opt/${node_base}/bin/npx" "${local_bin_dir}/npx"
177
178rm -f ${home_dir}/.claude && ln -s ${code_dir}/dotfiles/.claude ${home_dir}/.claude
179
180mkdir -p ${home_dir}/.claude/local
181${local_bin_dir}/npm install --prefix ${home_dir}/.claude/local @anthropic-ai/claude-code
182
183cat > ${local_bin_dir}/claude << 'EOF'
184#!/bin/bash
185exec "${HOME}/.local/bin/node" "${HOME}/.claude/local/node_modules/.bin/claude" "$@"
186EOF
187chmod +x ${local_bin_dir}/claude
188
189yes | . ${code_dir}/fzf/install
190. ${code_dir}/zoxide/install.sh
191
192rm -f ${local_bin_dir}/fri && ln -s ${code_dir}/fri/fri ${local_bin_dir}/fri
193rm -f ${home_dir}/.dircolors && ln -s ${code_dir}/dotfiles/.dircolors ${home_dir}/.dircolors
194
195# Build diff-so-fancy (handle missing dependency gracefully)
196cd ${code_dir}/diff-so-fancy/third_party/build_fatpack
197if perl build.pl --output ${local_bin_dir}/diff-so-fancy 2>/dev/null; then
198 echo "[diff-so-fancy] Built successfully"
199else
200 echo "[diff-so-fancy] Build failed - missing App::FatPacker, using direct script"
201 # Use the direct script as fallback
202 ln -sf "${code_dir}/diff-so-fancy/diff-so-fancy" "${local_bin_dir}/diff-so-fancy"
203 chmod +x "${local_bin_dir}/diff-so-fancy"
204fi
205cd ${home_dir}
206
207
208rm -f ${home_dir}/.zshrc && ln -s ${code_dir}/dotfiles/.zshrc ${home_dir}/.zshrc
209rm -f ${home_dir}/.p10k.zsh && ln -s ${code_dir}/dotfiles/.p10k.zsh ${home_dir}/.p10k.zsh
210rm -f ${home_dir}/.powerlevel10k.zsh-theme && ln -s ${code_dir}/powerlevel10k/powerlevel10k.zsh-theme ${home_dir}/.powerlevel10k.zsh-theme
211rm -f ${home_dir}/.aliases && ln -s ${code_dir}/dotfiles/.aliases ${home_dir}/.aliases
212rm -rf ${home_dir}/.config/git && mkdir -p ${home_dir}/.config/git && ln -s ${code_dir}/dotfiles/.config/git/config ${home_dir}/.config/git/config
213rm -rf ${home_dir}/.config/tmux && ln -s ${code_dir}/dotfiles/.config/tmux ${home_dir}/.config/
214rm -rf ${home_dir}/.config/nvim && ln -s ${code_dir}/dotfiles/.config/nvim ${home_dir}/.config/nvim
215
216# Install tmux plugins
217. ${home_dir}/.tmux/plugins/tpm/bin/install_plugins
218
219# Install nvim plugins
220${local_bin_dir}/nvim --headless "+Lazy! sync" +qa
221