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