#!/usr/bin/env bash # # Author: Tom Ryder (@tejr) # # This script installs @tejr's dotfiles in $HOME with symlinks into the # expected $HOME/.dotfiles path. # # By default, it checks out all Git submodules, and links in configuration for # Bash, cURL, Git, Vim, and some terminfo(5) definitions. You can supply # additional flags to link in other configuration files: # # -d -- mysql/psql # -g -- GnuPG # -m -- Mutt # -n -- Ncmpcpp # -r -- Newsbeuter # -t -- tmux # -x -- X11 # # You should be prompted about replacing any file or directory that already # exists. I have tried to make the function that does this relatively safe, but # there are almost certainly edge cases where it might break things, especially # on systems other than GNU/Linux or BSD. # # Run this at your own risk! # # Replace existing file with link if user confirms lns() { local file=$1 link=$2 if [[ -e $link ]]; then read -p "$link already exists; remove? [y/N] " confirm case $confirm in y*|Y*) rm -r -- "$link" ln -s -- "$file" "$link" return ;; *) return 1 ;; esac else ln -s -- "$file" "$link" fi return } # Bail if we don't have git(1) if ! hash git 2>/dev/null; then printf 'install: Could not find git(1)!\n' >&2 exit 1 fi # Define dotfiles directory and check it exists dotfiles=$HOME/.dotfiles if ! [[ -d $dotfiles ]]; then printf 'install: Could not find %s!\n' "$dotfiles" >&2 exit 1 fi # Check out submodules (cd -- "$dotfiles" && git submodule update --init) # Link in essential logical binaries mkdir -p -- "$HOME"/.local/bin lns "$dotfiles"/ack/ack "$HOME"/.local/bin/ack # Link in essential configuration files mkdir -p -- "$HOME"/.config lns "$dotfiles"/ack/ackrc "$HOME"/.ackrc lns "$dotfiles"/bash/bash_completion "$HOME"/.config/bash_completion lns "$dotfiles"/bash/bash_logout "$HOME"/.bash_logout lns "$dotfiles"/bash/bash_profile "$HOME"/.bash_profile lns "$dotfiles"/bash/bashrc "$HOME"/.bashrc lns "$dotfiles"/bash/bashrc.d "$HOME"/.bashrc.d lns "$dotfiles"/curl/curlrc "$HOME"/.curlrc lns "$dotfiles"/git/gitconfig "$HOME"/.gitconfig lns "$dotfiles"/readline/inputrc "$HOME"/.inputrc lns "$dotfiles"/sh/profile "$HOME"/.profile lns "$dotfiles"/sh/profile.d "$HOME"/.profile.d lns "$dotfiles"/vim/vimrc "$HOME"/.vimrc lns "$dotfiles"/vim "$HOME"/.vim # Link in shell stuff while getopts :dgmnrtx opt; do case $opt in d) lns "$dotfiles"/mysql/my.cnf "$HOME"/.my.cnf lns "$dotfiles"/psql/psqlrc "$HOME"/.psqlrc ;; g) mkdir -p -- "$HOME"/.gnupg lns "$dotfiles"/gnupg/gpg.conf "$HOME"/.gnupg/gpg.conf lns "$dotfiles"/gnupg/gpg-agent.conf "$HOME"/.gnupg/gpg-agent.conf ;; m) lns "$dotfiles"/mutt/muttrc "$HOME"/.muttrc lns "$dotfiles"/mutt "$HOME"/.mutt ;; n) lns "$dotfiles"/ncmpcpp "$HOME"/.ncmpcpp ;; r) mkdir -p -- "$HOME"/.config "$HOME"/.local/share/newsbeuter lns "$dotfiles"/newsbeuter "$HOME"/.config/newsbeuter ;; t) lns "$dotfiles"/tmux/tmux.conf "$HOME"/.tmux.conf ;; x) lns "$dotfiles"/i3 "$HOME"/.i3 lns "$dotfiles"/X/Xmodmap "$HOME"/.Xmodmap lns "$dotfiles"/X/Xresources "$HOME"/.Xresources lns "$dotfiles"/X/xsession "$HOME"/.xsession lns "$dotfiles"/X/xsessionrc "$HOME"/.xsessionrc lns "$dotfiles"/vim/gvimrc "$HOME"/.gvimrc ;; esac done shift $((OPTIND-1)) # Compile terminfo files if hash tic 2>/dev/null; then for info in "$dotfiles"/terminfo/*.info; do tic "$info" done fi