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: Mon Feb 26 18:52:32 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 if autoload -U url-quote-magic ; then
248 zle -N self-insert url-quote-magic
250 print 'Notice: no url-quote-magic available :('
253 alias run-help >&/dev/null && unalias run-help
254 autoload run-help # use via 'esc-h'
257 if autoload -U compinit && compinit 2>/dev/null ; then
258 compinit 2>/dev/null || print 'Notice: no compinit available :('
260 print 'Notice: no compinit available :('
265 is4 && autoload -U zed # use ZLE editor to edit a file or function
267 is4 && for mod in complist deltochar mathfunc ; do
268 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
271 # autoload zsh modules when they are referenced
272 is4 && for opt mod in a stat \
276 zmodload -${opt} zsh/${mod} ${mod}
279 is4 && autoload -U insert-files && \
280 zle -N insert-files && \
281 bindkey "^Xf" insert-files # C-x-f
283 bindkey ' ' magic-space # also do history expansion on space
284 bindkey '\ei' menu-complete # menu completion via esc-i
286 # press esc-e for editing command line in $EDITOR or $VISUAL
287 is4 && autoload -U edit-command-line && \
288 zle -N edit-command-line && \
289 bindkey '\ee' edit-command-line
291 # menu selection: pick item but stay in the menu (press esc-return)
292 is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
294 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
295 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
296 bindkey '\C-ed' _bkdate
299 # press esc-m for inserting last typed word again (thanks to caphuso!)
300 insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
301 zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
303 # set command prediction from history, see 'man 1 zshcontrib'
304 # is4 && autoload -U predict-on && \
305 # zle -N predict-on && \
306 # zle -N predict-off && \
307 # bindkey "^X^Z" predict-on && \
308 # bindkey "^Z" predict-off
310 # put job into foreground via ctrl-z:
311 bindkey -s '^z' "fg\n"
313 # press ctrl-q to quote line:
315 # zle beginning-of-line
317 # # RBUFFER="'$RBUFFER'"
318 # RBUFFER=${(q)RBUFFER}
321 # zle -N mquote && bindkey '^q' mquote
323 # run command line as user root via sudo:
324 _sudo-command-line() {
325 [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
327 zle -N sudo-command-line _sudo-command-line
328 bindkey "^Os" sudo-command-line
331 # {{{ set some important options
332 (( EUID != 0 )) && umask 002 || umask 022
335 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
336 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
337 setopt extended_history # save each command's beginning timestamp and the duration to the history file
338 is4 && setopt histignorealldups # If a new command line being added to the history
339 # list duplicates an older one, the older command is removed from the list
340 setopt histignorespace # remove command lines from the history list when
341 # the first character on the line is a space
342 # setopt histallowclobber # add `|' to output redirections in the history
343 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
344 setopt auto_cd # if a command is issued that can't be executed as a normal command,
345 # and the command is the name of a directory, perform the cd command to that directory
346 setopt extended_glob # in order to use #, ~ and ^ for filename generation
347 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
348 # -> searches for word not in compressed files
349 # don't forget to quote '^', '~' and '#'!
350 setopt notify # report the status of backgrounds jobs immediately
351 setopt hash_list_all # Whenever a command completion is attempted, make sure \
352 # the entire command path is hashed first.
353 setopt completeinword # not just at the end
354 # setopt nocheckjobs # don't warn me about bg processes when exiting
355 setopt nohup # and don't kill them, either
356 # setopt printexitvalue # alert me if something failed
357 # setopt dvorak # with spelling correction, assume dvorak kb
358 setopt auto_pushd # make cd push the old directory onto the directory stack.
359 setopt nonomatch # try to avoid the 'zsh: no matches found...'
360 setopt nobeep # avoid "beep"ing
362 MAILCHECK=30 # mailchecks
363 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 secondes
364 watch=(notme root) # watch for everyone but me and root
366 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
367 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
369 # WORDCHARS='*?_[]~=&;!#$%^(){}'
370 # WORDCHARS='${WORDCHARS:s@/@}'
372 # only slash should be considered as a word separator:
373 slash-backward-kill-word() {
374 local WORDCHARS="${WORDCHARS:s@/@}"
376 zle backward-kill-word
378 zle -N slash-backward-kill-word
379 bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
383 export ZSHDIR=$HOME/.zsh
384 HISTFILE=$HOME/.zsh_history
385 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
386 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
389 # dirstack handling {{{
391 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
392 dirstack=( ${(uf)"$(< ~/.zdirs)"} )
393 # "cd -" won't work after login by just setting $OLDPWD, so
394 cd $dirstack[0] && cd $OLDPWD
397 builtin dirs -pl >! ~/.zdirs
401 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
402 if [ -n "$BATTERY" ] ; then
403 if [ -x $(which acpi) ] ; then
404 PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
405 [ -z "$PERCENT" ] && PERCENT='acpi not present'
406 if [ "${PERCENT%%%}" -lt 20 ] ; then
407 PERCENT="warning: ${PERCENT}%"
414 if autoload promptinit && promptinit 2>/dev/null ; then
415 promptinit # people should be able to use their favourite prompt
417 print 'Notice: no promptinit available :('
420 # precmd() => a function which is executed just before each prompt
421 # use 'NOPRECMD=1' to disable the precmd + preexec commands
423 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
425 is4 && [[ -z $NOPRECMD ]] && precmd () {
426 [[ -n $NOPRECMD ]] && return 0
427 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
428 if [[ -z ${DONTSETRPROMPT} ]] ; then
429 if [ -n "$BATTERY" ] ; then
430 # RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
431 RPROMPT="${PERCENT}${SCREENTITLE}"
433 # RPROMPT="%(?..:()% ${SCREENTITLE}"
434 RPROMPT="${SCREENTITLE}"
437 # adjust title of xterm
438 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
439 case $TERM in (xterm*|rxvt)
440 print -Pn "\e]0;%n@%m: %~\a"
445 # chpwd () => a function which is executed whenever the directory is changed
447 # preexec() => a function running before every command
448 is4 && [[ -z $NOPRECMD ]] && preexec () {
449 [[ -n $NOPRECMD ]] && return 0
450 # set hostname if not running on host with name 'grml'
451 local HOSTNAME=$(hostname)
452 if [[ "$HOSTNAME" != grml ]] ; then
455 # get the name of the program currently running and hostname of local machine
456 # set screen window title if running in a screen
457 if [[ "$TERM" == screen* ]]; then
458 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # dont't use hostname
459 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
460 echo -ne "\ek$CMD\e\\"
462 # set the screen title to "zsh" when sitting at the command prompt:
463 if [[ "$TERM" == screen* ]]; then
464 SCREENTITLE=$'%{\ekzsh\e\\%}'
468 # adjust title of xterm
469 case $TERM in (xterm*|rxvt)
470 print -Pn "\e]0;%n@%m: $1\a"
476 if autoload colors && colors 2>/dev/null ; then
477 BLUE="%{${fg[blue]}%}"
478 RED="%{${fg_bold[red]}%}"
479 GREEN="%{${fg[green]}%}"
480 CYAN="%{${fg[cyan]}%}"
481 WHITE="%{${fg[white]}%}"
482 NO_COLOUR="%{${reset_color}%}"
489 NO_COLOUR="%{
\e[0m%}"
492 EXITCODE="%(?..%?%1v )"
493 PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
494 PS3='?# ' # selection prompt used within a select loop.
495 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
497 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
498 if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
499 debian_chroot=$(cat /etc/debian_chroot)
502 # don't use colors on dumb terminals (like emacs):
503 if [[ "$TERM" == dumb ]] ; then
504 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
506 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
507 # set variable identifying the chroot you work in (used in the prompt below)
508 if [[ -n "$GRMLPROMPT" ]]; then
509 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
510 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
512 if (( EUID != 0 )); then
513 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
515 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
520 # if we are inside a grml-chroot set a specific prompt theme
521 if [ -n "$GRML_CHROOT" ] ; then
522 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
526 # {{{ 'hash' some often used directories
527 hash -d deb=/var/cache/apt/archives
528 hash -d doc=/usr/share/doc
529 hash -d linux=/lib/modules/$(command uname -r)/build/
531 hash -d slog=/var/log/syslog
533 hash -d templ=/usr/share/doc/grml-templates
534 hash -d tt=/usr/share/doc/texttools-doc
539 if [ $UID = 0 ] ; then
540 [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
541 elif [ -r $HOME/.screenrc ] ; then
542 alias screen="/usr/bin/screen -c $HOME/.screenrc"
544 [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
547 if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
548 alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
549 alias la='ls -la --color=auto'
550 alias ll='ls -l --color=auto'
551 alias lh='ls -hAl --color=auto'
552 alias l='ls -lF --color=auto'
561 alias cp='nocorrect cp' # no spelling correction on cp
562 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
563 alias mv='nocorrect mv' # no spelling correction on mv
564 alias rm='nocorrect rm' # no spelling correction on rm
569 alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
571 # I like clean prompt, so provide simple way to get that
572 alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
574 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
575 if [ -x /usr/sbin/truecrypt ] ; then
577 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
579 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
583 zsh-help(){print "$bg[white]$fg[black]
584 zsh-help - hints for use of zsh on grml
585 =======================================$reset_color
587 Main configuration of zsh happens in /etc/zsh/zshrc (global)
588 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
589 The files are part of the package grml-etc-core, if you want to
590 use them on a non-grml-system just get the tar.gz from
591 http://deb.grml.org/ or get the files from the mercurial
594 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
595 http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
597 If you want to stay in sync with zsh configuration of grml
598 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
599 your own stuff in \$HOME/.zshrc.local. System wide configuration
600 without touching configuration files of grml can take place
601 in /etc/zsh/zshrc.local.
603 If you want to use the configuration of user grml also when
604 running as user root just run 'zshskel' which will source
605 the file /etc/skel/.zshrc.
607 For information regarding zsh start at http://grml.org/zsh/
609 Take a look at grml's zsh refcard:
610 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
612 Check out the main zsh refcard:
613 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
615 And of course visit the zsh-lovers:
618 You can adjust some options through environment variables when
619 invoking zsh without having to edit configuration files.
620 Basically meant for bash users who are not used to the power of
623 \"NOCOR=1 zsh\" => deactivate automatic correction
624 \"NOMENU=1 zsh\" => do not use menu completion (note: use strg-d for completion instead!)
625 \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
626 \"BATTERY=1 zsh\" => activate battery status (via acpi) on right side of prompt
628 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
629 Enjoy your grml system with the zsh!$reset_color"
633 if [ -r /etc/debian_version ] ; then
634 alias acs='apt-cache search'
635 alias acsh='apt-cache show'
636 alias acp='apt-cache policy'
637 alias adg="$SUDO apt-get dist-upgrade"
638 alias agi="$SUDO apt-get install"
639 alias ag="$SUDO apt-get upgrade"
640 alias au="$SUDO apt-get update"
641 alias dbp='dpkg-buildpackage'
642 alias ge='grep-excuses'
646 if [ -z "$1" ] ; then
648 $SUDO apt-get -u upgrade
650 ssh $1 $SUDO apt-get update
651 # ask before the upgrade
653 ssh $1 $SUDO apt-get --no-act upgrade
654 echo -n 'Process the upgrade?'
656 if [[ $dummy == "y" ]] ; then
657 ssh $1 $SUDO apt-get -u upgrade --yes
662 isgrmlcd && alias su="sudo su" # change to user root
663 alias tlog="tail -f /var/log/syslog" # take a look at the syslog
664 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
667 # sort installed Debian-packages by size
668 if [ -x /usr/bin/grep-status ] ; then
669 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
670 -n "install ok installed" | paste -sd " \n" | sort -rn'
673 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
674 if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
675 if [ -x $(which wodim) ] ; then
676 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
677 See #377109 in the BTS of Debian for more details.
679 Please use the wodim binary instead' ; return 1"
683 # I hate lacking backward compability, so provide an alternative therefore
684 if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
685 function apache2-ssl-certificate(){
687 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
688 print 'You might want to take a look at Debian the package ssl-cert as well.'
689 print 'To generate a certificate for use with apache2 follow the instructions:'
693 export RANDFILE=/dev/random
694 mkdir /etc/apache2/ssl/
695 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
696 chmod 600 /etc/apache2/ssl/apache.pem
698 Run "grml-tips ssl-certificate" if you need further instructions.
704 # {{{ Use hard limits, except for a smaller stack and no core dumps
707 isgrmlcd && limit core 0 # important for a live-cd-system
711 # {{{ completion stuff
713 # Where to look for autoloaded function definitions
714 if [ -d /etc/zsh/completion.d ] ; then
715 local comp=/etc/zsh/completion.d
716 for func in $comp/*(N-.:t); . ${comp}/${func}
719 # called later (via is4 && grmlcomp)
720 # notice: use 'zstyle' for getting current settings
721 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
724 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
725 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
726 zstyle ':completion:*:correct:*' insert-unambiguous true # start menu completion only if it could find no unambiguous initial string
727 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
728 zstyle ':completion:*:correct:*' original true #
729 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} # activate color-completion(!)
730 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}' # format on completion
731 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select # complete 'cd -<tab>' with menu
732 zstyle ':completion:*:expand:*' tag-order all-expansions # insert all expansions for expand completer
733 zstyle ':completion:*:history-words' list false #
734 zstyle ':completion:*:history-words' menu yes # activate menu
735 zstyle ':completion:*:history-words' remove-all-dups yes # ignore duplicate entries
736 zstyle ':completion:*:history-words' stop yes #
737 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # match uppercase from lowercase
738 zstyle ':completion:*:matches' group 'yes' # separate matches into groups
739 zstyle ':completion:*' group-name ''
740 if [[ -z "$NOMENU" ]] ; then
741 zstyle ':completion:*' menu select=5 # if there are more than 5 options allow selecting from a menu
743 setopt no_auto_menu # don't use any menus at all
745 zstyle ':completion:*:messages' format '%d' #
746 zstyle ':completion:*:options' auto-description '%d' #
747 zstyle ':completion:*:options' description 'yes' # describe options in full
748 zstyle ':completion:*:processes' command 'ps -au$USER' # on processes completion complete all user processes
749 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters # offer indexes before parameters in subscripts
750 zstyle ':completion:*' verbose true # provide verbose completion information
751 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
752 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)' # define files to ignore for zcompile
753 zstyle ':completion:correct:' prompt 'correct to: %e' #
754 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' # Ignore completion functions for commands you don't have:
756 # complete manual by their section
757 zstyle ':completion:*:manuals' separate-sections true
758 zstyle ':completion:*:manuals.*' insert-sections true
759 zstyle ':completion:*:man:*' menu yes select
762 # run rehash on completion so new installed program are found automatically:
764 (( CURRENT == 1 )) && rehash
765 return 1 # Because we didn't really complete anything
767 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
768 if [[ -n "$NOCOR" ]] ; then
769 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete
770 setopt nocorrect # do not try to correct the spelling if possible
772 # zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate
773 setopt correct # try to correct the spelling if possible
774 zstyle -e ':completion:*' completer '
775 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
776 _last_try="$HISTNO$BUFFER$CURSOR"
777 reply=(_complete _match _prefix)
779 if [[ $words[1] = (rm|mv) ]]; then
782 reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
786 # zstyle ':completion:*' completer _complete _correct _approximate
787 # zstyle ':completion:*' expand prefix suffix
789 # automatic rehash? Credits go to Frank Terbeck
790 # function my_accept () {
792 # [[ -z ${BUFFER} ]] && zle accept-line && return
793 # buf=( ${(z)BUFFER} )
794 # [[ -z ${commands[${buf[1]}]} ]] && rehash
798 # bindkey "^M" my_accept
800 # command for process lists, the local web server details and host completion
801 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
804 [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
805 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
807 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
809 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
810 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
822 zstyle ':completion:*:hosts' hosts $hosts
823 # zstyle '*' hosts $hosts
825 # specify your logins:
827 # {grml,grml1}@foo.invalid
828 # grml-devel@bar.invalid
831 # {fred,root}@foo.invalid
834 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
835 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
837 # specify specific port/service settings:
838 # telnet_users_hosts_ports=(
841 # @mail-server:{smtp,pop3}
845 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
847 # use generic completion system for programs not yet defined:
848 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
850 # see upgrade function in this file
851 compdef _hosts upgrade
857 # people should use 'grml-x'!
859 if [ -e /etc/X11/xorg.conf ] ; then
860 [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
862 echo "Please use the script \"grml-x\" for starting the X Window System
863 because there does not exist /etc/X11/xorg.conf yet.
864 If you want to use startx anyway please call \"/usr/bin/startx\"."
870 if [ -e /etc/X11/xorg.conf ] ; then
871 [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
873 echo "Please use the script \"grml-x\" for starting the X Window System.
874 because there does not exist /etc/X11/xorg.conf yet.
875 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
880 if [ -x /usr/sbin/915resolution ] ; then
881 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
884 alias grml-version='cat /etc/grml_version'
886 if [ -x /usr/sbin/rebuildfstab ] ; then
887 alias grml-rebuildfstab='rebuildfstab -v -r -config'
892 # {{{ now run the functions
894 is4 && isgrml && grmlstuff
899 [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
902 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
903 # You use it as follows:
904 # $ NTREF=/reference/file
906 # This lists all the files in the current directory newer than the reference file.
907 # You can also specify the reference file inline; note quotes:
908 # $ ls -l *(e:'nt ~/.zshenv':)
913 [[ $REPLY -nt $NTREF ]]
917 # shell functions {{{
918 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
919 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
921 if [[ "$#*" -eq 0 ]]; then
922 [ -r ~/.zshrc ] && . ~/.zshrc
931 compdef _functions reload freload
934 if type -p qma &>/dev/null ; then
935 manzsh() { qma zshall "$1" }
938 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
939 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
940 # manzsh() { man zshall | $MYLESS -p $1 ; }
943 # use "dchange <package-name>" to view Debian's changelog of the package:
945 if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
946 most /usr/share/doc/${1}/changelog.Debian.gz
948 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
949 most /usr/share/doc/${1}/changelog.gz
951 echo "No changelog for package $1 found, sorry."
956 _dchange() { _files -W /usr/share/doc -/ }
957 compdef _dchange dchange
959 # use "uchange <package-name>" to view upstream's changelog of the package:
961 if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
962 most /usr/share/doc/${1}/changelog.gz
964 echo "No changelog for package $1 found, sorry."
968 _uchange() { _files -W /usr/share/doc -/ }
969 compdef _uchange uchange
973 ZSH_PROFILE_RC=1 $SHELL "$@"
976 # edit alias via zle:
978 [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
980 compdef _aliases edalias
982 # edit function via zle:
984 [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
986 compdef _functions edfunc
988 # use it e.g. via 'Restart apache2'
989 if [ -d /etc/init.d ] ; then
990 for i in Start Restart Stop Force-Reload Reload ; do
991 eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
993 # now the completion for this:
994 compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
997 # provide useful information on globbing
1004 p named pipes (FIFOs)
1005 * executable plain files (0100)
1006 % device files (character or block special)
1007 %b block special files
1008 %c character special files
1009 r owner-readable files (0400)
1010 w owner-writable files (0200)
1011 x owner-executable files (0100)
1012 A group-readable files (0040)
1013 I group-writable files (0020)
1014 E group-executable files (0010)
1015 R world-readable files (0004)
1016 W world-writable files (0002)
1017 X world-executable files (0001)
1018 s setuid files (04000)
1019 S setgid files (02000)
1020 t files with the sticky bit (01000)
1022 print *(m-1) # Files modified up to a day ago
1023 print *(a1) # Files accessed a day ago
1024 print *(@) # Just symlinks
1025 print *(Lk+50) # Files bigger than 50 kilobytes
1026 print *(Lk-50) # Files smaller than 50 kilobytes
1027 print **/*.c # All *.c files recursively starting in \$PWD
1028 print **/*.c~file.c # Same as above, but excluding 'file.c'
1029 print (foo|bar).* # Files starting with 'foo' or 'bar'
1030 print *~*.* # All Files that do not contain a dot
1031 chmod 644 *(.^x) # make all plain non-executable files publically readable
1032 print -l *(.c|.h) # Lists *.c and *.h
1033 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
1034 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1036 alias help-zshglob=H-Glob
1038 type -p qma &>/dev/null && alias ?='qma zshall'
1040 # grep for running process, like: 'any vim'
1042 if [ -z "$1" ] ; then
1043 echo "any - grep for process(es) by keyword" >&2
1044 echo "Usage: any <keyword>" >&2 ; return 1
1047 local LENGTH=$(expr length $STRING)
1048 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1049 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1050 ps xauwww| grep "[$FIRSCHAR]$REST"
1054 # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1055 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1056 [ -r /proc/1/maps ] && deswap() {
1057 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1058 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
1059 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1062 # print hex value of a number
1064 [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1067 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1068 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1070 [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1071 perl -e "print eval($CALC),\"\n\";"
1073 functions peval &>/dev/null && alias calc=peval
1075 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1077 # NO_SWITCH="yes" command bash "$@"
1080 # exec $SHELL $SHELL_ARGS "$@"
1085 # log out? set timeout in seconds {{{
1087 # do not log out in some specific terminals:
1088 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1093 # {{{ make sure our environment is clean regarding colors
1094 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1097 # source another config file if present {{{
1098 if [ -r /etc/zsh/zshrc.local ]; then
1099 source /etc/zsh/zshrc.local
1103 # "persistent history" {{{
1104 # just write important commands you always need to ~/.important_commands
1105 if [ -r ~/.important_commands ] ; then
1106 fc -R ~/.important_commands
1110 ## END OF FILE #################################################################
1111 # vim:foldmethod=marker expandtab