2 # Purpose: config file for zsh (z shell)
3 # Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports: see http://grml.org/bugs/
5 # License: This file is licensed under the GPL v2.
6 # Latest change: Sam Feb 24 20:51:01 CET 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17 if [[ -n $ZSH_PROFILE_RC ]] ; then
22 # {{{ check for version/system
23 # check for versions (compatibility reasons)
24 if autoload is-at-least && is-at-least 2>/dev/null ; then
25 is4() { is-at-least 4 }
26 is42() { is-at-least 4.2 }
29 [[ $ZSH_VERSION == 4.* ]] && return 0
33 [[ $ZSH_VERSION == 4.<2->* ]] && return 0
40 [ -f /etc/grml_version ] && return 0
45 [ -f /etc/grml_cd ] && return 0
51 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
54 isgrmlsmall() { return 1 }
57 # are we running within an utf environment?
59 case "$LANG $CHARSET $LANGUAGE" in
66 # check for user, if not running as root set $SUDO to sudo
67 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
69 # change directory to home on first invocation of zsh
70 # important for rungetty -> autologin
71 # Thanks go to Bart Schaefer!
72 isgrml && checkhome() {
73 if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
74 export ALREADY_DID_CD_HOME=$HOME
80 # {{{ set some variables
81 export EDITOR=${EDITOR:-vim}
82 export MAIL=${MAIL:-/var/mail/$USER}
83 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
84 export SHELL='/bin/zsh'
85 [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
86 [[ -x /usr/bin/dircolors ]] && eval `dircolors -b`
88 # Search path for the cd comman
91 # Support our own site-functions
92 [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
94 # automatically remove duplicates from these arrays
95 typeset -U path cdpath fpath manpath
99 if [[ "$TERM" != emacs ]]; then
100 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
101 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
102 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
103 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
104 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
105 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
106 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
107 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
108 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
109 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
110 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
111 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
113 [[ "$terminfo[kcuu1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
114 [[ "$terminfo[kcud1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
115 [[ "$terminfo[kcuf1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
116 [[ "$terminfo[kcub1]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
117 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
118 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
119 [[ "$terminfo[khome]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
120 [[ "$terminfo[kend]" == "
\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
123 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
124 # use emacs style per default:
129 #if [[ "$TERM" == screen ]]; then
130 bindkey '\e[1~' beginning-of-line # home
131 bindkey '\e[4~' end-of-line # end
132 bindkey "^[[A" up-line-or-search # cursor up
133 bindkey "^[[B" down-line-or-search # <ESC>-
134 bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history
135 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
136 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
137 # if terminal type is set to 'rxvt':
138 bindkey '\e[7~' beginning-of-line # home
139 bindkey '\e[8~' end-of-line # end
142 # insert unicode character
143 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
144 # See for example http://unicode.org/charts/ for unicode characters code
145 autoload insert-unicode-char
146 zle -N insert-unicode-char
147 bindkey '^Xi' insert-unicode-char
149 # bindkey '\eq' push-line-or-edit
152 # power completion - abbreviation expansion {{{
153 # power completion / abbreviation expansion / buffer expansion
154 # see http://zshwiki.org/home/examples/zleiab for details
155 # less risky than the global aliases but powerful as well
156 # just type the abbreviation key and afterwards ',.' to expand it
159 setopt interactivecomments
167 'G' '|& grep --color=auto'
169 'Hl' ' --help |& less -r'
174 'R' '| tr A-z N-za-m'
179 'hide' "echo -en '\033]50;nil2\007'"
180 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
181 'small' 'echo -en "\033]50;6x10\007"'
182 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
183 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
184 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
185 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
186 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
187 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
191 'co' "./configure && make && sudo make install"
192 'CH' "./configure --help"
193 'conkeror' 'firefox -chrome chrome://conkeror/content'
195 'lad' $'ls -d .*(/)\n# only show dot-directories'
196 'lsa' $'ls -a .*(.)\n# only show dot-files'
197 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
198 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
199 'lsx' $'ls -l *(*[1,10])\n# only executables'
200 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
201 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
202 'lsd' $'ls -d *(/)\n# only show directories'
203 'lse' $'ls -d *(/^F)\n# only show empty directories'
204 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
205 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
206 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
208 '600' 'chmod u+rw-x,g-rwx,o-rwx'
210 '700' 'chmod u+rwx,g-rwx,o-rwx'
211 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
212 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
213 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
215 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
216 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
217 'fblinks' 'links2 -driver fb'
218 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
219 'fori' 'for i ({..}) { }'
222 'se' 'setopt interactivecomments'
223 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
224 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
225 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
227 'D' 'export DISPLAY=:0.0'
228 'mp' 'mplayer -vo xv -fs -zoom'
233 matched_chars='[.-|_a-zA-Z0-9]#'
234 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
235 LBUFFER+=${abk[$MATCH]:-$MATCH}
239 bindkey ",." globalias
243 autoload -U zmv # who needs mmv or rename?
244 autoload history-search-end
246 # we don't want to quote/espace URLs on our own...
247 # avoid 'url-quote-magic: function definition file not found' on some older boxes
248 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Zle/url-quote-magic" ] && \
249 autoload -U url-quote-magic && zle -N self-insert url-quote-magic ; then
250 zle -N self-insert url-quote-magic
252 print 'Notice: no url-quote-magic available :('
255 alias run-help >&/dev/null && unalias run-help
256 autoload run-help # use via 'esc-h'
259 if autoload -U compinit && compinit 2>/dev/null ; then
260 compinit 2>/dev/null || print 'Notice: no compinit available :('
262 print 'Notice: no compinit available :('
267 is4 && autoload -U zed # use ZLE editor to edit a file or function
269 is4 && for mod in complist deltochar mathfunc ; do
270 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
273 # autoload zsh modules when they are referenced
274 is4 && for opt mod in a stat \
278 zmodload -${opt} zsh/${mod} ${mod}
281 is4 && autoload -U insert-files && \
282 zle -N insert-files && \
283 bindkey "^Xf" insert-files # C-x-f
285 bindkey ' ' magic-space # also do history expansion on space
286 bindkey '\ei' menu-complete # menu completion via esc-i
288 # press esc-e for editing command line in $EDITOR or $VISUAL
289 is4 && autoload -U edit-command-line && \
290 zle -N edit-command-line && \
291 bindkey '\ee' edit-command-line
293 # menu selection: pick item but stay in the menu (press esc-return)
294 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
296 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
297 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
298 bindkey '\C-ed' _bkdate
301 # press esc-m for inserting last typed word again (thanks to caphuso!)
302 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
303 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
305 # set command prediction from history, see 'man 1 zshcontrib'
306 # is4 && autoload -U predict-on && \
307 # zle -N predict-on && \
308 # zle -N predict-off && \
309 # bindkey "^X^Z" predict-on && \
310 # bindkey "^Z" predict-off
312 # put job into foreground via ctrl-z:
313 bindkey -s '^z' "fg\n"
315 # press ctrl-q to quote line:
317 # zle beginning-of-line
319 # # RBUFFER="'$RBUFFER'"
320 # RBUFFER=${(q)RBUFFER}
323 # zle -N mquote && bindkey '^q' mquote
325 # run command line as user root via sudo:
326 _sudo-command-line() {
327 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
329 zle -N sudo-command-line _sudo-command-line
330 bindkey "^Os" sudo-command-line
333 # {{{ set some important options
338 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
339 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
340 setopt extended_history # save each command's beginning timestamp and the duration to the history file
341 is4 && setopt histignorealldups # If a new command line being added to the history
342 # list duplicates an older one, the older command is removed from the list
343 setopt histignorespace # remove command lines from the history list when
344 # the first character on the line is a space
345 # setopt histallowclobber # add `|' to output redirections in the history
346 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
347 setopt auto_cd # if a command is issued that can't be executed as a normal command,
348 # and the command is the name of a directory, perform the cd command to that directory
349 setopt extended_glob # in order to use #, ~ and ^ for filename generation
350 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
351 # -> searches for word not in compressed files
352 # don't forget to quote '^', '~' and '#'!
353 setopt notify # report the status of backgrounds jobs immediately
354 setopt hash_list_all # Whenever a command completion is attempted, make sure \
355 # the entire command path is hashed first.
356 setopt completeinword # not just at the end
357 # setopt nocheckjobs # don't warn me about bg processes when exiting
358 setopt nohup # and don't kill them, either
359 # setopt printexitvalue # alert me if something failed
360 # setopt dvorak # with spelling correction, assume dvorak kb
361 setopt auto_pushd # make cd push the old directory onto the directory stack.
362 setopt nonomatch # try to avoid the 'zsh: no matches found...'
363 setopt nobeep # avoid "beep"ing
365 MAILCHECK=30 # mailchecks
366 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
367 watch=(notme root) # watch for everyone but me and root
369 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
370 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
372 # WORDCHARS='*?_[]~=&;!#$%^(){}'
373 # WORDCHARS='${WORDCHARS:s@/@}'
375 # only slash should be considered as a word separator:
376 slash-backward-kill-word() {
377 local WORDCHARS="${WORDCHARS:s@/@}"
379 zle backward-kill-word
381 zle -N slash-backward-kill-word
382 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
386 export ZSHDIR=$HOME/.zsh
387 HISTFILE=$HOME/.zsh_history
388 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
389 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
392 # dirstack handling {{{
394 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
395 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
396 # "cd -" won't work after login by just setting $OLDPWD, so
397 cd $dirstack[0] && cd $OLDPWD
400 builtin dirs -pl >! ~/.zdirs
404 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
405 if [ -n "$BATTERY" ] ; then
406 if [ -x $(which acpi) ] ; then
407 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
408 [ -z "$PERCENT" ] && PERCENT='acpi not present'
409 if [ "${PERCENT%%%}" -lt 20 ] ; then
410 PERCENT="warning: ${PERCENT}%"
417 if [ -f "/usr/share/zsh/$ZSH_VERSION/functions/Prompts/promptinit" ] && autoload promptinit && promptinit 2>/dev/null ; then
418 promptinit # people should be able to use their favourite prompt
420 print 'Notice: no promptinit available :('
423 # precmd() => a function which is executed just before each prompt
424 # use 'NOPRECMD=1' to disable the precmd + preexec commands
426 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
428 is4 && [[ -z $NOPRECMD ]] && precmd () {
429 [[ -n $NOPRECMD ]] && return 0
430 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
431 if [[ -z ${DONTSETRPROMPT} ]] ; then
432 if [ -n "$BATTERY" ] ; then
433 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
434 RPROMPT="${PERCENT}${SCREENTITLE}"
436 # RPROMPT="%(?..:()% ${SCREENTITLE}"
437 RPROMPT="${SCREENTITLE}"
440 # adjust title of xterm
441 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
442 case $TERM in (xterm*|rxvt)
443 print -Pn "\e]0;%n@%m: %~\a"
448 # chpwd () => a function which is executed whenever the directory is changed
450 # preexec() => a function running before every command
451 is4 && [[ -z $NOPRECMD ]] && preexec () {
452 [[ -n $NOPRECMD ]] && return 0
453 # set hostname if not running on host with name 'grml'
454 local HOSTNAME=$(hostname)
455 if [[ "$HOSTNAME" != grml ]] ; then
458 # get the name of the program currently running and hostname of local machine
459 # set screen window title if running in a screen
460 if [[ "$TERM" == screen* ]]; then
461 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
462 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
463 echo -ne "\ek$CMD\e\\"
465 # set the screen title to "zsh" when sitting at the command prompt:
466 if [[ "$TERM" == screen* ]]; then
467 SCREENTITLE=$'%{\ekzsh\e\\%}'
471 # adjust title of xterm
472 case $TERM in (xterm*|rxvt)
473 print -Pn "\e]0;%n@%m: $1\a"
479 if autoload colors && colors 2>/dev/null ; then
480 BLUE="%{${fg[blue]}%}"
481 RED="%{${fg_bold[red]}%}"
482 GREEN="%{${fg[green]}%}"
483 CYAN="%{${fg[cyan]}%}"
484 WHITE="%{${fg[white]}%}"
485 NO_COLOUR="%{${reset_color}%}"
492 NO_COLOUR="%{
\e[0m%}"
495 EXITCODE="%(?..%?%1v )"
496 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
497 PS3='?# ' # selection prompt used within a select loop.
498 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
500 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
501 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
502 debian_chroot=$(cat /etc/debian_chroot)
505 # don't use colors on dumb terminals (like emacs):
506 if [[ "$TERM" == dumb ]] ; then
507 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
509 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
510 # set variable identifying the chroot you work in (used in the prompt below)
511 if [[ -n "$GRMLPROMPT" ]]; then
512 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
513 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
515 if (( EUID != 0 )); then
516 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
518 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
523 # if we are inside a grml-chroot set a specific prompt theme
524 if [ -n "$GRML_CHROOT" ] ; then
525 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
529 # {{{ 'hash' some often used directories
530 hash -d deb=/var/cache/apt/archives
531 hash -d doc=/usr/share/doc
532 hash -d linux=/lib/modules/$(command uname -r)/build/
534 hash -d slog=/var/log/syslog
536 hash -d templ=/usr/share/doc/grml-templates
537 hash -d tt=/usr/share/doc/texttools-doc
542 if [ $UID = 0 ] ; then
543 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
544 elif [ -r $HOME/.screenrc ] ; then
545 alias screen="/usr/bin/screen -c $HOME/.screenrc"
547 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
550 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
551 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
552 alias la='ls -la --color=auto'
553 alias ll='ls -l --color=auto'
554 alias lh='ls -hAl --color=auto'
555 alias l='ls -lF --color=auto'
564 alias cp='nocorrect cp' # no spelling correction on cp
565 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
566 alias mv='nocorrect mv' # no spelling correction on mv
567 alias rm='nocorrect rm' # no spelling correction on rm
572 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
574 # I like clean prompt, so provide simple way to get that
575 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
577 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
578 if [ -x /usr/sbin/truecrypt ] ; then
580 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
582 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
586 zsh-help(){print "$bg[white]$fg[black]
587 zsh-help - hints for use of zsh on grml
588 =======================================$reset_color
590 Main configuration of zsh happens in /etc/zsh/zshrc (global)
591 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
592 The files are part of the package grml-etc-core, if you want to
593 use them on a non-grml-system just get the tar.gz from
594 http://deb.grml.org/ or get the files from the mercurial
597 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
598 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
600 If you want to stay in sync with zsh configuration of grml
601 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
602 your own stuff in \$HOME/.zshrc.local. System wide configuration
603 without touching configuration files of grml can take place
604 in /etc/zsh/zshrc.local.
606 If you want to use the configuration of user grml also when
607 running as user root just run 'zshskel' which will source
608 the file /etc/skel/.zshrc.
610 For information regarding zsh start at http://grml.org/zsh/
612 Take a look at grml's zsh refcard:
613 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
615 Check out the main zsh refcard:
616 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
618 And of course visit the zsh-lovers:
621 You can adjust some options through environment variables when
622 invoking zsh without having to edit configuration files.
623 Basically meant for bash users who are not used to the power of
626 \"NOCOR=1 zsh\" => deactivate automatic correction
627 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
628 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
629 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
631 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
632 Enjoy your grml system with the zsh!$reset_color"
636 if [ -r /etc/debian_version ] ; then
637 alias acs='apt-cache search'
638 alias acsh='apt-cache show'
639 alias acp='apt-cache policy'
640 alias adg="$SUDO apt-get dist-upgrade"
641 alias agi="$SUDO apt-get install"
642 alias ag="$SUDO apt-get upgrade"
643 alias au="$SUDO apt-get update"
644 alias dbp='dpkg-buildpackage'
645 alias ge='grep-excuses'
649 if [ -z "$1" ] ; then
651 $SUDO apt-get -u upgrade
653 ssh $1 $SUDO apt-get update
654 # ask before the upgrade
656 ssh $1 $SUDO apt-get --no-act upgrade
657 echo -n 'Process the upgrade?'
659 if [[ $dummy == "y" ]] ; then
660 ssh $1 $SUDO apt-get -u upgrade --yes
665 isgrmlcd && alias su="sudo su" # change to user root
666 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
667 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
670 # sort installed Debian-packages by size
671 if [ -x /usr/bin/grep-status ] ; then
672 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
673 -n "install ok installed" | paste -sd " \n" | sort -rn'
676 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
677 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
678 if [ -x $(which wodim) ] ; then
679 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
680 See #377109 in the BTS of Debian for more details.
682 Please use the wodim binary instead' ; return 1"
686 # I hate lacking backward compability, so provide an alternative therefore
687 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
688 function apache2-ssl-certificate(){
690 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
691 print 'You might want to take a look at Debian the package ssl-cert as well.'
692 print 'To generate a certificate for use with apache2 follow the instructions:'
696 export RANDFILE=/dev/random
697 mkdir /etc/apache2/ssl/
698 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
699 chmod 600 /etc/apache2/ssl/apache.pem
701 Run "grml-tips ssl-certificate" if you need further instructions.
707 # {{{ Use hard limits, except for a smaller stack and no core dumps
710 isgrmlcd && limit core 0 # important for a live-cd-system
714 # {{{ completion stuff
716 # Where to look for autoloaded function definitions
717 if [ -d /etc/zsh/completion.d ] ; then
718 local comp=/etc/zsh/completion.d
719 for func in $comp/*(N-.:t); . ${comp}/${func}
722 # called later (via is4 && grmlcomp)
723 # notice: use 'zstyle' for getting current settings
724 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
727 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
728 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
729 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
730 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
731 zstyle ':completion:*:correct:*' original true #
732 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
733 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
734 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
735 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
736 zstyle ':completion:*:history-words' list false #
737 zstyle ':completion:*:history-words' menu yes # activate menu
738 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
739 zstyle ':completion:*:history-words' stop yes #
740 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
741 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
742 zstyle ':completion:*' group-name ''
743 if [[ -z "$NOMENU" ]] ; then
744 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
746 setopt no_auto_menu # don't use any menus at all
748 zstyle ':completion:*:messages' format '%d' #
749 zstyle ':completion:*:options' auto-description '%d' #
750 zstyle ':completion:*:options' description 'yes' # describe options in full
751 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
752 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
753 zstyle ':completion:*' verbose true # provide verbose completion information
754 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
755 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
756 zstyle ':completion:correct:' prompt 'correct to: %e' #
757 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
759 # complete manual by their section
760 zstyle ':completion:*:manuals' separate-sections true
761 zstyle ':completion:*:manuals.*' insert-sections true
762 zstyle ':completion:*:man:*' menu yes select
765 # run rehash on completion so new installed program are found automatically:
767 (( CURRENT == 1 )) && rehash
768 return 1 # Because we didn't really complete anything
770 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
771 if [[ -n "$NOCOR" ]] ; then
772 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
773 setopt nocorrect # do not try to correct the spelling if possible
775 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
776 setopt correct # try to correct the spelling if possible
777 zstyle -e ':completion:*' completer '
778 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
779 _last_try="$HISTNO$BUFFER$CURSOR"
780 reply=(_complete _match _prefix)
782 if [[ $words[1] = (rm|mv) ]]; then
785 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
789 # zstyle ':completion:*' completer _complete _correct _approximate
790 # zstyle ':completion:*' expand prefix suffix
792 # automatic rehash? Credits go to Frank Terbeck
793 # function my_accept () {
795 # [[ -z ${BUFFER} ]] && zle accept-line && return
796 # buf=( ${(z)BUFFER} )
797 # [[ -z ${commands[${buf[1]}]} ]] && rehash
801 # bindkey "^M" my_accept
803 # command for process lists, the local web server details and host completion
804 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
807 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
808 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
810 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
812 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
813 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
825 zstyle ':completion:*:hosts' hosts $hosts
826 # zstyle '*' hosts $hosts
828 # specify your logins:
830 # {grml,grml1}@foo.invalid
831 # grml-devel@bar.invalid
834 # {fred,root}@foo.invalid
837 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
838 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
840 # specify specific port/service settings:
841 # telnet_users_hosts_ports=(
844 # @mail-server:{smtp,pop3}
848 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
850 # use generic completion system for programs not yet defined:
851 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
853 # see upgrade function in this file
854 compdef _hosts upgrade
860 # people should use 'grml-x'!
862 if [ -e /etc/X11/xorg.conf ] ; then
863 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
865 echo "Please use the script \"grml-x\" for starting the X Window System
866 because there does not exist /etc/X11/xorg.conf yet.
867 If you want to use startx anyway please call \"/usr/bin/startx\"."
873 if [ -e /etc/X11/xorg.conf ] ; then
874 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
876 echo "Please use the script \"grml-x\" for starting the X Window System.
877 because there does not exist /etc/X11/xorg.conf yet.
878 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
883 if [ -x /usr/sbin/915resolution ] ; then
884 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
887 alias grml-version='cat /etc/grml_version'
889 if [ -x /usr/sbin/rebuildfstab ] ; then
890 alias grml-rebuildfstab='rebuildfstab -v -r -config'
895 # {{{ now run the functions
897 is4 && isgrml && grmlstuff
902 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
905 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
906 # You use it as follows:
907 # $ NTREF=/reference/file
909 # This lists all the files in the current directory newer than the reference file.
910 # You can also specify the reference file inline; note quotes:
911 # $ ls -l *(e:'nt ~/.zshenv':)
916 [[ $REPLY -nt $NTREF ]]
920 # shell functions {{{
921 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
922 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
924 if [[ "$#*" -eq 0 ]]; then
925 [ -r ~/.zshrc ] && . ~/.zshrc
934 compdef _functions reload freload
937 if type -p qma &>/dev/null ; then
938 manzsh() { qma zshall "$1" }
941 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
942 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
943 # manzsh() { man zshall | $MYLESS -p $1 ; }
946 # use "dchange <package-name>" to view Debian's changelog of the package:
948 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
949 most /usr/share/doc/${1}/changelog.Debian.gz
951 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
952 most /usr/share/doc/${1}/changelog.gz
954 echo "No changelog for package $1 found, sorry."
959 _dchange() { _files -W /usr/share/doc -/ }
960 compdef _dchange dchange
962 # use "uchange <package-name>" to view upstream's changelog of the package:
964 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
965 most /usr/share/doc/${1}/changelog.gz
967 echo "No changelog for package $1 found, sorry."
971 _uchange() { _files -W /usr/share/doc -/ }
972 compdef _uchange uchange
976 ZSH_PROFILE_RC=1 $SHELL "$@"
979 # edit alias via zle:
981 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
983 compdef _aliases edalias
985 # edit function via zle:
987 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
989 compdef _functions edfunc
991 # use it e.g. via 'Restart apache2'
992 if [ -d /etc/init.d ] ; then
993 for i in Start Restart Stop Force-Reload Reload ; do
994 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
996 # now the completion for this:
997 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1000 # provide useful information on globbing
1007 p named pipes (FIFOs)
1008 * executable plain files (0100)
1009 % device files (character or block special)
1010 %b block special files
1011 %c character special files
1012 r owner-readable files (0400)
1013 w owner-writable files (0200)
1014 x owner-executable files (0100)
1015 A group-readable files (0040)
1016 I group-writable files (0020)
1017 E group-executable files (0010)
1018 R world-readable files (0004)
1019 W world-writable files (0002)
1020 X world-executable files (0001)
1021 s setuid files (04000)
1022 S setgid files (02000)
1023 t files with the sticky bit (01000)
1025 print *(m-1) # Files modified up to a day ago
1026 print *(a1) # Files accessed a day ago
1027 print *(@) # Just symlinks
1028 print *(Lk+50) # Files bigger than 50 kilobytes
1029 print *(Lk-50) # Files smaller than 50 kilobytes
1030 print **/*.c # All *.c files recursively starting in \$PWD
1031 print **/*.c~file.c # Same as above, but excluding 'file.c'
1032 print (foo|bar).* # Files starting with 'foo' or 'bar'
1033 print *~*.* # All Files that do not contain a dot
1034 chmod 644 *(.^x) # make all plain non-executable files publically readable
1035 print -l *(.c|.h) # Lists *.c and *.h
1036 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1037 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1039 alias help-zshglob=H-Glob
1041 type -p qma &>/dev/null && alias ?='qma zshall'
1043 # grep for running process, like: 'any vim'
1045 if [ -z "$1" ] ; then
1046 echo "any - grep for process(es) by keyword" >&2
1047 echo "Usage: any <keyword>" >&2 ; return 1
1050 local LENGTH=$(expr length $STRING)
1051 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1052 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1053 ps xauwww| grep "[$FIRSCHAR]$REST"
1057 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1058 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1059 [ -r /proc/1/maps ] && deswap() {
1060 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1061 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1062 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1065 # print hex value of a number
1067 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1070 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1071 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1073 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1074 perl -e "print eval($CALC),\"\n\";"
1076 functions peval &>/dev/null && alias calc=peval
1078 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1080 # NO_SWITCH="yes" command bash "$@"
1083 # exec $SHELL $SHELL_ARGS "$@"
1088 # log out? set timeout in seconds {{{
1090 # do not log out in some specific terminals:
1091 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1096 # {{{ make sure our environment is clean regarding colors
1097 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1100 # source another config file if present {{{
1101 if [ -r /etc/zsh/zshrc.local ]; then
1102 source /etc/zsh/zshrc.local
1106 # "persistent history" {{{
1107 # just write important commands you always need to ~/.important_commands
1108 if [ -r ~/.important_commands ] ; then
1109 fc -R ~/.important_commands
1113 ## END OF FILE #################################################################
1114 # vim:foldmethod=marker expandtab