671e7c195715af342449e2adbb1f6274677eba26
[grml-etc-core.git] / etc / zsh / zshrc
1 # Filename:      zshrc
2 # Purpose:       config file for zsh (z shell)
3 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
4 # Bug-Reports:   see http://grml.org/bugs/
5 # License:       This file is licensed under the GPL v2.
6 # Latest change: Sam Dez 22 19:17:27 CET 2007 [mika]
7 ################################################################################
8 # This file is sourced only for interactive shells. It
9 # should contain commands to set up aliases, functions,
10 # options, key bindings, etc.
11 #
12 # Global Order: zshenv, zprofile, zshrc, zlogin
13 ################################################################################
14
15 # zsh-refcard-tag documentation: {{{
16 #   You may notice strange looking comments in the zshrc (and ~/.zshrc as
17 #   well). These are there for a purpose. grml's zsh-refcard can now be
18 #   automatically generated from the contents of the actual configuration
19 #   files. However, we need a little extra information on which comments
20 #   and what lines of code to take into account (and for what purpose).
21 #
22 # Here is what they mean:
23 #
24 # List of tags (comment types) used:
25 #   #a#     Next line contains an important alias, that should
26 #           be included in the grml-zsh-refcard.
27 #           (placement tag: @@INSERT-aliases@@)
28 #   #f#     Next line contains the beginning of an important function.
29 #           (placement tag: @@INSERT-functions@@)
30 #   #v#     Next line contains an important variable.
31 #           (placement tag: @@INSERT-variables@@)
32 #   #k#     Next line contains an important keybinding.
33 #           (placement tag: @@INSERT-keybindings@@)
34 #   #d#     Hashed directories list generation:
35 #               start   denotes the start of a list of 'hash -d'
36 #                       definitions.
37 #               end     denotes its end.
38 #           (placement tag: @@INSERT-hasheddirs@@)
39 #   #A#     Abbreviation expansion list generation:
40 #               start   denotes the beginning of abbreviations.
41 #               end     denotes their end.
42 #           Lines within this section that end in '#d .*' provide
43 #           extra documentation to be included in the refcard.
44 #           (placement tag: @@INSERT-abbrev@@)
45 #   #m#     This tag allows you to manually generate refcard entries
46 #           for code lines that are hard/impossible to parse.
47 #               Example:
48 #                   #m# k ESC-h Call the run-help function
49 #               That would add a refcard entry in the keybindings table
50 #               for 'ESC-h' with the given comment.
51 #           So the syntax is: #m# <section> <argument> <comment>
52 #   #o#     This tag lets you insert entries to the 'other' hash.
53 #           Generally, this should not be used. It is there for
54 #           things that cannot be done easily in another way.
55 #           (placement tag: @@INSERT-other-foobar@@)
56 #
57 #   All of these tags (except for m and o) take two arguments, the first
58 #   within the tag, the other after the tag:
59 #
60 #   #<tag><section># <comment>
61 #
62 #   Where <section> is really just a number, which are defined by the
63 #   @secmap array on top of 'genrefcard.pl'. The reason for numbers
64 #   instead of names is, that for the reader, the tag should not differ
65 #   much from a regular comment. For zsh, it is a regular comment indeed.
66 #   The numbers have got the following meanings:
67 #         0 -> "default"
68 #         1 -> "system"
69 #         2 -> "user"
70 #         3 -> "debian"
71 #         4 -> "search"
72 #         5 -> "shortcuts"
73 #         6 -> "services"
74 #
75 #   So, the following will add an entry to the 'functions' table in the
76 #   'system' section, with a (hopefully) descriptive comment:
77 #       #f1# Edit an alias via zle
78 #       edalias() {
79 #
80 #   It will then show up in the @@INSERT-aliases-system@@ replacement tag
81 #   that can be found in 'grml-zsh-refcard.tex.in'.
82 #   If the section number is omitted, the 'default' section is assumed.
83 #   Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
84 #   exactly the same as @@INSERT-aliases-default@@. If you want a list of
85 #   *all* aliases, for example, use @@INSERT-aliases-all@@.
86 #}}}
87
88 # zsh profiling {{{
89 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
90 if [[ -n $ZSH_PROFILE_RC ]] ; then
91     zmodload zsh/zprof
92 fi
93 # }}}
94
95 # utility functions {{{
96 # this function checks if a command exists and returns either true
97 # or false. This avoids using 'which' and 'whence', which will
98 # avoid problems with aliases for which on certain weird systems. :-)
99 check_com() {
100     local -i comonly
101
102     if [[ ${1} == '-c' ]] ; then
103         (( comonly = 1 ))
104         shift
105     else
106         (( comonly = 0 ))
107     fi
108
109     if (( ${#argv} != 1 )) ; then
110         printf 'usage: check_com [-c] <command>\n' >&2
111         return 1
112     fi
113
114     if (( comonly > 0 )) ; then
115         [[ -n ${commands[$1]}  ]] && return 0
116         return 1
117     fi
118
119     if   [[ -n ${commands[$1]}    ]] \
120       || [[ -n ${functions[$1]}   ]] \
121       || [[ -n ${aliases[$1]}     ]] \
122       || [[ -n ${reswords[(r)$1]} ]] ; then
123
124         return 0
125     fi
126
127     return 1
128 }
129
130 # creates an alias and precedes the command with
131 # sudo if $EUID is not zero.
132 salias() {
133     local only=0 ; local multi=0
134     while [[ ${1} == -* ]] ; do
135         case ${1} in
136             (-o) only=1 ;;
137             (-a) multi=1 ;;
138             (--) shift ; break ;;
139             (-h)
140                 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
141                 printf '  -h      shows this help text.\n'
142                 printf '  -a      replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
143                 printf '          be careful using this option.\n'
144                 printf '  -o      only sets an alias if a preceding sudo would be needed.\n'
145                 return 0
146                 ;;
147             (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
148         esac
149         shift
150     done
151
152     if (( ${#argv} > 1 )) ; then
153         printf 'Too many arguments %s\n' "${#argv}"
154         return 1
155     fi
156
157     key="${1%%\=*}" ;  val="${1#*\=}"
158     if (( EUID == 0 )) && (( only == 0 )); then
159         alias -- "${key}=${val}"
160     elif (( EUID > 0 )) ; then
161         (( multi > 0 )) && val="${val// ; / ; sudo }"
162         alias -- "${key}=sudo ${val}"
163     fi
164
165     return 0
166 }
167
168 # Check if we can read given files and source those we can.
169 xsource() {
170     if (( ${#argv} < 1 )) ; then
171         printf 'usage: xsource FILE(s)...\n' >&2
172         return 1
173     fi
174
175     while (( ${#argv} > 0 )) ; do
176         [[ -r ${1} ]] && source ${1}
177         shift
178     done
179     return 0
180 }
181
182 # Check if we can read a given file and 'cat(1)' it.
183 xcat() {
184     if (( ${#argv} != 1 )) ; then
185         printf 'usage: xcat FILE\n' >&2
186         return 1
187     fi
188
189     [[ -r ${1} ]] && cat ${1}
190     return 0
191 }
192
193 # Remove these functions again, they are of use only in these
194 # setup files. This should be called at the end of .zshrc.
195 xunfunction() {
196     local -a funcs
197     funcs=(check_com salias xcat xsource xunfunction)
198
199     for func in $funcs ; do
200         [[ -n ${functions[$func]} ]] \
201             && unfunction $func
202     done
203     return 0
204 }
205 #}}}
206
207 # locale setup {{{
208 if [[ -z "$LANG" ]] ; then
209     xsource "/etc/default/locale"
210 fi
211
212 export LANG=${LANG:-en_US.iso885915}
213 for var in LC_ALL LC_MESSAGES ; do
214     [[ -n ${(P)var} ]] && export $var
215 done
216
217 xsource "/etc/sysconfig/keyboard"
218
219 TZ=$(xcat /etc/timezone)
220 # }}}
221
222 # check for potentially old files in 'completion.d' {{{
223 setopt extendedglob
224 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
225 if (( ${#xof} > 0 )) ; then
226     printf '\n -!- INFORMATION\n\n'
227     printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
228     printf ' -!- /etc/zsh/completion.d/.\n\n'
229     printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
230     printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
231     printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
232     printf ' -!- named _* to that directory.\n\n'
233     printf ' -!- If you added functions to completion.d yourself, please consider\n'
234     printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
235     printf ' -!- starting with an underscore are marked for automatic loading\n'
236     printf ' -!- by default (so that is quite convenient).\n\n'
237     printf ' -!- If there are files *not* starting with an underscore from an older\n'
238     printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
239     printf ' -!- Delete the files for example via running:\n\n'
240     printf "      rm ${xof}\n\n"
241     printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
242     printf ' -!- resolve the situation manually.\n\n'
243     BROKEN_COMPLETION_DIR=1
244 fi
245 unset xof
246 # }}}
247
248 # {{{ check for version/system
249 # check for versions (compatibility reasons)
250 if autoload is-at-least && is-at-least 2>/dev/null ; then
251     is4()  { is-at-least 4 }
252     is41() { is-at-least 4.1 }
253     is42() { is-at-least 4.2 }
254 else
255     is4(){
256         [[ $ZSH_VERSION == 4.* ]] && return 0
257         return 1
258     }
259     is42(){
260         [[ $ZSH_VERSION == 4.<2->* ]] && return 0
261         return 1
262     }
263 fi
264
265 #f1# Checks whether or not you're running grml
266 isgrml(){
267     [[ -f /etc/grml_version ]] && return 0
268     return 1
269 }
270
271 #f1# Checks whether or not you're running a grml cd
272 isgrmlcd(){
273     [[ -f /etc/grml_cd ]] && return 0
274     return 1
275 }
276
277 if isgrml ; then
278 #f1# Checks whether or not you're running grml-small
279     isgrmlsmall() {
280         [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
281     }
282 else
283     isgrmlsmall() { return 1 }
284 fi
285
286 #f1# are we running within an utf environment?
287 isutfenv() {
288     case "$LANG $CHARSET $LANGUAGE" in
289         *utf*) return 0 ;;
290         *UTF*) return 0 ;;
291         *)     return 1 ;;
292     esac
293 }
294
295 # check for user, if not running as root set $SUDO to sudo
296 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
297
298 # change directory to home on first invocation of zsh
299 # important for rungetty -> autologin
300 # Thanks go to Bart Schaefer!
301 isgrml && checkhome() {
302     if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
303         export ALREADY_DID_CD_HOME=$HOME
304         cd
305     fi
306 }
307 # }}}
308
309 # {{{ set some variables
310 if check_com -c vim ; then
311 #v#
312     export EDITOR=${EDITOR:-vim}
313 else
314     export EDITOR=${EDITOR:-vi}
315 fi
316
317 #v#
318 (( ${+PAGER} )) || export PAGER="less"
319
320 #v#
321 export MAIL=${MAIL:-/var/mail/$USER}
322
323 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
324 export SHELL='/bin/zsh'
325
326 # color setup for ls:
327 check_com -c dircolors && eval $(dircolors -b)
328
329 # set width of man pages to 80 for more convenient reading
330 # (( ${+MANWIDTH} )) || export MANWIDTH=80
331
332 # Search path for the cd command
333 #  cdpath=(.. ~)
334
335 # completion functions go to /etc/zsh/completion.d
336 # function files may be put into /etc/zsh/functions.d, from where they
337 # will be automatically autoloaded.
338 if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
339     print 'Warning: not setting completion directories because broken files have been found.' >&2
340 else
341     [[ -d /etc/zsh/completion.d ]] && fpath=( $fpath /etc/zsh/completion.d )
342     if [[ -d /etc/zsh/functions.d ]] ; then
343         fpath+=( /etc/zsh/functions.d )
344         for func in /etc/zsh/functions.d/[^_]*[^~] ; do
345             autoload -U ${func:t}
346         done
347     fi
348 fi
349
350 # automatically remove duplicates from these arrays
351 typeset -U path cdpath fpath manpath
352 # }}}
353
354 # {{{ keybindings
355 if [[ "$TERM" != emacs ]] ; then
356     [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
357     [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
358     [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
359     [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
360     [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
361     [[ -z "$terminfo[kend]"  ]] || bindkey -M vicmd "$terminfo[kend]"  vi-end-of-line
362     [[ -z "$terminfo[cuu1]"  ]] || bindkey -M viins "$terminfo[cuu1]"  vi-up-line-or-history
363     [[ -z "$terminfo[cuf1]"  ]] || bindkey -M viins "$terminfo[cuf1]"  vi-forward-char
364     [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
365     [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
366     [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
367     [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
368     # ncurses stuff:
369     [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
370     [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
371     [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
372     [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
373     [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
374     [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}"  end-of-line
375     [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
376     [[ "$terminfo[kend]"  == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line
377 fi
378
379 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
380 # use emacs style per default:
381 bindkey -e
382 # use vi style:
383 # bindkey -v
384
385 #if [[ "$TERM" == screen ]] ; then
386 bindkey '\e[1~' beginning-of-line       # home
387 bindkey '\e[4~' end-of-line             # end
388 bindkey '\e[A'  up-line-or-search       # cursor up
389 bindkey '\e[B'  down-line-or-search     # <ESC>-
390 bindkey '^x'    history-beginning-search-backward # alternative ways of searching the shell history
391 # bindkey -s '^L' "|less\n"             # ctrl-L pipes to less
392 # bindkey -s '^B' " &\n"                # ctrl-B runs it in the background
393 # if terminal type is set to 'rxvt':
394 bindkey '\e[7~' beginning-of-line       # home
395 bindkey '\e[8~' end-of-line             # end
396 #fi
397
398 # insert unicode character
399 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an Â§
400 # See for example http://unicode.org/charts/ for unicode characters code
401 autoload insert-unicode-char
402 zle -N insert-unicode-char
403 #k# Insert Unicode character
404 bindkey '^Xi' insert-unicode-char
405
406 # just type 'cd ...' to get 'cd ../..'
407 #  rationalise-dot() {
408 #  if [[ $LBUFFER == *.. ]] ; then
409 #    LBUFFER+=/..
410 #  else
411 #    LBUFFER+=.
412 #  fi
413 #  }
414 #  zle -N rationalise-dot
415 #  bindkey . rationalise-dot
416
417 #  bindkey '\eq' push-line-or-edit
418 # }}}
419
420 # a generic accept-line wrapper {{{
421
422 # This widget can prevent unwanted autocorrections from command-name
423 # to _command-name, rehash automatically on enter and call any number
424 # of builtin and user-defined widgets in different contexts.
425 #
426 # For a broader description, see:
427 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
428 #
429 # The code is imported from the file 'zsh/functions/accept-line' from
430 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
431 # distributed under the same terms as zsh itself.
432
433 # A newly added command will may not be found or will cause false
434 # correction attempts, if you got auto-correction set. By setting the
435 # following style, we force accept-line() to rehash, if it cannot
436 # find the first word on the command line in the $command[] hash.
437 zstyle ':acceptline:*' rehash true
438
439 function Accept-Line() {
440     setopt localoptions noksharrays
441     local -a subs
442     local -xi aldone
443     local sub
444
445     zstyle -a ":acceptline:${alcontext}" actions subs
446
447     (( ${#subs} < 1 )) && return 0
448
449     (( aldone = 0 ))
450     for sub in ${subs} ; do
451         [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
452         zle ${sub}
453
454         (( aldone > 0 )) && break
455     done
456 }
457
458 function Accept-Line-getdefault() {
459     local default_action
460
461     zstyle -s ":acceptline:${alcontext}" default_action default_action
462     case ${default_action} in
463         ((accept-line|))
464             printf ".accept-line"
465             ;;
466         (*)
467             printf ${default_action}
468             ;;
469     esac
470 }
471
472 function accept-line() {
473     setopt localoptions noksharrays
474     local -a cmdline
475     local -x alcontext
476     local buf com fname format msg default_action
477
478     alcontext='default'
479     buf="${BUFFER}"
480     cmdline=(${(z)BUFFER})
481     com="${cmdline[1]}"
482     fname="_${com}"
483
484     zstyle -t ":acceptline:${alcontext}" rehash \
485         && [[ -z ${commands[$com]} ]]           \
486         && rehash
487
488     if    [[ -n ${reswords[(r)$com]} ]] \
489        || [[ -n ${aliases[$com]}     ]] \
490        || [[ -n ${functions[$com]}   ]] \
491        || [[ -n ${builtins[$com]}    ]] \
492        || [[ -n ${commands[$com]}    ]] ; then
493
494         # there is something sensible to execute, just do it.
495         alcontext='normal'
496         zle Accept-Line
497
498         default_action=$(Accept-Line-getdefault)
499         zstyle -T ":acceptline:${alcontext}" call_default \
500             && zle ${default_action}
501         return
502     fi
503
504     if    [[ -o correct              ]] \
505        || [[ -o correctall           ]] \
506        && [[ -n ${functions[$fname]} ]] ; then
507
508         # nothing there to execute but there is a function called
509         # _command_name; a completion widget. Makes no sense to
510         # call it on the commandline, but the correct{,all} options
511         # will ask for it nevertheless, so warn the user.
512         if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
513             # Okay, we warned the user before, he called us again,
514             # so have it his way.
515             alcontext='force'
516             zle Accept-Line
517
518             default_action=$(Accept-Line-getdefault)
519             zstyle -T ":acceptline:${alcontext}" call_default \
520                 && zle ${default_action}
521             return
522         fi
523
524         # prepare warning message for the user, configurable via zstyle.
525         zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
526
527         if [[ -z ${msg} ]] ; then
528             msg="%c will not execute and completion %f exists."
529         fi
530
531         zformat -f msg "${msg}" "c:${com}" "f:${fname}"
532
533         zle -M -- "${msg}"
534         return
535     elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
536         # If we are here, the commandline contains something that is not
537         # executable, which is neither subject to _command_name correction
538         # and is not empty. might be a variable assignment
539         alcontext='misc'
540         zle Accept-Line
541
542         default_action=$(Accept-Line-getdefault)
543         zstyle -T ":acceptline:${alcontext}" call_default \
544             && zle ${default_action}
545         return
546     fi
547
548     # If we got this far, the commandline only contains whitespace, or is empty.
549     alcontext='empty'
550     zle Accept-Line
551
552     default_action=$(Accept-Line-getdefault)
553     zstyle -T ":acceptline:${alcontext}" call_default \
554         && zle ${default_action}
555 }
556
557 zle -N accept-line
558 zle -N Accept-Line
559
560 # }}}
561
562 # power completion - abbreviation expansion {{{
563 # power completion / abbreviation expansion / buffer expansion
564 # see http://zshwiki.org/home/examples/zleiab for details
565 # less risky than the global aliases but powerful as well
566 # just type the abbreviation key and afterwards ',.' to expand it
567 declare -A abk
568 setopt extendedglob
569 setopt interactivecomments
570 abk=(
571 # key  # value                (#d additional doc string)
572 #A# start
573     '...' '../..'
574     '....' '../../..'
575     'BG' '& exit'
576     'C' '| wc -l'
577     'G' '|& grep --color=auto'
578     'H' '| head'
579     'Hl' ' --help |& less -r'      #d (Display help in pager)
580     'L' '| less'
581     'LL' '|& less -r'
582     'M' '| most'
583     'N' '&>/dev/null'              #d (No Output)
584     'R' '| tr A-z N-za-m'          #d (ROT13)
585     'SL' '| sort | less'
586     'S' '| sort -u'
587     'T' '| tail'
588     'V' '|& vim -'
589 #A# end
590     'hide' "echo -en '\033]50;nil2\007'"
591     'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
592     'small' 'echo -en "\033]50;6x10\007"'
593     'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
594     'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
595     'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
596     'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
597     'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
598     'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
599     'da' 'du -sch'
600     'j' 'jobs -l'
601     'u' 'translate -i'
602     'co' "./configure && make && sudo make install"
603     'CH' "./configure --help"
604     'conkeror' 'firefox -chrome chrome://conkeror/content'
605     'dir' 'ls -lSrah'
606     'lad' $'ls -d .*(/)\n# only show dot-directories'
607     'lsa' $'ls -a .*(.)\n# only show dot-files'
608     'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
609     'lsl' $'ls -l *(@[1,10])\n# only symlinks'
610     'lsx' $'ls -l *(*[1,10])\n# only executables'
611     'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
612     'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
613     'lsd' $'ls -d *(/)\n# only show directories'
614     'lse' $'ls -d *(/^F)\n# only show empty directories'
615     'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
616     'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
617     'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
618     'rw-' 'chmod 600'
619     '600' 'chmod u+rw-x,g-rwx,o-rwx'
620     'rwx' 'chmod u+rwx'
621     '700' 'chmod u+rwx,g-rwx,o-rwx'
622     'r--' 'chmod u+r-wx,g-rwx,o-rwx'
623     '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
624     '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
625     'md' 'mkdir -p '
626     'cmplayer' 'mplayer -vo -fs -zoom fbdev'
627     'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
628     'fblinks' 'links2 -driver fb'
629     'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
630     'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
631     'fori' 'for i ({..}) { }'
632     'cx' 'chmod +x'
633     'e'  'print -l'
634     'se' 'setopt interactivecomments'
635     'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
636     'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
637     'fb3' '=mplayer -vo fbdev -fs  -zoom 1>/dev/null -xy 3'
638     'ci' 'centericq'
639     'D'  'export DISPLAY=:0.0'
640     'mp' 'mplayer -vo xv -fs -zoom'
641 )
642
643 globalias() {
644     local MATCH
645     matched_chars='[.-|_a-zA-Z0-9]#'
646     LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
647     LBUFFER+=${abk[$MATCH]:-$MATCH}
648 }
649
650 zle -N globalias
651 bindkey ",." globalias
652 # }}}
653
654 # {{{ autoloading
655 autoload -U zmv    # who needs mmv or rename?
656 autoload history-search-end
657
658 # we don't want to quote/espace URLs on our own...
659 # if autoload -U url-quote-magic ; then
660 #    zle -N self-insert url-quote-magic
661 #    zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
662 # else
663 #    print 'Notice: no url-quote-magic available :('
664 # fi
665 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
666
667 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
668 alias run-help >&/dev/null && unalias run-help
669 autoload run-help # use via 'esc-h'
670
671 # completion system
672 if autoload -U compinit && compinit 2>/dev/null ; then
673     compinit 2>/dev/null || print 'Notice: no compinit available :('
674 else
675     print 'Notice: no compinit available :('
676     function zstyle { }
677     function compdef { }
678 fi
679
680 is4 && autoload -U zed # use ZLE editor to edit a file or function
681
682 is4 && \
683 for mod in complist deltochar mathfunc ; do
684     zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
685 done
686
687 # autoload zsh modules when they are referenced
688 if is4 ; then
689     tmpargs=(
690         a   stat
691         a   zpty
692         ap  zprof
693         ap  mapfile
694     )
695
696     while (( ${#tmpargs} > 0 )) ; do
697         zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
698         shift 2 tmpargs
699     done
700     unset tmpargs
701 fi
702
703 if is4 && autoload -U insert-files && zle -N insert-files ; then
704     #k# Insert files
705     bindkey "^Xf" insert-files # C-x-f
706 fi
707
708 bindkey ' '   magic-space    # also do history expansion on space
709 #k# Trigger menu-complete
710 bindkey '\ei' menu-complete  # menu completion via esc-i
711
712 # press esc-e for editing command line in $EDITOR or $VISUAL
713 if is4 && autoload -U edit-command-line && zle -N edit-command-line ; then
714     #k# Edit the current line in \kbd{\$EDITOR}
715     bindkey '\ee' edit-command-line
716 fi
717
718 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
719     #k# menu selection: pick item but stay in the menu
720     bindkey -M menuselect '\e^M' accept-and-menu-complete
721
722     # use the vi navigation keys (hjkl) besides cursor keys in menu completion
723     #bindkey -M menuselect 'h' vi-backward-char        # left
724     #bindkey -M menuselect 'k' vi-up-line-or-history   # up
725     #bindkey -M menuselect 'l' vi-forward-char         # right
726     #bindkey -M menuselect 'j' vi-down-line-or-history # bottom
727
728     # accept a completion and try to complete again by using menu
729     # completion; very useful with completing directories
730     # by using 'undo' one's got a simple file browser
731     bindkey -M menuselect '^o' accept-and-infer-next-history
732 fi
733
734 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
735 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
736 zle -N _bkdate
737
738 #k# Insert a timestamp on the command line (yyyy-mm-dd)
739 bindkey '^Ed' _bkdate
740
741 # press esc-m for inserting last typed word again (thanks to caphuso!)
742 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
743 zle -N insert-last-typed-word;
744
745 #k# Insert last typed word
746 bindkey "\em" insert-last-typed-word
747
748 # set command prediction from history, see 'man 1 zshcontrib'
749 #  is4 && autoload -U predict-on && \
750 #  zle -N predict-on         && \
751 #  zle -N predict-off        && \
752 #  bindkey "^X^Z" predict-on && \
753 #  bindkey "^Z" predict-off
754
755 #k# Shortcut for \kbd{fg<enter>}
756 bindkey -s '^z' "fg\n"
757
758 # press ctrl-q to quote line:
759 #  mquote () {
760 #        zle beginning-of-line
761 #        zle forward-word
762 #        # RBUFFER="'$RBUFFER'"
763 #        RBUFFER=${(q)RBUFFER}
764 #        zle end-of-line
765 #  }
766 #  zle -N mquote && bindkey '^q' mquote
767
768 # run command line as user root via sudo:
769 sudo-command-line() {
770     [[ -z $BUFFER ]] && zle up-history
771     [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
772 }
773 zle -N sudo-command-line
774
775 #k# Put the current command line into a \kbd{sudo} call
776 bindkey "^Os" sudo-command-line
777
778 ### jump behind the first word on the cmdline.
779 ### useful to add options.
780 function jump_after_first_word() {
781     local words
782     words=(${(z)BUFFER})
783
784     if (( ${#words} <= 1 )) ; then
785         CURSOR=${#BUFFER}
786     else
787         CURSOR=${#${words[1]}}
788     fi
789 }
790 zle -N jump_after_first_word
791
792 bindkey '^x1' jump_after_first_word
793
794 # }}}
795
796 # {{{ set some important options
797 # Please update these tags, if you change the umask settings below.
798 #o# r_umask     002
799 #o# r_umaskstr  rwxrwxr-x
800 #o# umask       022
801 #o# umaskstr    rwxr-xr-x
802 (( EUID != 0 )) && umask 002 || umask 022
803
804 # history:
805 setopt append_history       # append history list to the history file (important for multiple parallel zsh sessions!)
806 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
807 setopt extended_history     # save each command's beginning timestamp and the duration to the history file
808 is4 && setopt histignorealldups # If  a  new  command  line being added to the history
809                             # list duplicates an older one, the older command is removed from the list
810 setopt histignorespace      # remove command lines from the history list when
811                             # the first character on the line is a space
812 #  setopt histallowclobber    # add `|' to output redirections in the history
813 #  setopt NO_clobber          # warning if file exists ('cat /dev/null > ~/.zshrc')
814 setopt auto_cd              # if a command is issued that can't be executed as a normal command,
815                             # and the command is the name of a directory, perform the cd command to that directory
816 setopt extended_glob        # in order to use #, ~ and ^ for filename generation
817                             # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
818                             # -> searches for word not in compressed files
819                             # don't forget to quote '^', '~' and '#'!
820 setopt notify               # report the status of backgrounds jobs immediately
821 setopt hash_list_all        # Whenever a command completion is attempted, make sure \
822                             # the entire command path is hashed first.
823 setopt completeinword       # not just at the end
824 # setopt nocheckjobs          # don't warn me about bg processes when exiting
825 setopt nohup                # and don't kill them, either
826 # setopt printexitvalue       # alert me if something failed
827 # setopt dvorak               # with spelling correction, assume dvorak kb
828 setopt auto_pushd           # make cd push the old directory onto the directory stack.
829 setopt nonomatch            # try to avoid the 'zsh: no matches found...'
830 setopt nobeep               # avoid "beep"ing
831 setopt pushd_ignore_dups    # don't push the same dir twice.
832
833 MAILCHECK=30       # mailchecks
834 REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 seconds
835 watch=(notme root) # watch for everyone but me and root
836
837 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
838 #  WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
839 #  WORDCHARS=.
840 #  WORDCHARS='*?_[]~=&;!#$%^(){}'
841 #  WORDCHARS='${WORDCHARS:s@/@}'
842
843 # only slash should be considered as a word separator:
844 slash-backward-kill-word() {
845     local WORDCHARS="${WORDCHARS:s@/@}"
846     # zle backward-word
847     zle backward-kill-word
848 }
849 zle -N slash-backward-kill-word
850
851 #k# Kill everything in a word up to its last \kbd{/}
852 bindkey '\ev' slash-backward-kill-word
853
854 # }}}
855
856 # {{{ history
857
858 ZSHDIR=$HOME/.zsh
859
860 #v#
861 HISTFILE=$HOME/.zsh_history
862 isgrmlcd && HISTSIZE=500  || HISTSIZE=5000
863 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
864
865 # }}}
866
867 # dirstack handling {{{
868
869 DIRSTACKSIZE=20
870 if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
871     dirstack=( ${(f)"$(< ~/.zdirs)"} )
872     # "cd -" won't work after login by just setting $OLDPWD, so
873     [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
874 fi
875
876 chpwd() {
877     builtin print -l ${(u)dirstack} >! ~/.zdirs
878 }
879
880 # }}}
881
882 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
883 if [[ -n "$BATTERY" ]] ; then
884     if check_com -c acpi ; then
885         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
886         [[ -z "$PERCENT" ]] && PERCENT='acpi not present'
887
888         if [[ "${PERCENT%%%}" -lt 20 ]] ; then
889             PERCENT="warning: ${PERCENT}%"
890         fi
891     fi
892 fi
893 # }}}
894
895 # display version control information on right side of prompt if $VCS is set {{{
896 # based on Mike Hommey's http://web.glandium.org/blog/?p=170
897 __vcs_dir() {
898     local vcs base_dir sub_dir ref
899
900     sub_dir() {
901       local sub_dir
902       sub_dir=$(readlink -f "${PWD}")
903       sub_dir=${sub_dir#$1}
904       echo ${sub_dir#/}
905     }
906
907     git_dir() {
908       base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1
909       base_dir=$(readlink -f "$base_dir/..")
910       sub_dir=$(git-rev-parse --show-prefix)
911       sub_dir=${sub_dir%/}
912       ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null)
913       ref=${ref#refs/heads/}
914       vcs="git"
915     }
916
917     svn_dir() {
918       [[ -d ".svn" ]] || return 1
919       base_dir="."
920       while [[ -d "$base_dir/../.svn" ]]; do base_dir="$base_dir/.."; done
921       base_dir=$(readlink -f "$base_dir")
922       sub_dir=$(sub_dir "${base_dir}")
923       ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
924       vcs="svn"
925     }
926
927     svk_dir() {
928         [[ -f ~/.svk/config ]] || return 1
929         base_dir=$(awk '/: *$/ { sub(/^ */,"",$0); sub(/: *$/,"",$0); if (match("'${PWD}'", $0"(/|$)")) { print $0; d=1; } } /depotpath/ && d == 1 { sub(".*/","",$0); r=$0 } /revision/ && d == 1 { print r ":" $2; exit 1 }' ~/.svk/config) && return 1
930         ref=${base_dir##*
931   }
932         base_dir=${base_dir%%
933   *}
934         sub_dir=$(sub_dir "${base_dir}")
935         vcs="svk"
936     }
937
938     hg_dir() {
939         base_dir="."
940         while [[ ! -d "$base_dir/.hg" ]]; do
941             base_dir="$base_dir/.."
942             [[ $(readlink -f "${base_dir}") = "/" ]] && return 1
943         done
944         base_dir=$(readlink -f "$base_dir")
945         sub_dir=$(sub_dir "${base_dir}")
946         ref=$(< "${base_dir}/.hg/branch")
947         vcs="hg"
948     }
949
950     hg_dir  ||
951     git_dir ||
952     svn_dir ||
953     svk_dir # ||
954   #  base_dir="$PWD"
955   #  echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}"
956     echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}"
957 }
958 # }}}
959
960 # {{{ set prompt
961 if autoload promptinit && promptinit 2>/dev/null ; then
962     promptinit # people should be able to use their favourite prompt
963 else
964     print 'Notice: no promptinit available :('
965 fi
966
967
968 # precmd() => a function which is executed just before each prompt
969 # use 'NOPRECMD=1' to disable the precmd + preexec commands
970
971 # precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l;
972
973 # make sure to use right prompt only when not running a command
974 is41 && setopt transient_rprompt
975
976 is4 && [[ -z $NOPRECMD ]] && precmd () {
977     [[ -n $NOPRECMD ]] && return 0
978     # allow manual overwriting of RPROMPT
979     if [[ -n $RPROMPT ]] ; then
980         [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
981         # return 0
982     fi
983     # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
984     if [[ -z $DONTSETRPROMPT ]] ; then
985         if [[ -n $BATTERY ]] ; then
986             RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
987             # RPROMPT="${PERCENT}${SCREENTITLE}"
988         elif [[ -n $VCS ]] ; then
989             RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}"
990         else
991             RPROMPT="%(?..:()% ${SCREENTITLE}"
992             # RPROMPT="${SCREENTITLE}"
993         fi
994     fi
995     # adjust title of xterm
996     # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
997     case $TERM in
998         (xterm*|rxvt)
999             print -Pn "\e]0;%n@%m: %~\a"
1000             ;;
1001     esac
1002 }
1003
1004 # chpwd () => a function which is executed whenever the directory is changed
1005
1006 # preexec() => a function running before every command
1007 is4 && [[ -z $NOPRECMD ]] && \
1008 preexec () {
1009     [[ -n $NOPRECMD ]] && return 0
1010 # set hostname if not running on host with name 'grml'
1011     if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
1012        NAME="@$HOSTNAME"
1013     fi
1014 # get the name of the program currently running and hostname of local machine
1015 # set screen window title if running in a screen
1016     if [[ "$TERM" == screen* ]] ; then
1017         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # don't use hostname
1018         local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
1019         echo -ne "\ek$CMD\e\\"
1020     fi
1021 # set the screen title to "zsh" when sitting at the command prompt:
1022     if [[ "$TERM" == screen* ]] ; then
1023         SCREENTITLE=$'%{\ekzsh\e\\%}'
1024     else
1025         SCREENTITLE=''
1026     fi
1027 # adjust title of xterm
1028     case $TERM in
1029         (xterm*|rxvt)
1030             print -Pn "\e]0;%n@%m: $1\a"
1031             ;;
1032     esac
1033 }
1034
1035 # set colors
1036 if autoload colors && colors 2>/dev/null ; then
1037     BLUE="%{${fg[blue]}%}"
1038     RED="%{${fg_bold[red]}%}"
1039     GREEN="%{${fg[green]}%}"
1040     CYAN="%{${fg[cyan]}%}"
1041     WHITE="%{${fg[white]}%}"
1042     NO_COLOUR="%{${reset_color}%}"
1043 else
1044     BLUE=$'%{\e[1;34m%}'
1045     RED=$'%{\e[1;31m%}'
1046     GREEN=$'%{\e[1;32m%}'
1047     CYAN=$'%{\e[1;36m%}'
1048     WHITE=$'%{\e[1;37m%}'
1049     NO_COLOUR=$'%{\e[0m%}'
1050 fi
1051
1052 EXITCODE="%(?..%?%1v )"
1053 PS2='`%_> '       # secondary prompt, printed when the shell needs more information to complete a command.
1054 PS3='?# '         # selection prompt used within a select loop.
1055 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1056
1057 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1058 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1059     debian_chroot=$(cat /etc/debian_chroot)
1060 fi
1061
1062 # don't use colors on dumb terminals (like emacs):
1063 if [[ "$TERM" == dumb ]] ; then
1064     PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< %# "
1065 else
1066     # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
1067     # set variable identifying the chroot you work in (used in the prompt below)
1068     if [[ -n $GRMLPROMPT ]] ; then
1069         PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
1070 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
1071     else
1072         if (( EUID != 0 )); then
1073             PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
1074         else
1075             PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string
1076         fi
1077     fi
1078 fi
1079
1080 # if we are inside a grml-chroot set a specific prompt theme
1081 if [[ -n "$GRML_CHROOT" ]] ; then
1082     PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
1083 fi
1084 # }}}
1085
1086 # {{{ 'hash' some often used directories
1087 #d# start
1088 hash -d deb=/var/cache/apt/archives
1089 hash -d doc=/usr/share/doc
1090 hash -d linux=/lib/modules/$(command uname -r)/build/
1091 hash -d log=/var/log
1092 hash -d slog=/var/log/syslog
1093 hash -d src=/usr/src
1094 hash -d templ=/usr/share/doc/grml-templates
1095 hash -d tt=/usr/share/doc/texttools-doc
1096 hash -d www=/var/www
1097 #d# end
1098 # }}}
1099
1100 # {{{ some aliases
1101 if [[ $UID -eq 0 ]] ; then
1102     [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
1103 elif [[ -r $HOME/.screenrc ]] ; then
1104     alias screen="/usr/bin/screen -c $HOME/.screenrc"
1105 else
1106     [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
1107 fi
1108
1109 # do we have GNU ls with color-support?
1110 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
1111     #a1# execute \kbd{@a@}:\quad ls with colors
1112     alias ls='ls -b -CF --color=auto'
1113     #a1# execute \kbd{@a@}:\quad list all files, with colors
1114     alias la='ls -la --color=auto'
1115     #a1# long colored list, without dotfiles (@a@)
1116     alias ll='ls -l --color=auto'
1117     #a1# long colored list, human readable sizes (@a@)
1118     alias lh='ls -hAl --color=auto'
1119     #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
1120     alias l='ls -lF --color=auto'
1121 else
1122     alias ls='ls -b -CF'
1123     alias la='ls -la'
1124     alias ll='ls -l'
1125     alias lh='ls -hAl'
1126     alias l='ls -lF'
1127 fi
1128
1129 alias mdstat='cat /proc/mdstat'
1130 alias ...='cd ../../'
1131
1132 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
1133 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
1134     alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
1135 fi
1136
1137 alias cp='nocorrect cp'         # no spelling correction on cp
1138 alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
1139 alias mv='nocorrect mv'         # no spelling correction on mv
1140 alias rm='nocorrect rm'         # no spelling correction on rm
1141
1142 #a1# Execute \kbd{rmdir}
1143 alias rd='rmdir'
1144 #a1# Execute \kbd{rmdir}
1145 alias md='mkdir'
1146
1147 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
1148 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
1149 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
1150
1151 # make sure it is not assigned yet
1152 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
1153
1154 utf2iso() {
1155     if isutfenv ; then
1156         for ENV in $(env | command grep -i '.utf') ; do
1157             eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
1158         done
1159     fi
1160 }
1161
1162 # make sure it is not assigned yet
1163 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
1164 iso2utf() {
1165     if ! isutfenv ; then
1166         for ENV in $(env | command grep -i '\.iso') ; do
1167             eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
1168         done
1169     fi
1170 }
1171
1172 # set up software synthesizer via speakup
1173 swspeak() {
1174     aumix -w 90 -v 90 -p 90 -m 90
1175     if ! [[ -r /dev/softsynth ]] ; then
1176         flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
1177         return 1
1178     else
1179         setopt singlelinezle
1180         unsetopt prompt_cr
1181         export PS1="%m%# "
1182         nice -n -20 speechd-up
1183         sleep 2
1184         flite -o play -t "Finished setting up software synthesizer"
1185     fi
1186 }
1187
1188 # I like clean prompt, so provide simple way to get that
1189 check_com 0 || alias 0='return 0'
1190
1191 # for really lazy people like mika:
1192 check_com S &>/dev/null || alias S='screen'
1193 check_com s &>/dev/null || alias s='ssh'
1194
1195 # get top 10 shell commands:
1196 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
1197
1198 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
1199 if check_com -c truecrypt ; then
1200     if isutfenv ; then
1201         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
1202     else
1203         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
1204     fi
1205 fi
1206
1207 #f1# Hints for the use of zsh on grml
1208 zsh-help() {
1209     print "$bg[white]$fg[black]
1210 zsh-help - hints for use of zsh on grml
1211 =======================================$reset_color"
1212
1213     print '
1214 Main configuration of zsh happens in /etc/zsh/zshrc (global)
1215 and /etc/skel/.zshrc which is copied to $HOME/.zshrc once.
1216 The files are part of the package grml-etc-core, if you want to
1217 use them on a non-grml-system just get the tar.gz from
1218 http://deb.grml.org/ or get the files from the mercurial
1219 repository:
1220
1221   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/skel/.zshrc
1222   http://hg.grml.org/grml-etc-core/raw-file/tip/etc/zsh/zshrc
1223
1224 If you want to stay in sync with zsh configuration of grml
1225 run '\''ln -sf /etc/skel/.zshrc $HOME/.zshrc'\'' and configure
1226 your own stuff in $HOME/.zshrc.local. System wide configuration
1227 without touching configuration files of grml can take place
1228 in /etc/zsh/zshrc.local.
1229
1230 If you want to use the configuration of user grml also when
1231 running as user root just run '\''zshskel'\'' which will source
1232 the file /etc/skel/.zshrc.
1233
1234 For information regarding zsh start at http://grml.org/zsh/
1235
1236 Take a look at grml'\''s zsh refcard:
1237 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
1238
1239 Check out the main zsh refcard:
1240 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
1241
1242 And of course visit the zsh-lovers:
1243 % man zsh-lovers
1244
1245 You can adjust some options through environment variables when
1246 invoking zsh without having to edit configuration files.
1247 Basically meant for bash users who are not used to the power of
1248 the zsh yet. :)
1249
1250   "NOCOR=1    zsh" => deactivate automatic correction
1251   "NOMENU=1   zsh" => do not use menu completion (note: use strg-d for completion instead!)
1252   "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
1253   "BATTERY=1  zsh" => activate battery status (via acpi) on right side of prompt'
1254
1255     print "
1256 $bg[white]$fg[black]
1257 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
1258 Enjoy your grml system with the zsh!$reset_color"
1259 }
1260
1261 # debian stuff
1262 if [[ -r /etc/debian_version ]] ; then
1263     #a3# Execute \kbd{apt-cache search}
1264     alias acs='apt-cache search'
1265     #a3# Execute \kbd{apt-cache show}
1266     alias acsh='apt-cache show'
1267     #a3# Execute \kbd{apt-cache policy}
1268     alias acp='apt-cache policy'
1269     #a3# Execute \kbd{apt-get dist-upgrade}
1270     salias adg="apt-get dist-upgrade"
1271     #a3# Execute \kbd{apt-get install}
1272     salias agi="apt-get install"
1273     #a3# Execute \kbd{aptitude install}
1274     salias ati="aptitude install"
1275     #a3# Execute \kbd{apt-get upgrade}
1276     salias ag="apt-get upgrade"
1277     #a3# Execute \kbd{apt-get update}
1278     salias au="apt-get update"
1279     #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
1280     salias -a up="aptitude update ; aptitude safe-upgrade"
1281     #a3# Execute \kbd{dpkg-buildpackage}
1282     alias dbp='dpkg-buildpackage'
1283     #a3# Execute \kbd{grep-excuses}
1284     alias ge='grep-excuses'
1285
1286     # debian upgrade
1287     #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
1288     upgrade() {
1289         if [[ -z "$1" ]] ; then
1290             $SUDO apt-get update
1291             $SUDO apt-get -u upgrade
1292         else
1293             ssh $1 $SUDO apt-get update
1294             # ask before the upgrade
1295             local dummy
1296             ssh $1 $SUDO apt-get --no-act upgrade
1297             echo -n 'Process the upgrade?'
1298             read -q dummy
1299             if [[ $dummy == "y" ]] ; then
1300                 ssh $1 $SUDO apt-get -u upgrade --yes
1301             fi
1302         fi
1303     }
1304
1305     isgrmlcd && alias su="sudo -s"          # get a root shell
1306     #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
1307     alias llog="$PAGER /var/log/syslog"     # take a look at the syslog
1308     #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
1309     alias tlog="tail -f /var/log/syslog"    # follow the syslog
1310     #a1# (Re)-source \kbd{/etc/skel/.zshrc}
1311     alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
1312 fi
1313
1314 # sort installed Debian-packages by size
1315 if check_com -c grep-status ; then
1316     #a3# List installed Debian-packages sorted by size
1317     alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd "  \n" | sort -rn'
1318 fi
1319
1320 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
1321 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
1322     if check_com -c wodim ; then
1323         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
1324 See #377109 in the BTS of Debian for more details.
1325
1326 Please use the wodim binary instead' ; return 1"
1327     fi
1328 fi
1329
1330 # get_tw_cli has been renamed into get_3ware
1331 if check_com -c get_3ware ; then
1332     get_tw_cli() {
1333         echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
1334         get_3ware
1335     }
1336 fi
1337
1338 # I hate lacking backward compatibility, so provide an alternative therefore
1339 if ! check_com -c apache2-ssl-certificate ; then
1340
1341     apache2-ssl-certificate() {
1342
1343     print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
1344     print 'You might want to take a look at Debian the package ssl-cert as well.'
1345     print 'To generate a certificate for use with apache2 follow the instructions:'
1346
1347     echo '
1348
1349 export RANDFILE=/dev/random
1350 mkdir /etc/apache2/ssl/
1351 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
1352 chmod 600 /etc/apache2/ssl/apache.pem
1353
1354 Run "grml-tips ssl-certificate" if you need further instructions.
1355 '
1356     }
1357 fi
1358 # }}}
1359
1360 # {{{ Use hard limits, except for a smaller stack and no core dumps
1361 unlimit
1362 is4 && limit stack 8192
1363 isgrmlcd && limit core 0 # important for a live-cd-system
1364 limit -s
1365 # }}}
1366
1367 # {{{ completion system
1368
1369 # called later (via is4 && grmlcomp)
1370 # notice: use 'zstyle' for getting current settings
1371 #         press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
1372 grmlcomp() {
1373     # TODO: This could use some additional information
1374
1375     # allow one error for every three characters typed in approximate completer
1376     zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
1377
1378     # don't complete backup files as executables
1379     zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
1380
1381     # start menu completion only if it could find no unambiguous initial string
1382     zstyle ':completion:*:correct:*'       insert-unambiguous true
1383     zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
1384     zstyle ':completion:*:correct:*'       original true
1385
1386     # activate color-completion
1387     zstyle ':completion:*:default'         list-colors ${(s.:.)LS_COLORS}
1388
1389     # format on completion
1390     zstyle ':completion:*:descriptions'    format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
1391
1392     # complete 'cd -<tab>' with menu
1393     zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
1394
1395     # insert all expansions for expand completer
1396     zstyle ':completion:*:expand:*'        tag-order all-expansions
1397     zstyle ':completion:*:history-words'   list false
1398
1399     # activate menu
1400     zstyle ':completion:*:history-words'   menu yes
1401
1402     # ignore duplicate entries
1403     zstyle ':completion:*:history-words'   remove-all-dups yes
1404     zstyle ':completion:*:history-words'   stop yes
1405
1406     # match uppercase from lowercase
1407     zstyle ':completion:*'                 matcher-list 'm:{a-z}={A-Z}'
1408
1409     # separate matches into groups
1410     zstyle ':completion:*:matches'         group 'yes'
1411     zstyle ':completion:*'                 group-name ''
1412
1413     if [[ -z "$NOMENU" ]] ; then
1414         # if there are more than 5 options allow selecting from a menu
1415         zstyle ':completion:*'               menu select=5
1416     else
1417         # don't use any menus at all
1418         setopt no_auto_menu
1419     fi
1420
1421     zstyle ':completion:*:messages'        format '%d'
1422     zstyle ':completion:*:options'         auto-description '%d'
1423
1424     # describe options in full
1425     zstyle ':completion:*:options'         description 'yes'
1426
1427     # on processes completion complete all user processes
1428     zstyle ':completion:*:processes'       command 'ps -au$USER'
1429
1430     # offer indexes before parameters in subscripts
1431     zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
1432
1433     # provide verbose completion information
1434     zstyle ':completion:*'                 verbose true
1435
1436     # recent (as of Dec 2007) zsh versions are able to provide descriptions
1437     # for commands (read: 1st word in the line) that it will list for the user
1438     # to choose from. The following disables that, because it's not exactly fast.
1439     zstyle ':completion:*:-command-:*:'    verbose false
1440
1441     # set format for warnings
1442     zstyle ':completion:*:warnings'        format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
1443
1444     # define files to ignore for zcompile
1445     zstyle ':completion:*:*:zcompile:*'    ignored-patterns '(*~|*.zwc)'
1446     zstyle ':completion:correct:'          prompt 'correct to: %e'
1447
1448     # Ignore completion functions for commands you don't have:
1449     zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
1450
1451     # complete manual by their section
1452     zstyle ':completion:*:manuals'    separate-sections true
1453     zstyle ':completion:*:manuals.*'  insert-sections   true
1454     zstyle ':completion:*:man:*'      menu yes select
1455
1456     # run rehash on completion so new installed program are found automatically:
1457     _force_rehash() {
1458         (( CURRENT == 1 )) && rehash
1459         return 1
1460     }
1461
1462     ## correction
1463     # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
1464     if [[ -n "$NOCOR" ]] ; then
1465         zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
1466         setopt nocorrect
1467     else
1468         # try to be smart about when to use what completer...
1469         setopt correct
1470         zstyle -e ':completion:*' completer '
1471             if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
1472                 _last_try="$HISTNO$BUFFER$CURSOR"
1473                 reply=(_complete _match _ignored _prefix _files)
1474             else
1475                 if [[ $words[1] == (rm|mv) ]] ; then
1476                     reply=(_complete _files)
1477                 else
1478                     reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
1479                 fi
1480             fi'
1481     fi
1482
1483     # zstyle ':completion:*' completer _complete _correct _approximate
1484     # zstyle ':completion:*' expand prefix suffix
1485
1486     # command for process lists, the local web server details and host completion
1487     zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
1488
1489     # caching
1490     [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
1491                             zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
1492
1493     # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
1494     if is42 ; then
1495         [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
1496         [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
1497     else
1498         _ssh_hosts=()
1499         _etc_hosts=()
1500     fi
1501     hosts=(
1502         $(hostname)
1503         "$_ssh_hosts[@]"
1504         "$_etc_hosts[@]"
1505         grml.org
1506         localhost
1507     )
1508     zstyle ':completion:*:hosts' hosts $hosts
1509     #  zstyle '*' hosts $hosts
1510
1511     # specify your logins:
1512     # my_accounts=(
1513     #  {grml,grml1}@foo.invalid
1514     #  grml-devel@bar.invalid
1515     # )
1516     # other_accounts=(
1517     #  {fred,root}@foo.invalid
1518     #  vera@bar.invalid
1519     # )
1520     # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
1521     # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
1522
1523     # specify specific port/service settings:
1524     #  telnet_users_hosts_ports=(
1525     #    user1@host1:
1526     #    user2@host2:
1527     #    @mail-server:{smtp,pop3}
1528     #    @news-server:nntp
1529     #    @proxy-server:8000
1530     #  )
1531     # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
1532
1533     # use generic completion system for programs not yet defined; (_gnu_generic works
1534     # with commands that provide a --help option with "standard" gnu-like output.)
1535     compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
1536
1537     # see upgrade function in this file
1538     compdef _hosts upgrade
1539 }
1540 # }}}
1541
1542 # {{{ grmlstuff
1543 grmlstuff() {
1544 # people should use 'grml-x'!
1545     startx() {
1546         if [[ -e /etc/X11/xorg.conf ]] ; then
1547             [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
1548         else
1549             echo "Please use the script \"grml-x\" for starting the X Window System
1550 because there does not exist /etc/X11/xorg.conf yet.
1551 If you want to use startx anyway please call \"/usr/bin/startx\"."
1552             return -1
1553         fi
1554     }
1555
1556     xinit() {
1557         if [[ -e /etc/X11/xorg.conf ]] ; then
1558             [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
1559         else
1560             echo "Please use the script \"grml-x\" for starting the X Window System.
1561 because there does not exist /etc/X11/xorg.conf yet.
1562 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
1563             return -1
1564         fi
1565     }
1566
1567     if check_com -c 915resolution ; then
1568         alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
1569     fi
1570
1571     #a1# Output version of running grml
1572     alias grml-version='cat /etc/grml_version'
1573
1574     if check_com -c rebuildfstab ; then
1575         #a1# Rebuild /etc/fstab
1576         alias grml-rebuildfstab='rebuildfstab -v -r -config'
1577     fi
1578
1579     if check_com -c grml-debootstrap ; then
1580         alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
1581     fi
1582 }
1583 # }}}
1584
1585 # {{{ now run the functions
1586 isgrml && checkhome
1587 is4    && isgrml    && grmlstuff
1588 is4    && grmlcomp
1589 # }}}
1590
1591 # {{{ keephack
1592 is4 && xsource "/etc/zsh/keephack"
1593 # }}}
1594
1595 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
1596 # You use it as follows:
1597 # $ NTREF=/reference/file
1598 # $ ls -l *(e:nt:)
1599 # This lists all the files in the current directory newer than the reference file.
1600 # You can also specify the reference file inline; note quotes:
1601 # $ ls -l *(e:'nt ~/.zshenv':)
1602 is4 && nt() {
1603     if [[ -n $1 ]] ; then
1604         local NTREF=${~1}
1605     fi
1606     [[ $REPLY -nt $NTREF ]]
1607 }
1608 # }}}
1609
1610 # shell functions {{{
1611
1612 #f1# Provide csh compatibility
1613 setenv()  { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" }  # csh compatibility
1614
1615 #f1# Reload an autoloadable function
1616 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
1617
1618 #f1# Reload zsh setup
1619 reload() {
1620     if [[ "$#*" -eq 0 ]] ; then
1621         [[ -r ~/.zshrc ]] && . ~/.zshrc
1622     else
1623         local fn
1624         for fn in "$@"; do
1625             unfunction $fn
1626             autoload -U $fn
1627         done
1628     fi
1629 }
1630 compdef _functions reload freload
1631
1632 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
1633 sll() {
1634     [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
1635     for i in "$@" ; do
1636         file=$i
1637         while [[ -h "$file" ]] ; do
1638             ls -l $file
1639             file=$(readlink "$file")
1640         done
1641     done
1642 }
1643
1644 # fast manual access
1645 if check_com qma ; then
1646     #f1# View the zsh manual
1647     manzsh()  { qma zshall "$1" }
1648     compdef _man qma
1649 else
1650     manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
1651     # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
1652     # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
1653     # manzsh()  { man zshall | $MYLESS -p $1 ; }
1654 fi
1655
1656 if check_com -c $PAGER ; then
1657     #f1# View Debian's changelog of a given package
1658     dchange() {
1659         if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
1660             $PAGER /usr/share/doc/${1}/changelog.Debian.gz
1661         elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
1662             $PAGER /usr/share/doc/${1}/changelog.gz
1663         else
1664             if check_com -c aptitude ; then
1665                 echo "No changelog for package $1 found, using aptitude to retrieve it."
1666                 if isgrml ; then
1667                     aptitude -t unstable changelog ${1}
1668                 else
1669                     aptitude changelog ${1}
1670                 fi
1671             else
1672                 echo "No changelog for package $1 found, sorry."
1673                 return 1
1674             fi
1675         fi
1676     }
1677     _dchange() { _files -W /usr/share/doc -/ }
1678     compdef _dchange dchange
1679
1680     #f1# View Debian's NEWS of a given package
1681     dnews() {
1682         if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
1683             $PAGER /usr/share/doc/${1}/NEWS.Debian.gz
1684         else
1685             if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
1686                 $PAGER /usr/share/doc/${1}/NEWS.gz
1687             else
1688                 echo "No NEWS file for package $1 found, sorry."
1689                 return 1
1690             fi
1691         fi
1692     }
1693     _dnews() { _files -W /usr/share/doc -/ }
1694     compdef _dnews dnews
1695
1696     #f1# View upstream's changelog of a given package
1697     uchange() {
1698         if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
1699             $PAGER /usr/share/doc/${1}/changelog.gz
1700         else
1701             echo "No changelog for package $1 found, sorry."
1702             return 1
1703         fi
1704     }
1705     _uchange() { _files -W /usr/share/doc -/ }
1706     compdef _uchange uchange
1707 fi
1708
1709 # zsh profiling
1710 profile() {
1711     ZSH_PROFILE_RC=1 $SHELL "$@"
1712 }
1713
1714 #f1# Edit an alias via zle
1715 edalias() {
1716     [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
1717 }
1718 compdef _aliases edalias
1719
1720 #f1# Edit a function via zle
1721 edfunc() {
1722     [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
1723 }
1724 compdef _functions edfunc
1725
1726 # use it e.g. via 'Restart apache2'
1727 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
1728 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
1729 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
1730 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
1731 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
1732 if [[ -d /etc/init.d ]] ; then
1733     for i in Start Restart Stop Force-Reload Reload ; do
1734         eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
1735     done
1736 fi
1737
1738 #f1# Provides useful information on globbing
1739 H-Glob() {
1740     echo -e "
1741     /      directories
1742     .      plain files
1743     @      symbolic links
1744     =      sockets
1745     p      named pipes (FIFOs)
1746     *      executable plain files (0100)
1747     %      device files (character or block special)
1748     %b     block special files
1749     %c     character special files
1750     r      owner-readable files (0400)
1751     w      owner-writable files (0200)
1752     x      owner-executable files (0100)
1753     A      group-readable files (0040)
1754     I      group-writable files (0020)
1755     E      group-executable files (0010)
1756     R      world-readable files (0004)
1757     W      world-writable files (0002)
1758     X      world-executable files (0001)
1759     s      setuid files (04000)
1760     S      setgid files (02000)
1761     t      files with the sticky bit (01000)
1762
1763   print *(m-1)          # Files modified up to a day ago
1764   print *(a1)           # Files accessed a day ago
1765   print *(@)            # Just symlinks
1766   print *(Lk+50)        # Files bigger than 50 kilobytes
1767   print *(Lk-50)        # Files smaller than 50 kilobytes
1768   print **/*.c          # All *.c files recursively starting in \$PWD
1769   print **/*.c~file.c   # Same as above, but excluding 'file.c'
1770   print (foo|bar).*     # Files starting with 'foo' or 'bar'
1771   print *~*.*           # All Files that do not contain a dot
1772   chmod 644 *(.^x)      # make all plain non-executable files publically readable
1773   print -l *(.c|.h)     # Lists *.c and *.h
1774   print **/*(g:users:)  # Recursively match all files that are owned by group 'users'
1775   echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
1776 }
1777 alias help-zshglob=H-Glob
1778
1779 check_com -c qma && alias ?='qma zshall'
1780
1781 # grep for running process, like: 'any vim'
1782 any() {
1783     if [[ -z "$1" ]] ; then
1784         echo "any - grep for process(es) by keyword" >&2
1785         echo "Usage: any <keyword>" >&2 ; return 1
1786     else
1787         local STRING=$1
1788         local LENGTH=$(expr length $STRING)
1789         local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
1790         local REST=$(echo $(expr substr $STRING 2 $LENGTH))
1791         ps xauwww| grep "[$FIRSCHAR]$REST"
1792     fi
1793 }
1794
1795 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
1796 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
1797 [[ -r /proc/1/maps ]] && \
1798 deswap() {
1799     print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
1800     cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
1801     print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
1802 }
1803
1804 # print hex value of a number
1805 hex() {
1806     [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
1807 }
1808
1809 # calculate (or eval at all ;-)) with perl => p[erl-]eval
1810 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
1811 peval() {
1812     [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
1813     perl -e "print eval($CALC),\"\n\";"
1814 }
1815 functions peval &>/dev/null && alias calc=peval
1816
1817 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
1818 # certain circumstances, so work around it, no matter which environment we have
1819 brltty() {
1820     if [[ -z "$DISPLAY" ]] ; then
1821         consolechars -f /usr/share/consolefonts/default8x16.psf.gz
1822         command brltty "$@"
1823     else
1824         command brltty "$@"
1825     fi
1826 }
1827
1828 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
1829 aoeu() {
1830     echo -n 'Switching to us keyboard layout: '
1831     [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
1832     echo 'Done'
1833 }
1834 asdf() {
1835     echo -n 'Switching to dvorak keyboard layout: '
1836     [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
1837     echo 'Done'
1838 }
1839 # just press 'asdf' key to toggle from neon layout to us keyboard layout
1840 uiae() {
1841     echo -n 'Switching to us keyboard layout: '
1842     setxkbmap us && echo 'Done' || echo 'Failed'
1843 }
1844
1845 # set up an ipv6 tunnel
1846 ipv6-tunnel() {
1847     case $1 in
1848         start)
1849             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1850                 print 'ipv6 tunnel already set up, nothing to be done.'
1851                 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
1852             else
1853                 [[ -n "$PUBLIC_IP" ]] || \
1854                     local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
1855                                       awk '/inet addr:/ {print $2}' | tr -d 'addr:')
1856
1857                 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
1858                 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
1859                 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
1860                 ifconfig sit0 tunnel ::192.88.99.1 up
1861                 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
1862             fi
1863             ;;
1864         status)
1865             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1866                 print 'ipv6 tunnel available' ; return 0
1867             else
1868                 print 'ipv6 tunnel not available' ; return 1
1869             fi
1870             ;;
1871         stop)
1872             if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
1873                 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
1874                 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
1875             else
1876                 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
1877             fi
1878             ;;
1879         *)
1880             print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
1881             ;;
1882     esac
1883 }
1884
1885 # run dhclient for wireless device
1886 iwclient() {
1887     salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
1888 }
1889
1890 # spawn a minimally set up ksh - useful if you want to umount /usr/.
1891 minimal-shell() {
1892     exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
1893 }
1894
1895 # make a backup of a file
1896 bk() {
1897     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
1898 }
1899
1900 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
1901 # bash() {
1902 #  NO_SWITCH="yes" command bash "$@"
1903 # }
1904 # restart () {
1905 #  exec $SHELL $SHELL_ARGS "$@"
1906 # }
1907
1908 # }}}
1909
1910 # log out? set timeout in seconds {{{
1911 # TMOUT=1800
1912 # do not log out in some specific terminals:
1913 #  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then
1914 #    unset TMOUT
1915 #  fi
1916 # }}}
1917
1918 # {{{ make sure our environment is clean regarding colors
1919 for color in BLUE RED GREEN CYAN WHITE ; unset $color
1920 # }}}
1921
1922 # source another config file if present {{{
1923 xsource "/etc/zsh/zshrc.local"
1924 # }}}
1925
1926 # "persistent history" {{{
1927 # just write important commands you always need to ~/.important_commands
1928 if [[ -r ~/.important_commands ]] ; then
1929     fc -R ~/.important_commands
1930 fi
1931 # }}}
1932
1933 ## genrefcard.pl settings {{{
1934 ### example: split functions-search 8,16,24,32
1935 #@# split functions-search 8
1936 ## }}}
1937
1938 # add variable to be able to check whether the file has been read {{{
1939 ZSHRC_GLOBAL_HAS_BEEN_READ=1
1940 # }}}
1941
1942 ## END OF FILE #################################################################
1943 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4