From 2c014e281f6332d73118c760cd3a84c0d9199919 Mon Sep 17 00:00:00 2001 From: js0ny Date: Thu, 27 Feb 2025 03:02:55 +0000 Subject: [PATCH] chore(bootstrap): optimize shell-scripts for robustness --- bootstrap/components/mocha-port.bash | 232 ++++++++++++++++++ .../{temp => components}/mocha_port.fish | 0 bootstrap/components/rime.sh | 2 +- bootstrap/components/symlinks.bash | 130 +++++----- bootstrap/components/zsh.sh | 28 +-- bootstrap/linux/appman.bash | 6 +- bootstrap/linux/chromium-flags.bash | 40 +-- bootstrap/linux/main.bash | 138 ++++++----- bootstrap/linux/symlinks.bash | 26 +- bootstrap/linux/wsl.bash | 0 bootstrap/macOS/symlinks.zsh | 2 +- common/haskeline | 3 + tools/bash/bashrc | 18 +- 13 files changed, 441 insertions(+), 184 deletions(-) create mode 100644 bootstrap/components/mocha-port.bash rename bootstrap/{temp => components}/mocha_port.fish (100%) create mode 100644 bootstrap/linux/wsl.bash diff --git a/bootstrap/components/mocha-port.bash b/bootstrap/components/mocha-port.bash new file mode 100644 index 0000000..4a15ff4 --- /dev/null +++ b/bootstrap/components/mocha-port.bash @@ -0,0 +1,232 @@ +#!/usr/bin/env bash +# Adds better error handling and safety features +# shellcheck disable=SC2016 + +# TODO: UNTESTED +set -e # Exit immediately if a command exits with a non-zero status +set -u # Treat unset variables as an error + +# Create temporary working directory +TEMP_DIR="${HOME}/.tmp/catppuccin-install" +mkdir -p "${TEMP_DIR}" + +# Create config directories +mkdir -p "${HOME}/.config/tmux/plugins" +mkdir -p "${HOME}/.config/yazi" +mkdir -p "${HOME}/.config/btop/themes" +mkdir -p "${HOME}/.config/git" +mkdir -p "${HOME}/.config/lsd" +mkdir -p "${HOME}/.local/share/mc/skins" +mkdir -p "${HOME}/.config/fish/themes" +mkdir -p "${HOME}/.local/share/fcitx5/themes" + +# Function for downloading files +download_file() { + local url="$1" + local output_path="$2" + local output_dir + + # Extract directory from output path + output_dir=$(dirname "$output_path") + + # Create directory if it doesn't exist + if [ ! -d "$output_dir" ]; then + mkdir -p "$output_dir" + fi + + # Print status message + echo "Downloading: $url" + echo " to: $output_path" + + # Download with curl (using -L to follow redirects) + if ! curl -L -s --fail "$url" -o "$output_path"; then + echo "Error: Failed to download $url" >&2 + return 1 + fi + + # Verify file was downloaded + if [ ! -f "$output_path" ]; then + echo "Error: File was not created at $output_path" >&2 + return 1 + fi + + echo "Download successful." + return 0 +} + +# Function to check if command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Install Bat themes +if command_exists bat; then + BAT_CONFIG_DIR=$(bat --config-dir 2>/dev/null || echo "${HOME}/.config/bat") + mkdir -p "${BAT_CONFIG_DIR}/themes" + + echo "Installing Bat themes..." + THEMES=("Latte" "Frappe" "Macchiato" "Mocha") + + for theme in "${THEMES[@]}"; do + download_file "https://github.com/catppuccin/bat/raw/main/themes/Catppuccin%20${theme}.tmTheme" \ + "${BAT_CONFIG_DIR}/themes/Catppuccin ${theme}.tmTheme" + done + + echo "Rebuilding Bat cache..." + bat cache --build || echo "WARNING: Failed to rebuild Bat cache" >&2 +else + echo "Bat not found, skipping Bat themes installation" >&2 +fi + +# Install Tmux plugin +if command_exists tmux; then + echo "Installing Tmux plugin..." + + TMUX_PLUGIN_DIR="${HOME}/.config/tmux/plugins/catppuccin" + rm -rf "${TMUX_PLUGIN_DIR}" + mkdir -p "${TMUX_PLUGIN_DIR}" + + if command_exists git; then + if ! git clone -b v2.1.2 --depth=1 https://github.com/catppuccin/tmux.git "${TMUX_PLUGIN_DIR}/tmux" 2>/dev/null; then + echo "WARNING: Failed to clone Tmux plugin repository" >&2 + fi + else + echo "Git not found, skipping Tmux plugin installation" >&2 + fi +else + echo "Tmux not found, skipping Tmux plugin installation" >&2 +fi + +# Install Yazi theme +if command_exists yazi; then + echo "Installing Yazi theme..." + download_file "https://raw.githubusercontent.com/catppuccin/yazi/main/themes/mocha/catppuccin-mocha-lavender.toml" \ + "${HOME}/.config/yazi/theme.toml" +else + echo "Yazi not found, skipping Yazi theme installation" >&2 +fi + +# Install BTopa themes +if command_exists btop; then + echo "Installing BTopa themes..." + download_file "https://raw.githubusercontent.com/catppuccin/btop/main/themes/catppuccin_mocha.theme" \ + "${HOME}/.config/btop/themes/catppuccin_mocha.theme" + download_file "https://raw.githubusercontent.com/catppuccin/btop/main/themes/catppuccin_latte.theme" \ + "${HOME}/.config/btop/themes/catppuccin_latte.theme" +else + echo "BTopa not found, skipping BTopa themes installation" >&2 +fi + +# Install Delta config +echo "Installing Delta config..." +download_file "https://raw.githubusercontent.com/catppuccin/delta/main/catppuccin.gitconfig" \ + "${HOME}/.config/git/catppuccin-delta.gitconfig" + +# Configure FZF +if command_exists fzf; then + echo "Configuring FZF..." + + # Check shell type to determine how to set environment variables + if [ -n "${FISH_VERSION:-}" ] || command_exists fish; then + # For Fish shell + fish -c 'set -U FZF_DEFAULT_OPTS "--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8 --color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc --color=marker:#b4befe,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8 --color=selected-bg:#45475a --multi"' || + echo "WARNING: Failed to set FZF options for Fish shell" >&2 + else + # For Bash/Zsh - add to both .bashrc and .zshrc if they exist + FZF_CONFIG="export FZF_DEFAULT_OPTS=\"--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8 --color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc --color=marker:#b4befe,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8 --color=selected-bg:#45475a --multi\"" + + # Add to .bashrc if it exists + if [ -f "${HOME}/.bashrc" ]; then + if ! grep -q "FZF_DEFAULT_OPTS.*catppuccin" "${HOME}/.bashrc"; then + echo "${FZF_CONFIG}" >>"${HOME}/.bashrc" + echo "Added FZF configuration to .bashrc" + fi + fi + + # Add to .zshrc if it exists + if [ -f "${HOME}/.zshrc" ]; then + if ! grep -q "FZF_DEFAULT_OPTS.*catppuccin" "${HOME}/.zshrc"; then + echo "${FZF_CONFIG}" >>"${HOME}/.zshrc" + echo "Added FZF configuration to .zshrc" + fi + fi + fi +else + echo "FZF not found, skipping FZF configuration" >&2 +fi + +# Install LSD themes +if command_exists lsd; then + echo "Installing LSD themes..." + download_file "https://raw.githubusercontent.com/catppuccin/lsd/main/themes/catppuccin-mocha/colors.yaml" \ + "${HOME}/.config/lsd/colors.yaml" + download_file "https://raw.githubusercontent.com/catppuccin/lsd/main/themes/catppuccin-latte/colors.yaml" \ + "${HOME}/.config/lsd/colors-light.yaml" +else + echo "LSD not found, skipping LSD themes installation" >&2 +fi + +# Install Midnight Commander skin +echo "Installing Midnight Commander skin..." +download_file "https://raw.githubusercontent.com/catppuccin/mc/main/catppuccin.ini" \ + "${HOME}/.local/share/mc/skins/catppuccin.ini" + +# Print MC configuration hint +echo "Note: To use the Midnight Commander theme:" +echo " - Change or add skin=catppuccin in the [Midnight-Commander] section inside ~/.config/mc/ini" +echo " - OR choose the skin inside Midnight Commander through F9 > Options > Appearance" +echo " - Save setup through F9 > Options > Save setup" + +# Install PowerShell module +if command_exists pwsh; then + echo "Installing PowerShell module..." + PS_MODULE_PATH=$(pwsh -C 'Write-Output $Env:PSModulePath.split(":")[0]' 2>/dev/null) + + if [ -n "${PS_MODULE_PATH}" ]; then + if command_exists git; then + if ! git clone --depth=1 https://github.com/catppuccin/powershell.git "${PS_MODULE_PATH}/Catppuccin" 2>/dev/null; then + echo "WARNING: Failed to clone PowerShell module repository" >&2 + fi + else + echo "Git not found, skipping PowerShell module installation" >&2 + fi + else + echo "PowerShell module path not found, skipping PowerShell module installation" >&2 + fi +else + echo "PowerShell not found, skipping PowerShell module installation" >&2 +fi + +# Install Fish themes +if command_exists fish; then + echo "Installing Fish themes..." + download_file "https://raw.githubusercontent.com/catppuccin/fish/main/themes/Catppuccin%20Mocha.theme" \ + "${HOME}/.config/fish/themes/Catppuccin Mocha.theme" + download_file "https://raw.githubusercontent.com/catppuccin/fish/main/themes/Catppuccin%20Latte.theme" \ + "${HOME}/.config/fish/themes/Catppuccin Latte.theme" +else + echo "Fish not found, skipping Fish themes installation" >&2 +fi + +# Install Fcitx5 themes +if command_exists fcitx5; then + echo "Installing Fcitx5 themes..." + + rm -rf "${TEMP_DIR}/fcitx5" + if command_exists git; then + if git clone --depth=1 https://github.com/catppuccin/fcitx5.git "${TEMP_DIR}/fcitx5" 2>/dev/null; then + cp -r "${TEMP_DIR}/fcitx5/src/"* "${HOME}/.local/share/fcitx5/themes/" + else + echo "WARNING: Failed to clone Fcitx5 repository" >&2 + fi + else + echo "Git not found, skipping Fcitx5 themes installation" >&2 + fi +else + echo "Fcitx5 not found, skipping Fcitx5 themes installation" >&2 +fi + +# Clean up temporary directory +rm -rf "${TEMP_DIR}" + +echo "Catppuccin themes installation completed!" diff --git a/bootstrap/temp/mocha_port.fish b/bootstrap/components/mocha_port.fish similarity index 100% rename from bootstrap/temp/mocha_port.fish rename to bootstrap/components/mocha_port.fish diff --git a/bootstrap/components/rime.sh b/bootstrap/components/rime.sh index 85af366..b98bfb3 100644 --- a/bootstrap/components/rime.sh +++ b/bootstrap/components/rime.sh @@ -1,7 +1,7 @@ echo "[INFO] Installing Rime" git clone --depth 1 https://github.com/js0ny/rime_wanxiang_pro.git ~/Library/Rime -cd ~/Library/Rime +cd ~/Library/Rime || exit just init # just install_rime diff --git a/bootstrap/components/symlinks.bash b/bootstrap/components/symlinks.bash index 1ddb99b..4655d72 100644 --- a/bootstrap/components/symlinks.bash +++ b/bootstrap/components/symlinks.bash @@ -16,9 +16,9 @@ XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" echo "[INFO] Setting up some local directories" -test -d $XDG_CACHE_HOME || mkdir -p $XDG_CACHE_HOME -test -d $XDG_DATA_HOME || mkdir -p $XDG_DATA_HOME -test -d $XDG_STATE_HOME || mkdir -p $XDG_STATE_HOME +test -d "$XDG_CACHE_HOME" || mkdir -p "$XDG_CACHE_HOME" +test -d "$XDG_DATA_HOME" || mkdir -p "$XDG_DATA_HOME" +test -d "$XDG_STATE_HOME" || mkdir -p "$XDG_STATE_HOME" test -d ~/.local/state/zsh || mkdir -p ~/.local/state/zsh # echo "[INFO] Setting up system-wide zsh configuration" @@ -29,74 +29,74 @@ test -d ~/.local/state/zsh || mkdir -p ~/.local/state/zsh declare -A linkDots linkDots=( - ["$DOTFILES/common/condarc.yaml"]="$XDG_CONFIG_HOME/conda/.condarc" - # ["$DOTFILES/common/gitconfig"]="$XDG_CONFIG_HOME/git/config" - ["$DOTFILES/common/glow.yaml"]="$HOME/.config/glow/config.yml" - ["$DOTFILES/common/haskeline"]="$HOME/.haskeline" - ["$DOTFILES/common/ideavimrc"]="$XDG_CONFIG_HOME/ideavim/ideavimrc" - ["$DOTFILES/common/lazygit.yaml"]="$XDG_CONFIG_HOME/lazygit/config.yml" - ["$DOTFILES/common/lesskey"]="$XDG_CONFIG_HOME/lesskey" - ["$DOTFILES/common/npmrc"]="$NPM_CONFIG_USERCONFIG" - ["$DOTFILES/common/NuGet.Config"]="$XDG_CONFIG_HOME/NuGet/NuGet.Config" - ["$DOTFILES/common/pip.conf"]="$XDG_CONFIG_HOME/pip/pip.conf" - ["$DOTFILES/common/starship.toml"]="$HOME/.config/starship.toml" - ["$DOTFILES/common/tmux.conf"]="$XDG_CONFIG_HOME/tmux/tmux.conf" - ["$DOTFILES/common/vimrc"]="$XDG_CONFIG_HOME/vim/vimrc" - ["$DOTFILES/common/zellij.config.kdl"]="$HOME/.config/zellij/config.kdl" - # ["$DOTFILES/tools/emacs.d"]="$HOME/.emacs.d" - ["$DOTFILES/tools/doom"]="$HOME/.config/doom" - ["$DOTFILES/tools/fish"]="$HOME/.config/fish" - ["$DOTFILES/tools/ipython"]="$XDG_CONFIG_HOME/ipython" - ["$DOTFILES/tools/nvim"]="$XDG_CONFIG_HOME/nvim" - ["$DOTFILES/tools/yazi"]="$HOME/.config/yazi" - ["$DOTFILES/tools/zsh/zshrc"]="$ZDOTDIR/.zshrc" - ["$DOTFILES/tools/zsh/zshenv"]="$ZDOTDIR/.zshenv" - ["$DOTFILES/platforms/mac/pwshProfile.ps1"]="$HOME/.config/powershell/Microsoft.PowerShell_profile.ps1" + ["$DOTFILES/common/condarc.yaml"]="$XDG_CONFIG_HOME/conda/.condarc" + # ["$DOTFILES/common/gitconfig"]="$XDG_CONFIG_HOME/git/config" + ["$DOTFILES/common/glow.yaml"]="$HOME/.config/glow/config.yml" + ["$DOTFILES/common/haskeline"]="$HOME/.haskeline" + ["$DOTFILES/common/ideavimrc"]="$XDG_CONFIG_HOME/ideavim/ideavimrc" + ["$DOTFILES/common/lazygit.yaml"]="$XDG_CONFIG_HOME/lazygit/config.yml" + ["$DOTFILES/common/lesskey"]="$XDG_CONFIG_HOME/lesskey" + ["$DOTFILES/common/npmrc"]="$NPM_CONFIG_USERCONFIG" + ["$DOTFILES/common/NuGet.Config"]="$XDG_CONFIG_HOME/NuGet/NuGet.Config" + ["$DOTFILES/common/pip.conf"]="$XDG_CONFIG_HOME/pip/pip.conf" + ["$DOTFILES/common/starship.toml"]="$HOME/.config/starship.toml" + ["$DOTFILES/common/tmux.conf"]="$XDG_CONFIG_HOME/tmux/tmux.conf" + ["$DOTFILES/common/vimrc"]="$XDG_CONFIG_HOME/vim/vimrc" + ["$DOTFILES/common/zellij.config.kdl"]="$HOME/.config/zellij/config.kdl" + # ["$DOTFILES/tools/emacs.d"]="$HOME/.emacs.d" + ["$DOTFILES/tools/doom"]="$HOME/.config/doom" + ["$DOTFILES/tools/fish"]="$HOME/.config/fish" + ["$DOTFILES/tools/ipython"]="$XDG_CONFIG_HOME/ipython" + ["$DOTFILES/tools/nvim"]="$XDG_CONFIG_HOME/nvim" + ["$DOTFILES/tools/yazi"]="$HOME/.config/yazi" + ["$DOTFILES/tools/zsh/zshrc"]="$ZDOTDIR/.zshrc" + ["$DOTFILES/tools/zsh/zshenv"]="$ZDOTDIR/.zshenv" + ["$DOTFILES/platforms/mac/pwshProfile.ps1"]="$HOME/.config/powershell/Microsoft.PowerShell_profile.ps1" ) if [ $(uname) = "Darwin" ]; then - echo "[INFO] Running on macOS" - linkDots+=( - ["$DOTFILES/platforms/mac/karabiner"]="$HOME/.config/karabiner" - ["$DOTFILES/platforms/mac/skhdrc"]="$XDG_CONFIG_HOME/skhd/skhdrc" - ["$DOTFILES/platforms/mac/sketchybarrc"]="$XDG_CONFIG_HOME/sketchybar/sketchybarrc" - ["$DOTFILES/platforms/mac/yabairc"]="$XDG_CONFIG_HOME/yabai/yabairc" - ["$DOTFILES/tools/wezterm"]="$HOME/.config/wezterm" - ["$DOTFILES/tools/zed"]="$HOME/.config/zed" - ["$DOTFILES/tools/sioyek"]="$HOME/.config/sioyek" - ) -else - echo "[INFO] Running on Linux" - linkDots+=( - ["$DOTFILES/common/inputrc"]="$HOME/.inputrc" - ) - # WSL1 : Microsoft - # WSL2 : microsoft - # if [ "$(uname -r)" = *icrosoft* ]; then - # echo "[INFO] Running on WSL" - # : # NOP - if [ "$GUI_SETUP" -eq 1 ]; then - echo "[INFO] Setting up Linux GUI Applications" + echo "[INFO] Running on macOS" linkDots+=( - ["$DOTFILES/platforms/linux/awesome"]="$HOME/.config/awesome" - ["$DOTFILES/platforms/linux/hypr"]="$HOME/.config/hypr" - ["$DOTFILES/platforms/linux/waybar"]="$HOME/.config/waybar" - ["$DOTFILES/platforms/linux/wlogout"]="$HOME/.config/wlogout" - ["$DOTFILES/platforms/linux/mako-config"]="$HOME/.config/mako/config" - ["$DOTFILES/tools/wezterm"]="$HOME/.config/wezterm" - ["$DOTFILES/tools/zed"]="$HOME/.config/zed" - ["$DOTFILES/tools/sioyek"]="$HOME/.config/sioyek" + ["$DOTFILES/platforms/mac/karabiner"]="$HOME/.config/karabiner" + ["$DOTFILES/platforms/mac/skhdrc"]="$XDG_CONFIG_HOME/skhd/skhdrc" + ["$DOTFILES/platforms/mac/sketchybarrc"]="$XDG_CONFIG_HOME/sketchybar/sketchybarrc" + ["$DOTFILES/platforms/mac/yabairc"]="$XDG_CONFIG_HOME/yabai/yabairc" + ["$DOTFILES/tools/wezterm"]="$HOME/.config/wezterm" + ["$DOTFILES/tools/zed"]="$HOME/.config/zed" + ["$DOTFILES/tools/sioyek"]="$HOME/.config/sioyek" ) - for kde in "$DOTFILES/platforms/linux/kde/"*; do - linkDots+=["$kde"]="$HOME/.config/kde/$(basename $kde)" - # echo "Linking $kde to $HOME/.config/kde/$(basename $kde)" - done - if [ "$WHEEL" -eq 1 ]; then - echo "[INFO] Setting up system environment variables" - echo "[ACTION] Elevation required!" - sudo cp "$DOTFILES/platforms/linux/etc/environment" "/etc/environment" +else + echo "[INFO] Running on Linux" + linkDots+=( + ["$DOTFILES/common/inputrc"]="$HOME/.inputrc" + ) + # WSL1 : Microsoft + # WSL2 : microsoft + # if [ "$(uname -r)" = *icrosoft* ]; then + # echo "[INFO] Running on WSL" + # : # NOP + if [ "$GUI_SETUP" -eq 1 ]; then + echo "[INFO] Setting up Linux GUI Applications" + linkDots+=( + ["$DOTFILES/platforms/linux/awesome"]="$HOME/.config/awesome" + ["$DOTFILES/platforms/linux/hypr"]="$HOME/.config/hypr" + ["$DOTFILES/platforms/linux/waybar"]="$HOME/.config/waybar" + ["$DOTFILES/platforms/linux/wlogout"]="$HOME/.config/wlogout" + ["$DOTFILES/platforms/linux/mako-config"]="$HOME/.config/mako/config" + ["$DOTFILES/tools/wezterm"]="$HOME/.config/wezterm" + ["$DOTFILES/tools/zed"]="$HOME/.config/zed" + ["$DOTFILES/tools/sioyek"]="$HOME/.config/sioyek" + ) + for kde in "$DOTFILES/platforms/linux/kde/"*; do + linkDots+=["$kde"]="$HOME/.config/kde/$(basename "$kde")" + # echo "Linking $kde to $HOME/.config/kde/$(basename $kde)" + done + if [ "$WHEEL" -eq 1 ]; then + echo "[INFO] Setting up system environment variables" + echo "[ACTION] Elevation required!" + sudo cp "$DOTFILES/platforms/linux/etc/environment" "/etc/environment" + fi fi - fi fi echo "[INFO] Copying example files" diff --git a/bootstrap/components/zsh.sh b/bootstrap/components/zsh.sh index 128ead0..8f1871a 100644 --- a/bootstrap/components/zsh.sh +++ b/bootstrap/components/zsh.sh @@ -8,21 +8,21 @@ echo "[ACTION] Press any key to proceed" read -n 1 if [ "$WHEEL" -eq 1 ]; then - echo "[INFO] Setting up system-wide zsh configuration" - echo "[ACTION] Elevation required" - test -f "/etc/zsh/zshenv" && sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zsh/zshenv" - test -f "/etc/zshenv" && sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zshenv" - if [ $(uname) = "Darwin" ]; then - sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zshenv" - fi + echo "[INFO] Setting up system-wide zsh configuration" + echo "[ACTION] Elevation required" + test -f "/etc/zsh/zshenv" && sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zsh/zshenv" + test -f "/etc/zshenv" && sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zshenv" + if [ "$(uname)" = "Darwin" ]; then + sudo cp "$DOTFILES/tools/zsh/global.zshenv" "/etc/zshenv" + fi else - echo "[INFO] Setting up user zsh configuration" - # A fallback case to set $ZDOTDIR in ~/.zshenv if the user cannot access global zshenv - ln -sf "$DOTFILES/tools/zsh/zshenv" "$HOME/.zshenv" + echo "[INFO] Setting up user zsh configuration" + # A fallback case to set $ZDOTDIR in ~/.zshenv if the user cannot access global zshenv + ln -sf "$DOTFILES/tools/zsh/zshenv" "$HOME/.zshenv" fi echo "[INFO] Installing zsh plugins" -test -d $ZDOTDIR/plugins/zsh-autosuggestions || git clone --depth 1 https://github.com/zsh-users/zsh-autosuggestions.git $ZDOTDIR/plugins/zsh-autosuggestions -test -d $ZDOTDIR/plugins/zsh-syntax-highlighting || git clone --depth 1 https://github.com/zsh-users/zsh-syntax-highlighting.git $ZDOTDIR/plugins/zsh-syntax-highlighting -test -d $ZDOTDIR/plugins/zsh-history-substring-search || git clone --depth 1 https://github.com/zsh-users/zsh-history-substring-search.git $ZDOTDIR/plugins/zsh-history-substring-search -test -d $ZDOTDIR/plugins/zsh-completions || git clone --depth 1 https://github.com/zsh-users/zsh-completions.git $ZDOTDIR/plugins/zsh-completions +test -d "$ZDOTDIR"/plugins/zsh-autosuggestions || git clone --depth 1 https://github.com/zsh-users/zsh-autosuggestions.git "$ZDOTDIR"/plugins/zsh-autosuggestions +test -d "$ZDOTDIR"/plugins/zsh-syntax-highlighting || git clone --depth 1 https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZDOTDIR"/plugins/zsh-syntax-highlighting +test -d "$ZDOTDIR"/plugins/zsh-history-substring-search || git clone --depth 1 https://github.com/zsh-users/zsh-history-substring-search.git "$ZDOTDIR"/plugins/zsh-history-substring-search +test -d "$ZDOTDIR"/plugins/zsh-completions || git clone --depth 1 https://github.com/zsh-users/zsh-completions.git "$ZDOTDIR"/plugins/zsh-completions diff --git a/bootstrap/linux/appman.bash b/bootstrap/linux/appman.bash index 4de1113..09a74f9 100644 --- a/bootstrap/linux/appman.bash +++ b/bootstrap/linux/appman.bash @@ -6,7 +6,7 @@ wget -q https://raw.githubusercontent.com/ivan-hc/AM/main/AM-INSTALLER && chmod APPMAN_PATH="$HOME/.local/bin/appman" -if command -v $APPMAN_PATH >/dev/null 2>&1; then - $APPMAN_PATH install wezterm - $APPMAN_PATH install nvim +if command -v "$APPMAN_PATH" >/dev/null 2>&1; then + $APPMAN_PATH install wezterm + $APPMAN_PATH install nvim fi diff --git a/bootstrap/linux/chromium-flags.bash b/bootstrap/linux/chromium-flags.bash index 01731a7..41ace0d 100755 --- a/bootstrap/linux/chromium-flags.bash +++ b/bootstrap/linux/chromium-flags.bash @@ -13,34 +13,34 @@ ELECTRON_FLAG=$DOTFILES/platforms/linux/electron-flags.conf # Browser Flags browser_flags_path=( - "$XDG_CONFIG_HOME/chromium-flags.conf" # Chromium - "$XDG_CONFIG_HOME/chrome-flags.conf" # Google Chrome - "$XDG_CONFIG_HOME/thorium-flags.conf" # Thorium - "$XDG_CONFIG_HOME/vivaldi-flags.conf" # Vivaldi - "$XDG_CONFIG_HOME/vivaldi-stable.conf" # Vivaldi + "$XDG_CONFIG_HOME/chromium-flags.conf" # Chromium + "$XDG_CONFIG_HOME/chrome-flags.conf" # Google Chrome + "$XDG_CONFIG_HOME/thorium-flags.conf" # Thorium + "$XDG_CONFIG_HOME/vivaldi-flags.conf" # Vivaldi + "$XDG_CONFIG_HOME/vivaldi-stable.conf" # Vivaldi ) electron_flags_path=( - "$XDG_CONFIG_HOME/electron-flags.conf" # General - "$XDG_CONFIG_HOME/code-flags.conf" # VSCode - "$XDG_CONFIG_HOME/qq-electron-flags.conf" # Slack + "$XDG_CONFIG_HOME/electron-flags.conf" # General + "$XDG_CONFIG_HOME/code-flags.conf" # VSCode + "$XDG_CONFIG_HOME/qq-electron-flags.conf" # Slack ) for path in "${browser_flags_path[@]}"; do - if [ -f "$path" ]; then - echo "[INFO] Found Browser Flags: $path" - else - echo "[INFO] Creating Browser Flags: $path" - ln -s $BROWSER_FLAG $path - fi + if [ -f "$path" ]; then + echo "[INFO] Found Browser Flags: $path" + else + echo "[INFO] Creating Browser Flags: $path" + ln -s "$BROWSER_FLAG" "$path" + fi done for path in "${electron_flags_path[@]}"; do - if [ -f "$path" ]; then - echo "[INFO] Found Electron Flags: $path" - else - echo "[INFO] Creating Electron Flags: $path" - ln -s $ELECTRON_FLAG $path - fi + if [ -f "$path" ]; then + echo "[INFO] Found Electron Flags: $path" + else + echo "[INFO] Creating Electron Flags: $path" + ln -s "$ELECTRON_FLAG" "$path" + fi done diff --git a/bootstrap/linux/main.bash b/bootstrap/linux/main.bash index c47344a..faca32c 100644 --- a/bootstrap/linux/main.bash +++ b/bootstrap/linux/main.bash @@ -14,28 +14,34 @@ WHEEL=0 groups "$(whoami)" | grep -E -q '\b(sudo|wheel)\b' && WHEEL=1 if [ "$WHEEL" -eq 1 ]; then - echo "[INFO] Running as sudo or wheel group" + echo "[INFO] Running as sudo or wheel group" else - echo "[INFO] Not running as sudo or wheel group" + echo "[INFO] Not running as sudo or wheel group" fi export WHEEL GUI_SETUP=0 +IS_WSL=0 +WINDOWS_USER="" +PACKAGE_MANAGER="" + # NOTE: This is NOT a POSIX-compliant way, for POSIX-compliant way, use case/esac if [[ "$(uname -r)" = *Microsoft* ]]; then - echo "[INFO] Running on WSL1 Skipping GUI setup" + echo "[INFO] Running on WSL1 Skipping GUI setup" + IS_WSL=1 + WINDOWS_USER="$(cmd.exe /c "echo %USERNAME%" | tr -d '\r')" else - read -p "[ACTION] Do you want to setup Linux GUI? (y/N) " choice - case "$choice" in + read -p "[ACTION] Do you want to setup Linux GUI? (y/N) " -r choice + case "$choice" in y | Y) - GUI_SETUP=1 - ;; + GUI_SETUP=1 + ;; *) - echo "[INFO] Skipping GUI setup" - ;; - esac + echo "[INFO] Skipping GUI setup" + ;; + esac fi export GUI_SETUP @@ -43,103 +49,121 @@ export GUI_SETUP # base-devel if [ "$WHEEL" -eq 1 ]; then - echo "[INFO] Installing basic build tools" - if command -v apt >/dev/null 2>&1; then - sudo apt update - sudo apt install -y build-essential - elif command -v pacman >/dev/null 2>&1; then - sudo pacman -Syu --noconfirm - sudo pacman -S --noconfirm base-devel - else - echo "[ERROR] Unsupported package manager" - exit 1 - fi + echo "[INFO] Installing basic build tools" + if command -v apt >/dev/null 2>&1; then + sudo apt update + sudo apt install -y build-essential + PACKAGE_MANAGER="apt" + elif command -v pacman >/dev/null 2>&1; then + sudo pacman -Syu --noconfirm + sudo pacman -S --noconfirm base-devel + PACKAGE_MANAGER="pacman" + else + echo "[ERROR] Unsupported package manager" + exit 1 + fi fi echo "[INFO] Cloning Dotfiles" if [ -d "$DOTFILES" ]; then - echo "[INFO] Dotfiles already cloned" + echo "[INFO] Dotfiles already cloned" +elif [ "$IS_WSL" -eq 1 ]; then + ln -sf "/mnt/c/Users/$WINDOWS_USER/.dotfiles" "$DOTFILES" elif command -v git >/dev/null 2>&1; then - git clone https://github.com/js0ny/dotfiles.git "$DOTFILES" --depth 1 + git clone https://github.com/js0ny/dotfiles.git "$DOTFILES" --depth 1 else - echo "[ERROR] Git is not installed" - exit 1 + echo "[ERROR] Git is not installed" + exit 1 fi if [ "$WHEEL" -eq 0 ]; then - read -p "[ACTION] Do you want to install some AppImages (by AppMan)? (y/N) " choice - case "$choice" in + read -p "[ACTION] Do you want to install some AppImages (by AppMan)? (y/N) " -r choice + case "$choice" in y | Y) - source "$DOTFILES/bootstrap/linux/appman.bash" - ;; + source "$DOTFILES/bootstrap/linux/appman.bash" + ;; *) - echo "[INFO] Skipping AppMan installation" - : - ;; - esac + echo "[INFO] Skipping AppMan installation" + : + ;; + esac fi echo "[INFO] Setting up symbolic links" -source $DOTFILES/bootstrap/linux/symlinks.bash +source "$DOTFILES"/bootstrap/linux/symlinks.bash if [ "$WHEEL" -eq 1 ]; then - source $DOTFILES/tools/bash/xdg-compact.sh - source $DOTFILES/tools/bash/global.bashrc + source "$DOTFILES"/tools/bash/xdg-compact.sh + source "$DOTFILES"/tools/bash/global.bashrc fi -source $DOTFILES/tools/bash/profile -source $DOTFILES/tools/bash/bashrc -source $DOTFILES/tools/bash/bash_aliases +source "$DOTFILES"/tools/bash/profile +source "$DOTFILES"/tools/bash/bashrc +source "$DOTFILES"/tools/bash/bash_aliases if command -v zsh >/dev/null 2>&1; then - read -p "[ACTION] Do you want to setup zsh? (Y/n) " choice - case "$choice" in + read -p "[ACTION] Do you want to setup zsh? (Y/n) " -r choice + case "$choice" in n | N) - : - ;; + : + ;; *) - source $DOTFILES/bootstrap/components/zsh.sh - ;; - esac + source "$DOTFILES"/bootstrap/components/zsh.sh + ;; + esac fi if [ "$WHEEL" -eq 0 ]; then - echo "Done!" - exit 0 + echo "Done!" + exit 0 fi -read -p "[ACTION] Do you want to use other package managers? (y/N) " choice +# TODO: Add this part +read -p "[ACTION] Do you want to use other package managers? (y/N) " -r choice case "$choice" in - y | Y) +y | Y) : ;; - *) +*) : ;; esac echo "[INFO] Installing Doom Emacs" -source $DOTFILES/bootstrap/components/emacs.sh +source "$DOTFILES"/bootstrap/components/emacs.sh + +# TODO: Untestest +if [ "$IS_WSL" -eq 1 ]; then + ln -sf "/mnt/c/Users/$WINDOWS_USER" "$HOME/winhome" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Downloads" "$HOME/Downloads" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Documents" "$HOME/Documents" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Desktop" "$HOME/Desktop" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Pictures" "$HOME/Pictures" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Music" "$HOME/Music" + ln -sf "/mnt/c/Users/$WINDOWS_USER/Videos" "$HOME/Videos" +fi if [ "$GUI_SETUP" -eq 0 ]; then - echo "Done!" - exit 0 + echo "Done!" + exit 0 fi # Wayland -source $DOTFILES/bootstrap/linux/chromium-flags.sh +source "$DOTFILES"/bootstrap/linux/chromium-flags.bash # Rime -source $DOTFILES/bootstrap/components/rime.sh +source "$DOTFILES"/bootstrap/components/rime.sh # TODO: Rewrite the script(mocha_port.fish) in bash/zsh or POSIX-compliant shell echo "[INFO] Installing Color Scheme (Catppuccin Mocha)" -fish $DOTFILES/bootstrap/temp/mocha_port.fish +# fish $DOTFILES/bootstrap/temp/mocha_port.fish + +source "$DOTFILES"/bootstrap/components/mocha-port.bash echo "Done!" diff --git a/bootstrap/linux/symlinks.bash b/bootstrap/linux/symlinks.bash index 47a5172..ca0fdc1 100644 --- a/bootstrap/linux/symlinks.bash +++ b/bootstrap/linux/symlinks.bash @@ -9,21 +9,21 @@ source "$DOTFILES/bootstrap/components/symlinks.bash" echo "[INFO] DOTFILES = $DOTFILES" echo "[ACTION] Press any key to proceed" -read -n 1 +read -r -n1 -s echo "[INFO] Setting up symbolic links" for src in "${!linkDots[@]}"; do - dest="${linkDots[$src]}" - echo "Linking $src to $dest" - if [ -d "$src" ]; then - test -d "$dest" && mv "$dest" "$dest.bak" - ln -sf "$src" "$dest" - elif [ -f "$src" ]; then - dest_parent=$(dirname "$dest") - test -d "$dest_parent" || mkdir -p "$dest_parent" - ln -sf "$src" "$dest" - else - echo "[ERROR] $src does not exist" - fi + dest="${linkDots[$src]}" + echo "Linking $src to $dest" + if [ -d "$src" ]; then + test -d "$dest" && mv "$dest" "$dest.bak" + ln -sf "$src" "$dest" + elif [ -f "$src" ]; then + dest_parent=$(dirname "$dest") + test -d "$dest_parent" || mkdir -p "$dest_parent" + ln -sf "$src" "$dest" + else + echo "[ERROR] $src does not exist" + fi done diff --git a/bootstrap/linux/wsl.bash b/bootstrap/linux/wsl.bash new file mode 100644 index 0000000..e69de29 diff --git a/bootstrap/macOS/symlinks.zsh b/bootstrap/macOS/symlinks.zsh index e6d8253..f9466ca 100644 --- a/bootstrap/macOS/symlinks.zsh +++ b/bootstrap/macOS/symlinks.zsh @@ -9,7 +9,7 @@ source "$DOTFILES/bootstrap/components/symlinks.bash" echo "[INFO] DOTFILES = $DOTFILES" echo "[ACTION] Press any key to proceed" -read -n 1 +read -r -n1 echo "[INFO] Setting up symbolic links" # 使用 zsh 的关联数组语法 diff --git a/common/haskeline b/common/haskeline index bf0b6cd..8dd3b01 100644 --- a/common/haskeline +++ b/common/haskeline @@ -1 +1,4 @@ editMode: Vi +bind: n down +bind: e up +bind: l vi-insert diff --git a/tools/bash/bashrc b/tools/bash/bashrc index 1d8ac0b..4f79d68 100644 --- a/tools/bash/bashrc +++ b/tools/bash/bashrc @@ -6,28 +6,26 @@ export DOTFILES=$HOME/.dotfiles -if [ -n "$WAYLAND_DISPLAY" ]; then +if [ -n "$WSL_DISTRO_NAME" ]; then + alias clip="clip.exe" + alias paste="pwsh.exe -NoProfile -Command 'Get-Clipboard'" +elif [ -n "$WAYLAND_DISPLAY" ]; then alias clip="wl-copy" alias paste="wl-paste" elif [ -n "$DISPLAY" ]; then alias clip="xclip" -elif [ -n "$WSL_DISTRO_NAME" ]; then - alias clip="clip.exe" - alias paste="pwsh.exe -NoProfile -Command 'Get-Clipboard'" fi - - -source $DOTFILES/tools/bash/bash_aliases # For compatibility +source "$DOTFILES"/tools/bash/bash_aliases # For compatibility export IPYTHONDIR="$XDG_CONFIG_HOME"/ipython -if command -v fzf > /dev/null; then +if command -v fzf >/dev/null; then eval "$(fzf --bash)" fi -if command -v starship > /dev/null; then +if command -v starship >/dev/null; then eval "$(starship init bash)" fi # - # bind 'set show-mode-in-prompt off' +# bind 'set show-mode-in-prompt off'