A lot of people at work have been asking me how I set up my terminal, so I wrote this up to send to them. Hope you enjoy!
Install ZSH
The shell I use is zsh. To install it, follow these instructions
Install oh-my-zsh
oh-my-zsh is a plugin/theming library thingie for zsh.
Follow these instructions to install
Make sure to take a look at the plugins and enable any that might be useful for you. I’m a big fan of colored-man-pages
. Man pages become way easier to read when they have different colors, not just black and white.
Install Powerline Fonts
All of the fancy oh-my-zsh themes use the powerline fonts.
Follow these instructions to install
Depending on your terminal, you may need to change the default font to one of the Powerline fonts in order to get it to appear correctly. I currently use Menlo Regular
, but honestly that’s just one I picked at random and stuck with. I don’t know if there’s a better one out there.
Set Your Theme
oh-my-zsh has a bunch to choose from, but if you choose anything other than agnoster
, I can’t help you. Edit your ~/.zshrc
file and set ZSH_THEME=agnoster
. You’ll thank me later.
Customize your theme
One of the reasons I really like agnoster is that the terminal prompt is incredibly good looking, but also very easy to extend. Props to the writer, because these are some of the cleanest shell scripts I’ve ever seen.
To start customizing your theme, copy ~/.oh-my-zsh/themes/agnoster.zsh-theme
to ~/.oh-my-zsh/custom/themes/agnoster.zsh-theme
. After this, you can edit the theme as you see fit. The build_prompt()
function is the main one that calls all the others. Here’s what mine currently looks like:
## Main prompt
build_prompt() {
RETVAL=$?
prompt_status
prompt_virtualenv
# prompt_context
prompt_dir
prompt_git
# prompt_bzr
# prompt_hg
prompt_aws_env
prompt_k8s_context
prompt_end
}
All it does is set an environment variable, and then calls a bunch of functions to construct the different parts of the prompt. Or you can just comment out parts that you won’t use.
prompt_status
displays the status of the previous command, along with some other things that I can never remember.
prompt_virtualenv
displays the name of the currently configured virtualenv. Useful if you do a lot of python development.
prompt_git
is fantastic if you use git. It displays the branch name and lets you know if you’re up to date with your remote branch, among other things.
prompt_aws_env
and prompt_k8s_context
are ones that I added. prompt_aws_env
is only really relevant to my work so I won’t bother explaining that. But if you work with Kubernetes at all, I highly recommend you add the prompt_k8s_context
function. The code is below:
prompt_k8s_context() {
local kube_context=$(kubectl config current-context)
local kube_ns=$(kubectl config view --minify -o jsonpath='{.contexts[0].context.namespace}')
prompt_segment blue black "❂ ${kube_context}:${kube_ns}"
}
That’s it?
Hell yeah that’s it. The prompt_segment
helper function that the agnoster author made is SUPER USEFUL.
Hope this was helpful! Let me know of anything that needs clarified/is no longer up to date.