This is a homesick castle for bash.
Like many long term users of Linux/Unix/Mac, I have grown a fair amount of dot-files (.vimrc, .bashrc, .muttrc, ...) over the time. Each tailored to my specific needs, e.g with a git enabled prompt, and custom colours.
As long, as there was only one (main) machine, this was good and well. As the complexity of the dotfiles grew, so did the number of machines/virtual machines I wanted these settings to be used on. I started copying over files. Then I switched to plain git to keep the history, and to rollback changes. Later I switched to homesick.
More machines also meant more environments/operating-systems. Throwing in somewhat special systems like Solaris or MacOS, my dotfiles got littered with if ... then ... else and case statements.
Things got worse when the systems had different roles, or were configured for different environments. Say I did not want my personal .muttrc on my company machine. Or I wanted to configure $PATH different for a specific system.
Long story short: I have been through that, and wrote a bunch of scripts that help me to keep things organized.
- A homesick castles (repository) called homesick-bash.
- A system of homesick castles grouped around it.
This system allows me to
- Keep settings separtated by tool (e.g. vim, tmux) in dedicated castles. A hooking mechanism allows different castles (
plugins) to hook into.bashrc - Keep OS/distro -dependant things factored out in isolated files (if I want to)
- Keep everything in sync over multiple machines (
homesick_update,homesick_local_changes-- see below for an example) - Have OS specific callbacks in .bashrc
- Have machine specific callbacks in .bashrc
- Have a Solarized color scheme in my terminal (and vim)
- Have it running on Debian, MacOS, Solaris 11 (beta), and SmartOS (beta).
I shared the code via GitHub. Sensitive information (castles) is kept in my own git repositories at home.
If you are interested in doing the same, you'll need around 10-15 minutes. The process is very straigthforward, and is summarised in the steps:
- Install homesick
- Prepare a plugin for your existing
.bashrc - Backup
.profileto.profile.backup - Clone
homesick-bash - Create a host specific castle (optional)
- Integrate your
.profile(manual setup) - Push your local repositories to your git server (optional)
All steps, except the last two, are scripted below.
cd ~
sudo gem install homesick
homesick clone git://github.com/neuhalje/homesick-bash.git
# Convert .bashrc to a plugin-castle.
mkdir .homesick
cd ~/.homesick
homesick generate homesick-bashrc
mkdir -p homesick-bashrc/home/.bashrc-plugin.original_bashrc.d/common
mv ~/.bashrc homesick-bashrc/home/.bashrc-plugin.original_bashrc.d/common/plugin.conf
cd homesick-bashrc
git add -u .
git commit -m"~.bashrc"
cd ~
# Edit .profile later
mv .profile .profile.backup
homesick symlink homesick-bashrc
homesick symlink homesick-bash
# It is important to source the .bashrc to setup BASHRC_HOST_CONFIG
. .bashrc
# Create system specific castle
homesick generate .homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}
touch ~/.homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}/home/.bashrc.${BASHRC_HOST_CONFIG}.d/path
touch ~/.homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}/home/.bashrc.${BASHRC_HOST_CONFIG}.d/exports
touch ~/.homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}/home/.bashrc.${BASHRC_HOST_CONFIG}.d/alias
# The castle is a git repository
cd ~/.homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}/
cat <<EOF>README.md
README
-------
Castle for ${BASHRC_HOST_CONFIG}. See https://github.com/neuhalje/homesick-bash for docs.
EOF
git add home/.bashrc.${BASHRC_HOST_CONFIG}.d/*
git add README.md
git commit -m"1st commit"
cd -
homesick symlink homesick-system-${BASHRC_HOST_CONFIG}
echo Now you can add a remote (AKA backup) for your repository
echo cd .homesick/repos/homesick-system-${BASHRC_HOST_CONFIG}
echo git add remote origin ..
echo git push -u origin master
# now log out of the shell and back in to source .bashrc again with the machine specific settings.
echo Please edit .profile.backup, it is no longer sourcedUse the repo with homesick:
homesick clone ssh://[email protected]:neuhalje/homesick-bash.git
homesick symlink homesick-bashMy castles: homesickdir takes you to ~/.homesick/repos/.
Updating: homesick_update automatically calls homesick pull and homesick symlink for all homesick castles in ~/.homesick/repos/.
Checking for local modifications:
$ homesick_local_changes # also supports a -v flag
Looking for local modifications in your castles...
* homesick-bash
- there are some changed files
* homesick-git
* homesick-mail-base
- there are some untracked files
* homesick-mail-jens_home
* homesick-screen
* homesick-system-merkur
* homesick-vimCopy setup no new machine: homesick_export prints instructions to do so, e.g.
$ homesick_export
# homesick-bash
homesick clone ssh://[email protected]:neuhalje/homesick-bash.git
homesick symlink homesick-bash
# homesick-git
homesick clone ssh://[email protected]:neuhalje/homesick-git.git
homesick symlink homesick-git
# homesick-mail-base
homesick clone ssh://[email protected]:neuhalje/homesick-mail-base.git
homesick symlink homesick-mail-base
# ...
# homesick-tmux
homesick clone ssh://[email protected]:neuhalje/homesick-tmux.git
homesick symlink homesick-tmux
# homesick-vim
homesick clone ssh://[email protected]:neuhalje/homesick-vim.git
homesick symlink homesick-vimIncludes are bash scripts that are sourced. First general scripts are sourced, then os specific, then distro specific, and finally hostname specific.
The order and locations of the files are:
~/.bashrc.os.d/common~/.bashrc.os.d/${BASHRC_OS}-common~/.bashrc.os.d/${BASHRC_OS}-${BASHRC_OS_DISTRO}~/.bashrc.${BASHRC_HOST_CONFIG}.dwhere BASHRC_HOST_CONFIG is the node name without the domain part.
The files included are, in the following order:
-
bgcolor-- setCOLOR_BG_ISto eitherDARKorLIGHT, dpendening on whether the terminal BG is light or dark. Default:DARK -
colors-- internal create color tables -
main--~ -
path-- Augement the path -
alias-- Definealiases. -
exports-- Keep exports togehter -
bashprompt-- internal Set up the bashprompt
Plugins AKA other castles can hook into the sourcing lifecycle by providing a file matching the glob ~/.bashrc-plugin.*.d. .bashrc will source the file plugin.conf according to the rules described above.
On the system home which is an Ubuntu system, while sourcing .bashrc the following alias files are sourced in the following order (if they exist):
~/.bashrc.os.d/common/alias~/.bashrc.os.d/linux-common/alias~/.bashrc.os.d/linux-debian/alias~/.bashrc.home.d/alias
If a directory ~/.bashrc-plugin.myplugin.d exists, then the following files would be sourced as well (if they exist):
~/.bashrc-plugin.myplugin.d/common/plugin.conf~/.bashrc-plugin.myplugin.d/linux-common/plugin.conf~/.bashrc-plugin.myplugin.d/linux-debian/plugin.conf~/.bashrc.home.d/myplugin.conf
Logging can be enabled in .bashrc by setting DEBUG=1.
BASHRC_HOST_CONFIG- The hostname used for host-specific configuration files. Defined in.bashrc. ExportedBASHRC_ALREADY_CONFIGURED- Has.bashrcalready been sourced? Set toyesif so. Defined in.bashrc.
-
BASHRC_OS-- The OS running. Values for BASHRC_OS are:aix-- AIXdarwin-- MacOS Xlinux-- Linuxsmartos-- joyent SmartOSsolaris-- Sun Solariswindows-- Windows
-
BASHRC_OS_DISTRO-- The distro running (only set for Linux). Values for BASHRC_OS_DISTRO are:debian(also on Ubuntu)mandrakeredhatsuse
bashrc_determine_osdefined in detect_os. Sets BASHRC_OS and BASHRC_OS_DISTRO.
To make the shell more colorfull the castle provides some color-codes that can be used in shell-scripts. For a description of the color codes see Ethan Schoonovers Solarized page.
echo -e ${SOL_RED}red ${SOL_GREEN}green ${NO_COLOUR}blank ${SOL_EMPH}important ${SOL_BODY_TXT}normal ${SOL_COMMENT}unimportantThe following codes exist:
Text types:
SOL_EMPH- Text with emphasis, depends on the value ofCOLOR_BG_IS.SOL_BODY_TXT- Normal text, depends on the value ofCOLOR_BG_IS.SOL_COMMENT- Comments (lighter), depends on the value ofCOLOR_BG_IS.NO_COLOUR- No color
Colors:
SOL_YELLOWSOL_ORANGESOL_REDSOL_MAGENTASOL_VIOLETSOL_BLUESOL_CYANSOL_GREEN
Solarized base colors
SOL_BASE03SOL_BASE02SOL_BASE01SOL_BASE00SOL_BASE0SOL_BASE1SOL_BASE2SOL_BASE3

