Add new function ansi-colors()
[grml-etc-core.git] / etc / skel / .zshrc
index a8eb452..630272e 100644 (file)
@@ -3,23 +3,30 @@
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Don Dez 06 23:27:51 CET 2007 [mika]
+# Latest Change: Sat Jan 26 11:55:04 CET 2008
 ################################################################################
 
 # source ~/.zshrc.global {{{
+
 # see /etc/zsh/zshrc for some general settings
 # If you don't have write permissions to /etc/zsh/zshrc on your own
 # copy the file to your $HOME as /.zshrc.global and we source it:
-if type xsource &>/dev/null ; then
-   xsource "${HOME}/.zshrc.global"
-else
-   . "${HOME}/.zshrc.global"
-fi
+
+# Note, that xsource() is defined in the global file, so here,
+# we will have to do the sourcing manually for once:
+
+[[ -z "$ZSHRC_GLOBAL_HAS_BEEN_READ" ]]  \
+&& [[ -r "${HOME}/.zshrc.global" ]]     \
+&& source "${HOME}/.zshrc.global"
 # }}}
 
 # check whether global file has been read {{{
 if [[ -z "$ZSHRC_GLOBAL_HAS_BEEN_READ" ]] ; then
-    print 'Warning: global zsh config has not been read'>&2
+    print 'Warning: global zsh config has not been read.' >&2
+    print '         prepare for possible errors!'         >&2
+    print '' >&2
+    print 'See our refcard for info on how to get the complete configuration:' >&2
+    print '    <http://grml.org/zsh/grml-zsh-refcard.pdf>' >&2
 fi
 # }}}
 
@@ -31,6 +38,7 @@ fi
 
 # completion system {{{
 # just make sure it is loaded in this file too
+# TODO: is this *really* needed? compsys should be run in the global zshrc already.
 check_com compinit || { autoload -U compinit && compinit }
 # }}}
 
@@ -56,8 +64,6 @@ if [[ -z "$BROWSER" ]] ; then
         check_com -c w3m && export BROWSER=w3m
     fi
 fi
-#v#
-(( ${+PAGER} )) || export PAGER="less"
 
 #m# v QTDIR \kbd{/usr/share/qt[34]}\quad [for non-root only]
 [[ -d /usr/share/qt3 ]] && export QTDIR=/usr/share/qt3
@@ -253,7 +259,25 @@ fi
 #f4# Search for newspostings from authors
 agoogle() { ${=BROWSER} "http://groups.google.com/groups?as_uauthors=$*" ; }
 #f4# Search Debian Bug Tracking System by BugID in mbox format
-debbug()  { ${=BROWSER} "http://bugs.debian.org/$*" }
+debbug()  { 
+    setopt localoptions extendedglob
+    if [[ $# -eq 1 ]]; then
+        case "$1" in
+            ([0-9]##)
+            ${=BROWSER} "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
+            ;;
+            (*@*)
+            ${=BROWSER} "http://bugs.debian.org/cgi-bin/pkgreport.cgi?submitter=$1"
+            ;;
+            (*)
+            ${=BROWSER} "http://bugs.debian.org/$*"
+            ;;
+        esac
+    else
+        print "$0 needs one argument"
+        return 1
+    fi
+}
 #f4# Search Debian Bug Tracking System
 debbugm() { bts show --mbox $1 } # provide bugnummer as "$1"
 #f4# Search DMOZ
@@ -575,6 +599,7 @@ show-archive() {
             *.tgz)         tar -ztf $1 ;;
             *.zip)         unzip -l $1 ;;
             *.bz2)         bzless $1 ;;
+            *.deb)         dpkg-deb --fsys-tarfile $1 | tar -tf - -- ;;
             *)             echo "'$1' Error. Please go away" ;;
         esac
     else
@@ -582,39 +607,6 @@ show-archive() {
     fi
 }
 
-# TODO: isn't ssl() like this, but clean?
-#       I'd like to remove this, it's a gross hack, IMHO -ft
-#f5# Follow symlinks
-folsym() {
-    if [[ -e $1 || -h $1 ]] ; then
-        file=$1
-    else
-        file=`which $1`
-    fi
-    if [[ -e $file || -L $file ]] ; then
-        if [[ -L $file ]] ; then
-            echo `ls -ld $file | perl -ane 'print $F[7]'` '->'
-            folsym `perl -le '$file = $ARGV[0];
-                              $dest = readlink $file;
-                              if ($dest !~ m{^/}) {
-                                  $file =~ s{(/?)[^/]*$}{$1$dest};
-                              } else {
-                                  $file = $dest;
-                              }
-                              $file =~ s{/{2,}}{/}g;
-                              while ($file =~ s{[^/]+/\.\./}{}) {
-                                  ;
-                              }
-                              $file =~ s{^(/\.\.)+}{};
-                              print $file' $file`
-        else
-            ls -d $file
-        fi
-    else
-        echo $file
-    fi
-}
-
 # It's shameless stolen from <http://www.vim.org/tips/tip.php?tip_id=167>
 #f5# Use \kbd{vim} as your manpage reader
 vman() { man $* | col -b | view -c 'set ft=man nomod nolist' - }
