#
# ~/.zshrc
# Z shell configuration file.
# CREDITS
# File was first taken from the following location:
#
# http://www.tomaw.net/configs/zshrc
#
# Some additions were made by me, Jonathan Patrick Davies <jpds@ubuntu.com>.
# Among these are the Launchpad, Debian, Wikipedia/Wikitravel, BBC search,
# Demonoid, Lonely Planet, Urbandictionary and other various functions. I also
# implemented a few "if" statements to stop zsh complaining about any missing
# objects and placed the dircolors support.
#
# The forkex() function is thanks to Siegfried-Angel Gevatter Pujals
# <rainct@ubuntu.com>.
#
# Some of this file is thanks to <slarti@gentoo.org>, some is take from
# spider's <spider@gentoo.org> zshrc, and some from the zshwiki.org.
# Some bash functions are nicked from ciaranm's <ciaranm@gentoo.org>
# bashrc.
#
# READ ME
#
# • Remember to change the stuff specific to me! It's all at the top of
# this file.
#
# • You can obviously only get the most out of this file if you take the
# time to read through the comments. Of course, you can still experience
# zsh's superiority by simply plugging this file in and using it.
#
# BEGIN LOCAL
export LANG="{{ .locale }}"
export LC_TIME="en_GB.UTF-8"
export LC_COLLATE=C # force strict lexicographic sorting
export TIME_STYLE=long-iso # make ls -l use YYYY-MM-DD in dired
export TZ="America/Toronto" # Force our time zone this location.
export EDITOR="vim" # Long live vim (as our editor).
export NAME="Ryan Kavanagh" # Our name.
export EMAIL="rak@rak.ac" # Our email address.
export GPGKEY="4E469519ED677734268FBD958F7BF8FC4A11C97A" # Our GnuPG key ID.
export DEBFULLNAME=$NAME # These are used by Debian packaging...
export DEBEMAIL="rak@debian.org" # ...programs.
export DEBSIGN_KEYID=$GPGKEY # Key ID for signing Debian packages.
export BZR_EMAIL="$NAME <$EMAIL>" # Override email for Bazaar.
export GIT_AUTHOR_NAME=$NAME
export DARCS_EMAIL="$NAME <$EMAIL>"
export QUILT_PATCHES=debian/patches
if [[ `hostname` = "demeter.rak.ac" ]]; then
export PATH=${HOME}/bin:/opt/local/bin:/opt/local/sbin:/usr/sbin:/sbin:$PATH:${GEM_BIN}:${HOME}/.local/bin/
export MANPATH=/opt/local/share/man:$MANPATH
else
export PATH=${HOME}/bin:/usr/sbin:/sbin:$PATH:${GEM_BIN}:${HOME}/.local/bin/
fi
export MANWIDTH=80
export MANOPT="-L en"
export PAGER=less
export LESS=-FQXR
export PDFVIEWER=evince
export BROWSER=firefox
export TEXMFHOME=${HOME}/.texmf
export KRB5CCNAME=DIR:${HOME}/.cache/krb5cc # kerberos credentials cache
export GOPATH=${HOME}/.go
alias apt-upgrade='sudo apt-get update && sudo apt-get dist-upgrade'
alias dbuild='GPG_TTY=$(tty) debuild -S -sa -k$GPGKEY'
alias itp='reportbug -M -B debian --email rak@debian.org --paranoid -K $GPGKEY wnpp'
alias sneezymud='nc play.sneezymud.com 7900'
alias news='tin -g pqnews.cogeco.ca'
alias 1920s='mplayer -playlist http://kara.fast-serv.com:8398/listen.pls'
alias dismuke='mplayer -playlist http://early1900s.org/radiodismuke/radiodismuke.ram'
alias mplayer-fb='mplayer -vo fbdev'
alias links2-fb='links2 -driver fb'
alias svbuildi='svn-buildpackage --svn-ignore-new --svn-builder="debuild -S -sa -k$GPGKEY"'
alias svbuild='svn-buildpackage --svn-builder="debuild -S -sa -k$GPGKEY"'
alias gibuild='git-buildpackage --git-builder="sbuild -sAd u"'
alias gibuildi='git-buildpackage --git-ignore-new --git-builder="sbuild -sAd u"'
alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
alias vi='vim'
alias sm='tmux attach -t mail || tmux -f ${HOME}/.tmux-mail.conf attach -t mail'
alias sshfw='ssh -oForwardAgent=yes'
alias slpr="lpr -P scs_public -o Staple=1Staple\(Left\) -o KMDuplex=True"
# END LOCAL
. ${HOME}/.opam/opam-init/init.zsh > /dev/null 2> /dev/null || true
# Ensure that we possess a ~/.zsh/ directory. This is required for the
# ~/.zsh/history file.
if [ ! -d $HOME/.zsh/ ]; then
mkdir -p $HOME/.zsh/
fi
# We use powerline10k for our prompt
for f in $HOME/.zsh/p10k.zsh $HOME/.zsh/powerlevel10k/powerlevel10k.zsh-theme; do
[[ ! -f $f ]] || source $f
done
# Alias/custom commands
#
# Many of these options don's exist on BSD rm/cp/mkdir/ln/etc.
#
# Some are just in case - for 'rm', 'cp' and 'mv' - ask about overwriting or
# deleting files.
# Furthermore, be verbose about what each command is performing to be present of
# what is occuring every time.
if [[ `uname` = "Linux" ]]; then
alias cp="cp -iv"
alias mkdir="mkdir -v"
alias mv="mv -iv"
alias ln="ln -v"
# Only delete files on the current file system to avoid removing recursively
# from bind mounts.
alias rm="rm -iv --one-file-system"
alias grep="grep --colour=auto"
alias chown="chown -v"
alias chmod="chmod -v"
alias ls="ls --classify --color=always" # Add all colours and
# have fancy symbols for files, etc.
elif [[ `uname` = "OpenBSD" && -x /usr/local/bin/colorls ]]; then
alias ls="colorls -G"
fi
# Colours.
autoload -U colors; colors
# Change word boundary characters. Nabbed from
# http://zshwiki.org/KeyBindings.
# By default: export WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>'
# We remove the slash, period, angle brackets, dash here.
export WORDCHARS='*?_-[]~=&;!#$%^(){}'
# Follow GNU LS_COLORS for completion menus
zmodload -i zsh/complist
# Should dircolors exist. Fetch LS_COLORS from it.
if [ "`which dircolors`" != 'dircolors not found' ]; then
eval "$(dircolors -b)"
fi
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
zstyle ':completion:*:*:kill:*' list-colors '=%*=01;31'
# Load the completion system
autoload -U compinit; compinit
compdef _quilt dquilt=quilt # Quilt tab completion for dquilt
# pattern history search
bindkey '^R' history-incremental-pattern-search-backward
# Very powerful version of mv implemented in zsh. The main feature I
# know of it that seperates it from the standard mv is that it saves you
# time by being able to use patterns which are expanded into positional
# parameters. So:
#
# slarti@pohl % zmv (*)foo ${1}bar
#
# On a series of files like onefoo, twofoo, threefoo, fivefoo would be
# renamed to onebar twobar threebar fourbar.
#
# Although that's nifty enough, I suspect there are other features I
# don't know about yet...
#
# Read $fpath/zmv for some more basic examples of usage, and also use
# run-help on it :)
autoload -U zmv
# Like xargs, but instead of reading lines of arguments from standard input,
# it takes them from the command line. This is possible/useful because,
# especially with recursive glob operators, zsh often can construct a command
# line for a shell function that is longer than can be accepted by an external
# command. This is what's often referred to as the "shitty Linux exec limit" ;)
# The limitation is on the number of characters or arguments.
#
# slarti@pohl % echo {1..30000}
# zsh: argument list too long: /bin/echo
# zsh: exit 127 /bin/echo {1..30000}
autoload -U zargs
# Makes it easy to type URLs as command line arguments. As you type, the
# input character is analyzed and, if it mayn eed quoting, the current
# word is checked for a URI scheme. If one is found and the current word
# is not already quoted, a blackslash is inserted before the input
# caracter.
autoload -U url-quote-magic
zle -N self-insert url-quote-magic
# zed is a tiny command-line editor in pure ZSH; no other shell could do
# this. zed itself is simple as anything, but it's killer feature for
# me is that it can edit functions on the go with zed -f <funcname> (or
# fned <funcname>. This is useful for me when I'm using and defining
# functions interactively, for example, when I'm working through the
# Portage tree in CVS. It allows me to edit a function on the fly,
# without having to call the last definition back up from the history
# and re-edit that in ZLE. It also indents the function, even if it was
# defined on all one line in the line editor, making it easy as anything
# to edit.
#
# ^X^W to save, ^C to abort.
autoload -U zed
# Incremental completion of a word. After starting this, a list of
# completion choices can be shown after every character you type, which
# can deleted with ^H or delete. Return will accept the current
# completion. Hit tab for normal completion, ^G to get back where you
# came from and ^D to list matches.
autoload -U incremental-complete-word
zle -N incremental-complete-word
bindkey "^Xi" incremental-complete-word
# This function allows you type a file pattern, and see the results of
# the expansion at each step. When you hit return, they will be
# inserted into the command line.
autoload -U insert-files
zle -N insert-files
bindkey "^Xf" insert-files
# This set of functions implements a sort of magic history searching.
# After predict-on, typing characters causes the editor to look backward
# in the history for the first line beginning with what you have typed so
# far. After predict-off, editing returns to normal for the line found.
# In fact, you often don't even need to use predict-off, because if the
# line doesn't match something in the history, adding a key performs
# standard completion - though editing in the middle is liable to delete
# the rest of the line.
autoload -U predict-on
zle -N predict-on
zle -N predict-off
bindkey "^X^Z" predict-on
bindkey "^Z" predict-off
# run-help is a help finder, bound in ZLE to M-h. It doesn't need to be
# autoloaded to work - the non-autoloaded version just looks up a man
# page for the command under the cursor, then when that process is
# finished it pulls your old command line back up from the buffer stack.
# However, with the autoloaded function and:
#
# mkdir ~/zsh-help; cd ~/zsh-help MANPAGER="less" man zshbuiltins | \
# colcrt | perl /usr/share/zsh/4.2.1/Util/helpfiles
#
# It'll work for zsh builtins too. By the way, I've assumed some things
# in that command. ~/zsh-help can be wherever you like, MANPAGER needs
# to be any standard pager (less, pg, more, just not the MANPAGER I have
# defined in this file), colcrt can be col -bx, and the path to
# helpfiles may be different for you (Util may not even be installed
# with your distribution; fair enough, make install doesn't install it.
# Dig up a source tarball and everything is in there).
# Load the new one
autoload -U run-help
# Press Alt-H to show help for command we are currently on.
bindkey '[[A' run-help
# https://zsh.sourceforge.io/Doc/Release/Options.html#History
# History file name and maximum size.
HISTFILE="$HOME/.zsh/history"
SAVEHIST=500000
HISTSIZE=600000 # should be > SAVEHIST
# Save each command’s beginning timestamp (in seconds since the epoch) and the
# duration (in seconds) to the history file.
setopt EXTENDED_HISTORY
# If the internal history needs to be trimmed to add the current command line,
# setting this option will cause the oldest history event that has a duplicate
# to be lost before losing a unique event from the list.
setopt HIST_EXPIRE_DUPS_FIRST
# Better locking to avoid corruption
setopt HIST_FCNTL_LOCK
# When searching for history entries in the line editor, do not display
# duplicates of a line previously found, even if the duplicates are not
# contiguous.
setopt HIST_FIND_NO_DUPS
# Don't story commands in history if they start with a space
setopt HIST_IGNORE_SPACE
# Don't store history/fc -l in the history list when invoked
setopt HIST_NO_STORE
# Remove superfluous blanks from each command line being added to the history
# list.
setopt HIST_REDUCE_BLANKS
# This option works like APPEND_HISTORY except that new history lines are added
# to the $HISTFILE incrementally (as soon as they are entered), rather than
# waiting until the shell exits. The file will still be periodically re-written
# to trim it when the number of lines grows 20% beyond the value specified by
# $SAVEHIST (see also the HIST_SAVE_BY_COPY option).
setopt INC_APPEND_HISTORY
# Push History from previous sessions. IF $HISTFILE exists.
if [ -f $HISTFILE ]; then
fc -RI $HISTFILE
fi
## Key bindings
# You may use:
# % autoload -U zkbd
# % zkbd
# to discover your keys.
typeset -U fpath
# Actually, stick with emacs for the moment. The vi keymap just doesn't
# seem to be as complete (even if it's nicer for editing, there's no
# execute-named-cmd bound, for example).
bindkey -e # Emacs keybindings.
# This function sets the window tile to user@host:/workingdir before each
# prompt. If you're using screen, it sets the window title (works
# wonderfully for 'hardstatus' lines.
precmd() {
# [[ -t 1 ]] || return
case $TERM in
*xterm*|rxvt*) print -Pn "\e]2;%n@%m:%~\a"
;;
screen*) print -Pn "\ek%n@%m:%~\e\\"
;;
esac
}
# This sets the window title to the last run command.
preexec() {
# [[ -t 1 ]] || return
case $TERM in
*xterm*|rxvt*) print -Pn "\e]2;$1\a"
;;
screen*) print -Pn "\ek$1\e\\"
;;
esac
}
# Custom commands.
loop() {
while [ 1 -eq 1 ]; do
$@
done
}
# CTAN downloader
ctand() {
wget http://mirror.ctan.org/macros/latex/contrib/$1.zip && unzip $1.zip
}
# For formating text files for a printer
fmtpr() {
fmt --width=62 $@ | LC_ALL=C LANG=C pr -o 10 -W 62 -J -F -l 62
}
# Russian
#
verb.rus() {
curl -s "http://en.wiktionary.org/w/index.php?title=$1&action=edit" | grep 'ru-conj-'
firefox "http://en.wiktionary.org/w/index.php?title=$1"
}
#
# Debian.
#
debian.bugs.number() {
# Debian Bug Tracker - by number.
w3m "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
}
debian.bugs.package() {
# Debian Bug Tracker - by package.
w3m "http://bugs.debian.org/cgi-bin/pkgreport.cgi?src=$1"
}
debian.packages() {
# Debian Packages.
# Add 'src:' in front of the package name to search for source packages.
w3m "http://packages.debian.org/$1"
}
debian.qa.maintainer() {
# Debian QA Maintainer search by email address.
w3m "http://qa.debian.org/developer.php?login=$1"
}
debian.qa.package() {
# Debian QA Maintainer search by package name.
w3m "http://qa.debian.org/developer.php?package=$1"
}
debian.qa.pts() {
# Debian Package Tracking system - developers.
w3m "http://packages.qa.debian.org/$1"
}
debian.qa.task() {
# Debian QA - search for task.
w3m "http://qa.debian.org/developer.php?task=$1"
}
debian.wiki() {
# Search the Debian Wiki.
w3m "http://wiki.debian.org/?action=fullsearch&value=$@"
}
#
# Others.
#
wttr() {
local request="wttr.in/${1-Montreal}"
[ "$(tput cols)" -lt 125 ] && request+='?n'
curl -H "Accept-Language: ${LANG%_*}" --compressed "$request"
}
google() {
# Google search.
w3m "http://www.google.com/search?q=$@"
}
wikipedia() {
# Wikipedia search. English section.
w3m "http://en.wikipedia.org/wiki/Special:Search?search=$@"
}
wiktionary() {
# Search Wiktionary for a term.
w3m "http://en.wiktionary.org/wiki/Special:Search?search=$@"
}
forkex() {
# Fork program $@ from console.
nohup "$@" >/dev/null 2>&1 <&1 & disown %%
}
gbp-snap() {
if [[ -e $@ ]]; then
git-dch -aSN $1
else
git-dch -aS
fi
gpg-mounter
gibuild --git-ignore-new
DSC=`head -n1 debian/changelog | sed -e 's/\(.*\) (\(.*\)).*/\1_\2.dsc/g'`
DIST=`head -n1 debian/changelog | sed -e 's/.* \(.*\);.*/\1/g'`
cd ..
sbuild -d $DIST $DSC
}
# Pretty menu!
zstyle ':completion:*' menu select=1
zstyle ':completion:*' select-prompt %SScroll active at %p%s.
# Completion options.
zstyle ':completion:*' completer _complete _prefix
zstyle ':completion::prefix-1:*' completer _complete
zstyle ':completion:incremental:*' completer _complete _correct
zstyle ':completion:predict:*' completer _complete
# Completion caching.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zsh/cache/$HOST
# Expand partial paths.
zstyle ':completion:*' expand 'yes'
zstyle ':completion:*' squeeze-slashes 'yes'
# Include non-hidden directories in globbed file completions
# for certain commands.
zstyle ':completion::complete:*' '\'
# Use menuselection for PID completion.
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
# tag-order 'globbed-files directories' all-files.
zstyle ':completion::complete:*:tar:directories' file-patterns '*~.*(-/)'
# Do not complete backup files as executables.
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
# Separate matches into groups.
zstyle ':completion:*:matches' group 'yes'
# With commands like rm, it's annoying if you keep getting offered the same
# file multiple times. This fixes it. Also good for cp, et cetera..
zstyle ':completion:*:rm:*' ignore-line yes
zstyle ':completion:*:cp:*' ignore-line yes
# Describe each match group.
zstyle ':completion:*:descriptions' format "%B---- %d%b"
# Messages/warnings format.
zstyle ':completion:*:messages' format '%B%U---- %d%u%b'
zstyle ':completion:*:warnings' format '%B%U---- no match for: %d%u%b'
# Describe options in full.
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:options' auto-description '%d'
# Simulate spider's old abbrev-expand 3.0.5 patch
#zstyle ':completion:*:history-words' stop verbose
#zstyle ':completion:*:history-words' remove-all-dups yes
#zstyle ':completion:*:history-words' list false
# From the zshwiki. Hide CVS files/directories from being completed.
zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS'
zstyle ':completion:*:cd:*' ignored-patterns '(*/)#CVS'
# Also from the wiki. Hide uninteresting users from completion.
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 alias amavis at clamav cmd5checkpw cron cyrus dhcp dnscache \
dnslog foldingathome guest haldaemon jabber ldap mailman mpd mysql \
nut p2p portage postmaster qmaild qmaill qmailp qmailq qmailr qmails \
smmsp tinydns vpopmail wasabi zope
# Approximate completion. From the wiki.
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric
zstyle ':completion:*:sudo:*' command-path /usr/sbin /usr/bin /sbin /bin \
/usr/X11R6/bin
# Options
setopt \
NO_all_export \
always_last_prompt \
always_to_end \
append_history \
auto_cd \
auto_list \
auto_menu \
auto_name_dirs \
auto_param_keys \
auto_param_slash \
auto_pushd \
auto_remove_slash \
NO_auto_resume \
bad_pattern \
bang_hist \
NO_beep \
brace_ccl \
correct_all \
NO_bsd_echo \
NO_cdable_vars \
NO_chase_links \
clobber \
complete_aliases \
complete_in_word \
correct \
NO_correct_all \
csh_junkie_history \
NO_csh_junkie_loops \
NO_csh_junkie_quotes \
NO_csh_null_glob \
equals \
extended_glob \
extended_history \
function_argzero \
glob \
NO_glob_assign \
glob_complete \
NO_glob_dots \
NO_glob_subst \
NO_hash_cmds \
NO_hash_dirs \
hash_list_all \
hist_allow_clobber \
hist_beep \
hist_ignore_dups \
hist_ignore_space \
NO_hist_no_store \
hist_verify \
NO_hup \
NO_ignore_braces \
NO_ignore_eof \
interactive_comments \
inc_append_history \
NO_list_ambiguous \
NO_list_beep \
list_types \
long_list_jobs \
magic_equal_subst \
NO_mail_warning \
NO_mark_dirs \
menu_complete \
multios \
nomatch \
notify \
NO_null_glob \
numeric_glob_sort \
NO_overstrike \
path_dirs \
posix_builtins \
NO_print_exit_value \
NO_prompt_cr \
prompt_subst \
pushd_ignore_dups \
NO_pushd_minus \
pushd_silent \
pushd_to_home \
rc_expand_param \
NO_rc_quotes \
NO_rm_star_silent \
NO_sh_file_expansion \
sh_option_letters \
share_history \
short_loops \
NO_sh_word_split \
NO_single_line_zle \
NO_sun_keyboard_hack \
NO_verbose \
zle
# GPG / SSH AGENT
if command -v keychain > /dev/null; then
ls ~/.ssh/keys/{{ .chezmoi.hostname }}/id_* | egrep -v '\.pub$' | xargs keychain
[ -z "$HOSTNAME" ] && HOSTNAME=`uname -n`
[ -f $HOME/.keychain/$HOSTNAME-sh ] &&
. $HOME/.keychain/$HOSTNAME-sh
[ -f $HOME/.keychain/$HOSTNAME-sh-gpg ] &&
. $HOME/.keychain/$HOSTNAME-sh-gpg
fi