My ZSH Config (.zshrc)
January 14, 2016
I spent the last few weeks setting up ZSH the way I want it. I’m pretty happy with the result, so I figured I’d share.
If you just want to download it and skip the explanation below, here’s the github link.
Screenshot
Pictures are worth a thousand words, so here’s what it looks like:
There are a bunch of other things not pictured, like colored grep results, the prompt turns red if you’re root, and all of the sweet interactive stuff that ZSH offers.
Summary
My .zshrc is made up of a handful of files:
- .zshrc – The main config file. Lots of comments in here to help with your customization
- functions.zsh – Where I store my custom functions. I put them somewhere else to keep things neat
- spectrum.zsh – Someone else’s script that makes colors easy to use.
- prompts.zsh – Where I setup the prompt. Again, in a separate file to keep stuff neat
- termsupport.zsh – I stole this from oh-my-zsh. I don’t fully understand it, but it looks sweet
- dircolors – Generated with the dircolors program, and then manually edited for a few things. Not quoted below, because it’s super long, but I have included it in the zip.
I also use a custom font, which is necessary for the pretty prompt. The “powerline” fonts are edited to include a few special characters that can make your prompt look sweeter. If you don’t have these characters edited into your font, my prompt won’t look right on your system. You can get my font here: DejaVu Sans Mono (Powerline).
Download Everything
Here’s an easy-to-download zip that has all of the files enclosed: config.zip
File Stucture / Setup
I put most of my config files in “.config” in my home directory, and create symlinks to them. On most of my computers, “.config” links to a dropbox folder, so I get immediate updates. Here are two screenshots which might make things more clear:
~/.ssh/config is a hard link to ~/.config/.ssh/config, because SSH is picky about ownership and permissions on that file.
Why don’t I use .oh-my-zsh?
I don’t like that it is large and does a bunch of stuff I don’t need. It’s great, but I wanted more control and less mess.
Limitations
- Designed for black background; you’d have to edit it a bit to make it work on non-black backgrounds (dircolors and prompts.zsh).
- Prompt does not work in tmux, because tmux does not support Background Color Erase.
- Requires a powerline font.
There are probably a bunch more, but these are the main things that jump out at me.
Why use ZSH instead of BASH
Because it’s better. It feels just like bash, but it does a lot of things in better ways. There are plenty of posts out in the wild about this topic. I haven’t found one good reason to run bash instead of zsh.
Update October 10, 2016
I removed the timestamp after commands. It was causing a small delay after every command which was annoying.
.zshrc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
# Written by Josh Hartwell # Borrowed from a lot of places, especially .oh-my-zsh # Version 3 - 2016/08/20 local ZSH_CONF=$HOME/.zsh # Define the place I store all my zsh config stuff local ZSH_CACHE=$ZSH_CONF/cache # for storing files like history and zcompdump local LOCAL_ZSHRC=$HOME/.zshlocal/.zshrc # Allow the local machine to have its own overriding zshrc if it wants it # Load external config files and tools source $ZSH_CONF/functions.zsh # Load misc functions. Done in a seperate file to keep this from getting too long and ugly source $ZSH_CONF/spectrum.zsh # Make nice colors available source $ZSH_CONF/prompts.zsh # Setup our PS1, PS2, etc. source $ZSH_CONF/termsupport.zsh # Set terminal window title and other terminal-specific things # Set important shell variables export EDITOR=vim # Set default editor export WORDCHARS='' # This is the oh-my-zsh default, I think I'd like it to be a bit different export PAGER=less # Set default pager export LESS="-R" # Set the default options for less export LANG="en_US.UTF-8" # I'm not sure who looks at this, but I know it's good to set in general # Misc setopt ZLE # Enable the ZLE line editor, which is default behavior, but to be sure declare -U path # prevent duplicate entries in path eval $(dircolors $ZSH_CONF/dircolors) # Uses custom colors for LS, as outlined in dircolors LESSHISTFILE="/dev/null" # Prevent the less hist file from being made, I don't want it umask 002 # Default permissions for new files, subract from 777 to understand setopt NO_BEEP # Disable beeps setopt AUTO_CD # Sends cd commands without the need for 'cd' setopt MULTI_OS # Can pipe to mulitple outputs unsetopt NO_HUP # Kill all child processes when we exit, don't leave them running setopt INTERACTIVE_COMMENTS # Allows comments in interactive shell. setopt RC_EXPAND_PARAM # Abc{$cool}efg where $cool is an array surrounds all array variables individually unsetopt FLOW_CONTROL # Ctrl+S and Ctrl+Q usually disable/enable tty input. This disables those inputs setopt LONG_LIST_JOBS # List jobs in the long format by default. (I don't know what this does but it sounds good) setopt vi # Make the shell act like vi if i hit escape # ZSH History alias history='fc -fl 1' HISTFILE=$ZSH_CACHE/history # Keep our home directory neat by keeping the histfile somewhere else SAVEHIST=10000 # Big history HISTSIZE=10000 # Big history setopt EXTENDED_HISTORY # Include more information about when the command was executed, etc setopt APPEND_HISTORY # Allow multiple terminal sessions to all append to one zsh command history setopt HIST_FIND_NO_DUPS # When searching history don't display results already cycled through twice setopt HIST_EXPIRE_DUPS_FIRST # When duplicates are entered, get rid of the duplicates first when we hit $HISTSIZE setopt HIST_IGNORE_SPACE # Don't enter commands into history if they start with a space setopt HIST_VERIFY # makes history substitution commands a bit nicer. I don't fully understand setopt SHARE_HISTORY # Shares history across multiple zsh sessions, in real time setopt HIST_IGNORE_DUPS # Do not write events to history that are duplicates of the immediately previous event setopt INC_APPEND_HISTORY # Add commands to history as they are typed, don't wait until shell exit setopt HIST_REDUCE_BLANKS # Remove extra blanks from each command line being added to history # ZSH Auto Completion # Figure out the short hostname if [[ "$OSTYPE" = darwin* ]]; then # OS X's $HOST changes with dhcp, etc., so use ComputerName if possible. SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST=${HOST/.*/} else SHORT_HOST=${HOST/.*/} fi #the auto complete dump is a cache file where ZSH stores its auto complete data, for faster load times local ZSH_COMPDUMP="$ZSH_CACHE/acdump-${SHORT_HOST}-${ZSH_VERSION}" #where to store autocomplete data autoload -U compinit # Autoload auto completion compinit -i -d "${ZSH_COMPDUMP}" # Init auto completion; tell where to store autocomplete dump zstyle ':completion:*' menu select # Have the menu highlight as we cycle through options zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # Case-insensitive (uppercase from lowercase) completion setopt COMPLETE_IN_WORD # Allow completion from within a word/phrase setopt ALWAYS_TO_END # When completing from the middle of a word, move cursor to end of word setopt MENU_COMPLETE # When using auto-complete, put the first option on the line immediately setopt COMPLETE_ALIASES # Turn on completion for aliases as well setopt LIST_ROWS_FIRST # Cycle through menus horizontally instead of vertically # Globbing setopt NO_CASE_GLOB # Case insensitive globbing setopt EXTENDED_GLOB # Allow the powerful zsh globbing features, see link: # http://www.refining-linux.org/archives/37/ZSH-Gem-2-Extended-globbing-and-expansion/ setopt NUMERIC_GLOB_SORT # Sort globs that expand to numbers numerically, not by letter (i.e. 01 2 03) # Aliases git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit" alias -g ...='../..' alias -g ....='../../..' alias -g .....='../../../..' alias -g ......='../../../../..' alias -g .......='../../../../../..' alias -g ........='../../../../../../..' alias ls="ls -h --color='auto'" alias lsa='ls -a' alias ll='ls -l' alias la='ls -la' alias cdl=changeDirectory; function changeDirectory { cd $1 ; la } alias md='mkdir -p' alias rd='rmdir' # Search running processes. Usage: psg <process_name> alias psg="ps aux $( [[ -n "$(uname -a | grep CYGWIN )" ]] && echo '-W') | grep -i $1" # Copy with a progress bar alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --" alias d='dirs -v | head -10' # List the last ten directories we've been to this session, no duplicates alias google='web_search google' # Note: websearch function is loaded in function file, see above alias ddg='web_search ddg' alias github='web_search github' alias wiki='web_search ddg \!w' alias news='web_search ddg \!n' alias youtube='web_search ddg \!yt' alias map='web_search ddg \!m' alias image='web_search ddg \!i' # Key Bindings bindkey "^K" kill-whole-line # [Ctrl-K] erase whole line bindkey '^[[1;5C' forward-word # [Ctrl-RightArrow] - move forward one word bindkey '^[[1;5D' backward-word # [Ctrl-LeftArrow] - move backward one word bindkey '^?' backward-delete-char # [Backspace] - delete backward bindkey "${terminfo[kdch1]}" delete-char # [Delete] - delete forward bindkey '\e[2~' overwrite-mode # [Insert] - toggles overwrite mode bindkey "${terminfo[kpp]}" up-line-or-history # [PageUp] - Up a line of history bindkey "${terminfo[knp]}" down-line-or-history # [PageDown] - Down a line of history bindkey "^[[A" history-search-backward # start typing + [Up-Arrow] - fuzzy find history forward bindkey "^[[B" history-search-forward # start typing + [Down-Arrow] - fuzzy find history backward bindkey '\e[H' beginning-of-line # Note: this works on cygwin/mintty, may not work on other systems bindkey '\e[F' end-of-line # Note: this works on cygwin/mintty, may not work on other systems bindkey "\e\e" sudo-command-line # [Esc] [Esc] - insert "sudo" at beginning of line zle -N sudo-command-line sudo-command-line() { [[ -z $BUFFER ]] && zle up-history if [[ $BUFFER == sudo\ * ]]; then LBUFFER="${LBUFFER#sudo }" else LBUFFER="sudo $LBUFFER" fi } # Setup grep to be a bit more nice # check if 'x' grep argument available grep-flag-available() { echo | grep $1 "" >/dev/null 2>&1 } local GREP_OPTIONS="" # color grep results if grep-flag-available --color=auto; then GREP_OPTIONS+=" --color=auto" fi # ignore VCS folders (if the necessary grep flags are available) local VCS_FOLDERS="{.bzr,CVS,.git,.hg,.svn}" if grep-flag-available --exclude-dir=.cvs; then GREP_OPTIONS+=" --exclude-dir=$VCS_FOLDERS" elif grep-flag-available --exclude=.cvs; then GREP_OPTIONS+=" --exclude=$VCS_FOLDERS" fi # export grep settings alias grep="grep $GREP_OPTIONS" # clean up unfunction grep-flag-available # Allow local zsh settings (superseding anything in here) in case I want something specific for certain machines if [[ -r $LOCAL_ZSHRC ]]; then source $LOCAL_ZSHRC fi |
functions.zsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# intellegently extract archives based on extension. function extract { file=$1 dir=$2 if [[ -n $dir ]]; then mkdir -p $dir; echo Extracting $1 into $2 ... else echo Extracting $1 ... fi if [[ ! -f $1 ]] ; then echo "'$1' is not a valid file" else case $1 in *.tar.bz2) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar xjvf $1 $dc" echo $cmd eval ${cmd} ;; *.tar.gz) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar xzvf $1 $dc"; echo $cmd; eval ${cmd} ;; *.tar) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar vxf $1 $dc"; echo $cmd; eval ${cmd} ;; *.tbz2) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar xjvf $1 $dc"; echo $cmd; eval ${cmd} ;; *.tgz) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar xzf $1 $dc"; echo $cmd; eval ${cmd} ;; *.bz2) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar jf $1 $dc"; echo $cmd; eval ${cmd} ;; *.zip) if [[ -n $dir ]]; then dc="-d $dir"; fi cmd="unzip $1 $dc"; echo $cmd; eval ${cmd} ;; *.gz) if [[ -n $dir ]]; then dc="-C $dir"; fi cmd="tar zf $1 $dc"; echo $cmd; eval ${cmd} ;; *.7z) #TODO dir cmd="7z x -o$dir $1"; echo $cmd; eval ${cmd} ;; *.rar) #TODO Dir cmd="unrar x $1 $dir"; echo $cmd; eval ${cmd} ;; *) echo "'$1' cannot be extracted via extract()" ;; esac fi } # Make a directory and cd into it function take { mkdir -p $1 cd $1 } # web_search from terminal function web_search() { emulate -L zsh # define search engine URLS typeset -A urls urls=( google "https://www.google.com/search?q=" ddg "https://www.duckduckgo.com/?q=" github "https://github.com/search?q=" ) # check whether the search engine is supported if [[ -z "$urls[$1]" ]]; then echo "Search engine $1 not supported." return 1 fi # search or go to main page depending on number of arguments passed if [[ $# -gt 1 ]]; then # build search url: # join arguments passed with '+', then append to search engine URL url="${urls[$1]}${(j:+:)@[2,-1]}" else # build main page url: # split by '/', then rejoin protocol (1) and domain (2) parts with '//' url="${(j://:)${(s:/:)urls[$1]}[1,2]}" fi open_command "$url" } #use generalized open command function open_command() { emulate -L zsh setopt shwordsplit local open_cmd # define the open command case "$OSTYPE" in darwin*) open_cmd='open' ;; cygwin*) open_cmd='cygstart' ;; linux*) open_cmd='xdg-open' ;; msys*) open_cmd='start ""' ;; *) echo "Platform $OSTYPE not supported" return 1 ;; esac # don't use nohup on OSX if [[ "$OSTYPE" == darwin* ]]; then $open_cmd "$@" &>/dev/null else nohup $open_cmd "$@" &>/dev/null fi } # Show dots while waiting for tab-completion expand-or-complete-with-dots() { # toggle line-wrapping off and back on again [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti rmam print -Pn "%{%F{red}......%f%}" [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti smam zle expand-or-complete zle redisplay } zle -N expand-or-complete-with-dots bindkey "^I" expand-or-complete-with-dots |
spectrum.zsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# A script to make using 256 colors in zsh less painful. # P.C. Shyamshankar <sykora@lucentbeing.com> # Copied from http://github.com/sykora/etc/blob/master/zsh/functions/spectrum/ autoload -U colors && colors export LSCOLORS="Gxfxcxdxbxegedabagacad" typeset -AHg FX FG BG FX=( reset "%{[00m%}" bold "%{[01m%}" no-bold "%{[22m%}" italic "%{[03m%}" no-italic "%{[23m%}" underline "%{[04m%}" no-underline "%{[24m%}" blink "%{[05m%}" no-blink "%{[25m%}" reverse "%{[07m%}" no-reverse "%{[27m%}" ) for color in {000..255}; do FG[$color]="%{[38;5;${color}m%}" BG[$color]="%{[48;5;${color}m%}" done ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris} # Show all 256 colors with color number function spectrum_ls() { for code in {000..255}; do print -P -- "$code: %{$FG[$code]%}$ZSH_SPECTRUM_TEXT%{$reset_color%}" done } # Show all 256 colors where the background is set to specific color function spectrum_bls() { for code in {000..255}; do print -P -- "$code: %{$BG[$code]%}$ZSH_SPECTRUM_TEXT%{$reset_color%}" done } |
prompts.zsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
#/usr/bin/zsh #/usr/bin/zsh #if we're in a situation where we don't want colors #these variables aren't initialized and #so they don't have any impact on prompt definitions if [[ "$TERM" != "dumb" ]]; then local reset="%{$reset_color%}" local fg_text="$FG[232]" local fg_black="$FG[232]" local bg_black="$BG[232]" local fg_error="$FG[124]" local fg_time="$FG[232]" local bg_time="$BG[027]" local name=027; local fg_name="$FG[$name]"; local bg_name="$BG[$name]" local comp=070; local fg_comp="$FG[$comp]"; local bg_comp="$BG[$comp]" local dir=117; local fg_dir="$FG[$dir]"; local bg_dir="$BG[$dir]" local git=105; local fg_git="$FG[$git]"; local bg_git="$BG[$git]" local bar=240; local fg_bar="$FG[$bar]"; local bg_bar="$BG[$bar]" local jobs=117; local fg_jobs="$FG[$jobs]"; local bg_jobs="$BG[$jobs]" local clock=249; local fg_clock="$FG[$clock]"; local bg_clock="$BG[$clock]" local prompt=166 local prompt_root=124 local fg_prompt="%(!.$FG[$prompt_root].$FG[$prompt])" local bg_prompt="%(!.$BG[$prompt_root].$BG[$prompt])" local git_icon="" local split="$FX[no-bold]$FX[bold]" #local split="$FX[no-bold] $FX[bold]" local spad=" " local indicator="$split" else local indicator=">" fi local newline=$'\n' #inlining $'\n' doesn't work for some reason local return_status="%(?. .$fg_error ✖$newline)" #Setup the return status indicator ZLE_RPROMPT_INDENT=0 #get rid of the indent on the right-prompt setopt prompt_subst #make sure we get color substitution #now setup the prompts #first setup the main prompt. This can get a little tricky.. #All this fancy stuff is just to get rid of an extra newline when you first open a prompt window local line_one='$return_status' local line_two='$FX[bold]$fg_text$bg_name$spad%n$spad$fg_name$bg_comp$split$fg_text$spad@%m$spad$fg_comp$bg_dir$split$fg_text$spad%~$spad$fg_dir$(git_status)$bg_bar$split%E' local line_three='$reset$bg_prompt$spad$reset$fg_prompt$indicator$reset ' autoload -U add-zsh-hook # We need this for the hooks we call later on add-zsh-hook precmd updatePrompt add-zsh-hook preexec checkForClears function updatePrompt() { if [[ -z $newPrompt || $newPrompt == "true" ]]; then PROMPT="$line_two$newline$line_three$reset" newPrompt="false" elif [[ $newPrompt == "false" ]]; then PROMPT="$line_one$newline$line_two$newline$line_three" fi if [[ -n $lastCommand ]]; then unset $lastCommand fi } function checkForClears() { if [[ $1 =~ "^ *clear" ]]; then #TODO I would like to check for "reset" here as well, but it causes bugs newPrompt="true" fi } #Now setup the rest of the prompts. This is more direct RPROMPT='$FX[bold]$fg_black$(jobs_status)$FX[no-bold]$reset' PROMPT2='$reset$bg_prompt %_$spad$reset$fg_prompt$indicator$reset ' RPROMPT2='' PROMPT3='$reset$bg_prompt ?#$spad$reset$fg_prompt$indicator$reset ' PROMPT4='$reset$bg_prompt +%N:%i$spad$reset$fg_prompt$indicator$reset ' SPROMPT="zsh: correct '%R' to '%r' [nyae]?" #this is the default, and I like it TIMEFMT=`echo "$newline$fg_time$bg_time$FX[bold] %J %*Es (%P cpu) $reset" | sed -e 's/%{//g' -e 's/%}//g'` #tells us how many jobs are in the background function jobs_status() { count=$((jobs -s) | wc -l) if [[ $count -ne "0" ]]; then echo "$bg_jobs$split$fg_text $count $fg_jobs" else echo " " fi } function git_status() { ref=$(git symbolic-ref HEAD 2> /dev/null) if [[ -z $ref ]]; then echo "" else echo "$bg_git$split$fg_text $git_icon ${ref#refs/heads/}$(git_icons) $fg_git" fi } function git_icons() { #TODO: https://git-scm.com/docs/git-status #use these statuses to make more information local git_status="$(git status --porcelain 2> /dev/null)" if [[ -n "$git_status" ]]; then echo "*" fi } #Cool utf characters: λ ✔ ✓ ✘ ✢ ➤ ✖ ❯ ❮ ✚ ✹ ➜ ═ ✭ #Got this from ze-best-zsh-theme. Look at it in more detail #function git_prompt_info { # local ref=$(=git symbolic-ref HEAD 2> /dev/null) # local gitst="$(=git status 2> /dev/null)" # # if [[ -f .git/MERGE_HEAD ]]; then # if [[ ${gitst} =~ "unmerged" ]]; then # gitstatus=" %{$fg[red]%}unmerged%{$reset_color%}" # else # gitstatus=" %{$fg[green]%}merged%{$reset_color%}" # fi # elif [[ ${gitst} =~ "Changes to be committed" ]]; then # gitstatus=" %{$fg[blue]%}!%{$reset_color%}" # elif [[ ${gitst} =~ "use \"git add" ]]; then # gitstatus=" %{$fg[red]%}!%{$reset_color%}" # elif [[ -n `git checkout HEAD 2> /dev/null | grep ahead` ]]; then # gitstatus=" %{$fg[yellow]%}*%{$reset_color%}" # else # gitstatus='' # fi # # if [[ -n $ref ]]; then # echo "%{$fg_bold[green]%}/${ref#refs/heads/}%{$reset_color%}$gitstatus" # fi #} # $bg_clock$split$spad$fg_text${timec}%D{%L:%M:%S %p} # This is how I did the after-prompt time stamp, but it makes things sluggish, so i dont like it #autoload -U add-zsh-hook # We need this for the hooks we call later on #add-zsh-hook precmd updatePrompt #add-zsh-hook preexec checkForClears #function updatePrompt() { # if [[ -z $newPrompt || $newPrompt == "true" ]]; then # PROMPT="$line_two$newline$line_three$reset" # newPrompt="false" # # elif [[ $newPrompt == "false" ]]; then # echo $(echo "$fg_clock$FX[bold]$bg_clock$fg_black $(date +"%I:%M:%S%P") $bg_black$fg_clock$FX[no-bold]" | sed -e 's/%{//g' -e 's/%}//g') # PROMPT="$line_one$newline$line_two$newline$line_three" # # fi # # if [[ -n $lastCommand ]]; then # unset $lastCommand # fi #} # #function checkForClears() { # if [[ $1 =~ "^ *clear" ]]; then #TODO I would like to check for "reset" here as well, but it causes bugs # newPrompt="true" # fi #} |
termsupport.zsh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# Set terminal window and tab/icon title # # usage: title short_tab_title [long_window_title] # # See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1 # Fully supports screen, iterm, and probably most modern xterm and rxvt # (In screen, only short_tab_title is used) # Limited support for Apple Terminal (Terminal can't set window and tab separately) function title { emulate -L zsh setopt prompt_subst [[ "$EMACS" == *term* ]] && return # if $2 is unset use $1 as default # if it is set and empty, leave it as is : ${2=$1} case "$TERM" in cygwin|xterm*|putty*|rxvt*|ansi) print -Pn "\e]2;$2:q\a" # set window name print -Pn "\e]1;$1:q\a" # set tab name ;; screen*) print -Pn "\ek$1:q\e\\" # set screen hardstatus ;; *) if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then print -Pn "\e]2;$2:q\a" # set window name print -Pn "\e]1;$1:q\a" # set tab name else # Try to use terminfo to set the title # If the feature is available set title if [[ -n "$terminfo[fsl]" ]] && [[ -n "$terminfo[tsl]" ]]; then echoti tsl print -Pn "$1" echoti fsl fi fi ;; esac } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD ZSH_THEME_TERM_TITLE_IDLE="%n@%m: %~" # Avoid duplication of directory in terminals with independent dir display if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then ZSH_THEME_TERM_TITLE_IDLE="%n@%m" fi # Runs before showing the prompt function omz_termsupport_precmd { emulate -L zsh if [[ "$DISABLE_AUTO_TITLE" == true ]]; then return fi title $ZSH_THEME_TERM_TAB_TITLE_IDLE $ZSH_THEME_TERM_TITLE_IDLE } # Runs before executing the command function omz_termsupport_preexec { emulate -L zsh setopt extended_glob if [[ "$DISABLE_AUTO_TITLE" == true ]]; then return fi # cmd name only, or if this is sudo or ssh, the next cmd local CMD=${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%} local LINE="${2:gs/%/%%}" title '$CMD' '%100>...>$LINE%<<' } precmd_functions+=(omz_termsupport_precmd) preexec_functions+=(omz_termsupport_preexec) # Keep Apple Terminal.app's current working directory updated # Based on this answer: http://superuser.com/a/315029 # With extra fixes to handle multibyte chars and non-UTF-8 locales if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then # Emits the control sequence to notify Terminal.app of the cwd # Identifies the directory using a file: URI scheme, including # the host name to disambiguate local vs. remote paths. function update_terminalapp_cwd() { emulate -L zsh # Percent-encode the pathname. local URL_PATH="$(omz_urlencode -P $PWD)" [[ $? != 0 ]] && return 1 # Undocumented Terminal.app-specific control sequence printf '\e]7;%s\a' "file://$HOST$URL_PATH" } # Use a precmd hook instead of a chpwd hook to avoid contaminating output precmd_functions+=(update_terminalapp_cwd) # Run once to get initial cwd set update_terminalapp_cwd fi |
Hi,
thanks a lot for sharing! The theme config looks amazing. Only I was not capable of installing the font. Well, I have installed 4 of them but there are 2 file withing the fonts folder that I do not know what to do with them
Glad you like it! Which files are you stuck on? I think the four files is all you need.
Dejavu fonts were installed. Though, these files are not sure where should be put in.
-rw-rw-r– 1 xxxx xxxx 10K dec 22 2015 fonts.dir
-rw-rw-r– 1 xxxx xxxx 10K dec 22 2015 fonts.scale
01:21:55
Also, the arrows are not well displayed. Any suggestion?
Apparently, only arrows are missing.
You have to set the font in your console program. If you’re in cygwin, right click anywhere and select options, then in the “Text” tab, select the font. The method is similar for the gnome console.
Indeed. It works like a charm. The only thing I miss the most is the historical searching with .
Thanks a lot mate!
Ohh I see you defined a bindkey for that. Very sweet
bindkey “^[[A” history-search-backward # start typing + [Up-Arrow] – fuzzy find history forward
bindkey “^[[B” history-search-forward # start typing + [Down-Arrow] – fuzzy find history backward
😀 Enjoy! Thanks for the comments, and let me know if you make any improvements!
Thanks to the great guide
Glad it helped. 🙂
Been looking for something just like this without installing oh-my-zsh. Thank You
Enjoy. The screenshots are a little out of date now. I got rid of the dependency on those edited fonts. They were more trouble than they’re worth.