@@ -631,6 +623,22 @@ readme() {
     fi
 }
 
+# function ansi-colors()
+#f5# Display ANSI colors
+ansi-colors() {
+    typeset esc="\033[" line1 line2
+    echo " _ _ _40 _ _ _41_ _ _ _42 _ _ 43_ _ _ 44_ _ _45 _ _ _ 46_ _ _ 47_ _ _ 49_ _"
+    for fore in 30 31 32 33 34 35 36 37; do
+        line1="$fore "
+        line2="   "
+        for back in 40 41 42 43 44 45 46 47 49; do
+            line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"
+            line2="${line2}${esc}${back};${fore};1m Bold   ${esc}0m"
+        done
+        echo -e "$line1\n$line2"
+    done
+}
+
 # suidfind() { ls -latg $path | grep '^...s' }
 #f5# Find all files in \$PATH with setuid bit set
 suidfind() { ls -latg $path/*(sN) }
@@ -886,17 +894,22 @@ git-get-commit() {
 }
 
 #f5# Get specific git diff
-git-get-plaindiff() {
+git-get-plaindiff () {
     if [[ -z $GITTREE ]] ; then
-        GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
+       GITTREE='linux/kernel/git/torvalds/linux-2.6.git'
     fi
-    if [[ -z $1 ]] ; then
-        wget "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O $1.diff
+    if [[ -z $1 ]] ; then
+       echo 'Usage: git-get-plaindiff '
     else
-        echo 'Usage: git-get-plaindiff '
+       echo -n "Downloading $1.diff ... "
+       # avoid "generating ..." stuff from kernel.org server:
+       wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O /dev/null
+       wget --quiet "http://kernel.org/git/?p=$GITTREE;a=commitdiff_plain;h=$1" -O $1.diff \
+            && echo done || echo failed
     fi
 }
 
+
 # http://strcat.de/blog/index.php?/archives/335-Software-sauber-deinstallieren...html
 #f5# Log 'make install' output
 mmake() {
@@ -1050,6 +1063,55 @@ zurl() {
         | sed 's/value=//;s/"//g'
 }
 
+#f2# Find history events by search pattern and list them by date.
+whatwhen()  {
+# {{{
+    local usage help ident format_l format_s first_char remain first last
+    usage='USAGE: whatwhen [options] <searchstring> <search range>'
+    help='Use' \`'whatwhen -h'\'' for further explanations.'
+    ident=${(l,${#${:-Usage: }},, ,)}
+    format_l="${ident}%s\t\t\t%s\n"
+    format_s="${format_l//(\\t)##/\\t}"
+    # Make the first char of the word to search for case
+    # insensitive; e.g. [aA]
+    first_char=[${(L)1[1]}${(U)1[1]}]
+    remain=${1[2,-1]}
+    # Default search range is `-100'.
+    first=${2:-\-100}
+    # Optional, just used for `<first> <last>' given.
+    last=$3
+    case $1 in
+        ("")
+            printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
+            printf '%s\n%s\n\n' ${usage} ${help} && return 1
+        ;;
+        (-h)
+            printf '%s\n\n' ${usage}
+            print 'OPTIONS:'
+            printf $format_l '-h' 'show help text'
+            print '\f'
+            print 'SEARCH RANGE:'
+            printf $format_l "'0'" 'the whole history,'
+            printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
+            printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
+            printf '\n%s\n' 'EXAMPLES:'
+            printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
+            printf $format_l 'whatwhen zsh -250'
+            printf $format_l 'whatwhen foo 1 99'
+        ;;
+        (\?)
+            printf '%s\n%s\n\n' ${usage} ${help} && return 1
+        ;;
+        (*)
+            # -l list results on stout rather than invoking $EDITOR.
+            # -i Print dates as in YYYY-MM-DD.
+            # -m Search for a - quoted - pattern within the history.
+            fc -li -m "*${first_char}${remain}*" $first $last
+        ;;
+    esac
+# }}}
+}
+
 # change fluxbox keys from 'Alt-#' to 'Alt-F#' and vice versa
 fluxkey-change() {
     [[ -n "$FLUXKEYS" ]] || local FLUXKEYS="$HOME/.fluxbox/keys"
@@ -1075,6 +1137,7 @@ fluxkey-change() {
 weather() {
     [[ -n "$1" ]] || {
         print 'Usage: weather <station_id>' >&2
+        print 'List of stations: http://en.wikipedia.org/wiki/List_of_airports_by_ICAO_code'>&2
         return 1
     }
 
@@ -1107,8 +1170,6 @@ weather() {
         return 1
     fi
 }
-
-
 # }}}
 
 # mercurial related stuff {{{
@@ -1247,11 +1308,7 @@ gethgsnap() {
 # this allows us to stay in sync with /etc/skel/.zshrc
 # through 'ln -s /etc/skel/.zshrc ~/.zshrc' and put own
 # modifications in ~/.zshrc.local
-if type xsource &>/dev/null ; then
-    xsource "${HOME}/.zshrc.local"
-else
-    . "${HOME}/.zshrc.local"
-fi
+xsource "${HOME}/.zshrc.local"
 
 # ...and remove utility functions again.
 xunfunction