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 ################################################################################
7 # This file is sourced only for interactive shells. It
8 # should contain commands to set up aliases, functions,
9 # options, key bindings, etc.
11 # Global Order: zshenv, zprofile, zshrc, zlogin
12 ################################################################################
14 # zsh-refcard-tag documentation: {{{
15 # You may notice strange looking comments in the zshrc (and ~/.zshrc as
16 # well). These are there for a purpose. grml's zsh-refcard can now be
17 # automatically generated from the contents of the actual configuration
18 # files. However, we need a little extra information on which comments
19 # and what lines of code to take into account (and for what purpose).
21 # Here is what they mean:
23 # List of tags (comment types) used:
24 # #a# Next line contains an important alias, that should
25 # be included in the grml-zsh-refcard.
26 # (placement tag: @@INSERT-aliases@@)
27 # #f# Next line contains the beginning of an important function.
28 # (placement tag: @@INSERT-functions@@)
29 # #v# Next line contains an important variable.
30 # (placement tag: @@INSERT-variables@@)
31 # #k# Next line contains an important keybinding.
32 # (placement tag: @@INSERT-keybindings@@)
33 # #d# Hashed directories list generation:
34 # start denotes the start of a list of 'hash -d'
36 # end denotes its end.
37 # (placement tag: @@INSERT-hasheddirs@@)
38 # #A# Abbreviation expansion list generation:
39 # start denotes the beginning of abbreviations.
40 # end denotes their end.
41 # Lines within this section that end in '#d .*' provide
42 # extra documentation to be included in the refcard.
43 # (placement tag: @@INSERT-abbrev@@)
44 # #m# This tag allows you to manually generate refcard entries
45 # for code lines that are hard/impossible to parse.
47 # #m# k ESC-h Call the run-help function
48 # That would add a refcard entry in the keybindings table
49 # for 'ESC-h' with the given comment.
50 # So the syntax is: #m# <section> <argument> <comment>
51 # #o# This tag lets you insert entries to the 'other' hash.
52 # Generally, this should not be used. It is there for
53 # things that cannot be done easily in another way.
54 # (placement tag: @@INSERT-other-foobar@@)
56 # All of these tags (except for m and o) take two arguments, the first
57 # within the tag, the other after the tag:
59 # #<tag><section># <comment>
61 # Where <section> is really just a number, which are defined by the
62 # @secmap array on top of 'genrefcard.pl'. The reason for numbers
63 # instead of names is, that for the reader, the tag should not differ
64 # much from a regular comment. For zsh, it is a regular comment indeed.
65 # The numbers have got the following meanings:
74 # So, the following will add an entry to the 'functions' table in the
75 # 'system' section, with a (hopefully) descriptive comment:
76 # #f1# Edit an alias via zle
79 # It will then show up in the @@INSERT-aliases-system@@ replacement tag
80 # that can be found in 'grml-zsh-refcard.tex.in'.
81 # If the section number is omitted, the 'default' section is assumed.
82 # Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
83 # exactly the same as @@INSERT-aliases-default@@. If you want a list of
84 # *all* aliases, for example, use @@INSERT-aliases-all@@.
88 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
89 if [[ $ZSH_PROFILE_RC -gt 0 ]] ; then
94 # setting some default values {{{
97 NOPRECMD=${NOPRECMD:-0}
99 GRMLSMALL_SPECIFIC=${GRMLSMALL_SPECIFIC:-1}
100 GRML_ALWAYS_LOAD_ALL=${GRML_ALWAYS_LOAD_ALL:-0}
103 # {{{ check for version/system
104 # check for versions (compatibility reasons)
106 [[ $ZSH_VERSION == <4->* ]] && return 0
111 [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0
116 [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0
121 [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
126 [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0
130 #f1# Checks whether or not you're running grml
132 [[ -f /etc/grml_version ]] && return 0
136 #f1# Checks whether or not you're running a grml cd
138 [[ -f /etc/grml_cd ]] && return 0
143 #f1# Checks whether or not you're running grml-small
145 [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
148 isgrmlsmall() { return 1 }
151 #f1# are we running within an utf environment?
153 case "$LANG $CHARSET $LANGUAGE" in
160 # check for user, if not running as root set $SUDO to sudo
161 (( EUID != 0 )) && SUDO='sudo' || SUDO=''
163 # change directory to home on first invocation of zsh
164 # important for rungetty -> autologin
165 # Thanks go to Bart Schaefer!
166 isgrml && checkhome() {
167 if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
168 export ALREADY_DID_CD_HOME=$HOME
173 # check for zsh v3.1.7+
175 if ! [[ ${ZSH_VERSION} == 3.1.<7->* \
176 || ${ZSH_VERSION} == 3.<2->.<->* \
177 || ${ZSH_VERSION} == <4->.<->* ]] ; then
180 printf '-!- In this configuration we try to make use of features, that only\n'
181 printf '-!- require version 3.1.7 of the shell; That way this setup can be\n'
182 printf '-!- used with a wide range of zsh versions, while using fairly\n'
183 printf '-!- advanced features in all supported versions.\n'
185 printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION"
187 printf '-!- While this *may* work, it might as well fail.\n'
188 printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n'
190 printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n'
191 printf '-!- If it does today, you'\''ve been lucky.\n'
193 printf '-!- Ye been warned!\n'
196 function zstyle() { : }
201 # utility functions {{{
202 # this function checks if a command exists and returns either true
203 # or false. This avoids using 'which' and 'whence', which will
204 # avoid problems with aliases for which on certain weird systems. :-)
208 if [[ ${1} == '-c' ]] ; then
215 if (( ${#argv} != 1 )) ; then
216 printf 'usage: check_com [-c] <command>\n' >&2
220 if (( comonly > 0 )) ; then
221 [[ -n ${commands[$1]} ]] && return 0
225 if [[ -n ${commands[$1]} ]] \
226 || [[ -n ${functions[$1]} ]] \
227 || [[ -n ${aliases[$1]} ]] \
228 || [[ -n ${reswords[(r)$1]} ]] ; then
236 # creates an alias and precedes the command with
237 # sudo if $EUID is not zero.
239 local only=0 ; local multi=0
240 while [[ ${1} == -* ]] ; do
244 (--) shift ; break ;;
246 printf 'usage: salias [-h|-o|-a] <alias-expression>\n'
247 printf ' -h shows this help text.\n'
248 printf ' -a replace '\'' ; '\'' sequences with '\'' ; sudo '\''.\n'
249 printf ' be careful using this option.\n'
250 printf ' -o only sets an alias if a preceding sudo would be needed.\n'
253 (*) printf "unkown option: '%s'\n" "${1}" ; return 1 ;;
258 if (( ${#argv} > 1 )) ; then
259 printf 'Too many arguments %s\n' "${#argv}"
263 key="${1%%\=*}" ; val="${1#*\=}"
264 if (( EUID == 0 )) && (( only == 0 )); then
265 alias -- "${key}=${val}"
266 elif (( EUID > 0 )) ; then
267 (( multi > 0 )) && val="${val// ; / ; sudo }"
268 alias -- "${key}=sudo ${val}"
274 # a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells
276 # Where foo is the *name* of the parameter you want printed.
277 # Note that foo is no typo; $foo would be wrong here!
284 if [[ -z ${parameter} ]] ; then
285 printf 'usage: uprint <parameter>\n'
289 for w in ${(P)parameter} ; do
290 [[ -z ${(M)u:#${w}} ]] && u=( ${u} ${w} )
293 builtin print -l ${u}
297 # Check if we can read given files and source those we can.
299 if (( ${#argv} < 1 )) ; then
300 printf 'usage: xsource FILE(s)...\n' >&2
304 while (( ${#argv} > 0 )) ; do
305 [[ -r ${1} ]] && source ${1}
311 # Check if we can read a given file and 'cat(1)' it.
313 if (( ${#argv} != 1 )) ; then
314 printf 'usage: xcat FILE\n' >&2
318 [[ -r ${1} ]] && cat ${1}
322 # Remove these functions again, they are of use only in these
323 # setup files. This should be called at the end of .zshrc.
326 funcs=(salias xcat xsource xunfunction zrcautoload)
328 for func in $funcs ; do
329 [[ -n ${functions[$func]} ]] \
335 # autoload wrapper - use this one instead of autoload directly
336 function zrcautoload() {
337 setopt local_options extended_glob
343 for fdir in ${fpath} ; do
344 [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 ))
347 (( ffound == 0 )) && return 1
348 if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then
349 autoload -U ${ffile} || return 1
351 autoload ${ffile} || return 1
358 # Load is-at-least() for more precise version checks {{{
360 # Note that this test will *always* fail, if the is-at-least
361 # function could not be marked for autoloading.
362 zrcautoload is-at-least || is-at-least() { return 1 }
367 if [[ -z "$LANG" ]] ; then
368 xsource "/etc/default/locale"
371 export LANG=${LANG:-en_US.iso885915}
372 for var in LC_ALL LC_MESSAGES ; do
373 [[ -n ${(P)var} ]] && export $var
376 xsource "/etc/sysconfig/keyboard"
378 TZ=$(xcat /etc/timezone)
381 # check for potentially old files in 'completion.d' {{{
383 xof=(/etc/zsh/completion.d/*~/etc/zsh/completion.d/_*(N))
384 if (( ${#xof} > 0 )) ; then
385 printf '\n -!- INFORMATION\n\n'
386 printf ' -!- %s file(s) not starting with an underscore (_) found in\n' ${#xof}
387 printf ' -!- /etc/zsh/completion.d/.\n\n'
388 printf ' -!- While this has been the case in old versions of grml-etc-core,\n'
389 printf ' -!- recent versions of the grml-zsh-setup have all these files rewritten\n'
390 printf ' -!- and renamed. Furthermore, the grml-zsh-setup will *only* add files\n'
391 printf ' -!- named _* to that directory.\n\n'
392 printf ' -!- If you added functions to completion.d yourself, please consider\n'
393 printf ' -!- moving them to /etc/zsh/functions.d/. Files in that directory, not\n'
394 printf ' -!- starting with an underscore are marked for automatic loading\n'
395 printf ' -!- by default (so that is quite convenient).\n\n'
396 printf ' -!- If there are files *not* starting with an underscore from an older\n'
397 printf ' -!- grml-etc-core in completion.d, you may safely remove them.\n\n'
398 printf ' -!- Delete the files for example via running:\n\n'
399 printf " rm ${xof}\n\n"
400 printf ' -!- Note, that this message will *not* go away, unless you yourself\n'
401 printf ' -!- resolve the situation manually.\n\n'
402 BROKEN_COMPLETION_DIR=1
407 # {{{ set some variables
408 if check_com -c vim ; then
410 export EDITOR=${EDITOR:-vim}
412 export EDITOR=${EDITOR:-vi}
416 export PAGER=${PAGER:-less}
419 export MAIL=${MAIL:-/var/mail/$USER}
421 # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
422 export SHELL='/bin/zsh'
424 # color setup for ls:
425 check_com -c dircolors && eval $(dircolors -b)
427 # set width of man pages to 80 for more convenient reading
428 # export MANWIDTH=${MANWIDTH:-80}
430 # Search path for the cd command
433 # completion functions go to /etc/zsh/completion.d
434 # function files may be put into /etc/zsh/functions.d, from where they
435 # will be automatically autoloaded.
436 if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
437 print 'Warning: not setting completion directories because broken files have been found.' >&2
439 [[ -d /etc/zsh/completion.d ]] && fpath=( $fpath /etc/zsh/completion.d )
440 if [[ -d /etc/zsh/functions.d ]] ; then
441 fpath+=( /etc/zsh/functions.d )
442 for func in /etc/zsh/functions.d/[^_]*[^~](N.) ; do
443 zrcautoload -U ${func:t}
448 # automatically remove duplicates from these arrays
449 typeset -U path cdpath fpath manpath
453 if [[ "$TERM" != emacs ]] ; then
454 [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
455 [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
456 [[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
457 [[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
458 [[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
459 [[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
460 [[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
461 [[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
462 [[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
463 [[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
464 [[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
465 [[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
467 [[ "$terminfo[kcuu1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
468 [[ "$terminfo[kcud1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
469 [[ "$terminfo[kcuf1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
470 [[ "$terminfo[kcub1]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
471 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
472 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
473 [[ "$terminfo[khome]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
474 [[ "$terminfo[kend]" == $'\eO'* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
477 ## keybindings (run 'bindkeys' for details, more details via man zshzle)
478 # use emacs style per default:
483 #if [[ "$TERM" == screen ]] ; then
484 bindkey '\e[1~' beginning-of-line # home
485 bindkey '\e[4~' end-of-line # end
486 bindkey '\e[A' up-line-or-search # cursor up
487 bindkey '\e[B' down-line-or-search # <ESC>-
489 bindkey '^xp' history-beginning-search-backward
490 bindkey '^xP' history-beginning-search-forward
491 # bindkey -s '^L' "|less\n" # ctrl-L pipes to less
492 # bindkey -s '^B' " &\n" # ctrl-B runs it in the background
493 # if terminal type is set to 'rxvt':
494 bindkey '\e[7~' beginning-of-line # home
495 bindkey '\e[8~' end-of-line # end
498 # insert unicode character
499 # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an §
500 # See for example http://unicode.org/charts/ for unicode characters code
501 zrcautoload insert-unicode-char
502 zle -N insert-unicode-char
503 #k# Insert Unicode character
504 bindkey '^Xi' insert-unicode-char
506 # just type 'cd ...' to get 'cd ../..'
507 # rationalise-dot() {
508 # if [[ $LBUFFER == *.. ]] ; then
514 # zle -N rationalise-dot
515 # bindkey . rationalise-dot
517 # bindkey '\eq' push-line-or-edit
519 ## toggle the ,. abbreviation feature on/off
520 # NOABBREVIATION: default abbreviation-state
521 # 0 - enabled (default)
523 NOABBREVIATION=${NOABBREVIATION:-0}
525 grml_toggle_abbrev() {
526 if (( ${NOABBREVIATION} > 0 )) ; then
533 zle -N grml_toggle_abbrev
534 bindkey '^xA' grml_toggle_abbrev
538 # a generic accept-line wrapper {{{
540 # This widget can prevent unwanted autocorrections from command-name
541 # to _command-name, rehash automatically on enter and call any number
542 # of builtin and user-defined widgets in different contexts.
544 # For a broader description, see:
545 # <http://bewatermyfriend.org/posts/2007/12-26.11-50-38-tooltime.html>
547 # The code is imported from the file 'zsh/functions/accept-line' from
548 # <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>, which
549 # distributed under the same terms as zsh itself.
551 # A newly added command will may not be found or will cause false
552 # correction attempts, if you got auto-correction set. By setting the
553 # following style, we force accept-line() to rehash, if it cannot
554 # find the first word on the command line in the $command[] hash.
555 zstyle ':acceptline:*' rehash true
557 function Accept-Line() {
558 setopt localoptions noksharrays
563 zstyle -a ":acceptline:${alcontext}" actions subs
565 (( ${#subs} < 1 )) && return 0
568 for sub in ${subs} ; do
569 [[ ${sub} == 'accept-line' ]] && sub='.accept-line'
572 (( aldone > 0 )) && break
576 function Accept-Line-getdefault() {
579 zstyle -s ":acceptline:${alcontext}" default_action default_action
580 case ${default_action} in
582 printf ".accept-line"
585 printf ${default_action}
590 function accept-line() {
591 setopt localoptions noksharrays
594 local buf com fname format msg default_action
598 cmdline=(${(z)BUFFER})
602 zstyle -t ":acceptline:${alcontext}" rehash \
603 && [[ -z ${commands[$com]} ]] \
606 if [[ -n ${reswords[(r)$com]} ]] \
607 || [[ -n ${aliases[$com]} ]] \
608 || [[ -n ${functions[$com]} ]] \
609 || [[ -n ${builtins[$com]} ]] \
610 || [[ -n ${commands[$com]} ]] ; then
612 # there is something sensible to execute, just do it.
616 default_action=$(Accept-Line-getdefault)
617 zstyle -T ":acceptline:${alcontext}" call_default \
618 && zle ${default_action}
622 if [[ -o correct ]] \
623 || [[ -o correctall ]] \
624 && [[ -n ${functions[$fname]} ]] ; then
626 # nothing there to execute but there is a function called
627 # _command_name; a completion widget. Makes no sense to
628 # call it on the commandline, but the correct{,all} options
629 # will ask for it nevertheless, so warn the user.
630 if [[ ${LASTWIDGET} == 'accept-line' ]] ; then
631 # Okay, we warned the user before, he called us again,
632 # so have it his way.
636 default_action=$(Accept-Line-getdefault)
637 zstyle -T ":acceptline:${alcontext}" call_default \
638 && zle ${default_action}
642 # prepare warning message for the user, configurable via zstyle.
643 zstyle -s ":acceptline:${alcontext}" compwarnfmt msg
645 if [[ -z ${msg} ]] ; then
646 msg="%c will not execute and completion %f exists."
649 zformat -f msg "${msg}" "c:${com}" "f:${fname}"
653 elif [[ -n ${buf//[$' \t\n']##/} ]] ; then
654 # If we are here, the commandline contains something that is not
655 # executable, which is neither subject to _command_name correction
656 # and is not empty. might be a variable assignment
660 default_action=$(Accept-Line-getdefault)
661 zstyle -T ":acceptline:${alcontext}" call_default \
662 && zle ${default_action}
666 # If we got this far, the commandline only contains whitespace, or is empty.
670 default_action=$(Accept-Line-getdefault)
671 zstyle -T ":acceptline:${alcontext}" call_default \
672 && zle ${default_action}
680 # power completion - abbreviation expansion {{{
681 # power completion / abbreviation expansion / buffer expansion
682 # see http://zshwiki.org/home/examples/zleiab for details
683 # less risky than the global aliases but powerful as well
684 # just type the abbreviation key and afterwards ',.' to expand it
687 setopt interactivecomments
689 # key # value (#d additional doc string)
695 'G' '|& grep --color=auto'
697 'Hl' ' --help |& less -r' #d (Display help in pager)
701 'N' '&>/dev/null' #d (No Output)
702 'R' '| tr A-z N-za-m' #d (ROT13)
708 'hide' "echo -en '\033]50;nil2\007'"
709 'tiny' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
710 'small' 'echo -en "\033]50;6x10\007"'
711 'medium' 'echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
712 'default' 'echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
713 'large' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
714 'huge' 'echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
715 'smartfont' 'echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
716 'semifont' 'echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
720 'co' "./configure && make && sudo make install"
721 'CH' "./configure --help"
722 'conkeror' 'firefox -chrome chrome://conkeror/content'
724 'lad' $'ls -d .*(/)\n# only show dot-directories'
725 'lsa' $'ls -a .*(.)\n# only show dot-files'
726 'lss' $'ls -l *(s,S,t)\n# only files with setgid/setuid/sticky flag'
727 'lsl' $'ls -l *(@[1,10])\n# only symlinks'
728 'lsx' $'ls -l *(*[1,10])\n# only executables'
729 'lsw' $'ls -ld *(R,W,X.^ND/)\n# world-{readable,writable,executable} files'
730 'lsbig' $'ls -flh *(.OL[1,10])\n# display the biggest files'
731 'lsd' $'ls -d *(/)\n# only show directories'
732 'lse' $'ls -d *(/^F)\n# only show empty directories'
733 'lsnew' $'ls -rl *(D.om[1,10])\n# display the newest files'
734 'lsold' $'ls -rtlh *(D.om[-11,-1])\n # display the oldest files'
735 'lssmall' $'ls -Srl *(.oL[1,10])\n# display the smallest files'
737 '600' 'chmod u+rw-x,g-rwx,o-rwx'
739 '700' 'chmod u+rwx,g-rwx,o-rwx'
740 'r--' 'chmod u+r-wx,g-rwx,o-rwx'
741 '644' $'chmod u+rw-x,g+r-wx,o+r-wx\n # 4=r,2=w,1=x'
742 '755' 'chmod u+rwx,g+r-w+x,o+r-w+x'
744 'cmplayer' 'mplayer -vo -fs -zoom fbdev'
745 'fbmplayer' 'mplayer -vo -fs -zoom fbdev'
746 'fblinks' 'links2 -driver fb'
747 'insecssh' 'ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
748 'insecscp' 'scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
749 'fori' 'for i ({..}) { }'
752 'se' 'setopt interactivecomments'
753 'va' 'valac --vapidir=../vapi/ --pkg=gtk+-2.0 gtktest.vala'
754 'fb2' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 2'
755 'fb3' '=mplayer -vo fbdev -fs -zoom 1>/dev/null -xy 3'
757 'D' 'export DISPLAY=:0.0'
758 'mp' 'mplayer -vo xv -fs -zoom'
764 if (( NOABBREVIATION > 0 )) ; then
765 LBUFFER="${LBUFFER},."
769 matched_chars='[.-|_a-zA-Z0-9]#'
770 LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#}
771 LBUFFER+=${abk[$MATCH]:-$MATCH}
775 bindkey ",." globalias
779 zrcautoload zmv # who needs mmv or rename?
780 zrcautoload history-search-end
782 # we don't want to quote/espace URLs on our own...
783 # if autoload -U url-quote-magic ; then
784 # zle -N self-insert url-quote-magic
785 # zstyle ':url-quote-magic:*' url-metas '*?[]^()~#{}='
787 # print 'Notice: no url-quote-magic available :('
789 alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
791 #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line
792 alias run-help >&/dev/null && unalias run-help
793 zrcautoload run-help # use via 'esc-h'
796 if zrcautoload compinit && compinit 2>/dev/null ; then
797 compinit 2>/dev/null || print 'Notice: no compinit available :('
799 print 'Notice: no compinit available :('
804 is4 && zrcautoload zed # use ZLE editor to edit a file or function
807 for mod in complist deltochar mathfunc ; do
808 zmodload -i zsh/${mod} 2>/dev/null || print "Notice: no ${mod} available :("
811 # autoload zsh modules when they are referenced
819 while (( ${#tmpargs} > 0 )) ; do
820 zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
826 if is4 && zrcautoload insert-files && zle -N insert-files ; then
828 bindkey "^Xf" insert-files # C-x-f
831 bindkey ' ' magic-space # also do history expansion on space
832 #k# Trigger menu-complete
833 bindkey '\ei' menu-complete # menu completion via esc-i
835 # press esc-e for editing command line in $EDITOR or $VISUAL
836 if is4 && zrcautoload edit-command-line && zle -N edit-command-line ; then
837 #k# Edit the current line in \kbd{\$EDITOR}
838 bindkey '\ee' edit-command-line
841 if is4 && [[ -n ${(k)modules[zsh/complist]} ]] ; then
842 #k# menu selection: pick item but stay in the menu
843 bindkey -M menuselect '\e^M' accept-and-menu-complete
845 # use the vi navigation keys (hjkl) besides cursor keys in menu completion
846 #bindkey -M menuselect 'h' vi-backward-char # left
847 #bindkey -M menuselect 'k' vi-up-line-or-history # up
848 #bindkey -M menuselect 'l' vi-forward-char # right
849 #bindkey -M menuselect 'j' vi-down-line-or-history # bottom
851 # accept a completion and try to complete again by using menu
852 # completion; very useful with completing directories
853 # by using 'undo' one's got a simple file browser
854 bindkey -M menuselect '^o' accept-and-infer-next-history
857 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
858 _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
861 #k# Insert a timestamp on the command line (yyyy-mm-dd)
862 bindkey '^Ed' _bkdate
864 # press esc-m for inserting last typed word again (thanks to caphuso!)
865 insert-last-typed-word() { zle insert-last-word -- 0 -1 };
866 zle -N insert-last-typed-word;
868 #k# Insert last typed word
869 bindkey "\em" insert-last-typed-word
871 # set command prediction from history, see 'man 1 zshcontrib'
872 # is4 && zrcautoload predict-on && \
873 # zle -N predict-on && \
874 # zle -N predict-off && \
875 # bindkey "^X^Z" predict-on && \
876 # bindkey "^Z" predict-off
878 #k# Shortcut for \kbd{fg<enter>}
879 bindkey -s '^z' "fg\n"
881 # press ctrl-q to quote line:
883 # zle beginning-of-line
885 # # RBUFFER="'$RBUFFER'"
886 # RBUFFER=${(q)RBUFFER}
889 # zle -N mquote && bindkey '^q' mquote
891 # run command line as user root via sudo:
892 sudo-command-line() {
893 [[ -z $BUFFER ]] && zle up-history
894 [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
896 zle -N sudo-command-line
898 #k# Put the current command line into a \kbd{sudo} call
899 bindkey "^Os" sudo-command-line
901 ### jump behind the first word on the cmdline.
902 ### useful to add options.
903 function jump_after_first_word() {
907 if (( ${#words} <= 1 )) ; then
910 CURSOR=${#${words[1]}}
913 zle -N jump_after_first_word
915 bindkey '^x1' jump_after_first_word
919 # {{{ set some important options
920 # Please update these tags, if you change the umask settings below.
922 #o# r_umaskstr rwxrwxr-x
924 #o# umaskstr rwxr-xr-x
925 (( EUID != 0 )) && umask 002 || umask 022
928 setopt append_history # append history list to the history file (important for multiple parallel zsh sessions!)
929 is4 && setopt SHARE_HISTORY # import new commands from the history file also in other zsh-session
930 setopt extended_history # save each command's beginning timestamp and the duration to the history file
931 is4 && setopt histignorealldups # If a new command line being added to the history
932 # list duplicates an older one, the older command is removed from the list
933 setopt histignorespace # remove command lines from the history list when
934 # the first character on the line is a space
935 # setopt histallowclobber # add `|' to output redirections in the history
936 # setopt NO_clobber # warning if file exists ('cat /dev/null > ~/.zshrc')
937 setopt auto_cd # if a command is issued that can't be executed as a normal command,
938 # and the command is the name of a directory, perform the cd command to that directory
939 setopt extended_glob # in order to use #, ~ and ^ for filename generation
940 # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) ->
941 # -> searches for word not in compressed files
942 # don't forget to quote '^', '~' and '#'!
943 setopt longlistjobs # display PID when suspending processes as well
944 setopt notify # report the status of backgrounds jobs immediately
945 setopt hash_list_all # Whenever a command completion is attempted, make sure \
946 # the entire command path is hashed first.
947 setopt completeinword # not just at the end
948 # setopt nocheckjobs # don't warn me about bg processes when exiting
949 setopt nohup # and don't kill them, either
950 # setopt printexitvalue # alert me if something failed
951 # setopt dvorak # with spelling correction, assume dvorak kb
952 setopt auto_pushd # make cd push the old directory onto the directory stack.
953 setopt nonomatch # try to avoid the 'zsh: no matches found...'
954 setopt nobeep # avoid "beep"ing
955 setopt pushd_ignore_dups # don't push the same dir twice.
957 MAILCHECK=30 # mailchecks
958 REPORTTIME=5 # report about cpu-/system-/user-time of command if running longer than 5 seconds
959 watch=(notme root) # watch for everyone but me and root
961 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
962 # WORDCHARS='*?_-.[]~=/&;!#$%^(){}<>' # the default
964 # WORDCHARS='*?_[]~=&;!#$%^(){}'
965 # WORDCHARS='${WORDCHARS:s@/@}'
967 # only slash should be considered as a word separator:
968 slash-backward-kill-word() {
969 local WORDCHARS="${WORDCHARS:s@/@}"
971 zle backward-kill-word
973 zle -N slash-backward-kill-word
975 #k# Kill everything in a word up to its last \kbd{/}
976 bindkey '\ev' slash-backward-kill-word
985 HISTFILE=$HOME/.zsh_history
986 isgrmlcd && HISTSIZE=500 || HISTSIZE=5000
987 isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history
991 # dirstack handling {{{
993 DIRSTACKSIZE=${DIRSTACKSIZE:-20}
994 DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs}
996 if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
997 dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
998 # "cd -" won't work after login by just setting $OLDPWD, so
999 [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
1004 builtin print -l ${(u)dirstack} >! ${DIRSTACKFILE}
1006 uprint dirstack >! ${DIRSTACKFILE}
1012 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
1013 if [[ $BATTERY -gt 0 ]] ; then
1014 if ! check_com -c acpi ; then
1020 if [[ $BATTERY -gt 0 ]] ; then
1021 PERCENT="${${"$(acpi 2>/dev/null)"}/(#b)[[:space:]]##Battery <->: [^0-9]##, (<->)%*/${match[1]}}"
1022 if [[ -z "$PERCENT" ]] ; then
1023 PERCENT='acpi not present'
1025 if [[ "$PERCENT" -lt 20 ]] ; then
1026 PERCENT="warning: ${PERCENT}%%"
1028 PERCENT="${PERCENT}%%"
1035 # set colors for use in prompts {{{
1036 if zrcautoload colors && colors 2>/dev/null ; then
1037 BLUE="%{${fg[blue]}%}"
1038 RED="%{${fg_bold[red]}%}"
1039 GREEN="%{${fg[green]}%}"
1040 CYAN="%{${fg[cyan]}%}"
1041 MAGENTA="%{${fg[magenta]}%}"
1042 YELLOW="%{${fg[yellow]}%}"
1043 WHITE="%{${fg[white]}%}"
1044 NO_COLOUR="%{${reset_color}%}"
1046 BLUE=$'%{\e[1;34m%}'
1048 GREEN=$'%{\e[1;32m%}'
1049 CYAN=$'%{\e[1;36m%}'
1050 WHITE=$'%{\e[1;37m%}'
1051 MAGENTA=$'%{\e[1;35m%}'
1052 YELLOW=$'%{\e[1;33m%}'
1053 NO_COLOUR=$'%{\e[0m%}'
1058 # gather version control information for inclusion in a prompt {{{
1061 # Be quiet about version problems in grml's zshrc as the user cannot disable
1062 # loading vcs_info() as it is *in* the zshrc - as you can see. :-)
1063 # Just unset most probable variables and disable vcs_info altogether.
1065 for i in {0..9} ; do
1066 unset VCS_INFO_message_${i}_
1068 zstyle ':vcs_info:*' enable false
1071 # The following code is imported from the file 'zsh/functions/vcs_info'
1072 # from <http://ft.bewatermyfriend.org/comp/zsh/zsh-dotfiles.tar.bz2>,
1073 # which distributed under the same terms as zsh itself.
1075 # we will only be using one variable, so let the code know now.
1076 zstyle ':vcs_info:*' max-exports 1
1078 # vcs_info() documentation:
1082 # This functionality requires zsh version >= 4.1.*.
1087 # To load vcs_info(), copy this file to your $fpath[] and do:
1088 # % autoload -Uz vcs_info && vcs_info
1090 # To work, vcs_info() needs 'setopt prompt_subst' in your setup.
1095 # To get vcs_info() working quickly (including colors), you can do the
1096 # following (assuming, you loaded vcs_info() properly - see above):
1098 # % RED=$'%{\e[31m%}'
1099 # % GR=$'%{\e[32m%}'
1100 # % MA=$'%{\e[35m%}'
1101 # % YE=$'%{\e[33m%}'
1104 # % zstyle ':vcs_info:*' actionformats \
1105 # "${MA}(${NC}%s${MA})${YE}-${MA}[${GR}%b${YE}|${RED}%a${MA}]${NC} "
1107 # % zstyle ':vcs_info:*' formats \
1108 # "${MA}(${NC}%s${MA})${Y}-${MA}[${GR}%b${MA}]${NC}%} "
1110 # % zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YE}%r"
1112 # % precmd () { vcs_info }
1113 # % PS1='${MA}[${GR}%n${MA}] ${MA}(${RED}%!${MA}) ${YE}%3~ ${VCS_INFO_message_0_}${NC}%# '
1115 # Obviously, the las two lines are there for demonstration: You need to
1116 # call vcs_info() from your precmd() function (see 'SPECIAL FUNCTIONS' in
1117 # 'man zshmisc'). Once that is done you need a *single* quoted
1118 # '${VCS_INFO_message_0_}' in your prompt.
1120 # Now call the 'vcs_info_printsys' utility from the command line:
1122 # % vcs_info_printsys
1123 # # list of supported version control backends:
1124 # # disabled systems are prefixed by a hash sign (#)
1135 # # flavours (cannot be used in the disable style; they
1136 # # are disabled with their master [git-svn -> git]):
1140 # Ten version control backends as you can see. You may not want all
1141 # of these. Because there is no point in running the code to detect
1142 # systems you do not use. ever. So, there is a way to disable some
1143 # backends altogether:
1145 # % zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla
1147 # If you rerun 'vcs_info_printsys' now, you will see the backends listed
1148 # in the 'disable' style marked as diabled by a hash sign. That means the
1149 # detection of these systems is skipped *completely*. No wasted time there.
1151 # For more control, read the reference below.
1156 # The vcs_info() feature can be configured via zstyle.
1158 # First, the context in which we are working:
1159 # :vcs_info:<vcs-string>:<user-context>
1161 # ...where <vcs-string> is one of:
1162 # - git, git-svn, git-p4, hg, darcs, bzr, cdv, mtn, svn, cvs, svk or tla.
1164 # ...and <user-context> is a freely configurable string, assignable by the
1165 # user as the first argument to vcs_info() (see its description below).
1167 # There is are three special values for <vcs-string>: The first is named
1168 # 'init', that is in effect as long as there was no decision what vcs
1169 # backend to use. The second is 'preinit; it is used *before* vcs_info()
1170 # is run, when initializing the data exporting variables. The third
1171 # special value is 'formats' and is used by the 'vcs_info_lastmsg' for
1172 # looking up its styles.
1174 # There are two pre-defined values for <user-context>:
1175 # default - the one used if none is specified
1176 # command - used by vcs_info_lastmsg to lookup its styles.
1178 # You may *not* use 'print_systems_' as a user-context string, because it
1179 # is used internally.
1181 # You can of course use ':vcs_info:*' to match all VCSs in all
1182 # user-contexts at once.
1184 # Another special context is 'formats', which is used by the
1185 # vcs_info_lastmsg() utility function (see below).
1188 # This is a description of all styles, that are looked up:
1189 # formats - A list of formats, used when actionformats is not
1190 # used (which is most of the time).
1191 # actionformats - A list of formats, used if a there is a special
1192 # action going on in your current repository;
1193 # (like an interactive rebase or a merge conflict)
1194 # branchformat - Some backends replace %b in the formats and
1195 # actionformats styles above, not only by a branch
1196 # name but also by a revision number. This style
1197 # let's you modify how that string should look like.
1198 # nvcsformats - These "formats" are exported, when we didn't detect
1199 # a version control system for the current directory.
1200 # This is useful, if you want vcs_info() to completely
1201 # take over the generation of your prompt.
1202 # You would do something like
1203 # PS1='${VCS_INFO_message_0_}'
1204 # to accomplish that.
1205 # max-exports - Defines the maximum number if VCS_INFO_message_*_
1206 # variables vcs_info() will export.
1207 # enable - Checked in the 'init' context. If set to false,
1208 # vcs_info() will do nothing.
1209 # disable - Provide a list of systems, you don't want
1210 # the vcs_info() to check for repositories
1211 # (checked in the 'init' context, too).
1212 # use-simple - If there are two different ways of gathering
1213 # information, you can select the simpler one
1214 # by setting this style to true; the default
1215 # is to use the not-that-simple code, which is
1216 # potentially a lot slower but might be more
1217 # accurate in all possible cases.
1218 # use-prompt-escapes - determines if we assume that the assembled
1219 # string from vcs_info() includes prompt escapes.
1220 # (Used by vcs_info_lastmsg().
1222 # The use-simple style is only available for the bzr backend.
1224 # The default values for these in all contexts are:
1225 # formats " (%s)-[%b|%a]-"
1226 # actionformats " (%s)-[%b]-"
1227 # branchformat "%b:%r" (for bzr, svn and svk)
1231 # disable (empty list)
1233 # use-prompt-escapes true
1236 # In normal formats and actionformats, the following replacements
1238 # %s - The vcs in use (git, hg, svn etc.)
1239 # %b - Information about the current branch.
1240 # %a - An identifier, that describes the action.
1241 # Only makes sense in actionformats.
1242 # %R - base directory of the repository.
1243 # %r - repository name
1244 # If %R is '/foo/bar/repoXY', %r is 'repoXY'.
1245 # %S - subdirectory within a repository. if $PWD is
1246 # '/foo/bar/reposXY/beer/tasty', %S is 'beer/tasty'.
1249 # In branchformat these replacements are done:
1250 # %b - the branch name
1251 # %r - the current revision number
1253 # Not all vcs backends have to support all replacements.
1254 # nvcsformat does not perform *any* replacements. It is just a string.
1259 # If you want to use the %b (bold off) prompt expansion in 'formats', which
1260 # expands %b itself, use %%b. That will cause the vcs_info() expansion to
1261 # replace %%b with %b. So zsh's prompt expansion mechanism can handle it.
1262 # Similarly, to hand down %b from branchformat, use %%%%b. Sorry for this
1263 # inconvenience, but it cannot be easily avoided. Luckily we do not clash
1264 # with a lot of prompt expansions and this only needs to be done for those.
1265 # See 'man zshmisc' for details about EXPANSION OF PROMPT SEQUENCES.
1268 # FUNCTION DESCRIPTIONS (public API):
1271 # The main function, that runs all backends and assembles
1272 # all data into ${VCS_INFO_message_*_}. This is the function
1273 # you want to call from precmd() if you want to include
1274 # up-to-date information in your prompt (see VARIABLE
1275 # DESCRIPTION below).
1277 # vcs_info_printsys()
1278 # Prints a list of all supported version control systems.
1279 # Useful to find out possible contexts (and which of them are enabled)
1280 # or values for the 'disable' style.
1282 # vcs_info_lastmsg()
1283 # Outputs the last ${VCS_INFO_message_*_} value. Takes into account
1284 # the value of the use-prompt-escapes style in ':vcs_info:formats'.
1285 # It also only prints max-exports values.
1287 # All functions named VCS_INFO_* are for internal use only.
1290 # VARIABLE DESCRIPTION:
1292 # ${VCS_INFO_message_N_} (Note the trailing underscore)
1293 # Where 'N' is an integer, eg: VCS_INFO_message_0_
1294 # These variables are the storage for the informational message the
1295 # last vcs_info() call has assembled. These are strongly connected
1296 # to the formats, actionformats and nvcsformats styles described
1297 # above. Those styles are lists. the first member of that list gets
1298 # expanded into ${VCS_INFO_message_0_}, the second into
1299 # ${VCS_INFO_message_1_} and the Nth into ${VCS_INFO_message_N-1_}.
1300 # These parameters are exported into the environment.
1301 # (See the max-exports style above.)
1306 # Don't use vcs_info at all (even though it's in your prompt):
1307 # % zstyle ':vcs_info:*' enable false
1309 # Disable the backends for bzr and svk:
1310 # % zstyle ':vcs_info:*' disable bzr svk
1312 # Provide a special formats for git:
1313 # % zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]'
1314 # % zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]'
1316 # Use the quicker bzr backend (if you do, please report if it does
1317 # the-right-thing[tm] - thanks):
1318 # % zstyle ':vcs_info:bzr:*' use-simple true
1320 # Display the revision number in yellow for bzr and svn:
1321 # % zstyle ':vcs_info:(svn|bzr):*' branchformat '%b%{'${fg[yellow]}'%}:%r'
1323 # If you want colors, make sure you enclose the color codes in %{...%},
1324 # if you want to use the string provided by vcs_info() in prompts.
1326 # Here is how to print the vcs infomation as a command:
1327 # % alias vcsi='vcs_info command; vcs_info_lastmsg'
1329 # This way, you can even define different formats for output via
1330 # vcs_info_lastmsg() in the ':vcs_info:command:*' namespace.
1334 VCS_INFO_adjust () { #{{{
1335 [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]}
1339 VCS_INFO_check_com () { #{{{
1340 (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0
1344 VCS_INFO_formats () { # {{{
1345 setopt localoptions noksharrays
1346 local action=$1 branch=$2 base=$3
1350 if [[ -n ${action} ]] ; then
1351 zstyle -a ":vcs_info:${vcs}:${usercontext}" actionformats msgs
1352 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b|%a]-'
1354 zstyle -a ":vcs_info:${vcs}:${usercontext}" formats msgs
1355 (( ${#msgs} < 1 )) && msgs[1]=' (%s)-[%b]-'
1358 (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=()
1359 for i in {1..${#msgs}} ; do
1360 zformat -f msg ${msgs[$i]} a:${action} b:${branch} s:${vcs} r:${base:t} R:${base} S:"$(VCS_INFO_reposub ${base})"
1366 VCS_INFO_maxexports () { #{{{
1367 local -ix maxexports
1369 zstyle -s ":vcs_info:${vcs}:${usercontext}" "max-exports" maxexports || maxexports=2
1370 if [[ ${maxexports} != <-> ]] || (( maxexports < 1 )); then
1371 printf 'vcs_info(): expecting numeric arg >= 1 for max-exports (got %s).\n' ${maxexports}
1372 printf 'Defaulting to 2.\n'
1377 VCS_INFO_nvcsformats () { #{{{
1378 setopt localoptions noksharrays
1381 if [[ $1 == 'preinit' ]] ; then
1385 zstyle -a ":vcs_info:${v:-$vcs}:${c:-$usercontext}" nvcsformats msgs
1386 (( ${#msgs} > maxexports )) && msgs[${maxexports},-1]=()
1389 VCS_INFO_realpath () { #{{{
1390 # a portable 'readlink -f'
1391 # forcing a subshell, to ensure chpwd() is not removed
1392 # from the calling shell (if VCS_INFO_realpath() is called
1395 (( ${+functions[chpwd]} )) && unfunction chpwd
1397 cd $1 2>/dev/null && pwd
1401 VCS_INFO_reposub () { #{{{
1402 setopt localoptions extendedglob
1403 local base=${1%%/##}
1405 [[ ${PWD} == ${base}/* ]] || {
1409 printf '%s' ${PWD#$base/}
1413 VCS_INFO_set () { #{{{
1414 setopt localoptions noksharrays
1417 if [[ $1 == '--clear' ]] ; then
1418 for i in {0..9} ; do
1419 unset VCS_INFO_message_${i}_
1422 if [[ $1 == '--nvcs' ]] ; then
1423 [[ $2 == 'preinit' ]] && (( maxexports == 0 )) && (( maxexports = 1 ))
1424 for i in {0..$((maxexports - 1))} ; do
1425 typeset -gx VCS_INFO_message_${i}_=
1427 VCS_INFO_nvcsformats $2
1430 (( ${#msgs} - 1 < 0 )) && return 0
1431 for i in {0..$(( ${#msgs} - 1 ))} ; do
1433 typeset -gx VCS_INFO_message_${i}_=${msgs[$j]}
1438 # information gathering
1439 VCS_INFO_bzr_get_data () { # {{{
1440 setopt localoptions noksharrays
1444 if zstyle -t ":vcs_info:${vcs}:${usercontext}" "use-simple" ; then
1445 bzrbase=${vcs_comm[basedir]}
1446 bzrinfo[2]=${bzrbase:t}
1447 if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then
1448 bzrinfo[1]=$(< ${bzrbase}/.bzr/branch/last-revision)
1449 bzrinfo[1]=${${bzrinfo[1]}%% *}
1452 bzrbase=${${(M)${(f)"$( bzr info )"}:# ##branch\ root:*}/*: ##/}
1453 bzrinfo=( ${${${(M)${(f)"$( bzr version-info )"}:#(#s)(revno|branch-nick)*}/*: /}/*\//} )
1454 bzrbase="$(VCS_INFO_realpath ${bzrbase})"
1457 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat bzrbr || bzrbr="%b:%r"
1458 zformat -f bzrbr "${bzrbr}" "b:${bzrinfo[2]}" "r:${bzrinfo[1]}"
1459 VCS_INFO_formats '' "${bzrbr}" "${bzrbase}"
1463 VCS_INFO_cdv_get_data () { # {{{
1466 cdvbase=${vcs_comm[basedir]}
1467 VCS_INFO_formats '' "${cdvbase:t}" "${cdvbase}"
1471 VCS_INFO_cvs_get_data () { # {{{
1472 local cvsbranch cvsbase basename
1475 while [[ -d "${cvsbase}/../CVS" ]]; do
1476 cvsbase="${cvsbase}/.."
1478 cvsbase="$(VCS_INFO_realpath ${cvsbase})"
1479 cvsbranch=$(< ./CVS/Repository)
1480 basename=${cvsbase:t}
1481 cvsbranch=${cvsbranch##${basename}/}
1482 [[ -z ${cvsbranch} ]] && cvsbranch=${basename}
1483 VCS_INFO_formats '' "${cvsbranch}" "${cvsbase}"
1487 VCS_INFO_darcs_get_data () { # {{{
1490 darcsbase=${vcs_comm[basedir]}
1491 VCS_INFO_formats '' "${darcsbase:t}" "${darcsbase}"
1495 VCS_INFO_git_getaction () { #{{{
1496 local gitaction='' gitdir=$1
1499 for tmp in "${gitdir}/rebase-apply" \
1500 "${gitdir}/rebase" \
1501 "${gitdir}/../.dotest" ; do
1502 if [[ -d ${tmp} ]] ; then
1503 if [[ -f "${tmp}/rebasing" ]] ; then
1505 elif [[ -f "${tmp}/applying" ]] ; then
1508 gitaction="am/rebase"
1510 printf '%s' ${gitaction}
1515 for tmp in "${gitdir}/rebase-merge/interactive" \
1516 "${gitdir}/.dotest-merge/interactive" ; do
1517 if [[ -f "${tmp}" ]] ; then
1518 printf '%s' "rebase-i"
1523 for tmp in "${gitdir}/rebase-merge" \
1524 "${gitdir}/.dotest-merge" ; do
1525 if [[ -d "${tmp}" ]] ; then
1526 printf '%s' "rebase-m"
1531 if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1536 if [[ -f "${gitdir}/BISECT_LOG" ]] ; then
1537 printf '%s' "bisect"
1543 VCS_INFO_git_getbranch () { #{{{
1544 local gitbranch gitdir=$1
1545 local gitsymref='git symbolic-ref HEAD'
1547 if [[ -d "${gitdir}/rebase-apply" ]] \
1548 || [[ -d "${gitdir}/rebase" ]] \
1549 || [[ -d "${gitdir}/../.dotest" ]] \
1550 || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
1551 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1552 [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \
1553 && gitbranch="$(< ${gitdir}/rebase-apply/head-name)"
1555 elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \
1556 || [[ -d "${gitdir}/rebase-merge" ]] ; then
1557 gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
1559 elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
1560 || [[ -d "${gitdir}/.dotest-merge" ]] ; then
1561 gitbranch="$(< ${gitdir}/.dotest-merge/head-name)"
1564 gitbranch="$(${(z)gitsymref} 2> /dev/null)"
1566 if [[ $? -ne 0 ]] ; then
1567 gitbranch="$(git describe --exact-match HEAD 2>/dev/null)"
1569 if [[ $? -ne 0 ]] ; then
1570 gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
1575 printf '%s' "${gitbranch##refs/heads/}"
1579 VCS_INFO_git_get_data () { # {{{
1580 setopt localoptions extendedglob
1581 local gitdir gitbase gitbranch gitaction
1583 gitdir=${vcs_comm[gitdir]}
1584 gitbranch="$(VCS_INFO_git_getbranch ${gitdir})"
1586 if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then
1591 gitaction="$(VCS_INFO_git_getaction ${gitdir})"
1592 gitbase=${PWD%/${$( git rev-parse --show-prefix )%/##}}
1593 VCS_INFO_formats "${gitaction}" "${gitbranch}" "${gitbase}"
1597 VCS_INFO_hg_get_data () { # {{{
1598 local hgbranch hgbase
1600 hgbase=${vcs_comm[basedir]}
1601 hgbranch=$(< ${hgbase}/.hg/branch)
1602 VCS_INFO_formats '' "${hgbranch}" "${hgbase}"
1606 VCS_INFO_mtn_get_data () { # {{{
1607 local mtnbranch mtnbase
1609 mtnbase=${vcs_comm[basedir]}
1610 mtnbranch=${${(M)${(f)"$( mtn status )"}:#(#s)Current branch:*}/*: /}
1611 VCS_INFO_formats '' "${mtnbranch}" "${mtnbase}"
1615 VCS_INFO_svk_get_data () { # {{{
1616 local svkbranch svkbase
1618 svkbase=${vcs_comm[basedir]}
1619 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svkbranch || svkbranch="%b:%r"
1620 zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}"
1621 VCS_INFO_formats '' "${svkbranch}" "${svkbase}"
1625 VCS_INFO_svn_get_data () { # {{{
1626 setopt localoptions noksharrays
1627 local svnbase svnbranch
1631 while [[ -d "${svnbase}/../.svn" ]]; do
1632 svnbase="${svnbase}/.."
1634 svnbase="$(VCS_INFO_realpath ${svnbase})"
1635 svninfo=( ${${${(M)${(f)"$( svn info )"}:#(#s)(URL|Revision)*}/*: /}/*\//} )
1637 zstyle -s ":vcs_info:${vcs}:${usercontext}" branchformat svnbranch || svnbranch="%b:%r"
1638 zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}"
1639 VCS_INFO_formats '' "${svnbranch}" "${svnbase}"
1643 VCS_INFO_tla_get_data () { # {{{
1644 local tlabase tlabranch
1646 tlabase="$(VCS_INFO_realpath ${vcs_comm[basedir]})"
1647 # tree-id gives us something like 'foo@example.com/demo--1.0--patch-4', so:
1648 tlabranch=${${"$( tla tree-id )"}/*\//}
1649 VCS_INFO_formats '' "${tlabranch}" "${tlabase}"
1654 VCS_INFO_detect_by_dir() { #{{{
1656 local basedir="." realbasedir
1658 realbasedir="$(VCS_INFO_realpath ${basedir})"
1659 while [[ ${realbasedir} != '/' ]]; do
1660 if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
1661 [[ -d ${basedir}/${dirname} ]] && \
1662 [[ -f ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
1665 [[ -d ${basedir}/${dirname} ]] && break
1668 basedir=${basedir}/..
1669 realbasedir="$(VCS_INFO_realpath ${basedir})"
1672 [[ ${realbasedir} == "/" ]] && return 1
1673 vcs_comm[basedir]=${realbasedir}
1677 VCS_INFO_bzr_detect() { #{{{
1678 VCS_INFO_check_com bzr || return 1
1679 vcs_comm[detect_need_file]=branch/format
1680 VCS_INFO_detect_by_dir '.bzr'
1684 VCS_INFO_cdv_detect() { #{{{
1685 VCS_INFO_check_com cdv || return 1
1686 vcs_comm[detect_need_file]=format
1687 VCS_INFO_detect_by_dir '.cdv'
1691 VCS_INFO_cvs_detect() { #{{{
1692 VCS_INFO_check_com svn || return 1
1693 [[ -d "./CVS" ]] && [[ -r "./CVS/Repository" ]] && return 0
1697 VCS_INFO_darcs_detect() { #{{{
1698 VCS_INFO_check_com darcs || return 1
1699 vcs_comm[detect_need_file]=format
1700 VCS_INFO_detect_by_dir '_darcs'
1704 VCS_INFO_git_detect() { #{{{
1705 if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then
1706 vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1
1707 if [[ -d ${vcs_comm[gitdir]}/svn ]] ; then vcs_comm[overwrite_name]='git-svn'
1708 elif [[ -d ${vcs_comm[gitdir]}/refs/remotes/p4 ]] ; then vcs_comm[overwrite_name]='git-p4' ; fi
1714 VCS_INFO_hg_detect() { #{{{
1715 VCS_INFO_check_com hg || return 1
1716 vcs_comm[detect_need_file]=branch
1717 VCS_INFO_detect_by_dir '.hg'
1721 VCS_INFO_mtn_detect() { #{{{
1722 VCS_INFO_check_com mtn || return 1
1723 vcs_comm[detect_need_file]=revision
1724 VCS_INFO_detect_by_dir '_MTN'
1728 VCS_INFO_svk_detect() { #{{{
1729 setopt localoptions noksharrays extendedglob
1734 VCS_INFO_check_com svk || return 1
1735 [[ -f ~/.svk/config ]] || return 1
1737 # This detection function is a bit different from the others.
1738 # We need to read svk's config file to detect a svk repository
1739 # in the first place. Therefore, we'll just proceed and read
1740 # the other information, too. This is more then any of the
1741 # other detections do but this takes only one file open for
1742 # svk at most. VCS_INFO_svk_get_data() get simpler, too. :-)
1743 while IFS= read -r line ; do
1744 if [[ -n ${vcs_comm[basedir]} ]] ; then
1746 [[ ${line} == depotpath:* ]] && vcs_comm[branch]=${line##*/}
1747 [[ ${line} == revision:* ]] && vcs_comm[revision]=${line##*[[:space:]]##}
1748 [[ -n ${vcs_comm[branch]} ]] && [[ -n ${vcs_comm[revision]} ]] && break
1751 (( fhash > 0 )) && [[ ${line} == ' '[^[:space:]]*:* ]] && break
1752 [[ ${line} == ' hash:'* ]] && fhash=1 && continue
1753 (( fhash == 0 )) && continue
1754 [[ ${PWD}/ == ${${line## ##}%:*}/* ]] && vcs_comm[basedir]=${${line## ##}%:*}
1755 done < ~/.svk/config
1757 [[ -n ${vcs_comm[basedir]} ]] && \
1758 [[ -n ${vcs_comm[branch]} ]] && \
1759 [[ -n ${vcs_comm[revision]} ]] && return 0
1763 VCS_INFO_svn_detect() { #{{{
1764 VCS_INFO_check_com svn || return 1
1765 [[ -d ".svn" ]] && return 0
1769 VCS_INFO_tla_detect() { #{{{
1770 VCS_INFO_check_com tla || return 1
1771 vcs_comm[basedir]="$(tla tree-root 2> /dev/null)" && return 0
1776 vcs_info_printsys () { # {{{
1777 vcs_info print_systems_
1780 vcs_info_lastmsg () { # {{{
1784 for i in {0..$((maxexports - 1))} ; do
1785 printf '$VCS_INFO_message_%d_: "' $i
1786 if zstyle -T ':vcs_info:formats:command' use-prompt-escapes ; then
1787 print -nP ${(P)${:-VCS_INFO_message_${i}_}}
1789 print -n ${(P)${:-VCS_INFO_message_${i}_}}
1797 local -a VCSs disabled
1798 local -x vcs usercontext
1803 VCSs=(git hg bzr darcs svk mtn svn cvs cdv tla)
1806 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
1807 print -l '# list of supported version control backends:' \
1808 '# disabled systems are prefixed by a hash sign (#)'
1809 for vcs in ${VCSs} ; do
1810 [[ -n ${(M)disabled:#${vcs}} ]] && printf '#'
1811 printf '%s\n' ${vcs}
1813 print -l '# flavours (cannot be used in the disable style; they' \
1814 '# are disabled with their master [git-svn -> git]):' \
1819 [[ -z ${usercontext} ]] && usercontext=default
1821 (*) [[ -z ${usercontext} ]] && usercontext=$1
1825 zstyle -T ":vcs_info:${vcs}:${usercontext}" "enable" || {
1826 [[ -n ${VCS_INFO_message_0_} ]] && VCS_INFO_set --clear
1829 zstyle -a ":vcs_info:${vcs}:${usercontext}" "disable" disabled
1833 for vcs in ${VCSs} ; do
1834 [[ -n ${(M)disabled:#${vcs}} ]] && continue
1836 VCS_INFO_${vcs}_detect && (( found = 1 )) && break
1839 (( found == 0 )) && {
1844 VCS_INFO_${vcs}_get_data || {
1853 VCS_INFO_set --nvcs preinit
1856 # change vcs_info formats for the grml prompt
1857 if [[ "$TERM" == dumb ]] ; then
1858 zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] "
1859 zstyle ':vcs_info:*' formats "(%s%)-[%b] "
1861 # these are the same, just with a lot of colours:
1862 zstyle ':vcs_info:*' actionformats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} "
1863 zstyle ':vcs_info:*' formats "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} "
1864 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r"
1870 if zrcautoload promptinit && promptinit 2>/dev/null ; then
1871 promptinit # people should be able to use their favourite prompt
1873 print 'Notice: no promptinit available :('
1878 # make sure to use right prompt only when not running a command
1879 is41 && setopt transient_rprompt
1881 is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
1882 [[ $NOPRECMD -gt 0 ]] && return 0
1883 # update VCS information
1886 # allow manual overwriting of RPROMPT
1887 if [[ -n $RPROMPT ]] ; then
1888 [[ $TERM == screen* ]] && print -nP "\ekzsh\e\\"
1891 # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
1892 if [[ $DONTSETRPROMPT -eq 0 ]] ; then
1893 if [[ $BATTERY -gt 0 ]] ; then
1894 # update BATTERY information
1896 RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
1897 # RPROMPT="${PERCENT}${SCREENTITLE}"
1899 RPROMPT="%(?..:()% ${SCREENTITLE}"
1900 # RPROMPT="${SCREENTITLE}"
1903 # adjust title of xterm
1904 # see http://www.faqs.org/docs/Linux-mini/Xterm-Title.html
1907 print -Pn "\e]0;%n@%m: %~\a"
1912 # preexec() => a function running before every command
1913 is4 && [[ $NOPRECMD -eq 0 ]] && \
1915 [[ $NOPRECMD -gt 0 ]] && return 0
1916 # set hostname if not running on host with name 'grml'
1917 if [[ -n "$HOSTNAME" ]] && [[ "$HOSTNAME" != $(hostname) ]] ; then
1920 # get the name of the program currently running and hostname of local machine
1921 # set screen window title if running in a screen
1922 if [[ "$TERM" == screen* ]] ; then
1923 # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} # don't use hostname
1924 local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
1925 echo -ne "\ek$CMD\e\\"
1927 # set the screen title to "zsh" when sitting at the command prompt:
1928 if [[ "$TERM" == screen* ]] ; then
1929 SCREENTITLE=$'%{\ekzsh\e\\%}'
1933 # adjust title of xterm
1936 print -Pn "\e]0;%n@%m: $1\a"
1941 EXITCODE="%(?..%?%1v )"
1942 PS2='\`%_> ' # secondary prompt, printed when the shell needs more information to complete a command.
1943 PS3='?# ' # selection prompt used within a select loop.
1944 PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
1946 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
1947 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
1948 debian_chroot=$(cat /etc/debian_chroot)
1951 # don't use colors on dumb terminals (like emacs):
1952 if [[ "$TERM" == dumb ]] ; then
1953 PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
1955 # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended prompt
1956 # set variable identifying the chroot you work in (used in the prompt below)
1957 if [[ $GRMLPROMPT -gt 0 ]] ; then
1958 PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
1959 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
1961 # This assembles the primary prompt string
1962 if (( EUID != 0 )); then
1963 PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
1965 PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_0_}'"%# "
1970 # if we are inside a grml-chroot set a specific prompt theme
1971 if [[ -n "$GRML_CHROOT" ]] ; then
1972 PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
1976 # {{{ 'hash' some often used directories
1978 hash -d deb=/var/cache/apt/archives
1979 hash -d doc=/usr/share/doc
1980 hash -d linux=/lib/modules/$(command uname -r)/build/
1981 hash -d log=/var/log
1982 hash -d slog=/var/log/syslog
1983 hash -d src=/usr/src
1984 hash -d templ=/usr/share/doc/grml-templates
1985 hash -d tt=/usr/share/doc/texttools-doc
1986 hash -d www=/var/www
1991 if [[ $UID -eq 0 ]] ; then
1992 [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
1993 elif [[ -r $HOME/.screenrc ]] ; then
1994 alias screen="/usr/bin/screen -c $HOME/.screenrc"
1996 [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
1999 # do we have GNU ls with color-support?
2000 if ls --help 2>/dev/null | grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
2001 #a1# execute \kbd{@a@}:\quad ls with colors
2002 alias ls='ls -b -CF --color=auto'
2003 #a1# execute \kbd{@a@}:\quad list all files, with colors
2004 alias la='ls -la --color=auto'
2005 #a1# long colored list, without dotfiles (@a@)
2006 alias ll='ls -l --color=auto'
2007 #a1# long colored list, human readable sizes (@a@)
2008 alias lh='ls -hAl --color=auto'
2009 #a1# List files, append qualifier to filenames \\&\quad(\kbd{/} for directories, \kbd{@} for symlinks ...)
2010 alias l='ls -lF --color=auto'
2012 alias ls='ls -b -CF'
2019 alias mdstat='cat /proc/mdstat'
2020 alias ...='cd ../../'
2022 # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
2023 if [[ -x /sbin/kexec ]] && [[ -r /proc/cmdline ]] ; then
2024 alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
2027 alias cp='nocorrect cp' # no spelling correction on cp
2028 alias mkdir='nocorrect mkdir' # no spelling correction on mkdir
2029 alias mv='nocorrect mv' # no spelling correction on mv
2030 alias rm='nocorrect rm' # no spelling correction on rm
2032 #a1# Execute \kbd{rmdir}
2034 #a1# Execute \kbd{rmdir}
2037 # see http://www.cl.cam.ac.uk/~mgk25/unicode.html#term for details
2038 alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
2039 alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
2041 # make sure it is not assigned yet
2042 [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
2046 for ENV in $(env | command grep -i '.utf') ; do
2047 eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
2052 # make sure it is not assigned yet
2053 [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
2055 if ! isutfenv ; then
2056 for ENV in $(env | command grep -i '\.iso') ; do
2057 eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
2062 # set up software synthesizer via speakup
2064 if [ -x /usr/sbin/swspeak-setup ] ; then
2065 setopt singlelinezle
2068 /usr/sbin/swspeak-setup $@
2070 aumix -w 90 -v 90 -p 90 -m 90
2071 if ! [[ -r /dev/softsynth ]] ; then
2072 flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
2075 setopt singlelinezle
2078 nice -n -20 speechd-up
2080 flite -o play -t "Finished setting up software synthesizer"
2085 # I like clean prompt, so provide simple way to get that
2086 check_com 0 || alias 0='return 0'
2088 # for really lazy people like mika:
2089 check_com S &>/dev/null || alias S='screen'
2090 check_com s &>/dev/null || alias s='ssh'
2092 # get top 10 shell commands:
2093 alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
2095 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
2096 if check_com -c truecrypt ; then
2098 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
2100 alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077" '
2104 #f1# Hints for the use of zsh on grml
2106 print "$bg[white]$fg[black]
2107 zsh-help - hints for use of zsh on grml
2108 =======================================$reset_color"
2111 Main configuration of zsh happens in /etc/zsh/zshrc (global)
2112 and /etc/skel/.zshrc which is copied to $HOME/.zshrc once.
2113 The files are part of the package grml-etc-core, if you want to
2114 use them on a non-grml-system just get the tar.gz from
2115 http://deb.grml.org/ or get the files from the mercurial
2118 http://git.grml.org/?p=grml-etc-core.git;a=blob_plain;f=etc/zsh/zshrc
2119 http://git.grml.org/?p=grml-etc-core.git;a=blob_plain;f=etc/skel/.zshrc
2121 If you want to stay in sync with zsh configuration of grml
2122 run '\''ln -sf /etc/skel/.zshrc $HOME/.zshrc'\'' and configure
2123 your own stuff in $HOME/.zshrc.local. System wide configuration
2124 without touching configuration files of grml can take place
2125 in /etc/zsh/zshrc.local.
2127 If you want to use the configuration of user grml also when
2128 running as user root just run '\''zshskel'\'' which will source
2129 the file /etc/skel/.zshrc.
2131 For information regarding zsh start at http://grml.org/zsh/
2133 Take a look at grml'\''s zsh refcard:
2134 % xpdf =(zcat /usr/share/doc/grml-docs/zsh/grml-zsh-refcard.pdf.gz)
2136 Check out the main zsh refcard:
2137 % '$BROWSER' http://www.bash2zsh.com/zsh_refcard/refcard.pdf
2139 And of course visit the zsh-lovers:
2142 You can adjust some options through environment variables when
2143 invoking zsh without having to edit configuration files.
2144 Basically meant for bash users who are not used to the power of
2147 "NOCOR=1 zsh" => deactivate automatic correction
2148 "NOMENU=1 zsh" => do not use auto menu completion (note: use ctrl-d for completion instead!)
2149 "NOPRECMD=1 zsh" => disable the precmd + preexec commands (set GNU screen title)
2150 "BATTERY=1 zsh" => activate battery status (via acpi) on right side of prompt
2152 A value greater than 0 is enables a feature; a value equal to zero
2153 disables it. If you like one or the other of these settings, you can
2154 add them to ~/.zshenv to ensure they are set when sourcing grml'\''s
2158 $bg[white]$fg[black]
2159 Please report wishes + bugs to the grml-team: http://grml.org/bugs/
2160 Enjoy your grml system with the zsh!$reset_color"
2164 if [[ -r /etc/debian_version ]] ; then
2165 #a3# Execute \kbd{apt-cache search}
2166 alias acs='apt-cache search'
2167 #a3# Execute \kbd{apt-cache show}
2168 alias acsh='apt-cache show'
2169 #a3# Execute \kbd{apt-cache policy}
2170 alias acp='apt-cache policy'
2171 #a3# Execute \kbd{apt-get dist-upgrade}
2172 salias adg="apt-get dist-upgrade"
2173 #a3# Execute \kbd{apt-get install}
2174 salias agi="apt-get install"
2175 #a3# Execute \kbd{aptitude install}
2176 salias ati="aptitude install"
2177 #a3# Execute \kbd{apt-get upgrade}
2178 salias ag="apt-get upgrade"
2179 #a3# Execute \kbd{apt-get update}
2180 salias au="apt-get update"
2181 #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
2182 salias -a up="aptitude update ; aptitude safe-upgrade"
2183 #a3# Execute \kbd{dpkg-buildpackage}
2184 alias dbp='dpkg-buildpackage'
2185 #a3# Execute \kbd{grep-excuses}
2186 alias ge='grep-excuses'
2189 #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
2191 if [[ -z "$1" ]] ; then
2192 $SUDO apt-get update
2193 $SUDO apt-get -u upgrade
2195 ssh $1 $SUDO apt-get update
2196 # ask before the upgrade
2198 ssh $1 $SUDO apt-get --no-act upgrade
2199 echo -n 'Process the upgrade?'
2201 if [[ $dummy == "y" ]] ; then
2202 ssh $1 $SUDO apt-get -u upgrade --yes
2207 # get a root shell as normal user in live-cd mode:
2208 if isgrmlcd && [[ $UID -ne 0 ]] ; then
2212 #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog}
2213 alias llog="$PAGER /var/log/syslog" # take a look at the syslog
2214 #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog}
2215 alias tlog="tail -f /var/log/syslog" # follow the syslog
2216 #a1# (Re)-source \kbd{/etc/skel/.zshrc}
2217 alias zshskel="source /etc/skel/.zshrc" # source skeleton zshrc
2220 # sort installed Debian-packages by size
2221 if check_com -c grep-status ; then
2222 #a3# List installed Debian-packages sorted by size
2223 alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd " \n" | sort -rn'
2226 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
2227 if [[ -L /usr/bin/cdrecord ]] || ! check_com -c cdrecord ; then
2228 if check_com -c wodim ; then
2229 alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
2230 See #377109 in the BTS of Debian for more details.
2232 Please use the wodim binary instead' ; return 1"
2236 # get_tw_cli has been renamed into get_3ware
2237 if check_com -c get_3ware ; then
2239 echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
2244 # I hate lacking backward compatibility, so provide an alternative therefore
2245 if ! check_com -c apache2-ssl-certificate ; then
2247 apache2-ssl-certificate() {
2249 print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
2250 print 'You might want to take a look at Debian the package ssl-cert as well.'
2251 print 'To generate a certificate for use with apache2 follow the instructions:'
2255 export RANDFILE=/dev/random
2256 mkdir /etc/apache2/ssl/
2257 openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
2258 chmod 600 /etc/apache2/ssl/apache.pem
2260 Run "grml-tips ssl-certificate" if you need further instructions.
2266 # {{{ Use hard limits, except for a smaller stack and no core dumps
2268 is425 && limit stack 8192
2269 isgrmlcd && limit core 0 # important for a live-cd-system
2273 # {{{ completion system
2275 # called later (via is4 && grmlcomp)
2276 # notice: use 'zstyle' for getting current settings
2277 # press ^Xh (control-x h) for getting tags in context; ^X? (control-x ?) to run complete_debug with trace output
2279 # TODO: This could use some additional information
2281 # allow one error for every three characters typed in approximate completer
2282 zstyle ':completion:*:approximate:' max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )'
2284 # don't complete backup files as executables
2285 zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)'
2287 # start menu completion only if it could find no unambiguous initial string
2288 zstyle ':completion:*:correct:*' insert-unambiguous true
2289 zstyle ':completion:*:corrections' format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}'
2290 zstyle ':completion:*:correct:*' original true
2292 # activate color-completion
2293 zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
2295 # format on completion
2296 zstyle ':completion:*:descriptions' format $'%{\e[0;31m%}completing %B%d%b%{\e[0m%}'
2298 # complete 'cd -<tab>' with menu
2299 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
2301 # insert all expansions for expand completer
2302 zstyle ':completion:*:expand:*' tag-order all-expansions
2303 zstyle ':completion:*:history-words' list false
2306 zstyle ':completion:*:history-words' menu yes
2308 # ignore duplicate entries
2309 zstyle ':completion:*:history-words' remove-all-dups yes
2310 zstyle ':completion:*:history-words' stop yes
2312 # match uppercase from lowercase
2313 zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
2315 # separate matches into groups
2316 zstyle ':completion:*:matches' group 'yes'
2317 zstyle ':completion:*' group-name ''
2319 if [[ "$NOMENU" -eq 0 ]] ; then
2320 # if there are more than 5 options allow selecting from a menu
2321 zstyle ':completion:*' menu select=5
2323 # don't use any menus at all
2327 zstyle ':completion:*:messages' format '%d'
2328 zstyle ':completion:*:options' auto-description '%d'
2330 # describe options in full
2331 zstyle ':completion:*:options' description 'yes'
2333 # on processes completion complete all user processes
2334 zstyle ':completion:*:processes' command 'ps -au$USER'
2336 # offer indexes before parameters in subscripts
2337 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
2339 # provide verbose completion information
2340 zstyle ':completion:*' verbose true
2342 # recent (as of Dec 2007) zsh versions are able to provide descriptions
2343 # for commands (read: 1st word in the line) that it will list for the user
2344 # to choose from. The following disables that, because it's not exactly fast.
2345 zstyle ':completion:*:-command-:*:' verbose false
2347 # set format for warnings
2348 zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
2350 # define files to ignore for zcompile
2351 zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
2352 zstyle ':completion:correct:' prompt 'correct to: %e'
2354 # Ignore completion functions for commands you don't have:
2355 zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*'
2357 # Provide more processes in completion of programs like killall:
2358 zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq'
2360 # complete manual by their section
2361 zstyle ':completion:*:manuals' separate-sections true
2362 zstyle ':completion:*:manuals.*' insert-sections true
2363 zstyle ':completion:*:man:*' menu yes select
2365 # run rehash on completion so new installed program are found automatically:
2367 (( CURRENT == 1 )) && rehash
2372 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
2373 if [[ "$NOCOR" -gt 0 ]] ; then
2374 zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
2377 # try to be smart about when to use what completer...
2379 zstyle -e ':completion:*' completer '
2380 if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
2381 _last_try="$HISTNO$BUFFER$CURSOR"
2382 reply=(_complete _match _ignored _prefix _files)
2384 if [[ $words[1] == (rm|mv) ]] ; then
2385 reply=(_complete _files)
2387 reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
2392 # zstyle ':completion:*' completer _complete _correct _approximate
2393 # zstyle ':completion:*' expand prefix suffix
2395 # complete shell aliases
2396 # zstyle ':completion:*' completer _expand_alias _complete _approximate
2398 # command for process lists, the local web server details and host completion
2399 zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
2402 [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
2403 zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
2405 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
2407 [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
2408 [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
2420 zstyle ':completion:*:hosts' hosts $hosts
2421 # zstyle '*' hosts $hosts
2423 # specify your logins:
2425 # {grml,grml1}@foo.invalid
2426 # grml-devel@bar.invalid
2429 # {fred,root}@foo.invalid
2432 # zstyle ':completion:*:my-accounts' users-hosts $my_accounts
2433 # zstyle ':completion:*:other-accounts' users-hosts $other_accounts
2435 # specify specific port/service settings:
2436 # telnet_users_hosts_ports=(
2439 # @mail-server:{smtp,pop3}
2441 # @proxy-server:8000
2443 # zstyle ':completion:*:*:telnet:*' users-hosts-ports $telnet_users_hosts_ports
2445 # use generic completion system for programs not yet defined; (_gnu_generic works
2446 # with commands that provide a --help option with "standard" gnu-like output.)
2447 compdef _gnu_generic tail head feh cp mv df stow uname ipacsum fetchipac
2449 # see upgrade function in this file
2450 compdef _hosts upgrade
2456 # people should use 'grml-x'!
2458 if [[ -e /etc/X11/xorg.conf ]] ; then
2459 [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
2461 echo "Please use the script \"grml-x\" for starting the X Window System
2462 because there does not exist /etc/X11/xorg.conf yet.
2463 If you want to use startx anyway please call \"/usr/bin/startx\"."
2469 if [[ -e /etc/X11/xorg.conf ]] ; then
2470 [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
2472 echo "Please use the script \"grml-x\" for starting the X Window System.
2473 because there does not exist /etc/X11/xorg.conf yet.
2474 If you want to use xinit anyway please call \"/usr/bin/xinit\"."
2479 if check_com -c 915resolution ; then
2480 alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
2483 #a1# Output version of running grml
2484 alias grml-version='cat /etc/grml_version'
2486 if check_com -c rebuildfstab ; then
2487 #a1# Rebuild /etc/fstab
2488 alias grml-rebuildfstab='rebuildfstab -v -r -config'
2491 if check_com -c grml-debootstrap ; then
2492 alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
2497 # {{{ now run the functions
2499 is4 && isgrml && grmlstuff
2504 is4 && xsource "/etc/zsh/keephack"
2507 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
2508 # You use it as follows:
2509 # $ NTREF=/reference/file
2511 # This lists all the files in the current directory newer than the reference file.
2512 # You can also specify the reference file inline; note quotes:
2513 # $ ls -l *(e:'nt ~/.zshenv':)
2515 if [[ -n $1 ]] ; then
2518 [[ $REPLY -nt $NTREF ]]
2522 # shell functions {{{
2524 #f1# Provide csh compatibility
2525 setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
2527 #f1# Reload an autoloadable function
2528 freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
2530 #f1# Reload zsh setup
2532 if [[ "$#*" -eq 0 ]] ; then
2533 [[ -r ~/.zshrc ]] && . ~/.zshrc
2542 compdef _functions reload freload
2544 #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
2546 [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
2549 while [[ -h "$file" ]] ; do
2551 file=$(readlink "$file")
2556 # fast manual access
2557 if check_com qma ; then
2558 #f1# View the zsh manual
2559 manzsh() { qma zshall "$1" }
2562 manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
2563 # manzsh() { /usr/bin/man zshall | most +/"$1" ; }
2564 # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
2565 # manzsh() { man zshall | $MYLESS -p $1 ; }
2568 if check_com -c $PAGER ; then
2569 #f1# View Debian's changelog of a given package
2571 if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
2572 $PAGER /usr/share/doc/${1}/changelog.Debian.gz
2573 elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2574 $PAGER /usr/share/doc/${1}/changelog.gz
2576 if check_com -c aptitude ; then
2577 echo "No changelog for package $1 found, using aptitude to retrieve it."
2579 aptitude -t unstable changelog ${1}
2581 aptitude changelog ${1}
2584 echo "No changelog for package $1 found, sorry."
2589 _dchange() { _files -W /usr/share/doc -/ }
2590 compdef _dchange dchange
2592 #f1# View Debian's NEWS of a given package
2594 if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
2595 $PAGER /usr/share/doc/${1}/NEWS.Debian.gz
2597 if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
2598 $PAGER /usr/share/doc/${1}/NEWS.gz
2600 echo "No NEWS file for package $1 found, sorry."
2605 _dnews() { _files -W /usr/share/doc -/ }
2606 compdef _dnews dnews
2608 #f1# View upstream's changelog of a given package
2610 if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
2611 $PAGER /usr/share/doc/${1}/changelog.gz
2613 echo "No changelog for package $1 found, sorry."
2617 _uchange() { _files -W /usr/share/doc -/ }
2618 compdef _uchange uchange
2623 ZSH_PROFILE_RC=1 $SHELL "$@"
2626 #f1# Edit an alias via zle
2628 [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
2630 compdef _aliases edalias
2632 #f1# Edit a function via zle
2634 [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
2636 compdef _functions edfunc
2638 # use it e.g. via 'Restart apache2'
2639 #m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
2640 #m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
2641 #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop}
2642 #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload}
2643 #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload}
2644 if [[ -d /etc/init.d || -d /etc/service ]] ; then
2646 local action_="${1:l}" # e.g Start/Stop/Restart
2650 local service_target_="$(readlink /etc/init.d/$service_)"
2651 if [[ $service_target_ == "/usr/bin/sv" ]]; then
2653 case "${action_}" in
2654 start) if [[ ! -e /etc/service/$service_ ]]; then
2655 $SUDO ln -s "/etc/sv/$service_" "/etc/service/"
2657 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2659 # there is no reload in runits sysv emulation
2660 reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;;
2661 *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;;
2665 $SUDO "/etc/init.d/$service_" "${action_}" "$param_"
2669 for i in Start Restart Stop Force-Reload Reload ; do
2670 eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
2674 #f1# Provides useful information on globbing
2681 p named pipes (FIFOs)
2682 * executable plain files (0100)
2683 % device files (character or block special)
2684 %b block special files
2685 %c character special files
2686 r owner-readable files (0400)
2687 w owner-writable files (0200)
2688 x owner-executable files (0100)
2689 A group-readable files (0040)
2690 I group-writable files (0020)
2691 E group-executable files (0010)
2692 R world-readable files (0004)
2693 W world-writable files (0002)
2694 X world-executable files (0001)
2695 s setuid files (04000)
2696 S setgid files (02000)
2697 t files with the sticky bit (01000)
2699 print *(m-1) # Files modified up to a day ago
2700 print *(a1) # Files accessed a day ago
2701 print *(@) # Just symlinks
2702 print *(Lk+50) # Files bigger than 50 kilobytes
2703 print *(Lk-50) # Files smaller than 50 kilobytes
2704 print **/*.c # All *.c files recursively starting in \$PWD
2705 print **/*.c~file.c # Same as above, but excluding 'file.c'
2706 print (foo|bar).* # Files starting with 'foo' or 'bar'
2707 print *~*.* # All Files that do not contain a dot
2708 chmod 644 *(.^x) # make all plain non-executable files publically readable
2709 print -l *(.c|.h) # Lists *.c and *.h
2710 print **/*(g:users:) # Recursively match all files that are owned by group 'users'
2711 echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
2713 alias help-zshglob=H-Glob
2715 check_com -c qma && alias ?='qma zshall'
2717 # grep for running process, like: 'any vim'
2719 if [[ -z "$1" ]] ; then
2720 echo "any - grep for process(es) by keyword" >&2
2721 echo "Usage: any <keyword>" >&2 ; return 1
2724 local LENGTH=$(expr length $STRING)
2725 local FIRSCHAR=$(echo $(expr substr $STRING 1 1))
2726 local REST=$(echo $(expr substr $STRING 2 $LENGTH))
2727 ps xauwww| grep "[$FIRSCHAR]$REST"
2731 # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
2732 # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
2733 [[ -r /proc/1/maps ]] && \
2735 print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
2736 cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/') > /dev/null
2737 print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
2740 # print hex value of a number
2742 [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
2745 # calculate (or eval at all ;-)) with perl => p[erl-]eval
2746 # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
2748 [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
2749 perl -e "print eval($CALC),\"\n\";"
2751 functions peval &>/dev/null && alias calc=peval
2753 # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
2754 # certain circumstances, so work around it, no matter which environment we have
2756 if [[ -z "$DISPLAY" ]] ; then
2757 consolechars -f /usr/share/consolefonts/default8x16.psf.gz
2764 # just press 'asdf' keys to toggle between dvorak and us keyboard layout
2766 echo -n 'Switching to us keyboard layout: '
2767 [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
2771 echo -n 'Switching to dvorak keyboard layout: '
2772 [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
2775 # just press 'asdf' key to toggle from neon layout to us keyboard layout
2777 echo -n 'Switching to us keyboard layout: '
2778 setxkbmap us && echo 'Done' || echo 'Failed'
2781 # set up an ipv6 tunnel
2785 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2786 print 'ipv6 tunnel already set up, nothing to be done.'
2787 print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
2789 [[ -n "$PUBLIC_IP" ]] || \
2790 local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
2791 awk '/inet addr:/ {print $2}' | tr -d 'addr:')
2793 [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
2794 local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
2795 print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
2796 ifconfig sit0 tunnel ::192.88.99.1 up
2797 ifconfig sit1 add "$IPV6ADDR" && print done || print failed
2801 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2802 print 'ipv6 tunnel available' ; return 0
2804 print 'ipv6 tunnel not available' ; return 1
2808 if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
2809 print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
2810 ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
2812 print 'No ipv6 tunnel found, nothing to be done.' ; return 1
2816 print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
2821 # run dhclient for wireless device
2823 salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
2826 # spawn a minimally set up ksh - useful if you want to umount /usr/.
2828 exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
2831 # make a backup of a file
2833 cp -a "$1" "${1}_$(date --iso-8601=seconds)"
2836 # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
2838 # NO_SWITCH="yes" command bash "$@"
2841 # exec $SHELL $SHELL_ARGS "$@"
2846 # log out? set timeout in seconds {{{
2848 # do not log out in some specific terminals:
2849 # if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then
2854 # {{{ make sure our environment is clean regarding colors
2855 for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color
2858 # source another config file if present {{{
2859 xsource "/etc/zsh/zshrc.local"
2860 xsource "${HOME}/.zshenv"
2863 # "persistent history" {{{
2864 # just write important commands you always need to ~/.important_commands
2865 if [[ -r ~/.important_commands ]] ; then
2866 fc -R ~/.important_commands
2870 ## genrefcard.pl settings {{{
2871 ### example: split functions-search 8,16,24,32
2872 #@# split functions-search 8
2876 ### non-root (EUID == 0) code below
2879 (( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) && return 0
2881 # autoloading stuff {{{
2882 # associate types and extensions (be aware with perl scripts and anwanted behaviour!)
2883 # check_com zsh-mime-setup || { autoload zsh-mime-setup && zsh-mime-setup }
2884 # alias -s pl='perl -S'
2889 # set terminal property (used e.g. by msgid-chooser)
2890 export COLORTERM="yes"
2892 # set default browser
2893 if [[ -z "$BROWSER" ]] ; then
2894 if [[ -n "$DISPLAY" ]] ; then
2895 #v# If X11 is running
2896 check_com -c firefox && export BROWSER=firefox
2898 #v# If no X11 is running
2899 check_com -c w3m && export BROWSER=w3m
2903 #m# v QTDIR \kbd{/usr/share/qt[34]}\quad [for non-root only]
2904 [[ -d /usr/share/qt3 ]] && export QTDIR=/usr/share/qt3
2905 [[ -d /usr/share/qt4 ]] && export QTDIR=/usr/share/qt4
2907 # support running 'jikes *.java && jamvm HelloWorld' OOTB:
2908 #v# [for non-root only]
2909 [[ -f /usr/share/classpath/glibj.zip ]] && export JIKESPATH=/usr/share/classpath/glibj.zip
2914 # Allow comments even in interactive shells i. e.
2915 # $ uname # This command prints system informations
2916 # zsh: bad pattern: #
2917 # $ setopt interactivecomments
2918 # $ uname # This command prints system informations
2920 # setopt interactivecomments
2922 # ctrl-s will no longer freeze the terminal.
2927 # {{{ global aliases
2928 # These do not have to be at the beginning of the command line.
2929 # Avoid typing cd ../../ for going two dirs down and so on
2930 # Usage, e.g.: "$ cd ...' or just '$ ...' with 'setopt auto_cd'
2931 # Notice: deactivated by 061112 by default, we use another approach
2932 # known as "power completion / abbreviation expansion"
2933 # alias -g '...'='../..'
2934 # alias -g '....'='../../..'
2935 # alias -g BG='& exit'
2936 # alias -g C='|wc -l'
2937 # alias -g G='|grep'
2938 # alias -g H='|head'
2939 # alias -g Hl=' --help |& less -r'
2940 # alias -g K='|keep'
2941 # alias -g L='|less'
2942 # alias -g LL='|& less -r'
2943 # alias -g M='|most'
2944 # alias -g N='&>/dev/null'
2945 # alias -g R='| tr A-z N-za-m'
2946 # alias -g SL='| sort | less'
2947 # alias -g S='| sort'
2948 # alias -g T='|tail'
2949 # alias -g V='| vim -'
2954 # Xterm resizing-fu.
2955 # Based on http://svn.kitenet.net/trunk/home-full/.zshrc?rev=11710&view=log (by Joey Hess)
2956 alias hide='echo -en "\033]50;nil2\007"'
2957 alias tiny='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
2958 alias small='echo -en "\033]50;6x10\007"'
2959 alias medium='echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
2960 alias default='echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
2961 alias large='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
2962 alias huge='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
2963 alias smartfont='echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
2964 alias semifont='echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
2965 # if [[ "$TERM" == "xterm" ]] && [[ "$LINES" -ge 50 ]] && [[ "$COLUMNS" -ge 100 ]] && [[ -z "$SSH_CONNECTION" ]] ; then
2970 #a2# Execute \kbd{du -sch}
2972 #a2# Execute \kbd{jobs -l}
2974 # alias u='translate -i' # translate
2977 #a2# Execute \kbd{./configure}
2978 alias CO="./configure"
2979 #a2# Execute \kbd{./configure --help}
2980 alias CH="./configure --help"
2982 # http://conkeror.mozdev.org/
2983 #a2# Run a keyboard driven firefox
2984 alias conkeror='firefox -chrome chrome://conkeror/content'
2987 if check_com -c tla ; then
2988 #a2# Execute \kbd{tla what-changed --diffs | less}
2989 alias tdi='tla what-changed --diffs | less'
2990 #a2# Execute \kbd{tla-buildpackage}
2991 alias tbp='tla-buildpackage'
2992 #a2# Execute \kbd{tla archive-mirror}
2993 alias tmi='tla archive-mirror'
2994 #a2# Execute \kbd{tla commit}
2995 alias tco='tla commit'
2996 #a2# Execute \kbd{tla star-merge}
2997 alias tme='tla star-merge'
3001 #a2# Execute \kbd{ls -lSrah}
3002 alias dir="ls -lSrah"
3003 #a2# Only show dot-directories
3004 alias lad='ls -d .*(/)' # only show dot-directories
3005 #a2# Only show dot-files
3006 alias lsa='ls -a .*(.)' # only show dot-files
3007 #a2# Only files with setgid/setuid/sticky flag
3008 alias lss='ls -l *(s,S,t)' # only files with setgid/setuid/sticky flag
3009 #a2# Only show 1st ten symlinks
3010 alias lsl='ls -l *(@[1,10])' # only symlinks
3011 #a2# Display only executables
3012 alias lsx='ls -l *(*[1,10])' # only executables
3013 #a2# Display world-{readable,writable,executable} files
3014 alias lsw='ls -ld *(R,W,X.^ND/)' # world-{readable,writable,executable} files
3015 #a2# Display the ten biggest files
3016 alias lsbig="ls -flh *(.OL[1,10])" # display the biggest files
3017 #a2# Only show directories
3018 alias lsd='ls -d *(/)' # only show directories
3019 #a2# Only show empty directories
3020 alias lse='ls -d *(/^F)' # only show empty directories
3021 #a2# Display the ten newest files
3022 alias lsnew="ls -rl *(D.om[1,10])" # display the newest files
3023 #a2# Display the ten oldest files
3024 alias lsold="ls -rtlh *(D.om[1,10])" # display the oldest files
3025 #a2# Display the ten smallest files
3026 alias lssmall="ls -Srl *(.oL[1,10])" # display the smallest files
3029 #a2# Execute \kbd{chmod 600}
3030 alias rw-='chmod 600'
3031 #a2# Execute \kbd{chmod 700}
3032 alias rwx='chmod 700'
3033 #m# a2 r-{}- Execute \kbd{chmod 644}
3034 alias r--='chmod 644'
3035 #a2# Execute \kbd{chmod 755}
3036 alias r-x='chmod 755'
3038 # some useful aliases
3039 #a2# Execute \kbd{mkdir -o}
3042 check_com -c ipython && alias ips='ipython -p sh'
3045 #a2# Execute \kbd{mplayer -vo fbdev}
3046 alias cmplayer='mplayer -vo fbdev'
3047 #a2# Execute \kbd{mplayer -vo fbdev -fs -zoom}
3048 alias fbmplayer='mplayer -vo fbdev -fs -zoom'
3049 #a2# Execute \kbd{links2 -driver fb}
3050 alias fblinks='links2 -driver fb'
3052 # ignore ~/.ssh/known_hosts entries
3053 # alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "PreferredAuthentications=keyboard-interactive"'
3054 #a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
3055 alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3056 alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
3059 check_com -c python && alias http="python -m SimpleHTTPServer"
3061 # Use 'g' instead of 'git':
3062 check_com g || alias g='git'
3064 # use colors when browsing man pages, but only if not using LESS_TERMCAP_* from /etc/zsh/zshenv:
3065 if [[ -z "$LESS_TERMCAP_md" ]] ; then
3066 [[ -d ~/.terminfo/ ]] && alias man='TERMINFO=~/.terminfo/ LESS=C TERM=mostlike PAGER=less man'
3069 # check whether Debian's package management (dpkg) is running
3070 if check_com salias ; then
3071 #a2# Check whether a dpkg instance is currently running
3072 salias check_dpkg_running="dpkg_running"
3075 # work around non utf8 capable software in utf environment via $LANG and luit
3076 if check_com isutfenv && check_com luit ; then
3077 if check_com -c mrxvt ; then
3078 isutfenv && [[ -n "$LANG" ]] && \
3079 alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
3082 if check_com -c aterm ; then
3083 isutfenv && [[ -n "$LANG" ]] && \
3084 alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
3087 if check_com -c centericq ; then
3088 isutfenv && [[ -n "$LANG" ]] && \
3089 alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
3094 # useful functions {{{
3097 #f4# Search for newspostings from authors
3098 agoogle() { ${=BROWSER} "http://groups.google.com/groups?as_uauthors=$*" ; }
3099 #f4# Search Debian Bug Tracking System
3101 setopt localoptions extendedglob
3102 if [[ $# -eq 1 ]]; then
3105 ${=BROWSER} "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
3108 ${=BROWSER} "http://bugs.debian.org/cgi-bin/pkgreport.cgi?submitter=$1"
3111 ${=BROWSER} "http://bugs.debian.org/$*"
3115 print "$0 needs one argument"
3119 #f4# Search Debian Bug Tracking System in mbox format
3120 debbugm() { bts show --mbox $1 } # provide bugnummer as "$1"
3122 dmoz() { ${=BROWSER} http://search.dmoz.org/cgi-bin/search\?search=${1// /_} }
3123 #f4# Search German Wiktionary
3124 dwicti() { ${=BROWSER} http://de.wiktionary.org/wiki/${(C)1// /_} }
3125 #f4# Search English Wiktionary
3126 ewicti() { ${=BROWSER} http://en.wiktionary.org/wiki/${(C)1// /_} }
3127 #f4# Search Google Groups
3128 ggogle() { ${=BROWSER} "http://groups.google.com/groups?q=$*" }
3130 google() { ${=BROWSER} "http://www.google.com/search?&num=100&q=$*" }
3131 #f4# Search Google Groups for MsgID
3132 mggogle() { ${=BROWSER} "http://groups.google.com/groups?selm=$*" }
3133 #f4# Search Netcraft
3134 netcraft(){ ${=BROWSER} "http://toolbar.netcraft.com/site_report?url=$1" }
3135 #f4# Use German Wikipedia's full text search
3136 swiki() { ${=BROWSER} http://de.wikipedia.org/wiki/Spezial:Search/${(C)1} }
3137 #f4# search \kbd{dict.leo.org}
3138 oleo() { ${=BROWSER} "http://dict.leo.org/?search=$*" }
3139 #f4# Search German Wikipedia
3140 wikide() { ${=BROWSER} http://de.wikipedia.org/wiki/"${(C)*}" }
3141 #f4# Search English Wikipedia
3142 wikien() { ${=BROWSER} http://en.wikipedia.org/wiki/"${(C)*}" }
3143 #f4# Search official debs
3144 wodeb() { ${=BROWSER} "http://packages.debian.org/search?keywords=$1&searchon=contents&suite=${2:=unstable}§ion=all" }
3146 #m# f4 gex() Exact search via Google
3147 check_com google && gex () { google "\"[ $1]\" $*" } # exact search at google
3150 #f5# Backup \kbd{file {\rm to} file\_timestamp}
3151 bk() { cp -b ${1} ${1}_`date --iso-8601=m` }
3153 cdiff() { diff -crd "$*" | egrep -v "^Only in |^Binary files " }
3154 #f5# cd to directoy and list files
3155 cl() { cd $1 && ls -a } # cd && ls
3157 cvsa() { cvs add $* && cvs com -m 'initial checkin' $* }
3159 cvsd() { cvs diff -N $* |& $PAGER }
3161 cvsl() { cvs log $* |& $PAGER }
3163 cvsq() { cvs -nq update }
3165 cvsr() { rcs2log $* | $PAGER }
3167 cvss() { cvs status -v $* }
3168 #f5# Disassemble source files using gcc and as
3169 disassemble(){ gcc -pipe -S -o - -O -g $* | as -aldh -o /dev/null }
3170 #f5# Firefox remote control - open given URL
3171 fir() { firefox -a firefox -remote "openURL($1)" }
3172 #f5# Create Directoy and \kbd{cd} to it
3173 mcd() { mkdir -p "$@"; cd "$@" } # mkdir && cd
3174 #f5# Unified diff to timestamped outputfile
3175 mdiff() { diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1" }
3176 #f5# Memory overview
3177 memusage(){ ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc }
3178 #f5# Show contents of tar file
3179 shtar() { gunzip -c $1 | tar -tf - -- | $PAGER }
3180 #f5# Show contents of tgz file
3181 shtgz() { tar -ztf $1 | $PAGER }
3182 #f5# Show contents of zip file
3183 shzip() { unzip -l $1 | $PAGER }
3184 #f5# Greps signature from file
3185 sig() { agrep -d '^-- $' "$*" ~/.Signature }
3187 udiff() { diff -urd $* | egrep -v "^Only in |^Binary files " }
3188 #f5# (Mis)use \kbd{vim} as \kbd{less}
3189 viless() { vim --cmd 'let no_plugin_maps = 1' -c "so \$VIMRUNTIME/macros/less.vim" "${@:--}" }
3191 # download video from youtube
3193 if ! [[ -n "$2" ]] ; then
3194 print "Usage: ydtl http://youtube.com/watch?v=.... outputfile.flv">&2
3197 wget -O${2} "http://youtube.com/get_video?"${${${"$(wget -o/dev/null -O- "${1}" | grep -e watch_fullscreen)"}##*watch_fullscreen\?}%%\&fs=*}
3201 # Function Usage: uopen $URL/$file
3202 #f5# Download a file and display it locally
3204 if ! [[ -n "$1" ]] ; then
3205 print "Usage: uopen \$URL/\$file">&2
3209 MIME=$(curl --head $FILE | grep Content-Type | cut -d ' ' -f 2 | cut -d\; -f 1)
3211 curl $FILE | see ${MIME}:-
3215 # Function Usage: doc packagename
3216 #f5# \kbd{cd} to /usr/share/doc/\textit{package}
3217 doc() { cd /usr/share/doc/$1 && ls }
3218 _doc() { _files -W /usr/share/doc -/ }
3219 check_com compdef && compdef _doc doc
3221 #f5# Make screenshot
3223 [[ ! -d ~/shots ]] && mkdir ~/shots
3224 #cd ~/shots ; sleep 5 ; import -window root -depth 8 -quality 80 `date "+%Y-%m-%d--%H:%M:%S"`.png
3225 cd ~/shots ; sleep 5; import -window root shot_`date --iso-8601=m`.jpg
3231 images=( *.{jpg,gif,png}(.N) )
3233 if [[ $#images -eq 0 ]] ; then
3234 print "No image files found"
3236 ls "$@" "$images[@]"
3240 #f5# Create PDF file from source code
3244 a2ps --medium A4dj -E -o $output $*
3248 # zsh with perl-regex - use it e.g. via:
3249 # regcheck '\s\d\.\d{3}\.\d{3} Euro' ' 1.000.000 Euro'
3250 #f5# Checks whether a regex matches or not.\\&\quad Example: \kbd{regcheck '.\{3\} EUR' '500 EUR'}
3252 zmodload -i zsh/pcre
3253 pcre_compile $1 && \
3254 pcre_match $2 && echo "regex matches" || echo "regex does not match"
3257 #f5# List files which have been modified within the last {\it n} days
3258 new() { print -l *(m-$1) }
3260 #f5# Grep in history
3261 greph() { history 0 | grep $1 }
3262 # use colors when GNU grep with color-support
3263 #a2# Execute \kbd{grep -{}-color=auto}
3264 (grep --help 2>/dev/null |grep -- --color) >/dev/null && alias grep='grep --color=auto'
3265 #a2# Execute \kbd{grep -i -{}-color=auto}
3266 alias GREP='grep -i --color=auto'
3268 # one blank line between each line
3269 if [[ -r ~/.terminfo/m/mostlike ]] ; then
3270 # alias man2='MANPAGER="sed -e G |less" TERMINFO=~/.terminfo TERM=mostlike /usr/bin/man'
3271 #f5# Watch manpages in a stretched style
3272 man2() { PAGER='dash -c "sed G | /usr/bin/less"' TERM=mostlike /usr/bin/man "$@" ; }
3275 # d():Copyright 2005 Nikolai Weibull <nikolai@bitwi.se>
3276 # notice: option AUTO_PUSHD has to be set
3277 #f5# Jump between directories
3281 local color=$fg_bold[blue]
3283 dirs -p | while read dir; do
3284 local num="${$(printf "%-4d " $i)/ /.}"
3285 printf " %s $color%s$reset_color\n" $num $dir
3289 read -r 'dir?Jump to directory: ' || return
3290 (( dir == -1 )) && return
3291 if (( dir < 0 || dir >= i )); then
3292 echo d: no such directory stack entry: $dir
3298 # usage example: 'lcheck strcpy'
3299 #f5# Find out which libs define a symbol
3301 if [[ -n "$1" ]] ; then
3302 nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"
3304 echo "Usage: lcheck <function>" >&2
3308 #f5# Clean up directory - remove well known tempfiles
3310 FILES=(*~(N) .*~(N) \#*\#(N) *.o(N) a.out(N) *.core(N) *.cmo(N) *.cmi(N) .*.swp(N))
3312 if [[ $NBFILES > 0 ]] ; then
3315 echo -n "Remove these files? [y/n] "
3317 if [[ $ans == "y" ]] ; then
3319 echo ">> $PWD purged, $NBFILES files removed"
3321 echo "Ok. .. than not.."
3327 # 'translate' looks up fot a word in a file with language-to-language
3328 # translations (field separator should be " : "). A typical wordlist looks
3330 # | english-word : german-transmission
3331 # It's also only possible to translate english to german but not reciprocal.
3332 # Use the following oneliner to turn back the sort order:
3333 # $ awk -F ':' '{ print $2" : "$1" "$3 }' \
3334 # /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
3335 #f5# Translates a word
3339 translate -l de-en $2
3342 translate -l en-de $2
3345 echo "Usage: $0 { -D | -E }"
3346 echo " -D == German to English"
3347 echo " -E == English to German"
3351 # Some quick Perl-hacks aka /useful/ oneliner
3352 # bew() { perl -le 'print unpack "B*","'$1'"' }
3353 # web() { perl -le 'print pack "B*","'$1'"' }
3354 # hew() { perl -le 'print unpack "H*","'$1'"' }
3355 # weh() { perl -le 'print pack "H*","'$1'"' }
3356 # pversion() { perl -M$1 -le "print $1->VERSION" } # i. e."pversion LWP -> 5.79"
3357 # getlinks () { perl -ne 'while ( m/"((www|ftp|http):\/\/.*?)"/gc ) { print $1, "\n"; }' $* }
3358 # gethrefs () { perl -ne 'while ( m/href="([^"]*)"/gc ) { print $1, "\n"; }' $* }
3359 # getanames () { perl -ne 'while ( m/a name="([^"]*)"/gc ) { print $1, "\n"; }' $* }
3360 # getforms () { perl -ne 'while ( m:(\</?(input|form|select|option).*?\>):gic ) { print $1, "\n"; }' $* }
3361 # getstrings () { perl -ne 'while ( m/"(.*?)"/gc ) { print $1, "\n"; }' $*}
3362 # getanchors () { perl -ne 'while ( m/«([^«»\n]+)»/gc ) { print $1, "\n"; }' $* }
3363 # showINC () { perl -e 'for (@INC) { printf "%d %s\n", $i++, $_ }' }
3364 # vimpm () { vim `perldoc -l $1 | sed -e 's/pod$/pm/'` }
3365 # vimhelp () { vim -c "help $1" -c on -c "au! VimEnter *" }
3367 #f5# List all occurrences of programm in current PATH
3369 if [[ $# = 0 ]] ; then
3370 echo "Usage: $0 program"
3371 echo "Example: $0 zsh"
3372 echo "Lists all occurrences of program in the current PATH."
3374 ls -l ${^path}/*$1*(*N)
3378 # Found in the mailinglistarchive from Zsh (IIRC ~1996)
3379 #f5# Select items for specific command(s) from history
3384 echo "Usage: $0 command"
3387 cmd=(${(f)"$(grep -w $1 $HISTFILE | sort | uniq | pr -tn)"})
3388 print -l $cmd | less -F
3389 echo -n "enter number of desired command [1 - $(( ${#cmd[@]} - 1 ))]: "
3392 print -z "${cmd[$answer]#*$TAB}"
3395 # Use vim to convert plaintext to HTML
3396 #f5# Transform files to html with highlighting
3397 2html() { vim -u NONE -n -c ':syntax on' -c ':so $VIMRUNTIME/syntax/2html.vim' -c ':wqa' $1 &>/dev/null }
3399 # Usage: simple-extract <file>
3400 #f5# Smart archive extractor
3402 if [[ -f $1 ]] ; then
3404 *.tar.bz2) bzip2 -v -d $1 ;;
3405 *.tar.gz) tar -xvzf $1 ;;
3408 *.bz2) bzip2 -d $1 ;;
3410 *.gz) gunzip -d $1 ;;
3411 *.tar) tar -xvf $1 ;;
3412 *.tgz) gunzip -d $1 ;;
3413 *.tbz2) tar -jxvf $1 ;;
3415 *.Z) uncompress $1 ;;
3416 *) echo "'$1' Error. Please go away" ;;
3419 echo "'$1' is not a valid file"
3423 # Usage: smartcompress <file> (<type>)
3424 #f5# Smart archive creator
3426 if [[ -n $2 ]] ; then
3428 tgz | tar.gz) tar -zcvf$1.$2 $1 ;;
3429 tbz2 | tar.bz2) tar -jcvf$1.$2 $1 ;;
3430 tar.Z) tar -Zcvf$1.$2 $1 ;;
3431 tar) tar -cvf$1.$2 $1 ;;
3432 gz | gzip) gzip $1 ;;
3433 bz2 | bzip2) bzip2 $1 ;;
3435 echo "Error: $2 is not a valid compression type"
3439 smartcompress $1 tar.gz
3443 # Usage: show-archive <archive>
3444 #f5# List an archive's content
3446 if [[ -f $1 ]] ; then
3448 *.tar.gz) gunzip -c $1 | tar -tf - -- ;;
3449 *.tar) tar -tf $1 ;;
3450 *.tgz) tar -ztf $1 ;;
3451 *.zip) unzip -l $1 ;;
3453 *.deb) dpkg-deb --fsys-tarfile $1 | tar -tf - -- ;;
3454 *) echo "'$1' Error. Please go away" ;;
3457 echo "'$1' is not a valid archive"
3461 # It's shameless stolen from <http://www.vim.org/tips/tip.php?tip_id=167>
3462 #f5# Use \kbd{vim} as your manpage reader
3463 vman() { man $* | col -b | view -c 'set ft=man nomod nolist' - }
3465 # function readme() { $PAGER -- (#ia3)readme* }
3466 #f5# View all README-like files in current directory in pager
3469 files=(./(#i)*(read*me|lue*m(in|)ut)*(ND))
3470 if (($#files)) ; then
3473 print 'No README files.'
3477 # function ansi-colors()
3478 #f5# Display ANSI colors
3480 typeset esc="\033[" line1 line2
3481 echo " _ _ _40 _ _ _41_ _ _ _42 _ _ 43_ _ _ 44_ _ _45 _ _ _ 46_ _ _ 47_ _ _ 49_ _"
3482 for fore in 30 31 32 33 34 35 36 37; do
3485 for back in 40 41 42 43 44 45 46 47 49; do
3486 line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"
3487 line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m"
3489 echo -e "$line1\n$line2"
3493 # suidfind() { ls -latg $path | grep '^...s' }
3494 #f5# Find all files in \$PATH with setuid bit set
3495 suidfind() { ls -latg $path/*(sN) }
3497 # See above but this is /better/ ... anywise ..
3499 print 'Output will be written to ~/suid_* ...'
3500 $SUDO find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1
3501 $SUDO find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1
3502 $SUDO find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1
3503 $SUDO find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1
3507 #f5# Reload given functions
3509 for func in $argv ; do
3515 # a small check to see which DIR is located on which server/partition.
3516 # stolen and modified from Sven's zshrc.forall
3517 #f5# Report diskusage of a directory
3519 if [[ -n "$1" ]] ; then
3521 if [[ -d "$dir" ]] ; then
3522 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3524 echo "warning: $dir does not exist" >&2
3528 for dir in $path; do
3529 if [[ -d "$dir" ]] ; then
3530 ( cd $dir; echo "-<$dir>"; du -shx .; echo);
3532 echo "warning: $dir does not exist" >&2
3538 # % slow_print `cat /etc/passwd`
3539 #f5# Slowly print out parameters
3541 for argument in "${@}" ; do
3542 for ((i = 1; i <= ${#1} ;i++)) ; do
3543 print -n "${argument[i]}"
3551 #f5# Show some status info
3554 print "Date..: "$(date "+%Y-%m-%d %H:%M:%S")""
3555 print "Shell.: Zsh $ZSH_VERSION (PID = $$, $SHLVL nests)"
3556 print "Term..: $TTY ($TERM), $BAUD bauds, $COLUMNS x $LINES cars"
3557 print "Login.: $LOGNAME (UID = $EUID) on $HOST"
3558 print "System: $(cat /etc/[A-Za-z]*[_-][rv]e[lr]*)"
3559 print "Uptime:$(uptime)"
3564 #f5# Rip an audio CD
3568 cdrdao read-cd --device $DEVICE --driver generic-mmc audiocd.toc
3569 cdrdao read-cddb --device $DEVICE --driver generic-mmc audiocd.toc
3570 echo " * Would you like to burn the cd now? (yes/no)"
3572 if [[ "$input" = "yes" ]] ; then
3573 echo " ! Burning Audio CD"
3577 echo " ! Invalid response."
3582 #f5# Burn an audio CD (in combination with audiorip)
3585 cdrdao write --device $DEVICE --driver generic-mmc audiocd.toc
3586 echo " * Should I remove the temporary files? (yes/no)"
3588 if [[ "$input" = "yes" ]] ; then
3589 echo " ! Removing Temporary Files."
3594 echo " ! Invalid response."
3598 #f5# Make an audio CD from all mp3 files
3600 # TODO: do the renaming more zshish, possibly with zmv()
3602 for i in *.[Mm][Pp]3; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done
3603 for i in *.mp3; do mv "$i" `echo $i | tr ' ' '_'`; done
3604 for i in *.mp3; do mpg123 -w `basename $i .mp3`.wav $i; done
3606 for i in *.wav; do sox $i.wav -r 44100 $i.wav resample; done
3609 #f5# Create an ISO image. You are prompted for\\&\quad volume name, filename and directory
3611 echo " * Volume name "
3613 echo " * ISO Name (ie. tmp.iso)"
3615 echo " * Directory or File"
3617 mkisofs -o ~/$iso -A $volume -allow-multidot -J -R -iso-level 3 -V $volume -R $files
3620 #f5# Simple thumbnails generator
3622 rm -rf thumb-* index.html
3626 <title>Images</title>
3628 <body>" > index.html
3629 for f in *.(gif|jpeg|jpg|png) ; do
3630 convert -size 100x200 "$f" -resize 100x200 thumb-"$f"
3631 echo " <a href=\"$f\"><img src=\"thumb-$f\"></a>" >> index.html
3635 </html>" >> index.html
3638 #f5# Set all ulimit parameters to \kbd{unlimited}
3649 # ogg2mp3 with bitrate of 192
3651 oggdec -o - ${1} | lame -b 192 - ${1:r}.mp3
3654 #f5# RFC 2396 URL encoding in Z-Shell
3656 setopt localoptions extendedglob
3658 print ${(j::)input/(#b)([^A-Za-z0-9_.!~*\'\(\)-])/%${(l:2::0:)$(([##16]#match))}}
3661 #f5# Install x-lite (VoIP software)
3663 setopt local_options
3665 [[ -d ~/tmp ]] || mkdir ~/tmp
3668 echo "Downloading http://www.counterpath.com/download/X-Lite_Install.tar.gz and storing it in ~/tmp:"
3669 if wget http://www.counterpath.com/download/X-Lite_Install.tar.gz ; then
3670 unp X-Lite_Install.tar.gz && echo done || echo failed
3672 echo "Error while downloading." ; return 1
3675 if [[ -x xten-xlite/xtensoftphone ]] ; then
3676 echo "Execute xten-xlite/xtensoftphone to start xlite."
3682 setopt local_options
3684 echo "Downloading debian package of skype."
3685 echo "Notice: If you want to use a more recent skype version run 'getskypebeta'."
3686 wget http://www.skype.com/go/getskype-linux-deb
3687 $SUDO dpkg -i skype*.deb && echo "skype installed."
3690 #f5# Install beta-version of skype
3692 setopt local_options
3694 echo "Downloading debian package of skype (beta version)."
3695 wget http://www.skype.com/go/getskype-linux-beta-deb
3696 $SUDO dpkg -i skype-beta*.deb && echo "skype installed."
3699 #f5# Install gizmo (VoIP software)
3701 setopt local_options
3703 echo "libgtk2.0-0, gconf2, libstdc++6, libasound2 and zlib1g have to be available. Installing."
3704 $SUDO apt-get update
3705 $SUDO apt-get install libgtk2.0-0 gconf2 libstdc++6 libasound2 zlib1g
3706 wget "$(lynx --dump http://gizmo5.com/pc/download/linux/ | awk '/libstdc\+\+6.*\.deb/ {print $2}')"
3707 $SUDO dpkg -i gizmo-project*.deb && echo "gizmo installed."
3710 #f5# Get and run AIR (Automated Image and Restore)
3712 setopt local_options
3714 [[ -w . ]] || { echo 'Error: you do not have write permissions in this directory. Exiting.' ; return 1 }
3716 wget http://puzzle.dl.sourceforge.net/sourceforge/air-imager/air-$VER.tar.gz
3717 tar zxf air-$VER.tar.gz
3719 INTERACTIVE=no $SUDO ./install-air-1.2.8
3720 [[ -x /usr/local/bin/air ]] && [[ -n "$DISPLAY" ]] && $SUDO air
3723 #f5# Get specific git commitdiff
3725 if [[ -z $GITTREE ]] ; then
3726 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3728 if ! [[ -z $1 ]] ; then
3729 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commitdiff;h=$1"
3731 echo "Usage: git-get-diff <commit>"
3735 #f5# Get specific git commit
3737 if [[ -z $GITTREE ]] ; then
3738 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3740 if ! [[ -z $1 ]] ; then
3741 ${=BROWSER} "http://kernel.org/git/?p=$GITTREE;a=commit;h=$1"
3743 echo "Usage: git-get-commit <commit>"
3747 #f5# Get specific git diff
3748 git-get-plaindiff () {
3749 if [[ -z $GITTREE ]] ; then
3750 GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
3752 if [[ -z $1 ]] ; then
3753 echo 'Usage: git-get-plaindiff '
3755 echo -n "Downloading $1.diff ... "
3756 # avoid "generating ..." stuff from kernel.org server:
3757 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O /dev/null
3758 wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O $1.diff \
3759 && echo done || echo failed
3764 # http://strcat.de/blog/index.php?/archives/335-Software-sauber-deinstallieren...html
3765 #f5# Log 'make install' output
3767 [[ ! -d ~/.errorlogs ]] && mkdir ~/.errorlogs
3768 make -n install > ~/.errorlogs/${PWD##*/}-makelog
3771 #f5# Indent source code
3773 indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs $*
3776 # highlight important stuff in diff output, usage example: hg diff | hidiff
3777 #m# a2 hidiff \kbd{histring} oneliner for diffs
3778 check_com -c histring && \
3779 alias hidiff="histring -fE '^Comparing files .*|^diff .*' | histring -c yellow -fE '^\-.*' | histring -c green -fE '^\+.*'"
3781 # rename pictures based on information found in exif headers
3782 #f5# Rename pictures based on information found in exif headers
3784 if [[ $# -lt 1 ]] ; then
3785 echo 'Usage: jpgrename $FILES' >& 2
3788 echo -n 'Checking for jhead with version newer than 1.9: '
3789 jhead_version=`jhead -h | grep 'used by most Digital Cameras. v.*' | awk '{print $6}' | tr -d v`
3790 if [[ $jhead_version > '1.9' ]]; then
3791 echo 'success - now running jhead.'
3792 jhead -n%Y-%m-%d_%Hh%M_%f $*
3794 echo 'failed - exiting.'
3799 # open file in vim and jump to line
3800 # http://www.downgra.de/archives/2007/05/08/T19_21_11/
3803 params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23'
3804 params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n'
3808 # get_ic() - queries imap servers for capabilities; real simple. no imaps
3811 if [[ ! -z $1 ]] ; then
3813 print "querying imap server on $1:${port}...\n";
3814 print "a1 capability\na2 logout\n" | nc $1 ${port}
3816 print "usage:\n $0 <imap-server> [port]"
3820 # creates a Maildir/ with its {new,cur,tmp} subdirs
3823 root=${MAILDIR_ROOT:-${HOME}/Mail}
3824 if [[ -z ${1} ]] ; then print "Usage:\n $0 <dirname>" ; return 1 ; fi
3826 mkdir -p ${root}/${subdir}/{cur,new,tmp}
3829 # xtrename() rename xterm from within GNU-screen
3831 if [[ -z ${DISPLAY} ]] ; then
3832 printf 'xtrename only makes sense in X11.\n'
3835 if [[ -z ${1} ]] ; then
3836 printf 'usage: xtrename() "title for xterm"\n'
3837 printf ' renames the title of xterm from _within_ screen.\n'
3838 printf ' Also works without screen.\n'
3841 print -n "\eP\e]0;${1}\C-G\e\\"
3845 # hl() highlighted less
3846 # http://ft.bewatermyfriend.org/comp/data/zsh/zfunct.html
3847 if check_com -c highlight ; then
3850 theme=${HL_THEME:-""}
3853 ( printf 'available languages (syntax parameter):\n\n' ;
3854 highlight --list-langs ; ) | less -SMr
3857 ( printf 'available themes (style parameter):\n\n' ;
3858 highlight --list-themes ; ) | less -SMr
3861 printf 'usage: hl <syntax[:theme]> <file>\n'
3862 printf ' available options: --list (-l), --themes (-t), --help (-h)\n\n'
3863 printf ' Example: hl c main.c\n'
3866 if [[ -z ${2} ]] || (( ${#argv} > 2 )) ; then
3867 printf 'usage: hl <syntax[:theme]> <file>\n'
3868 printf ' available options: --list (-l), --themes (-t), --help (-h)\n'
3869 (( ${#argv} > 2 )) && printf ' Too many arguments.\n'
3873 [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
3874 if [[ -n ${theme} ]] ; then
3875 highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
3877 highlight --ansi --syntax ${lang} ${2} | less -SMr
3883 # ... and a proper completion for hl()
3884 # needs 'highlight' as well, so it fits fine in here.
3885 function _hl_genarg() {
3887 if [[ -prefix 1 *: ]] ; then
3889 themes=(${${${(f)"$(LC_ALL=C highlight --list-themes)"}/ #/}:#*(Installed|Use name)*})
3891 _wanted -C list themes expl theme compadd ${themes}
3894 langs=(${${${(f)"$(LC_ALL=C highlight --list-langs)"}/ #/}:#*(Installed|Use name)*})
3895 _wanted -C list languages expl languages compadd -S ':' -q ${langs}
3898 function _hl_complete() {
3899 _arguments -s '1: :_hl_genarg' '2:files:_path_files'
3901 compdef _hl_complete hl
3904 # create small urls via tinyurl.com using wget, grep and sed
3906 [[ -z ${1} ]] && print "please give an url to shrink." && return 1
3908 local tiny="http://tinyurl.com/create.php?url="
3909 #print "${tiny}${url}" ; return
3913 | grep -Eio 'value="(http://tinyurl.com/.*)"' \
3914 | sed 's/value=//;s/"//g'
3917 #f2# Print a specific line of file(s).
3920 if [ $# -lt 2 ] ; then
3921 print "Usage: linenr <number>[,<number>] <file>" ; return 1
3922 elif [ $# -eq 2 ] ; then
3925 command ed -s $file <<< "${number}n"
3929 for file in "$@" ; do
3930 if [ ! -d $file ] ; then
3932 command ed -s $file <<< "${number}n" 2> /dev/null
3941 #f2# Find history events by search pattern and list them by date.
3944 local usage help ident format_l format_s first_char remain first last
3945 usage='USAGE: whatwhen [options] <searchstring> <search range>'
3946 help='Use' \`'whatwhen -h'\'' for further explanations.'
3947 ident=${(l,${#${:-Usage: }},, ,)}
3948 format_l="${ident}%s\t\t\t%s\n"
3949 format_s="${format_l//(\\t)##/\\t}"
3950 # Make the first char of the word to search for case
3951 # insensitive; e.g. [aA]
3952 first_char=[${(L)1[1]}${(U)1[1]}]
3954 # Default search range is `-100'.
3956 # Optional, just used for `<first> <last>' given.
3960 printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
3961 printf '%s\n%s\n\n' ${usage} ${help} && return 1
3964 printf '%s\n\n' ${usage}
3966 printf $format_l '-h' 'show help text'
3968 print 'SEARCH RANGE:'
3969 printf $format_l "'0'" 'the whole history,'
3970 printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
3971 printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
3972 printf '\n%s\n' 'EXAMPLES:'
3973 printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
3974 printf $format_l 'whatwhen zsh -250'
3975 printf $format_l 'whatwhen foo 1 99'
3978 printf '%s\n%s\n\n' ${usage} ${help} && return 1
3981 # -l list results on stout rather than invoking $EDITOR.
3982 # -i Print dates as in YYYY-MM-DD.
3983 # -m Search for a - quoted - pattern within the history.
3984 fc -li -m "*${first_char}${remain}*" $first $last
3990 # change fluxbox keys from 'Alt-#' to 'Alt-F#' and vice versa
3992 [[ -n "$FLUXKEYS" ]] || local FLUXKEYS="$HOME/.fluxbox/keys"
3993 if ! [[ -r "$FLUXKEYS" ]] ; then
3994 echo "Sorry, \$FLUXKEYS file $FLUXKEYS could not be read - nothing to be done."
3997 if grep -q 'Mod1 F[0-9] :Workspace [0-9]' $FLUXKEYS ; then
3998 echo -n 'Switching to Alt-# mode in ~/.fluxbox/keys: '
3999 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)F\([0-9]\+[: space :]\+:Workspace.*\)|\1\2|' $FLUXKEYS && echo done || echo failed
4000 elif grep -q 'Mod1 [0-9] :Workspace [0-9]' $FLUXKEYS ; then
4001 echo -n 'Switching to Alt-F# mode in ~/.fluxbox/keys: '
4002 sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)\([0-9]\+[: space :]\+:Workspace.*\)|\1F\2|' $FLUXKEYS && echo done || echo failed
4004 echo 'Sorry, do not know what to do.'
4010 # retrieve weather information on the console
4011 # Usage example: 'weather LOWG'
4014 print 'Usage: weather <station_id>' >&2
4015 print 'List of stations: http://en.wikipedia.org/wiki/List_of_airports_by_ICAO_code'>&2
4019 local PLACE="${1:u}"
4020 local FILE="$HOME/.weather/$PLACE"
4021 local LOG="$HOME/.weather/log"
4023 [[ -d $HOME/.weather ]] || {
4024 print -n "Creating $HOME/.weather: "
4025 mkdir $HOME/.weather
4029 print "Retrieving information for ${PLACE}:"
4031 wget -T 10 --no-verbose --output-file=$LOG --output-document=$FILE --timestamping http://weather.noaa.gov/pub/data/observations/metar/decoded/$PLACE.TXT
4033 if [[ $? -eq 0 ]] ; then
4034 if [[ -n "$VERBOSE" ]] ; then
4037 DATE=$(grep 'UTC' $FILE | sed 's#.* /##')
4038 TEMPERATURE=$(awk '/Temperature/ { print $4" degree Celcius / " $2" degree Fahrenheit" }' $FILE| tr -d '(')
4040 echo "temp: $TEMPERATURE"
4043 print "There was an error retrieving the weather information for $PLACE" >&2
4050 # mercurial related stuff {{{
4051 if check_com -c hg ; then
4052 # gnu like diff for mercurial
4053 # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
4054 #f5# GNU like diff for mercurial
4056 for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
4059 # build debian package
4060 #a2# Alias for \kbd{hg-buildpackage}
4061 alias hbp='hg-buildpackage'
4063 # execute commands on the versioned patch-queue from the current repos
4064 alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
4066 # diffstat for specific version of a mercurial repository
4067 # hgstat => display diffstat between last revision and tip
4068 # hgstat 1234 => display diffstat between revision 1234 and tip
4069 #f5# Diffstat for specific version of a mercurial repos
4071 [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
4074 #f5# Get current mercurial tip via hg itself
4076 setopt local_options
4078 if [[ -f mercurial-tree/.hg ]] ; then
4080 echo "Running hg pull for retreiving latest version..."
4082 echo "Finished update. Building mercurial"
4084 echo "Setting \$PATH to $PWD:\$PATH..."
4085 export PATH="$PWD:$PATH"
4087 echo "Downloading mercurial via hg"
4088 hg clone http://selenic.com/repo/hg mercurial-tree
4090 echo "Building mercurial"
4092 echo "Setting \$PATH to $PWD:\$PATH..."
4093 export PATH="$PWD:$PATH"
4094 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4095 # echo "Setting \$PYTHONPATH to PYTHONPATH=\${HOME}/lib/python,"
4096 # export PYTHONPATH=${HOME}/lib/python
4100 fi # end of check whether we have the 'hg'-executable
4102 # get current mercurial snapshot
4103 #f5# Get current mercurial snapshot
4105 setopt local_options
4107 if [[ -f mercurial-snapshot.tar.gz ]] ; then
4108 echo "mercurial-snapshot.tar.gz exists already, skipping download."
4110 echo "Downloading mercurial snapshot"
4111 wget http://www.selenic.com/mercurial/mercurial-snapshot.tar.gz
4113 echo "Unpacking mercurial-snapshot.tar.gz"
4114 tar zxf mercurial-snapshot.tar.gz
4115 cd mercurial-snapshot/
4116 echo "Installing required build-dependencies"
4117 $SUDO apt-get update
4118 $SUDO apt-get install python2.4-dev
4119 echo "Building mercurial"
4121 echo "Setting \$PATH to $PWD:\$PATH..."
4122 export PATH="$PWD:$PATH"
4123 echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
4127 # some useful commands often hard to remember - let's grep for them {{{
4129 # Work around ion/xterm resize bug.
4130 #if [[ "$SHLVL" -eq 1 ]]; then
4131 # if check_com -c resize ; then
4132 # eval `resize </dev/null`
4137 # /usr/bin/jackd -dalsa -dhw:0 -r48000 -p1024 -n2
4138 # now play audio file:
4139 # alsaplayer -o jack foobar.mp3
4141 # send files via netcat
4143 # send() {j=$*; tar cpz ${j/%${!#}/}|nc -w 1 ${!#} 51330;}
4145 # alias receive='nc -vlp 51330 | tar xzvp'
4148 # dh_make -e foo@localhost -f $1
4149 # dpkg-buildpackage -rfakeroot
4151 # dpkg-scanpackages ./ /dev/null | gzip > Packages.gz
4152 # dpkg-scansources . | gzip > Sources.gz
4153 # grep-dctrl --field Maintainer $* /var/lib/apt/lists/*
4156 # convert -geometry 200x200 -interlace LINE -verbose
4157 # ldapsearch -x -b "OU=Bedienstete,O=tug" -h ldap.tugraz.at sn=$1
4158 # ps -ao user,pcpu,start,command
4159 # gpg --keyserver blackhole.pca.dfn.de --recv-keys
4160 # xterm -bg black -fg yellow -fn -misc-fixed-medium-r-normal--14-140-75-75-c-90-iso8859-15 -ah
4161 # nc -vz $1 1-1024 # portscan via netcat
4162 # wget --mirror --no-parent --convert-links
4164 # autoload -U tetris; zle -N tetris; bindkey '...' ; echo "press ... for playing tennis"
4166 # modify console cursor
4167 # see http://www.tldp.org/HOWTO/Framebuffer-HOWTO-5.html
4168 # print $'\e[?96;0;64c'
4171 # grml-small cleanups {{{
4173 # The following is used to remove zsh-config-items that do not work
4174 # in grml-small by default.
4175 # If you do not want these adjustments (for whatever reason), set
4176 # $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
4177 # sources if it is there).
4179 if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
4182 unalias 'V' &> /dev/null
4183 unfunction vman &> /dev/null
4184 unfunction vimpm &> /dev/null
4185 unfunction vimhelp &> /dev/null
4186 unfunction viless &> /dev/null
4187 unfunction 2html &> /dev/null
4189 # manpages are not in grmlsmall
4190 unfunction manzsh &> /dev/null
4191 unalias man2 &> /dev/null
4192 unalias man &> /dev/null
4193 unfunction man2 &> /dev/null
4199 # finally source a local zshrc {{{
4201 # this allows us to stay in sync with grml's zshrc and put own
4202 # modifications in ~/.zshrc.local
4204 xsource "${HOME}/.zshrc.local"
4208 ### doc strings for external functions from files {{{
4209 #m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)
4212 ## END OF FILE #################################################################
4213 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4