# Filename: /etc/skel/.zshrc # Purpose: config file for zsh (z shell) # Authors: (c) grml-team (grml.org) # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. ################################################################################ # Nowadays, grml's zsh setup lives in only *one* zshrc file. # That is the global one: /etc/zsh/zshrc (from grml-etc-core). # It is best to leave *this* file untouched and do personal changes to # your zsh setup via ${HOME}/.zshrc.local which is loaded at the end of # the global zshrc. # # That way, we enable people on other operating systems to use our # setup, too, just by copying our global zshrc to their ${HOME}/.zshrc. # Adjustments would still go to the .zshrc.local file. ################################################################################ ## Inform users about upgrade path for grml's old zshrc layout, assuming that: ## /etc/skel/.zshrc was installed as ~/.zshrc, ## /etc/zsh/zshrc was installed as ~/.zshrc.global and ## ~/.zshrc.local does not exist yet. if [ -r ~/.zshrc -a -r ~/.zshrc.global -a ! -r ~/.zshrc.local ] ; then printf '-!-\n' printf '-!- Looks like you are using the old zshrc layout of grml.\n' printf '-!- Please read the notes in the grml-zsh-refcard, being' printf '-!- available at: http://grml.org/zsh/\n' printf '-!-\n' printf '-!- If you just want to get rid of this warning message execute:\n' printf '-!- touch ~/.zshrc.local\n' printf '-!-\n' fi ## Settings for umask #if (( EUID == 0 )); then # umask 002 #else # umask 022 #fi ## Now, we'll give a few examples of what you might want to use in your ## .zshrc.local file (just copy'n'paste and uncomment it there): ## Prompt theme extension ## # Virtualenv support #function virtual_env_prompt () { # REPLY=${VIRTUAL_ENV+(${VIRTUAL_ENV:t}) } #} #grml_theme_add_token virtual-env -f virtual_env_prompt '%F{magenta}' '%f' #zstyle ':prompt:grml:left:setup' items rc virtual-env change-root user at host path vcs percent ## ZLE tweaks ## ## use the vi navigation keys (hjkl) besides cursor keys in menu completion #bindkey -M menuselect 'h' vi-backward-char # left #bindkey -M menuselect 'k' vi-up-line-or-history # up #bindkey -M menuselect 'l' vi-forward-char # right #bindkey -M menuselect 'j' vi-down-line-or-history # bottom ## set command prediction from history, see 'man 1 zshcontrib' #is4 && zrcautoload predict-on && \ #zle -N predict-on && \ #zle -N predict-off && \ #bindkey "^X^Z" predict-on && \ #bindkey "^Z" predict-off ## press ctrl-q to quote line: #mquote () { # zle beginning-of-line # zle forward-word # # RBUFFER="'$RBUFFER'" # RBUFFER=${(q)RBUFFER} # zle end-of-line #} #zle -N mquote && bindkey '^q' mquote ## define word separators (for stuff like backward-word, forward-word, backward-kill-word,..) #WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default #WORDCHARS=. #WORDCHARS='*?_[]~=&;!#$%^(){}' #WORDCHARS='${WORDCHARS:s@/@}' # just type '...' to get '../..' #rationalise-dot() { #local MATCH #if [[ $LBUFFER =~ '(^|/| | |'$'\n''|\||;|&)\.\.$' ]]; then # LBUFFER+=/ # zle self-insert # zle self-insert #else # zle self-insert #fi #} #zle -N rationalise-dot #bindkey . rationalise-dot ## without this, typing a . aborts incremental history search #bindkey -M isearch . self-insert #bindkey '\eq' push-line-or-edit ## some popular options ## ## add `|' to output redirections in the history #setopt histallowclobber ## try to avoid the 'zsh: no matches found...' #setopt nonomatch ## warning if file exists ('cat /dev/null > ~/.zshrc') #setopt NO_clobber ## don't warn me about bg processes when exiting #setopt nocheckjobs ## alert me if something failed #setopt printexitvalue ## with spelling correction, assume dvorak kb #setopt dvorak ## Allow comments even in interactive shells #setopt interactivecomments ## compsys related snippets ## ## changed completer settings #zstyle ':completion:*' completer _complete _correct _approximate #zstyle ':completion:*' expand prefix suffix ## another different completer setting: expand shell aliases #zstyle ':completion:*' completer _expand_alias _complete _approximate ## to have more convenient account completion, specify your logins: #my_accounts=( # {grml,grml1}@foo.invalid # grml-devel@bar.invalid #) #other_accounts=( # {fred,root}@foo.invalid # vera@bar.invalid #) #zstyle ':completion:*:my-accounts' users-hosts $my_accounts #zstyle ':completion:*:other-accounts' users-hosts $other_accounts ## add grml.org to your list of hosts #hosts+=(grml.org) #zstyle ':completion:*:hosts' hosts $hosts ## telnet on non-default ports? ...well: ## specify specific port/service settings: #telnet_users_hosts_ports=( # user1@host1: # user2@host2: # @mail-server:{smtp,pop3} # @news-server:nntp # @proxy-server:8000 #) #zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports ## the default grml setup provides '..' as a completion. it does not provide ## '.' though. If you want that too, use the following line: #zstyle ':completion:*' special-dirs true ## aliases ## ## translate #alias u='translate -i' ## ignore ~/.ssh/known_hosts entries #alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "PreferredAuthentications=keyboard-interactive"' ## global aliases (for those who like them) ## #alias -g '...'='../..' #alias -g '....'='../../..' #alias -g BG='& exit' #alias -g C='|wc -l' #alias -g G='|grep' #alias -g H='|head' #alias -g Hl=' --help |& less -r' #alias -g K='|keep' #alias -g L='|less' #alias -g LL='|& less -r' #alias -g M='|most' #alias -g N='&>/dev/null' #alias -g R='| tr A-z N-za-m' #alias -g SL='| sort | less' #alias -g S='| sort' #alias -g T='|tail' #alias -g V='| vim -' ## instead of global aliase it might be better to use grmls $abk assoc array, whose contents are expanded after pressing ,. #$abk[SnL]="| sort -n | less" ## get top 10 shell commands: #alias top10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10' ## Execute \kbd{./configure} #alias CO="./configure" ## Execute \kbd{./configure --help} #alias CH="./configure --help" ## miscellaneous code ## ## Use a default width of 80 for manpages for more convenient reading #export MANWIDTH=${MANWIDTH:-80} ## Set a search path for the cd builtin #cdpath=(.. ~) ## variation of our manzsh() function; pick you poison: #manzsh() { /usr/bin/man zshall | most +/"$1" ; } ## Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html #bash() { # NO_SWITCH="yes" command bash "$@" #} #restart () { # exec $SHELL $SHELL_ARGS "$@" #} ## Handy functions for use with the (e::) globbing qualifier (like nt) #contains() { grep -q "$*" $REPLY } #sameas() { diff -q "$*" $REPLY &>/dev/null } #ot () { [[ $REPLY -ot ${~1} ]] } ## get_ic() - queries imap servers for capabilities; real simple. no imaps #ic_get() { # emulate -L zsh # local port # if [[ ! -z $1 ]] ; then # port=${2:-143} # print "querying imap server on $1:${port}...\n"; # print "a1 capability\na2 logout\n" | nc $1 ${port} # else # print "usage:\n $0 [port]" # fi #} ## List all occurrences of programm in current PATH #plap() { # emulate -L zsh # if [[ $# = 0 ]] ; then # echo "Usage: $0 program" # echo "Example: $0 zsh" # echo "Lists all occurrences of program in the current PATH." # else # ls -l ${^path}/*$1*(*N) # fi #} ## Find out which libs define a symbol #lcheck() { # if [[ -n "$1" ]] ; then # nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1" # else # echo "Usage: lcheck " >&2 # fi #} ## Download a file and display it locally #uopen() { # emulate -L zsh # if ! [[ -n "$1" ]] ; then # print "Usage: uopen \$URL/\$file">&2 # return 1 # else # FILE=$1 # MIME=$(curl --head $FILE | \ # grep Content-Type | \ # cut -d ' ' -f 2 | \ # cut -d\; -f 1) # MIME=${MIME%$'\r'} # curl $FILE | see ${MIME}:- # fi #} ## Memory overview #memusage() { # ps aux | awk '{if (NR > 1) print $5; # if (NR > 2) print "+"} # END { print "p" }' | dc #} ## print hex value of a number #hex() { # emulate -L zsh # if [[ -n "$1" ]]; then # printf "%x\n" $1 # else # print 'Usage: hex ' # return 1 # fi #} ## log out? set timeout in seconds... ## ...and do not log out in some specific terminals: #if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then # unset TMOUT #else # TMOUT=1800 #fi ## associate types and extensions (be aware with perl scripts and anwanted behaviour!) #check_com zsh-mime-setup || { autoload zsh-mime-setup && zsh-mime-setup } #alias -s pl='perl -S' ## ctrl-s will no longer freeze the terminal. #stty erase "^?" ## you want to automatically use a bigger font on big terminals? #if [[ "$TERM" == "xterm" ]] && [[ "$LINES" -ge 50 ]] && [[ "$COLUMNS" -ge 100 ]] && [[ -z "$SSH_CONNECTION" ]] ; then # large #fi ## Some quick Perl-hacks aka /useful/ oneliner #bew() { perl -le 'print unpack "B*","'$1'"' } #web() { perl -le 'print pack "B*","'$1'"' } #hew() { perl -le 'print unpack "H*","'$1'"' } #weh() { perl -le 'print pack "H*","'$1'"' } #pversion() { perl -M$1 -le "print $1->VERSION" } # i. e."pversion LWP -> 5.79" #getlinks () { perl -ne 'while ( m/"((www|ftp|http):\/\/.*?)"/gc ) { print $1, "\n"; }' $* } #gethrefs () { perl -ne 'while ( m/href="([^"]*)"/gc ) { print $1, "\n"; }' $* } #getanames () { perl -ne 'while ( m/a name="([^"]*)"/gc ) { print $1, "\n"; }' $* } #getforms () { perl -ne 'while ( m:(\):gic ) { print $1, "\n"; }' $* } #getstrings () { perl -ne 'while ( m/"(.*?)"/gc ) { print $1, "\n"; }' $*} #getanchors () { perl -ne 'while ( m/«([^«»\n]+)»/gc ) { print $1, "\n"; }' $* } #showINC () { perl -e 'for (@INC) { printf "%d %s\n", $i++, $_ }' } #vimpm () { vim `perldoc -l $1 | sed -e 's/pod$/pm/'` } #vimhelp () { vim -c "help $1" -c on -c "au! VimEnter *" } ## END OF FILE ################################################################# # source ~/.zshrc.alias # source /etc/zsh_command_not_found #export PATH=~/.config/composer/vendor/bin:$PATH #export PATH=~/utils:$PATH #export PATH=/usr/local/go/bin:$PATH #export PATH=~/go/bin:$PATH #export PATH=$PATH:/opt/mssql-tools/bin/ # customize vcs_info zstyle ':vcs_info:git*:*' check-for-changes true zstyle ':vcs_info:git*:*' unstagedstr ' %F{red}•' zstyle ':vcs_info:git*:*' stagedstr ' %F{yellow}•' # enable hooks, requires Zsh >=4.3.11 if [[ $ZSH_VERSION == 4.3.<11->* || $ZSH_VERSION == 4.<4->* || $ZSH_VERSION == <5->* ]] ; then # hook for untracked files +vi-untracked() { if [[ $(git rev-parse --is-inside-work-tree 2>/dev/null) == 'true' ]] && \ [[ -n $(git ls-files --others --exclude-standard) ]] ; then hook_com[staged]+=' %F{red}•' fi } # unpushed commits +vi-outgoing() { local gitdir="$(git rev-parse --git-dir 2>/dev/null)" [ -n "$gitdir" ] || return 0 if [ -r "${gitdir}/refs/remotes/git-svn" ] ; then local count=$(git rev-list remotes/git-svn.. 2>/dev/null | wc -l) else local branch="$(cat ${gitdir}/HEAD 2>/dev/null)" branch=${branch##*/heads/} local count=$(git rev-list remotes/origin/${branch}.. 2>/dev/null | wc -l | xargs) fi if [[ "$count" -gt 0 ]] ; then hook_com[staged]+="%F{cyan} $count" fi } # hook for stashed files +vi-stashed() { if git rev-parse --verify refs/stash &>/dev/null ; then hook_com[staged]+=' %F{cyan}•' fi } zstyle ':vcs_info:git*+set-message:*' hooks stashed untracked outgoing fi # required for *formats in vcs_info, see below BLUE="%F{blue}" RED="%F{red}" GREEN="%F{green}" CYAN="%F{cyan}" MAGENTA="%F{magenta}" YELLOW="%F{yellow}" WHITE="%F{white}" NO_COLOR="%f" # extend default vcs_info in prompt zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a%u%c${MAGENTA}]${NO_COLOR} " "zsh: %r" zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b%u%c${MAGENTA}]${NO_COLOR}%} " "zsh: %r" setopt HIST_IGNORE_SPACE # ps -p $SSH_AGENT_PID > /dev/null || eval `ssh-agent -s` # ssh-add -l | grep sevikgr > /dev/null 2>&1 || (echo "Adding ssh-key to ssh-agent"; ssh-add) bindkey -- '^[[1~' beginning-of-line # Home key bindkey -- '^[[4~' end-of-line # End key [ ! -d ~/.ssh ] && mkdir ~/.ssh if [ ! -S ~/.ssh/ssh_auth_sock ]; then eval `ssh-agent -s` ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock fi export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock ssh-add -l > /dev/null 2>&1 || ssh-add