added insert-unicode-char
[grml-etc-core.git] / etc / zsh / zshrc
1 # Filename:      zshrc
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.
11 #
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
14
15 # zsh profiling {{{
16 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
17   if [[ -n $ZSH_PROFILE_RC ]] ; then
18      zmodload zsh/zprof
19   fi
20 # }}}
21
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 }
27   else
28     is4(){
29       [[ $ZSH_VERSION == 4.* ]] && return 0
30       return 1
31     }
32     is42(){
33       [[ $ZSH_VERSION == 4.<2->* ]] && return 0
34       return 1
35     }
36   fi
37
38 # grml specific stuff
39   isgrml(){
40     [ -f /etc/grml_version ] && return 0
41     return 1
42   }
43
44   isgrmlcd(){
45     [ -f /etc/grml_cd ] && return 0
46     return 1
47   }
48
49   if isgrml ; then
50     isgrmlsmall() {
51     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
52   }
53   else
54     isgrmlsmall() { return 1 }
55   fi
56
57   # are we running within an utf environment?
58   isutfenv() {
59     case "$LANG $CHARSET $LANGUAGE" in
60       *utf*) return 0 ;;
61       *UTF*) return 0 ;;
62       *)     return 1 ;;
63     esac
64   }
65
66 # check for user, if not running as root set $SUDO to sudo
67  (( EUID != 0 )) && SUDO='sudo' || SUDO=''
68
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
75      cd
76   fi
77   }
78 # }}}
79
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`
87
88 # Search path for the cd comman
89 #  cdpath=(.. ~)
90
91 # Support our own site-functions
92   [ -d /etc/zsh/site-functions ] && FPATH=/etc/zsh/site-functions:$FPATH
93
94 # automatically remove duplicates from these arrays
95   typeset -U path cdpath fpath manpath
96 # }}}
97
98 # {{{ keybindings
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
112   # ncurses stuff:
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
121 fi
122
123 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
124 # use emacs style per default:
125   bindkey -e
126 # use vi style:
127 # bindkey -v
128
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
140 #fi
141
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
148
149 #  bindkey '\eq' push-line-or-edit
150 # }}}
151
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
157   declare -A abk
158   setopt extendedglob
159   setopt interactivecomments
160   abk=(
161    # key  # value
162    'C'    '| wc -l'
163    '...' '../..'
164    '....' '../../..'
165    'BG' '& exit'
166    'C' '| wc -l'
167    'G' '|& grep --color=auto'
168    'H' '| head'
169    'Hl' ' --help |& less -r'
170    'L' '| less'
171    'LL' '|& less -r'
172    'M' '| most'
173    'N' '&>/dev/null'
174    'R' '| tr A-z N-za-m'
175    'SL' '| sort | less'
176    'S' '| sort -u'
177    'T' '| tail'
178    'V' '|& vim -'
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"'
188    'da' 'du -sch'
189    'j' 'jobs -l'
190    'u' 'translate -i'
191    'co' "./configure && make && sudo make install"
192    'CH' "./configure --help"
193    'conkeror' 'firefox -chrome chrome://conkeror/content'
194    'dir' 'ls -lSrah'
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'
207    'rw-' 'chmod 600'
208    '600' 'chmod u+rw-x,g-rwx,o-rwx'
209    'rwx' 'chmod u+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'
214    'md' 'mkdir -p '
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 ({..}) { }'
220    'cx' 'chmod +x'
221    'e'  'print -l'
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'
226    'ci' 'centericq'
227    'D'  'export DISPLAY=:0.0'
228    'mp' 'mplayer -vo xv -fs -zoom'
229   )
230
231   globalias () {
232         local MATCH
233         matched_chars='[.-|_a-zA-Z0-9]#'
234         LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
235         LBUFFER+=${abk[$MATCH]:-$MATCH}
236   }
237
238   zle -N globalias
239   bindkey ",." globalias
240 # }}}
241
242 # {{{ autoloading
243   autoload -U zmv    # who needs mmv or rename?
244   autoload history-search-end
245
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
251   else
252      print 'Notice: no url-quote-magic available :('
253   fi
254
255   alias run-help >&/dev/null && unalias run-help
256   autoload run-help # use via 'esc-h'
257
258 # completion system
259   if autoload -U compinit && compinit 2>/dev/null ; then
260      compinit 2>/dev/null || print 'Notice: no compinit available :('
261    else
262      print 'Notice: no compinit available :('
263      function zstyle { }
264      function compdef { }
265   fi
266
267   is4 && autoload -U zed                  # use ZLE editor to edit a file or function
268
269   is4 && for mod in complist deltochar mathfunc ; do
270              zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
271          done
272
273 # autoload zsh modules when they are referenced
274   is4 && for opt mod in a  stat    \
275                         a  zpty    \
276                         ap zprof   \
277                         ap mapfile ; do
278              zmodload -${opt} zsh/${mod} ${mod}
279          done ; unset opt mod
280
281   is4 && autoload -U insert-files && \
282   zle -N insert-files && \
283   bindkey "^Xf" insert-files # C-x-f
284
285   bindkey ' '   magic-space    # also do history expansion on space
286   bindkey '\ei' menu-complete  # menu completion via esc-i
287
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
292
293 # menu selection: pick item but stay in the menu (press esc-return)
294   is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
295
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
299   zle -N _bkdate
300
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
304
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
311
312 # put job into foreground via ctrl-z:
313   bindkey -s '^z' "fg\n"
314
315 # press ctrl-q to quote line:
316 #  mquote () {
317 #        zle beginning-of-line
318 #        zle forward-word
319 #        # RBUFFER="'$RBUFFER'"
320 #        RBUFFER=${(q)RBUFFER}
321 #        zle end-of-line
322 #  }
323 #  zle -N mquote && bindkey '^q' mquote
324
325 # run command line as user root via sudo:
326   _sudo-command-line() {
327     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
328   }
329   zle -N sudo-command-line _sudo-command-line
330   bindkey "^Os" sudo-command-line
331 # }}}
332
333 # {{{ set some important options
334   # umask 022
335   umask 002
336
337 # history:
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
364
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
368
369 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
370 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
371 #  WORDCHARS=.
372 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
373 #  WORDCHARS='${WORDCHARS:s@/@}'
374
375 # only slash should be considered as a word separator:
376   slash-backward-kill-word() {
377     local WORDCHARS="${WORDCHARS:s@/@}"
378     # zle backward-word
379     zle backward-kill-word
380   }
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!)
383 # }}}
384
385 # {{{ history
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
390 # }}}
391
392 # dirstack handling {{{
393   DIRSTACKSIZE=20
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
398   fi
399   chpwd() {
400     builtin dirs -pl >! ~/.zdirs
401   }
402 # }}}
403
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}%"
411         fi
412      fi
413   fi
414 # }}}
415
416 # {{{ set prompt
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
419   else
420      print 'Notice: no promptinit available :('
421   fi
422
423 # precmd() => a function which is executed just before each prompt
424 # use 'NOPRECMD=1' to disable the precmd + preexec commands
425
426   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
427
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}"
435         else
436           # RPROMPT="%(?..:()% ${SCREENTITLE}"
437           RPROMPT="${SCREENTITLE}"
438         fi
439       fi
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"
444         ;;
445       esac
446   }
447
448 # chpwd () => a function which is executed whenever the directory is changed
449
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
456          NAME="@$HOSTNAME"
457       fi
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\\"
464       fi
465   # set the screen title to "zsh" when sitting at the command prompt:
466       if [[ "$TERM" == screen* ]]; then
467            SCREENTITLE=$'%{\ekzsh\e\\%}'
468       else
469            SCREENTITLE=''
470       fi
471   # adjust title of xterm
472       case $TERM in (xterm*|rxvt)
473         print -Pn "\e]0;%n@%m: $1\a"
474         ;;
475       esac
476   }
477
478 # set colors
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}%}"
486   else
487      BLUE="%{\e[1;34m%}"
488      RED="%{\e[1;31m%}"
489      GREEN="%{\e[1;32m%}"
490      CYAN="%{\e[1;36m%}"
491      WHITE="%{\e[1;37m%}"
492      NO_COLOUR="%{\e[0m%}"
493   fi
494
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>'
499
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)
503   fi
504
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%<< %# "
508   else
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%<< %# "
514     else
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
517       else
518         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
519       fi
520     fi
521   fi
522
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%<< %\# "
526   fi
527 # }}}
528
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/
533   hash -d log=/var/log
534   hash -d slog=/var/log/syslog
535   hash -d src=/usr/src
536   hash -d templ=/usr/share/doc/grml-templates
537   hash -d tt=/usr/share/doc/texttools-doc
538   hash -d www=/var/www
539 # }}}
540
541 # {{{ some aliases
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"
546   else
547      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
548   fi
549
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'
556   else
557      alias ls='ls -b -CF'
558      alias la='ls -la'
559      alias ll='ls -l'
560      alias lh='ls -hAl'
561      alias l='ls -lF'
562   fi
563
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
568
569   alias rd='rmdir'
570   alias md='mkdir'
571
572   alias swspeak="setopt singlelinezle ; unsetopt prompt_cr ; export PS1='%m%# ' ; speechd-up" # set up software synth.
573
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'
576
577 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
578   if [ -x /usr/sbin/truecrypt ] ; then
579      if isutfenv ; then
580         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
581      else
582         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
583      fi
584   fi
585
586   zsh-help(){print "$bg[white]$fg[black]
587 zsh-help - hints for use of zsh on grml
588 =======================================$reset_color
589
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
595 repository:
596
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
599
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.
605
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.
609
610 For information regarding zsh start at http://grml.org/zsh/
611
612 Take a look at grml's zsh refcard:
613 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
614
615 Check out the main zsh refcard:
616 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
617
618 And of course visit the zsh-lovers:
619 % man zsh-lovers
620
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
624 the zsh yet. :)
625
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
630 $bg[white]$fg[black]
631 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
632 Enjoy your grml system with the zsh!$reset_color"
633 }
634
635 # debian stuff
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'
646
647     # debian upgrade
648     upgrade () {
649       if [ -z "$1" ] ; then
650           $SUDO apt-get update
651           $SUDO apt-get -u upgrade
652       else
653           ssh $1 $SUDO apt-get update
654           # ask before the upgrade
655           local dummy
656           ssh $1 $SUDO apt-get --no-act upgrade
657           echo -n 'Process the upgrade?'
658           read -q dummy
659           if [[ $dummy == "y" ]] ; then
660               ssh $1 $SUDO apt-get -u upgrade --yes
661           fi
662       fi
663     }
664
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
668   fi
669
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'
674   fi
675
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.
681
682 Please use the wodim binary instead' ; return 1"
683      fi
684   fi
685
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(){
689
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:'
693
694      echo '
695
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
700
701 Run "grml-tips ssl-certificate" if you need further instructions.
702 '
703    }
704   fi
705 # }}}
706
707 # {{{ Use hard limits, except for a smaller stack and no core dumps
708   unlimit
709   limit stack 8192
710   isgrmlcd && limit core 0 # important for a live-cd-system
711   limit -s
712 # }}}
713
714 # {{{ completion stuff
715
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}
720   fi
721
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
725 grmlcomp() {
726 ## completion system
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
745   else
746     setopt no_auto_menu # don't use any menus at all
747   fi
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:
758
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
763
764 ## correction
765 # run rehash on completion so new installed program are found automatically:
766   _force_rehash() {
767       (( CURRENT == 1 )) && rehash
768          return 1 # Because we didn't really complete anything
769     }
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
774   else
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)
781         else
782           if [[ $words[1] = (rm|mv) ]]; then
783             reply=(_complete)
784           else
785             reply=(_oldlist _expand _force_rehash _complete _correct _approximate)
786           fi
787         fi'
788   fi
789 # zstyle ':completion:*' completer _complete _correct _approximate
790 # zstyle ':completion:*' expand prefix suffix
791
792 # automatic rehash? Credits go to Frank Terbeck
793 # function my_accept () {
794 #   local buf
795 #   [[ -z ${BUFFER} ]] && zle accept-line && return
796 #   buf=( ${(z)BUFFER}  )
797 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
798 #   zle accept-line
799 # }
800 # zle -N my_accept
801 # bindkey "^M" my_accept
802
803 # command for process lists, the local web server details and host completion
804   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
805
806 # caching
807   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
808                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
809
810 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
811   if is42 ; then
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=()
814   else
815     _ssh_hosts=()
816     _etc_hosts=()
817   fi
818   hosts=(
819       `hostname`
820       "$_ssh_hosts[@]"
821       "$_etc_hosts[@]"
822       grml.org
823       localhost
824   )
825   zstyle ':completion:*:hosts' hosts $hosts
826 #  zstyle '*' hosts $hosts
827
828 # specify your logins:
829 # my_accounts=(
830 #  {grml,grml1}@foo.invalid
831 #  grml-devel@bar.invalid
832 # )
833 # other_accounts=(
834 #  {fred,root}@foo.invalid
835 #  vera@bar.invalid
836 # )
837 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
838 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
839
840 # specify specific port/service settings:
841 #  telnet_users_hosts_ports=(
842 #    user1@host1:
843 #    user2@host2:
844 #    @mail-server:{smtp,pop3}
845 #    @news-server:nntp
846 #    @proxy-server:8000
847 #  )
848 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
849
850 # use generic completion system for programs not yet defined:
851   compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
852
853 # see upgrade function in this file
854   compdef _hosts upgrade
855 }
856 # }}}
857
858 # {{{ grmlstuff
859 grmlstuff() {
860 # people should use 'grml-x'!
861   function startx() {
862     if [ -e /etc/X11/xorg.conf ] ; then
863        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
864     else
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\"."
868       return -1
869     fi
870   }
871
872   function xinit() {
873     if [ -e /etc/X11/xorg.conf ] ; then
874        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
875     else
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\"."
879       return -1
880     fi
881   }
882
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'
885   fi
886
887   alias grml-version='cat /etc/grml_version'
888
889   if [ -x /usr/sbin/rebuildfstab ] ; then
890      alias grml-rebuildfstab='rebuildfstab -v -r -config'
891   fi
892 }
893 # }}}
894
895 # {{{ now run the functions
896   isgrml && checkhome
897   is4    && isgrml    && grmlstuff
898   is4    && grmlcomp
899 # }}}
900
901 # {{{ keephack
902   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
903 # }}}
904
905 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
906 # You use it as follows:
907 # $ NTREF=/reference/file
908 # $ ls -l *(e:nt:)
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':)
912   is4 && nt() {
913     if [[ -n $1 ]]; then
914       local NTREF=${~1}
915     fi
916     [[ $REPLY -nt $NTREF ]]
917   }
918 # }}}
919
920 # shell functions {{{
921   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
922   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
923   reload () {
924    if [[ "$#*" -eq 0 ]]; then
925       [ -r ~/.zshrc ] && . ~/.zshrc
926    else
927       local fn
928       for fn in "$@"; do
929           unfunction $fn
930           autoload -U $fn
931       done
932    fi
933   }
934   compdef _functions reload freload
935
936   # fast manual access
937   if type -p qma &>/dev/null ; then
938      manzsh()  { qma zshall "$1" }
939      compdef _man qma
940   else
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 ; }
944   fi
945
946 # use "dchange <package-name>" to view Debian's changelog of the package:
947   dchange() {
948     if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
949        most /usr/share/doc/${1}/changelog.Debian.gz
950     else
951        if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
952           most /usr/share/doc/${1}/changelog.gz
953        else
954           echo "No changelog for package $1 found, sorry."
955           return 1
956        fi
957     fi
958   }
959   _dchange() { _files -W /usr/share/doc -/ }
960   compdef _dchange dchange
961
962 # use "uchange <package-name>" to view upstream's changelog of the package:
963   uchange() {
964     if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
965        most /usr/share/doc/${1}/changelog.gz
966     else
967        echo "No changelog for package $1 found, sorry."
968        return 1
969     fi
970   }
971   _uchange() { _files -W /usr/share/doc -/ }
972   compdef _uchange uchange
973
974 # zsh profiling
975   profile () {
976       ZSH_PROFILE_RC=1 $SHELL "$@"
977   }
978
979 # edit alias via zle:
980   edalias() {
981     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
982   }
983   compdef _aliases edalias
984
985 # edit function via zle:
986   edfunc() {
987     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
988   }
989   compdef _functions edfunc
990
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 ; }"
995   done
996   # now the completion for this:
997   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
998  fi
999
1000 # provide useful information on globbing
1001   H-Glob() {
1002   echo -e "
1003       /      directories
1004       .      plain files
1005       @      symbolic links
1006       =      sockets
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)
1024
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}'<"
1038   }
1039   alias help-zshglob=H-Glob
1040
1041   type -p qma &>/dev/null && alias ?='qma zshall'
1042
1043   # grep for running process, like: 'any vim'
1044   any() {
1045   if [ -z "$1" ] ; then
1046      echo "any - grep for process(es) by keyword" >&2
1047      echo "Usage: any <keyword>" >&2 ; return 1
1048   else
1049      local STRING=$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"
1054   fi
1055   }
1056
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.'
1063   }
1064
1065   # print hex value of a number
1066   hex() {
1067     [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1068   }
1069
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'
1072   peval() {
1073     [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1074     perl -e "print eval($CALC),\"\n\";"
1075   }
1076   functions peval &>/dev/null && alias calc=peval
1077
1078   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1079   # bash() {
1080   #  NO_SWITCH="yes" command bash "$@"
1081   # }
1082   # restart () {
1083   #  exec $SHELL $SHELL_ARGS "$@"
1084   # }
1085
1086 # }}}
1087
1088 # log out? set timeout in seconds {{{
1089 # TMOUT=1800
1090 # do not log out in some specific terminals:
1091 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1092 #    unset TMOUT
1093 #  fi
1094 # }}}
1095
1096 # {{{ make sure our environment is clean regarding colors
1097   for color in BLUE RED GREEN CYAN WHITE ; unset $color
1098 # }}}
1099
1100 # source another config file if present {{{
1101   if [ -r /etc/zsh/zshrc.local ]; then
1102    source /etc/zsh/zshrc.local
1103   fi
1104 # }}}
1105
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
1110   fi
1111 # }}}
1112
1113 ## END OF FILE #################################################################
1114 # vim:foldmethod=marker expandtab