Skip to content

Instantly share code, notes, and snippets.

@hbsdev
Last active August 29, 2015 14:03
Show Gist options
  • Save hbsdev/03830c6d24f10c94602d to your computer and use it in GitHub Desktop.
Save hbsdev/03830c6d24f10c94602d to your computer and use it in GitHub Desktop.

Revisions

  1. hbsdev revised this gist Jul 2, 2014. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions .zshrc
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,17 @@
    # .zshrc file
    #
    # Written by Matthew Blissett.
    # .zshrc file written by Matthew Blissett.
    #
    # Latest version available from http://matt.blissett.me.uk/linux/zsh/zshrc
    #
    # Some functions taken from various web sites/mailing lists, others written
    # myself.
    #
    # Last updated 2014-04-16
    #
    # Released into the public domain.
    #

    # alternative: https://github.com/phux/zshrc/blob/master/.zshrc
    # gist: https://gist.github.com/hbsdev/03830c6d24f10c94602d

    # Skip all this for non-interactive shells
    [[ -z "$PS1" ]] && return

  2. hbsdev revised this gist Jul 2, 2014. 1 changed file with 1 addition and 2 deletions.
    3 changes: 1 addition & 2 deletions .zshrc
    Original file line number Diff line number Diff line change
    @@ -526,5 +526,4 @@ fi

    # Get round annoyance in Gentoo
    # (No idea if this is needed any more)
    source $HOME/.zshenv
    This page was last modified on 14
    source $HOME/.zshenv
  3. hbsdev renamed this gist Jul 2, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  4. hbsdev created this gist Jul 2, 2014.
    530 changes: 530 additions & 0 deletions gistfile1.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,530 @@
    # .zshrc file
    #
    # Written by Matthew Blissett.
    #
    # Latest version available from http://matt.blissett.me.uk/linux/zsh/zshrc
    #
    # Some functions taken from various web sites/mailing lists, others written
    # myself.
    #
    # Last updated 2014-04-16
    #
    # Released into the public domain.
    #

    # Skip all this for non-interactive shells
    [[ -z "$PS1" ]] && return

    # Set prompt (white and purple, nothing too fancy)
    #PS1=$'%{\e[0;37m%}%B%*%b %{\e[0;35m%}%m:%{\e[0;37m%}%~ %(!.#.>) %{\e[00m%}'
    # Fancier prompt
    # Exit status indicator in red (if not 0)
    # Job count in yellow (if not 0)
    # Date in white, host in magenta, directory in default, prompt character
    # Example:
    # 1J 23:06:26 ig:~ >
    PS1=$'%F{def}%(?..%B%K{red}[%?]%K{def}%b )%(1j.%b%K{yel}%F{bla}%jJ%F{def}%K{def} .)%F{white}%B%*%b %F{m}%m:%F{white}%~ %(!.#.>) %F{def}'

    # Set less options
    if [[ -x $(which less 2> /dev/null) ]]
    then
    export PAGER="less"
    export LESS="--ignore-case --LONG-PROMPT --QUIET --chop-long-lines -Sm --RAW-CONTROL-CHARS --quit-if-one-screen --no-init"
    export LESSHISTFILE='-'
    if [[ -x $(which lesspipe 2> /dev/null) ]]
    then
    LESSOPEN="| lesspipe %s"
    export LESSOPEN
    fi
    fi

    # Set default editor
    if [[ -x $(which emacs 2> /dev/null) ]]
    then
    export EDITOR="emacs"
    export USE_EDITOR=$EDITOR
    export VISUAL=$EDITOR
    fi

    # FAQ 3.10: Why does zsh not work in an Emacs shell mode any more?
    # http://zsh.sourceforge.net/FAQ/zshfaq03.html#l26
    [[ $EMACS = t ]] && unsetopt zle

    # Zsh settings for history
    export HISTIGNORE="&:ls:[bf]g:exit:reset:clear:cd:cd ..:cd.."
    export HISTSIZE=25000
    export HISTFILE=~/.zsh_history
    export SAVEHIST=10000
    setopt INC_APPEND_HISTORY
    setopt HIST_IGNORE_ALL_DUPS
    setopt HIST_IGNORE_SPACE
    setopt HIST_REDUCE_BLANKS
    setopt HIST_VERIFY

    # Say how long a command took, if it took more than 30 seconds
    export REPORTTIME=30

    # Zsh spelling correction options
    #setopt CORRECT
    #setopt DVORAK

    # Prompts for confirmation after 'rm *' etc
    # Helps avoid mistakes like 'rm * o' when 'rm *.o' was intended
    setopt RM_STAR_WAIT

    # Background processes aren't killed on exit of shell
    setopt AUTO_CONTINUE

    # Don’t write over existing files with >, use >! instead
    setopt NOCLOBBER

    # Don’t nice background processes
    setopt NO_BG_NICE

    # Watch other user login/out
    watch=notme
    export LOGCHECK=60

    # Enable color support of ls
    if [[ "$TERM" != "dumb" ]]; then
    if [[ -x `which dircolors 2> /dev/null` ]]; then
    eval `dircolors -b`
    alias 'ls=ls --color=auto'
    fi
    fi

    # Why is the date American even when the locale is en_GB? Fix with this
    export TIME_STYLE="long-iso"

    # Commas in ls, du, df output
    export BLOCK_SIZE="'1"

    # Short command aliases
    alias 'l=ls'
    alias 'la=ls -A'
    alias 'll=ls -l'
    alias 'llh=ls -l --si'
    alias 'lq=ls -Q'
    alias 'lr=ls -R'
    alias 'lrs=ls -lrS'
    alias 'lrt=ls -lrt'
    alias 'lrta=ls -lrtA'
    alias 'lrth=ls -lrth --si'
    alias 'lrtha=ls -lrthA --si'
    alias 'j=jobs -l'
    alias 'kw=kwrite'
    alias 'tf=tail -F'
    alias 'grep=grep --colour --devices=skip'
    alias 'e=emacs -nw'
    alias 'vnice=nice -n 20 ionice -c 3'
    alias 'get_iplayer=get_iplayer --nopurge'
    alias 'get-iplayer=get-iplayer --nopurge'
    alias "tree=tree -I 'CVS|*~'"
    alias 'lo=libreoffice'
    alias 'synchist=fc -RI'

    # Useful KDE integration (see later for definition of z)
    alias 'k=z kate -u' # -u is reuse existing session if possible

    # These are useful with the Dvorak keyboard layout
    alias 'h=ls'
    alias 'ha=la'
    alias 'hh=ll'
    alias 'hhh=llh'
    alias 'hq=lq'
    alias 'hr=lr'
    alias 'hrt=lrt'
    alias 'hrs=lrs'

    # Play safe!
    alias 'rm=rm -i'
    alias 'mv=mv -i'
    alias 'cp=cp -i'

    # For Git
    alias 'gk=z gitk --all'
    alias 'gs=git status' # (NB overriding GhostScript)
    alias 'gd=git diff'
    alias 'gg=z git gui'
    alias 'git-stashpullpop=git stash && git pull --rebase && git stash pop'

    # For convenience
    alias 'mkdir=mkdir -p'
    alias 'dmesg=dmesg --ctime'
    alias 'df=df --exclude-type=tmpfs'
    alias 'dus=du -ms * .*(N) | sort -n'
    alias 'dus.=du -ms .* | sort -n'
    alias 'fcs=(for i in * .*(N); do echo $(find $i -type f | wc -l) "\t$i"; done) | sort -n'
    alias 'fcs.=(for i in .*; do echo $(find $i -type f | wc -l) "\t$i"; done) | sort -n'
    alias 'zap=clear; echo -en "\e[3J"'
    alias 'rmedir=rmdir -v **/*(/^F)'
    alias 'xmlindent=xmlindent -t -f -nbe'

    # Typing errors...
    alias 'cd..=cd ..'

    # Global aliases (expand whatever their position)
    # e.g. find . E L
    alias -g L='| less'
    alias -g H='| head'
    #alias -g S='| sort'
    alias -g T='| tail'
    #alias -g N='> /dev/null'
    #alias -g E='2> /dev/null'
    unglobalalias() {
    unalias 'L'
    unalias 'H'
    unalias 'T'
    }

    # Log file viewing
    lastlogdir=logs
    alias taillast='tail -f $lastlogdir/*(om[1])'
    alias catlast='< $lastlogdir/*(om[1])'
    alias lesslast='less $lastlogdir/*(om[1])'

    # SSH aliases
    alias 'sshb=ssh [email protected]'

    # SSH to shell[1234].doc.ic.ac.uk at random
    sshdoc() {
    ssh mrb04@shell$(($RANDOM % 4 + 1)).doc.ic.ac.uk $*
    }

    # Automatically background processes (no output to terminal etc)
    z () {
    grey='\e[1;30m'
    norm='\e[m'
    outfile=$(mktemp --tmpdir ${1//\//}.XXX)
    echo "$grey$* &> $outfile$norm"
    $* &>! $outfile &!
    }

    # Aliases to use this
    # Use e.g. 'command gv' to avoid
    for i in acroread akregator amarok ario chromium-browser easytag eclipse firefox gimp gpdf gv \
    gwenview k3b kate konqueror kwrite libreoffice okular \
    opera see; do
    alias "$i=z $i"
    done
    alias "lo=z libreoffice"

    # Quick find
    f() {
    echo "find . -iname \"*$1*\""
    find . -iname "*$1*"
    }

    # Remap Dvorak-Qwerty quickly
    alias 'aoeu=setxkbmap gb' # (British keyboard layout)
    alias 'asdf=setxkbmap gb dvorak 2> /dev/null || setxkbmap dvorak gb 2> /dev/null || setxkbmap dvorak'

    # Update config files (master copies stored on server)
    alias rsync-config='if [[ -d ~/.matt-config/.git ]]; then echo Managed by Git; else rsync -av --delete --exclude .git blissett.me.uk:.matt-config/ ~/.matt-config/; fi'
    alias pull-config='(cd ~/.matt-config; git --git-dir=$HOME/.matt-config/.git pull && . ~/.zshrc)'

    # Check dot-files are up-to-date
    ~/.matt-config/make-links

    # Named directories
    hash -d config=$HOME/.matt-config
    hash -d bin=$HOME/.matt-config/bin
    hash -d log=/var/log

    # When directory is changed set xterm title to host:dir
    chpwd() {
    [[ -t 1 ]] || return
    case $TERM in
    sun-cmd) print -Pn "\e]l%~\e\\";;
    *xterm*|rxvt|(dt|k|E)term) print -Pn "\e]2;%m:%~\a";;
    esac
    }

    # For changing the umask automatically
    chpwd () {
    case $PWD in
    $HOME/[Dd]ocuments*)
    if [[ $(umask) -ne 077 ]]; then
    umask 0077
    echo -e "\033[01;32mumask: private \033[m"
    fi;;
    /web*|$HOME/[Ww]eb*)
    if [[ $(umask) -ne 072 ]]; then
    umask 0072
    echo -e "\033[01;33mumask: other readable \033[m"
    fi;;
    /nothing)
    if [[ $(umask) -ne 002 ]]; then
    umask 0002
    echo -e "\033[01;35mumask: group writable \033[m"
    fi;;
    *)
    if [[ $(umask) -ne 022 ]]; then
    umask 0022
    echo -e "\033[01;31mumask: world readable \033[m"
    fi;;
    esac
    }
    cd . &> /dev/null

    # For quickly plotting data with gnuplot. Arguments are files for 'plot "" with lines'.
    plot () {
    echo -n '(echo set term png; '
    echo -n 'echo -n plot \"'$1'\" with lines; '
    for i in $*[2,$#@]; echo -n 'echo -n , \"'$i'\" with lines; '
    echo 'echo ) | gnuplot | display png:-'

    (
    echo "set term png"
    echo -n plot \"$1\" with lines
    for i in $*[2,$#@]; echo -n "," \"$i\" "with lines"
    ) | gnuplot | display png:-
    }
    # Persistant gnuplot (can be resized etc)
    plotp () {
    echo -n '(echo -n plot \"'$1'\" with lines; '
    for i in $*[2,$#@]; echo -n 'echo -n , \"'$i'\" with lines; '
    echo 'echo ) | gnuplot -persist'

    (
    echo -n plot \"$1\" with lines
    for i in $*[2,$#@]; echo -n "," \"$i\" "with lines"
    echo
    ) | gnuplot -persist
    }

    # CD into random directory in PWD
    cdrand () {
    all=( *(/) )
    rand=$(( 1 + $RANDOM % $#all ))
    cd $all[$rand]
    }

    # Rotate a jpeg, losslessly
    #jrotate-r () {
    # for i in $*; do
    # exiftran -9 -b -i $i
    # done
    #}

    # Calculate the difference in whole days between two dates, ignoring timezone changes
    datediff () {
    echo $(( ($(date -u -d $1 +%s) - $(date -u -d $2 +%s)) / 86400))
    }

    # Close Amarok and shut down
    bedtime () {
    sleep ${1}m
    qdbus org.ktorrent.ktorrent /MainApplication quit
    qdbus org.kde.amarok /Player StopAfterCurrent
    until $(qdbus --literal org.kde.amarok /Player GetStatus | grep -q 2); do echo -n .; sleep 5; done; echo
    qdbus org.kde.amarok / Quit
    sudo shutdown -h 1
    }

    # MySQL prompt
    export MYSQL_PS1="\R:\m:\s \h.\d> "

    if [[ -x $(which mvn 2> /dev/null) ]]
    then
    export MAVEN_OPTS="-DdownloadSources=true -DdownloadJavadocs=true $MAVEN_OPTS"
    fi

    # Print some stuff
    date +%c
    if [[ -x `which fortune 2> /dev/null` ]]; then
    echo
    fortune -a 2> /dev/null
    fi

    # The following lines were added by compinstall
    zstyle ':completion:*' completer _expand _complete _match
    zstyle ':completion:*' completions 0
    zstyle ':completion:*' format 'Completing %d'
    zstyle ':completion:*' glob 0
    zstyle ':completion:*' group-name ''
    zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
    zstyle ':completion:*' matcher-list '+m:{a-z}={A-Z} r:|[._-]=** r:|=**' '' '' '+m:{a-z}={A-Z} r:|[._-]=** r:|=**'
    zstyle ':completion:*' max-errors 1 numeric
    zstyle ':completion:*' substitute 0
    zstyle :compinstall filename "$HOME/.zshrc"

    autoload -Uz compinit
    compinit
    # End of lines added by compinstall

    # Username completion.
    # Delete old definitions
    zstyle -d users
    # Set explicitly: zstyle ':completion:*' users mrb04 matt
    # Uses /etc/passwd, minus these entries:
    zstyle ':completion:*:*:*:users' ignored-patterns \
    adm apache bin daemon games gdm halt ident junkbust lp mail mailnull \
    named news nfsnobody nobody nscd ntp operator pcap postgres radvd \
    rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs backup bind \
    dictd gnats identd irc man messagebus postfix proxy sys www-data \
    avahi Debian-exim hplip list cupsys haldaemon ntpd proftpd statd

    # Hostname completion
    zstyle ':completion:*' hosts $( cat $HOME/.hosts* )

    # File/directory completion, for cd command
    zstyle ':completion:*:cd:*' ignored-patterns '(*/)#lost+found' '(*/)#CVS'
    # and for all commands taking file arguments
    zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS'

    # Prevent offering a file (process, etc) that's already in the command line.
    zstyle ':completion:*:(rm|cp|mv|kill|diff|scp):*' ignore-line yes
    # (Use Alt-Comma to do something like "mv abcd.efg abcd.efg.old")

    # Completion selection by menu for kill
    zstyle ':completion:*:*:kill:*' menu yes select
    zstyle ':completion:*:kill:*' force-list always
    zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd'
    zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

    # Filename suffixes to ignore during completion (except after rm command)
    # This doesn't seem to work
    zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.o' '*?.c~' '*?.old' '*?.pro' '*~'
    zstyle ':completion:*:(^rm):*' ignored-patterns '*?.o' '*?.c~' '*?.old' '*?.pro' '*~'
    zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS'
    #zstyle ':completion:*:(all-|)files' file-patterns '(*~|\\#*\\#):backup-files' 'core(|.*):core\ files' '*:all-files'

    zstyle ':completion:*:*:rmdir:*' file-sort time

    zstyle ':completion:*' local matt.blissett.me.uk /web/matt.blissett.me.uk

    # CD to never select parent directory
    zstyle ':completion:*:cd:*' ignore-parents parent pwd

    ## Use cache
    # Some functions, like _apt and _dpkg, are very slow. You can use a cache in
    # order to proxy the list of results (like the list of available debian
    # packages)
    zstyle ':completion:*' use-cache on
    zstyle ':completion:*' cache-path ~/.zsh/cache

    # Quick ../../..
    rationalise-dot() {
    if [[ $LBUFFER = *.. ]]; then
    LBUFFER+=/..
    else
    LBUFFER+=.
    fi
    }
    zle -N rationalise-dot
    bindkey . rationalise-dot

    autoload zsh/sched

    # Copys word from earlier in the current command line
    # or previous line if it was chosen with ^[. etc
    autoload copy-earlier-word
    zle -N copy-earlier-word
    bindkey '^[,' copy-earlier-word

    # Cycle between positions for ambigous completions
    autoload cycle-completion-positions
    zle -N cycle-completion-positions
    bindkey '^[z' cycle-completion-positions

    # Increment integer argument
    autoload incarg
    zle -N incarg
    bindkey '^X+' incarg

    # Write globbed files into command line
    autoload insert-files
    zle -N insert-files
    bindkey '^Xf' insert-files

    # Play tetris
    #autoload -U tetris
    #zle -N tetris
    #bindkey '^X^T' tetris

    # xargs but zargs
    autoload -U zargs

    # Calculator
    autoload zcalc

    # Line editor
    autoload zed

    # Renaming with globbing
    autoload zmv

    # Add Git functions
    if [[ -d ~/.matt-config/zsh-git/functions ]]; then
    fpath=($fpath ~/.matt-config/zsh-git/functions)
    typeset -U fpath
    setopt promptsubst
    autoload -U promptinit
    promptinit
    prompt wunjo
    fi

    # Git completion, retrieved from https://git.kernel.org/cgit/git/git.git/tree/contrib/completion/git-completion.zsh
    if [[ -f ~/.matt-config/git-completion.zsh ]]; then
    fpath=(~/.matt-config/git-completion.zsh $fpath)
    fi

    # PRLL, for parallel shell processing
    if [[ -e ~/.matt-config/prll/prll.sh ]]; then
    source ~/.matt-config/prll/prll.sh
    fi

    # Various reminders of things I forget...
    # (Mostly useful features that I forget to use)
    # vared
    # =ls turns to /bin/ls
    # =(ls) turns to filename (which contains output of ls)
    # <(ls) turns to named pipe
    # ^X* expand word
    # ^[^_ copy prev word
    # ^[A accept and hold
    # echo $name:r not-extension
    # echo $name:e extension
    # echo $xx:l lowercase
    # echo $name:s/foo/bar/

    # Quote current line: M-'
    # Quote region: M-"

    # Up-case-word: M-u
    # Down-case-word: M-l
    # Capitilise word: M-c

    # kill-region

    # expand word: ^X*
    # accept-and-hold: M-a
    # accept-line-and-down-history: ^O
    # execute-named-cmd: M-x
    # push-line: ^Q
    # run-help: M-h
    # spelling correction: M-s

    # echo ${^~path}/*mous*

    # Add host/domain specific zshrc
    if [ -f $HOME/.zshrc-$HOST ]
    then
    . $HOME/.zshrc-$HOST
    fi

    if [ -f $HOME/.zshrc-$(hostname -f) ]
    then
    . $HOME/.zshrc-$(hostname -f)
    fi

    if [ -f $HOME/.zshrc-$(hostname -d) ]
    then
    . $HOME/.zshrc-$(hostname -d)
    fi

    # Get round annoyance in Gentoo
    # (No idea if this is needed any more)
    source $HOME/.zshenv
    This page was last modified on 14