+#f5# Rename pictures based on information found in exif headers
+exirename() {
+ if [[ $# -lt 1 ]] ; then
+ echo 'Usage: jpgrename $FILES' >& 2
+ return 1
+ else
+ echo -n 'Checking for jhead with version newer than 1.9: '
+ jhead_version=`jhead -h | grep 'used by most Digital Cameras. v.*' | awk '{print $6}' | tr -d v`
+ if [[ $jhead_version > '1.9' ]]; then
+ echo 'success - now running jhead.'
+ jhead -n%Y-%m-%d_%Hh%M_%f $*
+ else
+ echo 'failed - exiting.'
+ fi
+ fi
+}
+
+# open file in vim and jump to line
+# http://www.downgra.de/archives/2007/05/08/T19_21_11/
+j2v() {
+ local -a params
+ params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23'
+ params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n'
+ vim ${params}
+}
+
+# get_ic() - queries imap servers for capabilities; real simple. no imaps
+ic_get() {
+ local port
+ if [[ ! -z $1 ]] ; then
+ port=${2:-143}
+ print "querying imap server on $1:${port}...\n";
+ print "a1 capability\na2 logout\n" | nc $1 ${port}
+ else
+ print "usage:\n $0 <imap-server> [port]"
+ fi
+}
+
+# creates a Maildir/ with its {new,cur,tmp} subdirs
+mkmaildir() {
+ local root subdir
+ root=${MAILDIR_ROOT:-${HOME}/Mail}
+ if [[ -z ${1} ]] ; then print "Usage:\n $0 <dirname>" ; return 1 ; fi
+ subdir=${1}
+ mkdir -p ${root}/${subdir}/{cur,new,tmp}
+}
+
+# xtrename() rename xterm from within GNU-screen
+xtrename() {
+ if [[ -z ${DISPLAY} ]] ; then
+ printf 'xtrename only makes sense in X11.\n'
+ return 1
+ fi
+ if [[ -z ${1} ]] ; then
+ printf 'usage: xtrename() "title for xterm"\n'
+ printf ' renames the title of xterm from _within_ screen.\n'
+ printf ' Also works without screen.\n'
+ return 0
+ fi
+ print -n "\eP\e]0;${1}\C-G\e\\"
+ return 0
+}
+
+# hl() highlighted less
+# http://ft.bewatermyfriend.org/comp/data/zsh/zfunct.html
+if check_com -c highlight ; then
+ function hl() {
+ local theme lang
+ theme=${HL_THEME:-""}
+ case ${1} in
+ (-l|--list)
+ ( printf 'available languages (syntax parameter):\n\n' ;
+ highlight --list-langs ; ) | less -SMr
+ ;;
+ (-t|--themes)
+ ( printf 'available themes (style parameter):\n\n' ;
+ highlight --list-themes ; ) | less -SMr
+ ;;
+ (-h|--help)
+ printf 'usage: hl <syntax[:theme]> <file>\n'
+ printf ' available options: --list (-l), --themes (-t), --help (-h)\n\n'
+ printf ' Example: hl c main.c\n'
+ ;;
+ (*)
+ if [[ -z ${2} ]] || (( ${#argv} > 2 )) ; then
+ printf 'usage: hl <syntax[:theme]> <file>\n'
+ printf ' available options: --list (-l), --themes (-t), --help (-h)\n'
+ (( ${#argv} > 2 )) && printf ' Too many arguments.\n'
+ return 1
+ fi
+ lang=${1%:*}
+ [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
+ if [[ -n ${theme} ]] ; then
+ highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
+ else
+ highlight --ansi --syntax ${lang} ${2} | less -SMr
+ fi
+ ;;
+ esac
+ return 0
+ }
+ # ... and a proper completion for hl()
+ # needs 'highlight' as well, so it fits fine in here.
+ function _hl_genarg() {
+ local expl
+ if [[ -prefix 1 *: ]] ; then
+ local themes
+ themes=(${${${(f)"$(LC_ALL=C highlight --list-themes)"}/ #/}:#*(Installed|Use name)*})
+ compset -P 1 '*:'
+ _wanted -C list themes expl theme compadd ${themes}
+ else
+ local langs
+ langs=(${${${(f)"$(LC_ALL=C highlight --list-langs)"}/ #/}:#*(Installed|Use name)*})
+ _wanted -C list languages expl languages compadd -S ':' -q ${langs}
+ fi
+ }
+ function _hl_complete() {
+ _arguments -s '1: :_hl_genarg' '2:files:_path_files'
+ }
+ compdef _hl_complete hl
+fi
+
+# create small urls via tinyurl.com using wget, grep and sed
+zurl() {
+ [[ -z ${1} ]] && print "please give an url to shrink." && return 1
+ local url=${1}
+ local tiny="http://tinyurl.com/create.php?url="
+ #print "${tiny}${url}" ; return
+ wget -O- \
+ -o/dev/null \
+ "${tiny}${url}" \
+ | grep -Eio 'value="(http://tinyurl.com/.*)"' \
+ | sed 's/value=//;s/"//g'
+}
+
+#f2# Print a specific line of file(s).
+linenr () {
+# {{{
+ if [ $# -lt 2 ] ; then
+ print "Usage: linenr <number>[,<number>] <file>" ; return 1
+ elif [ $# -eq 2 ] ; then
+ local number=$1
+ local file=$2
+ command ed -s $file <<< "${number}n"
+ else
+ local number=$1
+ shift
+ for file in "$@" ; do
+ if [ ! -d $file ] ; then
+ echo "${file}:"
+ command ed -s $file <<< "${number}n" 2> /dev/null
+ else
+ continue
+ fi
+ done | less
+ fi
+# }}}
+}
+
+#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"
+ if ! [[ -r "$FLUXKEYS" ]] ; then
+ echo "Sorry, \$FLUXKEYS file $FLUXKEYS could not be read - nothing to be done."
+ return 1
+ else
+ if grep -q 'Mod1 F[0-9] :Workspace [0-9]' $FLUXKEYS ; then
+ echo -n 'Switching to Alt-# mode in ~/.fluxbox/keys: '
+ sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)F\([0-9]\+[: space :]\+:Workspace.*\)|\1\2|' $FLUXKEYS && echo done || echo failed
+ elif grep -q 'Mod1 [0-9] :Workspace [0-9]' $FLUXKEYS ; then
+ echo -n 'Switching to Alt-F# mode in ~/.fluxbox/keys: '
+ sed -i -e 's|^\(Mod[0-9]\+[: space :]\+\)\([0-9]\+[: space :]\+:Workspace.*\)|\1F\2|' $FLUXKEYS && echo done || echo failed
+ else
+ echo 'Sorry, do not know what to do.'
+ return 1
+ fi
+ fi
+}
+
+# retrieve weather information on the console
+# Usage example: 'weather LOWG'
+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
+ }
+
+ local PLACE="${1:u}"
+ local FILE="$HOME/.weather/$PLACE"
+ local LOG="$HOME/.weather/log"
+
+ [[ -d $HOME/.weather ]] || {
+ print -n "Creating $HOME/.weather: "
+ mkdir $HOME/.weather
+ print 'done'
+ }
+
+ print "Retrieving information for ${PLACE}:"
+ print
+ wget -T 10 --no-verbose --output-file=$LOG --output-document=$FILE --timestamping http://weather.noaa.gov/pub/data/observations/metar/decoded/$PLACE.TXT
+
+ if [[ $? -eq 0 ]] ; then
+ if [[ -n "$VERBOSE" ]] ; then
+ cat $FILE
+ else
+ DATE=$(grep 'UTC' $FILE | sed 's#.* /##')
+ TEMPERATURE=$(awk '/Temperature/ { print $4" degree Celcius / " $2" degree Fahrenheit" }' $FILE| tr -d '(')
+ echo "date: $DATE"
+ echo "temp: $TEMPERATURE"
+ fi