About a year and a half ago, I stumbled upon Ryan Tomayko's "dotfiles"
repository on Github. The moment I saw it, I thought it was a great idea:
the idea of managing all your $HOME
directory "dot-files" in a Git repository.
That single idea led me on a personal crusade to better understand all the
different configuration files that live in your UNIX (Linux, Mac OSX, etc.)
home directory, and the end-result was creating my own "dotfiles"
Git repository for synchronizing/tracking/deploying my dot-files between the
various machines I work upon.
I learned a lot of neat stuff along the way, including some config options which I never knew were there and some tricks which really optimized my command-line shell experience.
Using Git
I found it to be a very natural fit to use Git to track the edits to my dot-files. It makes it dead-easy to see what changes I've made since the last commit and easy to commit those changes and push them to a central Git repository.
Git also makes it dead-easy to "bootstrap" my dot-files environment into a brand-new home directory:
~/bin/
Ryan has a ~/bin/
directory in his dot-files repo with all kinds of nifty
little utilities.
There's a bunch of great Git-related utilities in there, e.g.:
- git-up - Like
git-pull
but show a short and sexy log of changes immediately after merging (git-up) or rebasing (git-reup). - git-incoming/git-outgoing - Shows difference between the current branch vs. the upstream branch.
And there's also some great general-purpose utilities in there, e.g.:
- ack - A tool like
grep
, designed for programmers with large trees of heterogeneous source code. Very handy for recursive file-searching.
~/.gitconfig
Ryan has lots of nifty tricks in his .gitconfig
file, tying in short-cuts for
calling the helper utilities in ~/bin/
. Also, you can setup Git to use ANSI
colors for various sub-commands (diff, status), which is very handy.
~/.inputrc
There's a lot of neat options in the .inputrc
file, for binding key-sequences
to various command-line options. For example:
…are the two single-most time-saving key-bindings that I stumbled upon. This
lets you type a partial command and then use Ctrl-n
and Ctrl-p
to
completion-match the rest of the line based on your command history. Awesome!
I find this incredibly useful to completion-match hostnames for ssh
commands or other
longer commands which I often type. Completion-matching for-the-win!
Vim: .vimrc and .vim/
Before setting out on this project, I had used Vi some but hadn't really explored
(or understood) the full-power that was Vim. Digging
into the .vimrc
file, reading-up on all the various config options, and
digging into all the ~/.vim/
plugins which Ryan had was an eye-opening
experience. I came to realize just how much you could extend and customize
Vim to meet your needs. Simple things like getting syntax-highlighting
and color-schemes set by default made for an oh-so-much more pleasant
Vim experience.
This all led me to learning a lot more about Vim and becoming much more proficient using Vim. It's now my text-based editor of choice. Once you get to know the key-bindings and the various commands, the command-chaining that you can do in Vim is incredibly powerful.
Sharing is Fun!
If you're at all interesting in learning more about customizing your Unix shell environment, looking at other people's dot-files is a great learning experience. And publishing your dot-files on Github is a great way to share your shell-environment with the world so that others can learn and explore.