-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetup.sh
executable file
·382 lines (288 loc) · 8.9 KB
/
setup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
#!/bin/bash
# Prompt for Yes/No (Ref: https://gist.github.com/karancode/f43bc93f9e47f53e71fa29eed638243c)
ask() {
local prompt default reply
if [[ ${2:-} = 'Y' ]]; then
prompt='Y/n'
default='Y'
elif [[ ${2:-} = 'N' ]]; then
prompt='y/N'
default='N'
else
prompt='y/n'
default=''
fi
while true; do
# Ask the question (not using "read -p" as it uses stderr not stdout)
echo -n "$1 [$prompt] "
# Read the answer (use /dev/tty in case stdin is redirected from somewhere else)
read -r reply </dev/tty
# Default?
if [[ -z $reply ]]; then
reply=$default
fi
# Check if the reply is valid
case "$reply" in
Y*|y*) return 0 ;;
N*|n*) return 1 ;;
esac
done
}
#Make sure everything is up to date
if ask 'Update everything before we start?' Y ; then
sudo apt update -y
sudo apt upgrade -y
sudo apt autoremove -y
fi
# OpenSSL
sudo apt install -y libssl-dev
# Curl
sudo apt install -y curl
# git
sudo apt install -y git
# FUSE
sudo add-apt-repository -y universe
sudo apt install -y libfuse2
# tmux
install_tmux_theme()
{
# Tmux theme
TMUX_THEME_DIR=~/.local/share/tmux/plugins/tmux-themepack
if ! test -d $TMUX_THEME_DIR; then
git clone https://github.com/jimeh/tmux-themepack.git $TMUX_THEME_DIR
fi
}
if ! which tmux > /dev/null; then
if ask 'Install tmux?' Y; then
sudo apt install -y tmux
install_tmux_theme
fi
else
install_tmux_theme
fi
# The directory for installing binary executables
BIN_DIR=/usr/bin
# neovim
NEOVIM_PATH=$BIN_DIR/nvim
if ! test -f $NEOVIM_PATH; then
sudo curl -L https://github.com/neovim/neovim/releases/latest/download/nvim.appimage --create-dirs -o $NEOVIM_PATH
sudo chmod +x $NEOVIM_PATH
fi
# Languages and Coc Extensions
COC_EXTENSIONS='coc-json coc-yaml coc-pairs coc-snippets'
# Treesitters
TREESITTERS='json yaml'
# C/C++ and build tools
install_c_cpp()
{
COC_EXTENSIONS+=' coc-clangd coc-cmake'
TREESITTERS+=' c cpp cmake'
# Set the CMake generator to Ninja, in environment variables of .bashrc
if [[ -z $CMAKE_GENERATOR ]]; then
echo $'\nexport CMAKE_GENERATOR=\'Ninja\'' >> $HOME/.bashrc
fi
# Have CMake generate compile_commands.json, in environment variables of .bashrc
if [[ -z $CMAKE_EXPORT_COMPILE_COMMANDS ]]; then
echo $'\nexport CMAKE_EXPORT_COMPILE_COMMANDS=1' >> $HOME/.bashrc
fi
}
if ! which g++ > /dev/null || ! which cmake > /dev/null || ! which ninja > /dev/null || ! which clangd > /dev/null; then
if ask $'\nInstall C/C++, CMake, and Ninja?' Y; then
# g++
sudo apt install -y g++
# CMake
sudo apt install -y cmake
# Ninja
sudo apt install -y ninja-build
# Clangd for Neovim
sudo apt install -y clangd-15
sudo update-alternatives --install $BIN_DIR/clangd clangd $BIN_DIR/clangd-15 100
install_c_cpp
fi
else
install_c_cpp
fi
# Java
install_java()
{
COC_EXTENSIONS+=' coc-java'
TREESITTERS+=' java'
}
if ! which java > /dev/null || ! which javac > /dev/null; then
if ask $'\nInstall Java?' Y; then
# OpenJDK
sudo apt install -y openjdk-19-jdk-headless
install_java
fi
else
install_java
fi
# HTML CSS JS
if ask $'\nInstall HTML, CSS, and JS?' Y; then
HTML_CSS_JS_INSTALL=true
COC_EXTENSIONS+=' coc-html coc-css coc-tsserver coc-emmet'
TREESITTERS+=' html css javascript typescript'
fi
# Python
install_python()
{
COC_EXTENSIONS+=' coc-pyright'
TREESITTERS+=' python'
}
if ! which python > /dev/null; then
if ask $'\nInstall Python extensions?' Y; then
install_python
fi
else
install_python
fi
# Lua extensions
install_lua()
{
COC_EXTENSIONS+=' coc-sumneko-lua'
TREESITTERS+=' lua'
}
if ! which lua-language-server > /dev/null || ! which $HOME/.config/coc/extensions/coc-lua-data/lua-language-server/bin/lua-language-server > /dev/null; then
if ask $'\nInstall Lua extensions?' Y; then
install_lua
fi
# Lua
if ask $'\nInstall Lua (The language, independent from extensions)?' Y; then
sudo apt install lua5.4
install_lua
fi
else
install_lua
fi
# Node.js for Coc
if ! which node > /dev/null; then
curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash - &&\
sudo apt install -y nodejs
fi
# Live server
if ! test -z ${HTML_CSS_JS_INSTALL+x} && ! which live-server > /dev/null; then
sudo npm i -g live-server
fi
# Ensure python is installed
sudo apt install -y python3
sudo ln -s /bin/python3 /bin/python
# Ensure pip is installed
sudo apt install -y python3-pip
# Install pynvim for coc-snippets
python -m pip install --user --upgrade pynvim
# Neovim Packer and Plugins
echo 'Installing Neovim plugins'
nvim --headless +"autocmd User PackerComplete qa"
echo
nvim --headless +"autocmd User PackerComplete qa" +"silent PackerSync"
# Neovim Coc Extensions
echo -e "\nInstalling Neovim Coc extensions: $COC_EXTENSIONS"
nvim --headless +"CocInstall -sync $COC_EXTENSIONS|qa"
# Neovimm Treesitters
echo -e "\nInstalling Neovim Treesitters: $TREESITTERS"
nvim +"TSInstallSync $TREESITTERS|qa"
# Neovim Telescope dependency
sudo apt install -y ripgrep
# Don't show dotfiles untracked files
git --git-dir=$HOME/.dotfiles --work-tree=$HOME config status.showUntrackedFiles no
# Git credentials
if ask 'Do you want to provide your git commit name and email?' Y; then
while read -p $'\tName: ' GIT_USERNAME && [[ -z $GIT_USERNAME ]]; do :
done
while read -p $'\tEmail: ' GIT_EMAIL && [[ -z $GIT_EMAIL ]]; do :
done
git config --global user.name "$GIT_USERNAME"
git config --global user.email "$GIT_EMAIL"
fi
if ask 'Allow git credentials to be stored on disk?' Y; then
git config --global credential.helper store
fi
# Git default branch
if ask 'Set default git init branch name to main?' Y; then
git config --global init.defaultBranch main
fi
# Git mergetool
if ask 'Set default git mergetool to nvimdiff?' Y; then
git config --global merge.tool nvimdiff
fi
# Git merge backup
if ask 'Disable git merge backup files?' Y; then
git config --global mergetool.keepBackup false
fi
# Auto-completion for bash aliases
sudo apt install -y bash-completion
BASH_COMPLETION_PATH=$HOME/.bash_completion
COMPLETE_ALIAS_PATH=~/.config/.complete_alias
BASH_COMPLETION_DATA=". $COMPLETE_ALIAS_PATH > /dev/null 2>&1"
if ! test -f $BASH_COMPLETION_PATH || ! grep -q "^$BASH_COMPLETION_DATA\$" $BASH_COMPLETION_PATH; then
echo "$BASH_COMPLETION_DATA" >> $BASH_COMPLETION_PATH
fi
# Platform specific commands to execute
sudo apt install -y grep
FONT_NAME='JetBrainsMono'
FONT_FACE="${FONT_NAME}NL Nerd Font Mono"
FONT_VER='v2.3.3'
# If we are running in WSL
if [[ $(grep -Fi 'Microsoft' /proc/version) ]]; then
# systemd, check if /etc/wsl.conf has the required data for systemd
WSL_CONF_PATH=/etc/wsl.conf
WSL_CONF_DATA=$'[boot]\nsystemd=true'
if ! test -f $WSL_CONF_PATH || [[ $(< $WSL_CONF_PATH) != "$WSL_CONF_DATA" ]]; then
echo "$WSL_CONF_DATA" | sudo tee $WSL_CONF_PATH > /dev/null
fi
# TODO: Either show them where to download and install, then
# set their terminal settings font to JetBrainsMonoNL Nerd Font Mono
# Or interact with windows through here
echo $'\nChange the font of the terminal by going to: Terminal > Settings (CTRL + ,) > Profile > Additional settings > Appearance'
echo "- Font: $FONT_FACE"
echo '- Font Size: 12'
echo '- Font Weight: Medium'
# If it is pure linux
else
# JetBrainsMono font
FONTS_DIR=/usr/local/share/fonts
FONT_PATH=$FONTS_DIR/$FONT_NAME
# Allow fonts to be installed with `fc-cache -fv`
sudo apt install -y fontconfig
# If the font already exists
if ! fc-list : family | sort | uniq | grep -q "$FONT_FACE" && ! test -d $FONT_PATH; then
FONT_ZIP_FILE=$FONT_PATH.zip
curl -L https://github.com/ryanoasis/nerd-fonts/releases/download/$FONT_VER/${FONT_NAME}.zip --create-dirs -o $FONT_ZIP_FILE
# unzip
sudo apt install -y unzip
unzip $FONT_ZIP_FILE -d $FONT_PATH
rm $FONT_ZIP_FILE
# Add the font
fc-cache -fv
fi
echo $'\nChange the font of the terminal by going to: Terminal > Preferences > Profile > Text > Custom font'
echo "- Font: $FONT_FACE"
echo '- Font Size: 12'
echo '- Font Weight: Medium'
fi
# Add our custom .profile on top of the existing .profile, by sourcing
PROFILE_PATH=~/.config/.profile
PROFILE_DATA=". $PROFILE_PATH"
PROFILE_DEFAULT_PATH=$HOME/.profile
if ! test -f $PROFILE_DEFAULT_PATH || ! grep -q "^$PROFILE_DATA\$" $PROFILE_DEFAULT_PATH; then
echo "$PROFILE_DATA" >> $PROFILE_DEFAULT_PATH
fi
# Add our custom .bashrc on top of the existing .bashrc, by sourcing
BASHRC_PATH=~/.config/.bashrc
BASHRC_DATA=". $BASHRC_PATH"
BASHRC_DEFAULT_PATH=$HOME/.bashrc
if ! test -f $BASHRC_DEFAULT_PATH || ! grep -q "^$BASHRC_DATA\$" $BASHRC_DEFAULT_PATH; then
echo "$BASHRC_DATA" >> $BASHRC_DEFAULT_PATH
fi
# Add our custom .bash_logout on top of the existing .bash_logout, by sourcing
BASH_LOGOUT_PATH=~/.config/.bash_logout
BASH_LOGOUT_DATA=". $BASH_LOGOUT_PATH"
BASH_LOGOUT_DEFAULT_PATH=$HOME/.bash_logout
if ! test -f $BASH_LOGOUT_DEFAULT_PATH || ! grep -q "^$BASH_LOGOUT_DATA\$" $BASH_LOGOUT_DEFAULT_PATH; then
echo "$BASH_LOGOUT_DATA" >> $BASH_LOGOUT_DEFAULT_PATH
fi
# Finish
echo $'\nSetup complete'
read -p 'Press enter to finish'
echo
. $HOME/.bashrc