dotfiles/dot-install
Sebastian Lenzlinger 00ac22e726 Add subcommand install_vim_neovim.
Installs vim config as neovim config. I.e. to use vimscript instead of lua as config for neovim.
2025-04-15 11:33:20 +02:00

269 lines
7.4 KiB
Bash
Executable File

#!/bin/sh
# dot-install: Create symlinks for dotfiles configurations
set -e
DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)"
CONFIG_DIR="${HOME}/.config"
# Print usage info
usage() {
echo "Usage: dot-install [PACKAGE...] [all]"
echo
echo "Available packages:"
echo " bash - Bash configuration files (all)"
echo " bash:aliases - Bash aliases only"
echo " bash:completion - Bash completion only"
echo " bash:env - Bash environment only"
echo " bash:functions - Bash functions only"
echo " bash:fedora - Fedora specific bash aliases"
echo " borg - Borg backup profiles"
echo " fish - Fish shell configuration"
echo " ghostty - Ghostty terminal configuration"
echo " git - Git configuration"
echo " nvim - Neovim configuration"
echo " rsync - Rsync filter rules"
echo " starship - Starship prompt configuration"
echo " tmux - Tmux configuration"
echo " vim - Vim configuration"
echo " zellij - Zellij terminal multiplexer configuration"
echo " zsh - Zsh configuration"
echo " all - Install all packages"
echo
echo "Example: dot-install bash:aliases git nvim"
exit 1
}
# Create parent directories if they don't exist
ensure_dir() {
if [ ! -d "$1" ]; then
mkdir -p "$1"
echo "Created directory: $1"
fi
}
# Create a symlink and handle existing files
link_file() {
local src="$1"
local dest="$2"
# Check if destination already exists
if [ -e "$dest" ]; then
if [ -L "$dest" ]; then
# If it's already a symlink, check if it points to our file
if [ "$(readlink "$dest")" = "$src" ]; then
echo "Link already exists: $dest -> $src"
return 0
else
echo "Removing existing link: $dest"
rm "$dest"
fi
else
# If it's a regular file or directory
echo "Backing up existing file: $dest -> ${dest}.bak"
mv "$dest" "${dest}.bak"
fi
fi
# Create the symlink
ln -s "$src" "$dest"
echo "Created link: $dest -> $src"
}
# Add source command to bashrc if needed
add_source_to_bashrc() {
local file="$1"
local config_path="$CONFIG_DIR/bash/$file"
if [ -f "$HOME/.bashrc" ]; then
if ! grep -q "source \$HOME/.config/bash/$file" "$HOME/.bashrc"; then
echo "Adding source command for $file to .bashrc"
echo "[ -f \$HOME/.config/bash/$file ] && source \$HOME/.config/bash/$file" >> "$HOME/.bashrc"
fi
else
echo "Warning: $HOME/.bashrc does not exist. You'll need to manually source $file."
fi
}
install_bash_aliases() {
echo "Installing bash aliases..."
ensure_dir "$CONFIG_DIR/bash"
link_file "$DOTFILES_DIR/bash/bash_aliases" "$CONFIG_DIR/bash/bash_aliases"
add_source_to_bashrc "bash_aliases"
}
install_bash_completion() {
echo "Installing bash completion..."
ensure_dir "$CONFIG_DIR/bash"
link_file "$DOTFILES_DIR/bash/bash_completion" "$CONFIG_DIR/bash/bash_completion"
add_source_to_bashrc "bash_completion"
}
install_bash_env() {
echo "Installing bash environment..."
ensure_dir "$CONFIG_DIR/bash"
link_file "$DOTFILES_DIR/bash/bash_env" "$CONFIG_DIR/bash/bash_env"
add_source_to_bashrc "bash_env"
}
install_bash_functions() {
echo "Installing bash functions..."
ensure_dir "$CONFIG_DIR/bash"
link_file "$DOTFILES_DIR/bash/bash_functions" "$CONFIG_DIR/bash/bash_functions"
add_source_to_bashrc "bash_functions"
}
install_bash_fedora() {
echo "Installing fedora aliases..."
ensure_dir "$CONFIG_DIR/bash"
link_file "$DOTFILES_DIR/bash/fedora_aliases" "$CONFIG_DIR/bash/fedora_aliases"
add_source_to_bashrc "fedora_aliases"
}
install_bash() {
echo "Installing all bash configuration..."
install_bash_aliases
install_bash_completion
install_bash_env
install_bash_functions
install_bash_fedora
# Create a .bash_dir symlink in home directory for compatibility
link_file "$CONFIG_DIR/bash" "$HOME/.bash_dir"
}
install_borg() {
echo "Installing borg backup profiles..."
ensure_dir "$CONFIG_DIR/borg"
link_file "$DOTFILES_DIR/borg-backup-profiles" "$CONFIG_DIR/borg"
}
install_fish() {
echo "Installing fish configuration..."
ensure_dir "$CONFIG_DIR"
link_file "$DOTFILES_DIR/fish" "$CONFIG_DIR/fish"
}
install_ghostty() {
echo "Installing ghostty configuration..."
ensure_dir "$CONFIG_DIR"
link_file "$DOTFILES_DIR/ghostty" "$CONFIG_DIR/ghostty"
}
install_git() {
echo "Installing git configuration..."
link_file "$DOTFILES_DIR/git/gitconfig" "$HOME/.gitconfig"
}
install_nvim() {
echo "Installing neovim configuration..."
ensure_dir "$CONFIG_DIR"
link_file "$DOTFILES_DIR/nvim" "$CONFIG_DIR/nvim"
}
install_rsync() {
echo "Installing rsync filter rules..."
link_file "$DOTFILES_DIR/sync-filter-fedora/dot-rsync-filter-home" "$HOME/.rsync-filter-home"
}
install_starship() {
echo "Installing starship configuration..."
ensure_dir "$CONFIG_DIR"
link_file "$DOTFILES_DIR/dot-config/starship.toml" "$CONFIG_DIR/starship.toml"
}
install_tmux() {
echo "Installing tmux configuration..."
link_file "$DOTFILES_DIR/tmux/tmux.conf" "$HOME/.tmux.conf"
}
install_vim() {
echo "Installing vim configuration..."
link_file "$DOTFILES_DIR/vim/vimrc" "$HOME/.vimrc"
ensure_dir "$HOME/.vim"
link_file "$DOTFILES_DIR/vim/initvim" "$HOME/.vim/init.vim"
}
install_zellij() {
echo "Installing zellij configuration..."
ensure_dir "$CONFIG_DIR/zellij"
link_file "$DOTFILES_DIR/dot-config/zellij.kdl" "$CONFIG_DIR/zellij/config.kdl"
}
install_zsh() {
echo "Installing zsh configuration..."
link_file "$DOTFILES_DIR/zsh/zshrc" "$HOME/.zshrc"
}
# Install vimconfig as config for neovim
install_vim_neovim() {
echo "Installing init.vim as config for *neovim*"
ensure_dir "$CONFIG_DIR/nvim"
link_file "$DOTFILES_DIR/vim/initvim" "$CONFIG_DIR/nvim/init.vim"
}
install_all() {
install_bash
install_borg
install_fish
install_ghostty
install_git
install_nvim
install_rsync
install_starship
install_tmux
install_vim
install_zellij
install_zsh
}
if [ $# -eq 0 ]; then
usage
fi
for arg in "$@"; do
case "$arg" in
bash) install_bash ;;
bash:aliases) install_bash_aliases ;;
bash:completion) install_bash_completion ;;
bash:env) install_bash_env ;;
bash:functions) install_bash_functions ;;
bash:fedora) install_bash_fedora ;;
borg) install_borg ;;
fish) install_fish ;;
ghostty) install_ghostty ;;
git) install_git ;;
nvim) install_nvim ;;
vimnvim) install_vim_neovim ;;
rsync) install_rsync ;;
starship) install_starship ;;
tmux) install_tmux ;;
vim) install_vim ;;
zellij) install_zellij ;;
zsh) install_zsh ;;
all) install_all ;;
*) echo "Unknown package: $arg"; usage ;;
esac
done
echo "Installation complete!"