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