#!/bin/sh # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 # @author: Sylvain Herlédan # @date: 2017-06-02 set -o nounset set -o errexit set -o pipefail PROGNAME="$(basename "${0}")"; PROGDIR="$(readlink -f "$(dirname "${0}")")"; ARGS="${@}"; # Include helpers . "${PROGDIR}/lib/colors.sh" . "${PROGDIR}/lib/functions.sh" # Tup installation ------------------------------------------------------------ # ----------------------------------------------------------------------------- install_tup() { local tools_dir="${1}"; shift; local install_dir="${1}"; shift; if [ ! -f "${install_dir}/bin/tup" ]; then if [ ! -d "${tools_dir}/tup" ]; then git clone "git://github.com/gittup/tup.git" "${tools_dir}/tup" fi cd "${tools_dir}/tup" ./bootstrap.sh mkdir -p "${install_dir}/bin" cp "${tools_dir}/tup/tup" "${install_dir}/bin/tup" fi } # St installation ------------------------------------------------------------- # ----------------------------------------------------------------------------- install_st() { local tools_dir="${1}"; shift; local install_dir="${1}"; shift; local patches_url="http://st.suckless.org/patches"; if [ ! -f "${install_dir}/bin/st" ]; then if [ ! -d "${tools_dir}/st" ]; then git clone "http://git.suckless.org/st" "${tools_dir}/st" wget \ "${patches_url}/st-no_bold_colors-20160727-308bfbf.diff" \ -O "${tools_dir}/st/st-no_bold.diff" wget \ "${patches_url}/st-solarized-dark-20160727-308bfbf.diff" \ -O "${tools_dir}/st/st-solarized.diff" fi cd "${tools_dir}/st" git checkout tags/0.7 git apply st-no_bold.diff git apply st-solarized.diff cp config.def.h config.h sed -i 's/.*Liberation Mono.*/static char font[] = "Inconsolata:pixelsize=13:antialias=true:hinting=true";/' config.h sed -i 's/static int borderpx = 2;/static int borderpx = 0;/' config.h sed -i 's/static char shell\[\] = "\/bin\/sh";/static char shell\[\] = "\/usr\/bin\/zsh";/' config.h make clean make cp "${tools_dir}/st/st" "${install_dir}/bin/st" fi } # Sxiv installation ----------------------------------------------------------- # ----------------------------------------------------------------------------- install_sxiv() { local tools_dir="${1}"; shift; local install_dir="${1}"; shift; if [ ! -f "${install_dir}/bin/sxiv" ]; then if [ ! -d "${tools_dir}/sxiv" ]; then git clone "https://github.com/muennich/sxiv.git" "${tools_dir}/sxiv" fi cd "${tools_dir}/sxiv" make PREFIX="${install_dir}" install fi } # Dein installation ----------------------------------------------------------- # # Dein is a manager for vim plugins. # ----------------------------------------------------------------------------- install_dein() { local tools_dir="${1}"; shift; local install_dir="${1}"; shift; local repo_path="${install_dir}/config/vim/dein/repos/github.com/Shougo"; local link_path="${repo_path}/dein.vim"; if [ ! -h "${link_path}" -o ! -d "${link_path}" ]; then if [ ! -d "${tools_dir}/dein" ]; then git clone \ "https://github.com/Shougo/dein.vim.git" \ "${tools_dir}/dein" fi rm -rf "${install_dir}/config/vim/dein/repos/github.com/Shougo" mkdir -p "${install_dir}/config/vim/dein/repos/github.com/Shougo" ln -sf \ "${tools_dir}/dein" \ "${install_dir}/config/vim/dein/repos/github.com/Shougo/dein.vim" fi } # Oh my zsh installation ------------------------------------------------------ # ----------------------------------------------------------------------------- install_oh_my_zsh() { local tools_dir="${1}"; shift; local install_dir="${1}"; shift; local link_path="${install_dir}/.oh-my-zsh"; if [ ! -h "${link_path}" -o ! -d "${link_path}" ]; then if [ ! -d "${tools_dir}/oh-my-zsh" ]; then git clone \ "git://github.com/robbyrussell/oh-my-zsh.git" \ "${tools_dir}/oh-my-zsh" fi ln -sf \ "${tools_dir}/oh-my-zsh" \ "${install_dir}/config/oh-my-zsh" fi } # create_symlinks() { local cfg_dir="${1}"; shift; local install_dir="${1}"; shift; rm -rf "${install_dir}/.config/git" ln -sfT "${cfg_dir}/git" "${install_dir}/.config/git" rm -rf "${install_dir}/.config/i3" ln -sfT "${cfg_dir}/i3" "${install_dir}/.config/i3" rm -rf "${install_dir}/.xinitrc" ln -sfT "${cfg_dir}/xinitrc" "${install_dir}/.config/xinitrc" rm -rf "${install_dir}/.tmux.conf" ln -sfT "${cfg_dir}/tmux.conf" "${install_dir}/.tmux.conf" rm -rf "${install_dir}/.zshrc" ln -sfT "${cfg_dir}/zshrc" "${install_dir}/.zshrc" rm -rf "${install_dir}/.vim" ln -sfT "${cfg_dir}/vim" "${install_dir}/.vim" rm -rf "${install_dir}/.config/vim" ln -sfT "${cfg_dir}/vim" "${install_dir}/.config/vim" rm -rf "${install_dir}/.config/dunst" ln -sfT "${cfg_dir}/dunst" "${install_dir}/.config/dunst" rm -rf "${install_dir}/.config/sxiv" ln -sfT "${cfg_dir}/sxiv" "${install_dir}/.config/sxiv" rm -rf "${install_dir}/.rtorrent.rc" ln -sfT "${cfg_dir}/rtorrentrc" "${install_dir}/.rtorrent.rc" rm -rf "${install_dir}/.config/mpv" ln -sfT "${cfg_dir}/mpv" "${install_dir}/.config/mpv" rm -rf "${install_dir}/.config/host" ln -sfT "${cfg_dir}/host" "${install_dir}/.config/host" rm -rf "${install_dir}/.config/wgetrc" ln -sfT "${cfg_dir}/wgetrc" "${install_dir}/.config/wgetrc" } # Directory creation ---------------------------------------------------------- # ----------------------------------------------------------------------------- create_dirs() { local root_dir="${1}"; shift; mkdir -p "${root_dir}/.local/tools" mkdir -p "${root_dir}/.local/config" mkdir -p "${root_dir}/.local/config/vim/colors" mkdir -p "${root_dir}/.local/config/dunst" mkdir -p "${root_dir}/.local/config/i3" mkdir -p "${root_dir}/.local/config/git" mkdir -p "${root_dir}/.local/config/sxiv" mkdir -p "${root_dir}/.local/config/sxiv/exec" mkdir -p "${root_dir}/.local/config/mpv" mkdir -p "${root_dir}/docs/downloads" mkdir -p "${root_dir}/docs/screenshots" mkdir -p "${root_dir}/.cache/vim/undo" mkdir -p "${root_dir}/.cache/vim/swap" mkdir -p "${root_dir}/.cache/vim/backup" mkdir -p "${root_dir}/.cache/rtorrent" } # Copy configuration files ---------------------------------------------------- # ----------------------------------------------------------------------------- copy_files() { local src_dir="${1}"; shift; local dst_dir="${1}"; shift; cp "${src_dir}/tomorrow_night.vim" \ "${dst_dir}/.local/config/vim/colors/tomorrow_night.vim" cp -r "${src_dir}/aliases" \ "${dst_dir}/.local/config/aliases" cp -r "${src_dir}/zshrc" \ "${dst_dir}/.local/config/zshrc" cp -r "${src_dir}/i3config" \ "${dst_dir}/.local/config/i3/config" cp -r "${src_dir}/gitconfig" \ "${dst_dir}/.local/config/git/config" cp -r "${src_dir}/tmux.conf" \ "${dst_dir}/.local/config/tmux.conf" cp -r "${src_dir}/vimrc" \ "${dst_dir}/.local/config/vim/vimrc" cp -r "${src_dir}/vimpwrc" \ "${dst_dir}/.local/config/vim/vimpwrc" cp -r "${src_dir}/xinitrc" \ "${dst_dir}/.local/config/xinitrc" cp -r "${src_dir}/dunstrc" \ "${dst_dir}/.local/config/dunst/dunstrc" cp -r "${src_dir}/bin/image-info.sh" \ "${dst_dir}/.local/config/sxiv/exec/image-info" cp -r "${src_dir}/bin/key-handler.sh" \ "${dst_dir}/.local/config/sxiv/exec/key-handler" cp -r "${src_dir}/mpv.conf" \ "${dst_dir}/.local/config/mpv/mpv.conf" cp -r "${src_dir}/mpv_input.conf" \ "${dst_dir}/.local/config/mpv/input.conf" cp -r "${src_dir}/hosts/$(hostname)" \ "${dst_dir}/.local/config/host" cp -r "${src_dir}/wgetrc" \ "${dst_dir}/.local/config/wgetrc" configure_rtorrent "${src_dir}" "${dst_dir}" } # Set paths for applications that follow the XDG specifications. ------------- # ----------------------------------------------------------------------------- configure_xdg() { local install_dir="${1}"; shift; local user_dirs="${install_dir}/.config/user-dirs.dirs"; cat > "${user_dirs}" < "${dst_dir}/.local/config/rtorrentrc" } check_requirements() { local requirements="git make wget i3"; local optional_deps="notify-send dunst pulseaudio scrot sudo redshift numlockx identify convert xclip ctags"; local requirements_not_met=0; for cmd in ${optional_deps}; do if has "${cmd}"; then echo -e " [ ${LIGHT_GREEN}OK${NO_COLOR}] ${cmd}" else echo -e " [${LIGHT_CYAN}NOK${NO_COLOR}] ${cmd}" fi done for cmd in ${requirements}; do if has "${cmd}"; then echo -e " [ ${LIGHT_GREEN}OK${NO_COLOR}] ${cmd}" else echo -e " [${LIGHT_RED}NOK${NO_COLOR}] ${cmd}" requirements_not_met=1; fi done return ${requirements_not_met}; } main() { local local_dir="${HOME}/.local"; local tools_dir="${local_dir}/tools"; local cfg_dir="${local_dir}/config"; echo -e "\n\t${BOLD}.:| Dotfiles |:.${NO_COLOR}" # Check requirements first echo -e "\n${YELLOW}=>${NO_COLOR}${BOLD} Checking requirements...${NO_COLOR}" if check_requirements; then echo else echo -e "\n${YELLOW}=>${NO_COLOR}${BOLD} Abort.${NO_COLOR}" exit 1 fi create_dirs "${HOME}" copy_files "${PROGDIR}" "${HOME}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Installing tup...${NO_COLOR}" install_tup "${tools_dir}" "${local_dir}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Installing st...${NO_COLOR}" install_st "${tools_dir}" "${local_dir}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Installing dein...${NO_COLOR}" install_dein "${tools_dir}" "${local_dir}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Installing ohmyzsh...${NO_COLOR}" install_oh_my_zsh "${tools_dir}" "${local_dir}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Installing sxiv...${NO_COLOR}" install_sxiv "${tools_dir}" "${local_dir}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Finalizing...${NO_COLOR}" create_symlinks "${cfg_dir}" "${HOME}" configure_xdg "${HOME}" echo -e "${YELLOW}=>${NO_COLOR}${BOLD} Done.${NO_COLOR}\n" echo -e "In order to initialize plugins, run the following command the " \ "first time you start vim:" echo -e "\t:call dein#install()" echo } main ${ARGS} exit 0