/etc/zsh/zshrc: check for $SUDO and do not use it when running as root
[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: Son Apr 29 13:16:44 CEST 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 # completion functions go to /etc/zsh/completion.d
92 # function files may be put into /etc/zsh/functions.d, from where they
93 # will be automatically autoloaded.
94   [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
95   if [[ -d /etc/zsh/functions.d ]] ; then
96     fpath+=( /etc/zsh/functions.d )
97     for func in /etc/zsh/functions.d/[^_]*[^~] ; do
98       autoload -U ${func:t}
99     done
100   fi
101
102 # automatically remove duplicates from these arrays
103   typeset -U path cdpath fpath manpath
104 # }}}
105
106 # {{{ keybindings
107  if [[ "$TERM" != emacs ]]; then
108   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
109   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
110   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
111   [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
112   [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
113   [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
114   [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
115   [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
116   [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
117   [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
118   [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
119   [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
120   # ncurses stuff:
121   [[ "$terminfo[kcuu1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
122   [[ "$terminfo[kcud1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
123   [[ "$terminfo[kcuf1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
124   [[ "$terminfo[kcub1]" == "\eO"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
125   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
126   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
127   [[ "$terminfo[khome]" == "\eO"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
128   [[ "$terminfo[kend]"  == "\eO"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
129 fi
130
131 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
132 # use emacs style per default:
133   bindkey -e
134 # use vi style:
135 # bindkey -v
136
137 #if [[ "$TERM" == screen ]]; then
138   bindkey '\e[1~' beginning-of-line       # home
139   bindkey '\e[4~' end-of-line             # end
140   bindkey "^[[A"  up-line-or-search       # cursor up
141   bindkey "^[[B"  down-line-or-search     # <ESC>-
142   bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
143 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
144 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
145 # if terminal type is set to 'rxvt':
146   bindkey '\e[7~' beginning-of-line       # home
147   bindkey '\e[8~' end-of-line             # end
148 #fi
149
150 # insert unicode character
151 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง
152 # See for example http://unicode.org/charts/ for unicode characters code
153   autoload insert-unicode-char
154   zle -N insert-unicode-char
155   bindkey '^Xi' insert-unicode-char
156
157 # just type 'cd ...' to get 'cd ../..'
158 #  rationalise-dot() {
159 #  if [[ $LBUFFER = *.. ]]; then
160 #    LBUFFER+=/..
161 #  else
162 #    LBUFFER+=.
163 #  fi
164 #  }
165 #  zle -N rationalise-dot
166 #  bindkey . rationalise-dot
167
168 #  bindkey '\eq' push-line-or-edit
169 # }}}
170
171 # power completion - abbreviation expansion {{{
172 # power completion / abbreviation expansion / buffer expansion
173 # see http://zshwiki.org/home/examples/zleiab for details
174 # less risky than the global aliases but powerful as well
175 # just type the abbreviation key and afterwards ',.' to expand it
176   declare -A abk
177   setopt extendedglob
178   setopt interactivecomments
179   abk=(
180    # key  # value
181    'C'    '| wc -l'
182    '...' '../..'
183    '....' '../../..'
184    'BG' '& exit'
185    'C' '| wc -l'
186    'G' '|& grep --color=auto'
187    'H' '| head'
188    'Hl' ' --help |& less -r'
189    'L' '| less'
190    'LL' '|& less -r'
191    'M' '| most'
192    'N' '&>/dev/null'
193    'R' '| tr A-z N-za-m'
194    'SL' '| sort | less'
195    'S' '| sort -u'
196    'T' '| tail'
197    'V' '|& vim -'
198    'hide' "echo -en '\033]50;nil2\007'"
199    'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
200    'small' 'echo -en "\033]50;6x10\007"'
201    'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
202    'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
203    'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
204    'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
205    'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
206    'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
207    'da' 'du -sch'
208    'j' 'jobs -l'
209    'u' 'translate -i'
210    'co' "./configure && make && sudo make install"
211    'CH' "./configure --help"
212    'conkeror' 'firefox -chrome chrome://conkeror/content'
213    'dir' 'ls -lSrah'
214    'lad' $'ls -d .*(/)\n# only show dot-directories'
215    'lsa' $'ls -a .*(.)\n# only show dot-files'
216    'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
217    'lsl' $'ls -l *(@[1,10])\n# only symlinks'
218    'lsx' $'ls -l *(*[1,10])\n# only executables'
219    'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
220    'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
221    'lsd' $'ls -d *(/)\n# only show directories'
222    'lse' $'ls -d *(/^F)\n# only show empty directories'
223    'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
224    'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
225    'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
226    'rw-' 'chmod 600'
227    '600' 'chmod u+rw-x,g-rwx,o-rwx'
228    'rwx' 'chmod u+rwx'
229    '700' 'chmod u+rwx,g-rwx,o-rwx'
230    'r--' 'chmod u+r-wx,g-rwx,o-rwx'
231    '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
232    '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
233    'md' 'mkdir -p '
234    'cmplayer' 'mplayer -vo -fs -zoom fbdev'
235    'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
236    'fblinks' 'links2 -driver fb'
237    'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
238    'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
239    'fori' 'for i ({..}) { }'
240    'cx' 'chmod +x'
241    'e'  'print -l'
242    'se' 'setopt interactivecomments'
243    'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
244    'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
245    'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
246    'ci' 'centericq'
247    'D'  'export DISPLAY=:0.0'
248    'mp' 'mplayer -vo xv -fs -zoom'
249   )
250
251   globalias () {
252         local MATCH
253         matched_chars='[.-|_a-zA-Z0-9]#'
254         LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
255         LBUFFER+=${abk[$MATCH]:-$MATCH}
256   }
257
258   zle -N globalias
259   bindkey ",." globalias
260 # }}}
261
262 # {{{ autoloading
263   autoload -U zmv    # who needs mmv or rename?
264   autoload history-search-end
265
266   # we don't want to quote/espace URLs on our own...
267   # if autoload -U url-quote-magic ; then
268   #    zle -N self-insert url-quote-magic
269   #    zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
270   # else
271   #    print 'Notice: no url-quote-magic available :('
272   # fi
273   alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
274
275   alias run-help >&/dev/null && unalias run-help
276   autoload run-help # use via 'esc-h'
277
278 # completion system
279   if autoload -U compinit && compinit 2>/dev/null ; then
280      compinit 2>/dev/null || print 'Notice: no compinit available :('
281    else
282      print 'Notice: no compinit available :('
283      function zstyle { }
284      function compdef { }
285   fi
286
287   is4 && autoload -U zed                  # use ZLE editor to edit a file or function
288
289   is4 && for mod in complist deltochar mathfunc ; do
290              zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
291          done
292
293 # autoload zsh modules when they are referenced
294   is4 && for opt mod in a  stat    \
295                         a  zpty    \
296                         ap zprof   \
297                         ap mapfile ; do
298              zmodload -${opt} zsh/${mod} ${mod}
299          done ; unset opt mod
300
301   is4 && autoload -U insert-files && \
302   zle -N insert-files && \
303   bindkey "^Xf" insert-files # C-x-f
304
305   bindkey ' '   magic-space    # also do history expansion on space
306   bindkey '\ei' menu-complete  # menu completion via esc-i
307
308 # press esc-e for editing command line in $EDITOR or $VISUAL
309   is4 && autoload -U edit-command-line && \
310   zle -N edit-command-line && \
311   bindkey '\ee' edit-command-line
312
313 # menu selection: pick item but stay in the menu (press esc-return)
314   is4 && bindkey -M menuselect '\e^M' accept-and-menu-complete
315
316 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
317   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
318   bindkey '\C-ed' _bkdate
319   zle -N _bkdate
320
321 # press esc-m for inserting last typed word again (thanks to caphuso!)
322   insert-last-typed-word() { zle insert-last-word -- 0 -1 }; \
323   zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word
324
325 # set command prediction from history, see 'man 1 zshcontrib'
326 #  is4 && autoload -U predict-on && \
327 #  zle -N predict-on         && \
328 #  zle -N predict-off        && \
329 #  bindkey "^X^Z" predict-on && \
330 #  bindkey "^Z" predict-off
331
332 # put job into foreground via ctrl-z:
333   bindkey -s '^z' "fg\n"
334
335 # press ctrl-q to quote line:
336 #  mquote () {
337 #        zle beginning-of-line
338 #        zle forward-word
339 #        # RBUFFER="'$RBUFFER'"
340 #        RBUFFER=${(q)RBUFFER}
341 #        zle end-of-line
342 #  }
343 #  zle -N mquote && bindkey '^q' mquote
344
345 # run command line as user root via sudo:
346   _sudo-command-line() {
347     [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
348   }
349   zle -N sudo-command-line _sudo-command-line
350   bindkey "^Os" sudo-command-line
351 # }}}
352
353 # {{{ set some important options
354   (( EUID != 0 )) && umask 002 || umask 022
355
356 # history:
357   setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
358   is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
359   setopt extended_history     # save each command's beginning timestamp and the duration to the history file
360   is4 && setopt histignorealldups # If  a  new  command  line being added to the history
361                               # list duplicates an older one, the older command is removed from the list
362   setopt histignorespace      # remove command lines from the history list when
363                               # the first character on the line is a space
364 #  setopt histallowclobber    # add `|' to output redirections in the history
365 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
366   setopt auto_cd              # if a command is issued that can't be executed as a normal command,
367                               # and the command is the name of a directory, perform the cd command to that directory
368   setopt extended_glob        # in order to use #, ~ and ^ for filename generation
369                               # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
370                               # -> searches for word not in compressed files
371                               # don't forget to quote '^', '~' and '#'!
372   setopt notify               # report the status of backgrounds jobs immediately
373   setopt hash_list_all        # Whenever a command completion is attempted, make sure \
374                               # the entire command path is hashed first.
375   setopt completeinword       # not just at the end
376 # setopt nocheckjobs          # don't warn me about bg processes when exiting
377   setopt nohup                # and don't kill them, either
378 # setopt printexitvalue       # alert me if something failed
379 # setopt dvorak               # with spelling correction, assume dvorak kb
380   setopt auto_pushd           # make cd push the old directory onto the directory stack.
381   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
382   setopt nobeep               # avoid "beep"ing
383
384   MAILCHECK=30       # mailchecks
385   REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
386   watch=(notme root) # watch for everyone but me and root
387
388 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
389 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
390 #  WORDCHARS=.
391 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
392 #  WORDCHARS='${WORDCHARS:s@/@}'
393
394 # only slash should be considered as a word separator:
395   slash-backward-kill-word() {
396     local WORDCHARS="${WORDCHARS:s@/@}"
397     # zle backward-word
398     zle backward-kill-word
399   }
400   zle -N slash-backward-kill-word
401   bindkey '\ev' slash-backward-kill-word # press esc-v to delete a word until its last '/' (not the same as ctrl-w!)
402 # }}}
403
404 # {{{ history
405   export ZSHDIR=$HOME/.zsh
406   HISTFILE=$HOME/.zsh_history
407   isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
408   isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
409 # }}}
410
411 # dirstack handling {{{
412   DIRSTACKSIZE=20
413   if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
414      dirstack=( ${(uf)"$(< ~/.zdirs)"} )
415      # "cd -" won't work after login by just setting $OLDPWD, so
416      cd $dirstack[0] && cd $OLDPWD
417   fi
418   chpwd() {
419     builtin dirs -pl >! ~/.zdirs
420   }
421 # }}}
422
423 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
424   if [ -n "$BATTERY" ] ; then
425      if [ -x $(which acpi) ] ; then
426         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
427         [ -z "$PERCENT" ] && PERCENT='acpi not present'
428         if [ "${PERCENT%%%}" -lt 20 ] ; then
429            PERCENT="warning: ${PERCENT}%"
430         fi
431      fi
432   fi
433 # }}}
434
435 # {{{ set prompt
436   if autoload promptinit && promptinit 2>/dev/null ; then
437      promptinit # people should be able to use their favourite prompt
438   else
439      print 'Notice: no promptinit available :('
440   fi
441
442 # precmd() => a function which is executed just before each prompt
443 # use 'NOPRECMD=1' to disable the precmd + preexec commands
444
445   # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
446
447   # make sure to use right prompt only when not running a command
448   is4 && setopt transient_rprompt
449
450   is4 && [[ -z $NOPRECMD ]] && precmd () {
451       [[ -n $NOPRECMD ]] && return 0
452       # allow manual overwriting of RPROMPT
453       if [[ -n $RPROMPT ]] ; then
454          [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
455          return 0
456       fi
457       # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
458       if [[ -z $DONTSETRPROMPT ]] ; then
459          if [[ -n $BATTERY ]] ; then
460             RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
461             # RPROMPT="${PERCENT}${SCREENTITLE}"
462          else
463             RPROMPT="%(?..:()% ${SCREENTITLE}"
464             # RPROMPT="${SCREENTITLE}"
465          fi
466       fi
467       # adjust title of xterm
468       # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
469       case $TERM in (xterm*|rxvt)
470         print -Pn "\e]0;%n@%m: %~\a"
471         ;;
472       esac
473   }
474
475 # chpwd () => a function which is executed whenever the directory is changed
476
477 # preexec() => a function running before every command
478   is4 && [[ -z $NOPRECMD ]] && preexec () {
479       [[ -n $NOPRECMD ]] && return 0
480   # set hostname if not running on host with name 'grml'
481       local HOSTNAME=$(hostname)
482       if [[ "$HOSTNAME" != grml ]] ; then
483          NAME="@$HOSTNAME"
484       fi
485   # get the name of the program currently running and hostname of local machine
486   # set screen window title if running in a screen
487       if [[ "$TERM" == screen* ]]; then
488          # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
489          local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
490          echo -ne "\ek$CMD\e\\"
491       fi
492   # set the screen title to "zsh" when sitting at the command prompt:
493       if [[ "$TERM" == screen* ]]; then
494          SCREENTITLE=$'%{\ekzsh\e\\%}'
495       else
496          SCREENTITLE=''
497       fi
498   # adjust title of xterm
499       case $TERM in (xterm*|rxvt)
500         print -Pn "\e]0;%n@%m: $1\a"
501         ;;
502       esac
503   }
504
505 # set colors
506   if autoload colors && colors 2>/dev/null ; then
507      BLUE="%{${fg[blue]}%}"
508      RED="%{${fg_bold[red]}%}"
509      GREEN="%{${fg[green]}%}"
510      CYAN="%{${fg[cyan]}%}"
511      WHITE="%{${fg[white]}%}"
512      NO_COLOUR="%{${reset_color}%}"
513   else
514      BLUE="%{\e[1;34m%}"
515      RED="%{\e[1;31m%}"
516      GREEN="%{\e[1;32m%}"
517      CYAN="%{\e[1;36m%}"
518      WHITE="%{\e[1;37m%}"
519      NO_COLOUR="%{\e[0m%}"
520   fi
521
522   EXITCODE="%(?..%?%1v )"
523   PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
524   PS3='?# '         # selection prompt used within a select loop.
525   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
526
527   # set variable debian_chroot if running in a chroot with /etc/debian_chroot
528   if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
529     debian_chroot=$(cat /etc/debian_chroot)
530   fi
531
532   # don't use colors on dumb terminals (like emacs):
533   if [[ "$TERM" == dumb ]] ; then
534      PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
535   else
536     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
537     # set variable identifying the chroot you work in (used in the prompt below)
538     if [[ -n $GRMLPROMPT ]]; then
539       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
540 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
541     else
542       if (( EUID != 0 )); then
543         PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
544       else
545         PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
546       fi
547     fi
548   fi
549
550   # if we are inside a grml-chroot set a specific prompt theme
551   if [ -n "$GRML_CHROOT" ] ; then
552      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
553   fi
554 # }}}
555
556 # {{{ 'hash' some often used directories
557   hash -d deb=/var/cache/apt/archives
558   hash -d doc=/usr/share/doc
559   hash -d linux=/lib/modules/$(command uname -r)/build/
560   hash -d log=/var/log
561   hash -d slog=/var/log/syslog
562   hash -d src=/usr/src
563   hash -d templ=/usr/share/doc/grml-templates
564   hash -d tt=/usr/share/doc/texttools-doc
565   hash -d www=/var/www
566 # }}}
567
568 # {{{ some aliases
569   if [ $UID = 0 ] ; then
570      [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
571   elif [ -r $HOME/.screenrc ] ; then
572      alias screen="/usr/bin/screen -c $HOME/.screenrc"
573   else
574      [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
575   fi
576
577   if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
578      alias ls='ls -b -CF --color=auto' # do we have GNU ls with color-support?
579      alias la='ls -la --color=auto'
580      alias ll='ls -l --color=auto'
581      alias lh='ls -hAl --color=auto'
582      alias l='ls -lF --color=auto'
583   else
584      alias ls='ls -b -CF'
585      alias la='ls -la'
586      alias ll='ls -l'
587      alias lh='ls -hAl'
588      alias l='ls -lF'
589   fi
590
591   alias mdstat='cat /proc/mdstat'
592   alias ...='cd ../../'
593
594   alias cp='nocorrect cp'         # no spelling correction on cp
595   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
596   alias mv='nocorrect mv'         # no spelling correction on mv
597   alias rm='nocorrect rm'         # no spelling correction on rm
598
599   alias rd='rmdir'
600   alias md='mkdir'
601
602   # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
603   alias term2iso="echo 'Setting terminal to iso mode' ; echo -e '\e%@'"
604   alias term2utf="echo 'Setting terminal to utf-8 mode'; echo -e '\e%G'"
605
606   alias utf2iso='if isutfenv ; then
607    for ENV in `env | grep UTF` ; do
608        eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
609    done
610    fi'
611   alias iso2utf='if isutfenv ; then
612    for ENV in `env | grep '\.iso'` ; do
613        eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
614    done
615    fi'
616
617 # set up software synthesizer via speakup
618   alias swspeak='
619     aumix -w 90 -v 90 -p 90 -m 90
620     if ! [ -r /dev/softsynth ] ; then
621        flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
622        return 1
623     else
624        setopt singlelinezle
625        unsetopt prompt_cr
626        export PS1="%m%# "
627        nice -n -20 speechd-up
628        sleep 2
629        flite -o play -t "Finished setting up software synthesizer"
630     fi
631   '
632
633   # I like clean prompt, so provide simple way to get that
634   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
635
636 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
637   if [ -x /usr/sbin/truecrypt ] ; then
638      if isutfenv ; then
639         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
640      else
641         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
642      fi
643   fi
644
645   zsh-help(){print "$bg[white]$fg[black]
646 zsh-help - hints for use of zsh on grml
647 =======================================$reset_color
648
649 Main configuration of zsh happens in /etc/zsh/zshrc (global)
650 and /etc/skel/.zshrc which is copied to \$HOME/.zshrc once.
651 The files are part of the package grml-etc-core, if you want to
652 use them on a non-grml-system just get the tar.gz from
653 http://deb.grml.org/ or get the files from the mercurial
654 repository:
655
656   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
657   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
658
659 If you want to stay in sync with zsh configuration of grml
660 run 'ln -sf /etc/skel/.zshrc \$HOME/.zshrc' and configure
661 your own stuff in \$HOME/.zshrc.local. System wide configuration
662 without touching configuration files of grml can take place
663 in /etc/zsh/zshrc.local.
664
665 If you want to use the configuration of user grml also when
666 running as user root just run 'zshskel' which will source
667 the file /etc/skel/.zshrc.
668
669 For information regarding zsh start at http://grml.org/zsh/
670
671 Take a look at grml's zsh refcard:
672 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
673
674 Check out the main zsh refcard:
675 % $BROWSER http://www.bash2zsh.com/zsh_refcard/refcard.pdf
676
677 And of course visit the zsh-lovers:
678 % man zsh-lovers
679
680 You can adjust some options through environment variables when
681 invoking zsh without having to edit configuration files.
682 Basically meant for bash users who are not used to the power of
683 the zsh yet. :)
684
685   \"NOCOR=1    zsh\" => deactivate automatic correction
686   \"NOMENU=1   zsh\" => do not use menu completion (note: use strg-d for completion instead!)
687   \"NOPRECMD=1 zsh\" => disable the precmd + preexec commands (set GNU screen title)
688   \"BATTERY=1  zsh\" => activate battery status (via acpi) on right side of prompt
689 $bg[white]$fg[black]
690 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
691 Enjoy your grml system with the zsh!$reset_color"
692 }
693
694 # debian stuff
695   if [ -r /etc/debian_version ] ; then
696     alias acs='apt-cache search'
697     alias acsh='apt-cache show'
698     alias acp='apt-cache policy'
699     [ -n "$SUDO" ] && alias adg="$SUDO apt-get dist-upgrade" || alias adg="apt-get dist-upgrade"
700     [ -n "$SUDO" ] && alias agi="$SUDO apt-get install"      || alias agi="apt-get install"
701     [ -n "$SUDO" ] && alias ati="$SUDO aptitude install"     || alias ati="aptitude install"
702     [ -n "$SUDO" ] && alias ag="$SUDO apt-get upgrade"       || alias ag="apt-get upgrade"
703     [ -n "$SUDO" ] && alias au="$SUDO apt-get update"        || alias au="apt-get update"
704     [ -n "$SUDO" ] && alias up="$SUDO aptitude update ; $SUDO aptitude upgrade" || alias up="aptitude update ; aptitude upgrade"
705     alias dbp='dpkg-buildpackage'
706     alias ge='grep-excuses'
707
708     # debian upgrade
709     upgrade () {
710       if [ -z "$1" ] ; then
711           $SUDO apt-get update
712           $SUDO apt-get -u upgrade
713       else
714           ssh $1 $SUDO apt-get update
715           # ask before the upgrade
716           local dummy
717           ssh $1 $SUDO apt-get --no-act upgrade
718           echo -n 'Process the upgrade?'
719           read -q dummy
720           if [[ $dummy == "y" ]] ; then
721               ssh $1 $SUDO apt-get -u upgrade --yes
722           fi
723       fi
724     }
725
726     isgrmlcd && alias su="sudo su"          # change to user root
727     alias tlog="tail -f /var/log/syslog"    # take a look at the syslog
728     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
729   fi
730
731 # sort installed Debian-packages by size
732   if [ -x /usr/bin/grep-status ] ; then
733      alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package \
734                 -n "install ok installed" | paste -sd "  \n" | sort -rn'
735   fi
736
737 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
738   if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
739      if [ -x $(which wodim) ] ; then
740         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
741 See #377109 in the BTS of Debian for more details.
742
743 Please use the wodim binary instead' ; return 1"
744      fi
745   fi
746
747 # get_tw_cli has been renamed into get_3ware
748   if [ -x /usr/bin/get_3ware ] ; then
749      get_tw_cli() {
750        echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
751        get_3ware
752      }
753   fi
754
755 # I hate lacking backward compability, so provide an alternative therefore
756   if ! [ -x /usr/sbin/apache2-ssl-certificate ] ; then
757    function apache2-ssl-certificate(){
758
759      print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
760      print 'You might want to take a look at Debian the package ssl-cert as well.'
761      print 'To generate a certificate for use with apache2 follow the instructions:'
762
763      echo '
764
765 export RANDFILE=/dev/random
766 mkdir /etc/apache2/ssl/
767 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
768 chmod 600 /etc/apache2/ssl/apache.pem
769
770 Run "grml-tips ssl-certificate" if you need further instructions.
771 '
772    }
773   fi
774 # }}}
775
776 # {{{ Use hard limits, except for a smaller stack and no core dumps
777   unlimit
778   limit stack 8192
779   isgrmlcd && limit core 0 # important for a live-cd-system
780   limit -s
781 # }}}
782
783 # {{{ completion stuff
784
785 # called later (via is4 && grmlcomp)
786 # notice: use 'zstyle' for getting current settings
787 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
788 grmlcomp() {
789 ## completion system
790   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
791   zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
792   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
793   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
794   zstyle ':completion:*:correct:*'       original true                       #
795   zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}      # activate color-completion(!)
796   zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'  # format on completion
797   zstyle ':completion:*:*:cd:*:directory-stack' menu yes select              # complete 'cd -<tab>' with menu
798   zstyle ':completion:*:expand:*'        tag-order all-expansions            # insert all expansions for expand completer
799   zstyle ':completion:*:history-words'   list false                          #
800   zstyle ':completion:*:history-words'   menu yes                            # activate menu
801   zstyle ':completion:*:history-words'   remove-all-dups yes                 # ignore duplicate entries
802   zstyle ':completion:*:history-words'   stop yes                            #
803   zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'        # match uppercase from lowercase
804   zstyle ':completion:*:matches'         group 'yes'                         # separate matches into groups
805   zstyle ':completion:*'                 group-name ''
806   if [[ -z "$NOMENU" ]] ; then
807     zstyle ':completion:*'               menu select=5                       # if there are more than 5 options allow selecting from a menu
808   else
809     setopt no_auto_menu # don't use any menus at all
810   fi
811   zstyle ':completion:*:messages'        format '%d'                         #
812   zstyle ':completion:*:options'         auto-description '%d'               #
813   zstyle ':completion:*:options'         description 'yes'                   # describe options in full
814   zstyle ':completion:*:processes'       command 'ps -au$USER'               # on processes completion complete all user processes
815   zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters        # offer indexes before parameters in subscripts
816   zstyle ':completion:*'                 verbose true                        # provide verbose completion information
817   zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d' # set format for warnings
818   zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'       # define files to ignore for zcompile
819   zstyle ':completion:correct:'          prompt 'correct to: %e'             #
820   zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'    # Ignore completion functions for commands you don't have:
821
822 # complete manual by their section
823   zstyle ':completion:*:manuals'    separate-sections true
824   zstyle ':completion:*:manuals.*'  insert-sections   true
825   zstyle ':completion:*:man:*'      menu yes select
826
827 ## correction
828 # run rehash on completion so new installed program are found automatically:
829   _force_rehash() {
830       (( CURRENT == 1 )) && rehash
831          return 1 # Because we didn't really complete anything
832     }
833 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
834   if [[ -n "$NOCOR" ]] ; then
835     zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
836     setopt nocorrect # do not try to correct the spelling if possible
837   else
838 #    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
839     setopt correct  # try to correct the spelling if possible
840     zstyle -e ':completion:*' completer '
841         if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
842           _last_try="$HISTNO$BUFFER$CURSOR"
843           reply=(_complete _match _prefix _files)
844         else
845           if [[ $words[1] = (rm|mv) ]]; then
846             reply=(_complete _files)
847           else
848             reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
849           fi
850         fi'
851   fi
852 # zstyle ':completion:*' completer _complete _correct _approximate
853 # zstyle ':completion:*' expand prefix suffix
854
855 # automatic rehash? Credits go to Frank Terbeck
856 # function my_accept () {
857 #   local buf
858 #   [[ -z ${BUFFER} ]] && zle accept-line && return
859 #   buf=( ${(z)BUFFER}  )
860 #   [[ -z ${commands[${buf[1]}]} ]] && rehash
861 #   zle accept-line
862 # }
863 # zle -N my_accept
864 # bindkey "^M" my_accept
865
866 # command for process lists, the local web server details and host completion
867   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
868
869 # caching
870   [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
871                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
872
873 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
874   if is42 ; then
875     [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
876     [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
877   else
878     _ssh_hosts=()
879     _etc_hosts=()
880   fi
881   hosts=(
882       `hostname`
883       "$_ssh_hosts[@]"
884       "$_etc_hosts[@]"
885       grml.org
886       localhost
887   )
888   zstyle ':completion:*:hosts' hosts $hosts
889 #  zstyle '*' hosts $hosts
890
891 # specify your logins:
892 # my_accounts=(
893 #  {grml,grml1}@foo.invalid
894 #  grml-devel@bar.invalid
895 # )
896 # other_accounts=(
897 #  {fred,root}@foo.invalid
898 #  vera@bar.invalid
899 # )
900 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
901 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
902
903 # specify specific port/service settings:
904 #  telnet_users_hosts_ports=(
905 #    user1@host1:
906 #    user2@host2:
907 #    @mail-server:{smtp,pop3}
908 #    @news-server:nntp
909 #    @proxy-server:8000
910 #  )
911 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
912
913 # use generic completion system for programs not yet defined:
914   compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
915
916 # see upgrade function in this file
917   compdef _hosts upgrade
918 }
919 # }}}
920
921 # {{{ grmlstuff
922 grmlstuff() {
923 # people should use 'grml-x'!
924   function startx() {
925     if [ -e /etc/X11/xorg.conf ] ; then
926        [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
927     else
928       echo "Please use the script \"grml-x\" for starting the X Window System
929 because there does not exist /etc/X11/xorg.conf yet.
930 If you want to use startx anyway please call \"/usr/bin/startx\"."
931       return -1
932     fi
933   }
934
935   function xinit() {
936     if [ -e /etc/X11/xorg.conf ] ; then
937        [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
938     else
939       echo "Please use the script \"grml-x\" for starting the X Window System.
940 because there does not exist /etc/X11/xorg.conf yet.
941 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
942       return -1
943     fi
944   }
945
946   if [ -x /usr/sbin/915resolution ] ; then
947      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
948   fi
949
950   alias grml-version='cat /etc/grml_version'
951
952   if [ -x /usr/sbin/rebuildfstab ] ; then
953      alias grml-rebuildfstab='rebuildfstab -v -r -config'
954   fi
955 }
956 # }}}
957
958 # {{{ now run the functions
959   isgrml && checkhome
960   is4    && isgrml    && grmlstuff
961   is4    && grmlcomp
962 # }}}
963
964 # {{{ keephack
965   [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
966 # }}}
967
968 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
969 # You use it as follows:
970 # $ NTREF=/reference/file
971 # $ ls -l *(e:nt:)
972 # This lists all the files in the current directory newer than the reference file.
973 # You can also specify the reference file inline; note quotes:
974 # $ ls -l *(e:'nt ~/.zshenv':)
975   is4 && nt() {
976     if [[ -n $1 ]]; then
977       local NTREF=${~1}
978     fi
979     [[ $REPLY -nt $NTREF ]]
980   }
981 # }}}
982
983 # shell functions {{{
984   setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
985   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
986   reload () {
987    if [[ "$#*" -eq 0 ]]; then
988       [ -r ~/.zshrc ] && . ~/.zshrc
989    else
990       local fn
991       for fn in "$@"; do
992           unfunction $fn
993           autoload -U $fn
994       done
995    fi
996   }
997   compdef _functions reload freload
998
999   # list symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1000   sll() {
1001     [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1002     for i in "$@" ; do
1003       file=$i
1004       while [ -h "$file" ] ; do
1005         ls -l $file
1006         file=$(readlink "$file")
1007       done
1008     done
1009   }
1010
1011   # fast manual access
1012   if type -p qma &>/dev/null ; then
1013      manzsh()  { qma zshall "$1" }
1014      compdef _man qma
1015   else
1016      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1017      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
1018      # manzsh()  { man zshall | $MYLESS -p $1 ; }
1019   fi
1020
1021   if [ -x /usr/bin/most ] ; then
1022   # use "dchange <package-name>" to view Debian's changelog of the package:
1023     dchange() {
1024       if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
1025          most /usr/share/doc/${1}/changelog.Debian.gz
1026       else
1027          if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1028             most /usr/share/doc/${1}/changelog.gz
1029          else
1030             echo "No changelog for package $1 found, sorry."
1031             return 1
1032          fi
1033       fi
1034     }
1035     _dchange() { _files -W /usr/share/doc -/ }
1036     compdef _dchange dchange
1037
1038   # use "uchange <package-name>" to view upstream's changelog of the package:
1039     uchange() {
1040       if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
1041          most /usr/share/doc/${1}/changelog.gz
1042       else
1043          echo "No changelog for package $1 found, sorry."
1044          return 1
1045       fi
1046     }
1047     _uchange() { _files -W /usr/share/doc -/ }
1048     compdef _uchange uchange
1049   fi
1050
1051 # zsh profiling
1052   profile () {
1053       ZSH_PROFILE_RC=1 $SHELL "$@"
1054   }
1055
1056 # edit alias via zle:
1057   edalias() {
1058     [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1059   }
1060   compdef _aliases edalias
1061
1062 # edit function via zle:
1063   edfunc() {
1064     [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1065   }
1066   compdef _functions edfunc
1067
1068 # use it e.g. via 'Restart apache2'
1069  if [ -d /etc/init.d ] ; then
1070   for i in Start Restart Stop Force-Reload Reload ; do
1071     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1072   done
1073   # now the completion for this:
1074   compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
1075  fi
1076
1077 # provide useful information on globbing
1078   H-Glob() {
1079   echo -e "
1080       /      directories
1081       .      plain files
1082       @      symbolic links
1083       =      sockets
1084       p      named pipes (FIFOs)
1085       *      executable plain files (0100)
1086       %      device files (character or block special)
1087       %b     block special files
1088       %c     character special files
1089       r      owner-readable files (0400)
1090       w      owner-writable files (0200)
1091       x      owner-executable files (0100)
1092       A      group-readable files (0040)
1093       I      group-writable files (0020)
1094       E      group-executable files (0010)
1095       R      world-readable files (0004)
1096       W      world-writable files (0002)
1097       X      world-executable files (0001)
1098       s      setuid files (04000)
1099       S      setgid files (02000)
1100       t      files with the sticky bit (01000)
1101
1102    print *(m-1)          # Files modified up to a day ago
1103    print *(a1)           # Files accessed a day ago
1104    print *(@)            # Just symlinks
1105    print *(Lk+50)        # Files bigger than 50 kilobytes
1106    print *(Lk-50)        # Files smaller than 50 kilobytes
1107    print **/*.c          # All *.c files recursively starting in \$PWD
1108    print **/*.c~file.c   # Same as above, but excluding 'file.c'
1109    print (foo|bar).*     # Files starting with 'foo' or 'bar'
1110    print *~*.*           # All Files that do not contain a dot
1111    chmod 644 *(.^x)      # make all plain non-executable files publically readable
1112    print -l *(.c|.h)     # Lists *.c and *.h
1113    print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
1114    echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1115   }
1116   alias help-zshglob=H-Glob
1117
1118   type -p qma &>/dev/null && alias ?='qma zshall'
1119
1120   # grep for running process, like: 'any vim'
1121   any() {
1122   if [ -z "$1" ] ; then
1123      echo "any - grep for process(es) by keyword" >&2
1124      echo "Usage: any <keyword>" >&2 ; return 1
1125   else
1126      local STRING=$1
1127      local LENGTH=$(expr length $STRING)
1128      local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1129      local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1130      ps xauwww| grep "[$FIRSCHAR]$REST"
1131   fi
1132   }
1133
1134   # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
1135   # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1136   [ -r /proc/1/maps ] && deswap() {
1137      print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1138      cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
1139      print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1140   }
1141
1142   # print hex value of a number
1143   hex() {
1144     [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1145   }
1146
1147   # calculate (or eval at all ;-)) with perl => p[erl-]eval
1148   # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1149   peval() {
1150     [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
1151     perl -e "print eval($CALC),\"\n\";"
1152   }
1153   functions peval &>/dev/null && alias calc=peval
1154
1155   # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1156   # certain circumstances, so work around it, no matter which environment we have
1157   brltty() {
1158     if [ -z "$DISPLAY" ] ; then
1159        consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1160        command brltty "$@"
1161     else
1162        command brltty "$@"
1163     fi
1164   }
1165
1166   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1167   # bash() {
1168   #  NO_SWITCH="yes" command bash "$@"
1169   # }
1170   # restart () {
1171   #  exec $SHELL $SHELL_ARGS "$@"
1172   # }
1173
1174 # }}}
1175
1176 # log out? set timeout in seconds {{{
1177 # TMOUT=1800
1178 # do not log out in some specific terminals:
1179 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
1180 #    unset TMOUT
1181 #  fi
1182 # }}}
1183
1184 # {{{ make sure our environment is clean regarding colors
1185   for color in BLUE RED GREEN CYAN WHITE ; unset $color
1186 # }}}
1187
1188 # source another config file if present {{{
1189   if [ -r /etc/zsh/zshrc.local ]; then
1190    source /etc/zsh/zshrc.local
1191   fi
1192 # }}}
1193
1194 # "persistent history" {{{
1195 # just write important commands you always need to ~/.important_commands
1196   if [ -r ~/.important_commands ] ; then
1197      fc -R ~/.important_commands
1198   fi
1199 # }}}
1200
1201 ## END OF FILE #################################################################
1202 # vim:foldmethod=marker expandtab