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