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