zsh-workers
 help / color / mirror / code / Atom feed
* contribution: 'address' database as zsh script
@ 1999-08-02  3:44 Dominik Vogt
  1999-08-02  5:21 ` Bart Schaefer
  1999-08-02  7:32 ` Bart Schaefer
  0 siblings, 2 replies; 5+ messages in thread
From: Dominik Vogt @ 1999-08-02  3:44 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 387 bytes --]

Hi folks,

here is the script I want to contribute as I mentioned a while
ago. It's a self contained address book and runs with only
zsh (3.0.5) and sed. I've put full documentation at the end
of the script.

Bye

Dominik ^_^

-- 
Dominik Vogt, Hewlett-Packard GmbH, Dept. BVS
Herrenberger Str.130, 71034 Boeblingen, Germany
phone: 07031/14-4596, fax: 07031/14-3883, dominik_vogt@hp.com

[-- Attachment #2: tele --]
[-- Type: text/plain, Size: 27068 bytes --]

#!/bin/zsh
# (c) Dominik Vogt, 12-Jul-1998, domimink.vogt@gmx.de
#
# tele - a (phone) database implemented as a zsh script for zsh 3.0.5. The
# data is part of the script.
#
#
# NOTE: For performance reasons you will find the documentation at the end of
#       this script.
#
#
# COPYRIGHT NOTICE:
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#




###############################################################################
# customizing section                                                         #
###############################################################################

# reserved words: all, com, nl, lots of variable names in UPPERCASE



##### default options #####

# Change these if you like.
#DEFAULT_OPTIONS=(-s -f +o)
# zsh 3.0.5 getopts bug patch
DEFAULT_OPTIONS=(-s -f -O)



##### list of all defined keys #####

# 'nl' must be the first entry and can be used to insert a newline character.
# The value of this key is printed on the new line.
KEYS=(nl tit nam fn sn nn occ cmp add po zip cit pho fax ema web hou bir ban bcn acc cus mis)



##### long form of the keys #####

# The first entry is a mask for the field length. All entries should be exactly
# the same length, end with a space and must be in the same order as in the
# KEYS array.
KEYNAMES=(\
"             " \
"title:       " \
"name:        " \
"first name:  " \
"surname:     " \
"nickname:    " \
"occupation:  " \
"company:     " \
"address:     " \
"PO box:      " \
"zip:         " \
"city:        " \
"phone:       " \
"fax:         " \
"email:       " \
"website:     " \
"hours/busi.: " \
"birthday:    " \
"bank:        " \
"bank code #: " \
"account:     " \
"customer #:  " \
"misc.:       "
)


##### group definitions #####

# Logical groups of keys. Groups are arrays of keynames as defined above in the
# array KEYS. The 'all' group must be defined and must contain all of the keys
# except 'nl' and 'com' which are reserved words. The order of the keys does
# not matter, however. A '\\' prefix to the key names has a special meaning if
# short output format is used (-s option):
#
# (substitute 'current key' for c, 'previous key' for p, 'current group' for g)
#
#   IF   c is in g
#   AND  p ('com' and 'nl' do not count) has been printed also
#   AND  key name of c begins with '\\'
#   AND  p is the same as c or occurs before c in g
#   AND  all keys between p and c begin with '\\' (in g)
#   THEN print current key on the same line as the last one printed.
#
# Note that the '\\' only occurs in the group arrays, not in the database.
# The characters ',;.:' work exactly the same with the exception that they
# will be printed before the space if all above conditions are met.
#
all=(nam tit \\fn \\sn \\nn occ cmp add po zip \\cit pho fax hou ema web bir ban bcn acc cus mis)
add=(add po zip \\cit)
pho=(pho fax hou)
nam=(nam tit \\fn \\sn \\nn)
job=(occ cmp)
per=(bir)
web=(ema web)
acc=(ban bcn acc cus mis)
# Special groups for printable output.
padd=(,add \\po ,zip \\cit)
ppho=(,pho ,fax ,hou)
psn=(nam \\sn)
pfn=(,fn ,tit)



##### list of all defined groups #####

GROUPS=(all nam pho add job per web acc prt)



##### separator symbol #####

# The character in the database used to separate the key names and values.
# You must change it in the function 'break_stanza_lines' manually:
# Replace 's:x:' with 's:y:' where x is the old separator and y the new one.
KEY_SEPARATOR="|"



##### default query #####

# The groups you want to see by default (e.g. name and telephone number).
DEFAULT_QUERY=(nam add pho)



##### default print query #####

# Special default query for the -p option. This is useful if you want to print
# your the whole database (or selected keys) in a compressed format.
PRINT_QUERY=(psn pfn padd ppho)



##### comment setup #####

# The default strings printed before and after a comment.
COM_PREFIX=""
COM_SUFFIX=""




###############################################################################
# do not edit below here                                                      #
###############################################################################

#-------------------------
# zsh configuration
#-------------------------
# reset options
setopt LOCALOPTIONS
emulate -R zsh
setopt EXTENDEDGLOB
setopt SHWORDSPLIT
unsetopt KSHARRAYS
unsetopt FUNCTIONARGZERO
unsetopt ALLEXPORT
# just to make sure
alias echo='builtin echo'
alias read='builtin read'

#-------------------------
# global variables
#-------------------------
local G_CUST=""
# options
local O_ARRAY=""
local O_FAST=""
local O_FORMAT=""
local O_GSEPARATE=""
local O_QTYPE=""
local O_QUERY=""
local G_SEP=""

#-------------------------
# functions
#-------------------------

#-------------------------
# error handling functions
#-------------------------
function usage ()
{
    echo "usage: ${0##*/} [ options ] [ regexp ]"
    if [[ -z "$1" ]] ; then
        echo "       ${0##*/} -h for help"
        exit 2
    else
echo "options:"
echo " -a     Select all keys in the order they appear in KEYS."
echo " -c,+f  Complex search. Search keys as well as record labels."
echo " -C,-D string"
echo "        Specify the string printed before (-C) and after (-D) a comment."
echo " -f,+c  Fast search. Only the record labels are searched."
echo " -g list|group[,group]..."
echo "        'tele -g list' for a list of groups. No spaces must occur"
echo "        between the commas and the groups."
echo " -h     Print this help text."
echo " -k list|key[,key]..."
echo "        'tele -k list' for a list of keys. Keys with a \\-prefix (e.g."
echo "        \\tel are printed on the same line as the previous key if short"
echo "        output format (-s option) is used. No spaces are allowed in the"
echo "        list."
echo " -l     Long output style. Each key is printed on a separate line."
echo " -o,+o,-O  Print keys in the order of the selected groups. Otherwise (or"
echo "        if the +o or -O option is used) the keys are printed in the"
echo "        order they occur in the database."
echo " -p     Format output for printing. No newline is inserted between the"
echo "        groups. Sets the -o option. This may be changed by specifying +o"
echo "        anywhere after the -p option."
echo " -s,+l  Short output style."
echo "default options: $DEFAULT_OPTIONS -g ${(j:,:)DEFAULT_QUERY}"
echo "additional -p default options: -o -g ${(j:,:)PRINT_QUERY}"
        exit
    fi
}

check_group_all ()
{
    if [[ ! $[ ${#all} + 1 ] = ${#KEYS} ]] ; then
echo "ERROR: Group 'all' must contain all elements of 'KEYS' except 'nl'."
echo "Please check your configuration at the beginning of this script."
echo
    fi
}

function list_valid_keys ()
{
    local -i I=2
    local -i J
    local -i PAD

    check_group_all
    if [[ ! ${#KEYS} = ${#KEYNAMES} ]] ; then
echo "ERROR: 'KEYS' and 'KEYNAMES' have a different number of entries!"
echo "Please check your configuration at the beginning of this script."
echo "Possibly offending pairs of key/name:"
echo
        J=${#KEYS}
        (( $J > ${#KEYNAMES} )) && J=${#KEYNAMES}
        I=2
        repeat $J ; do
            if [[ ! ${(L)KEYS[1]} = ${(L)KEYNAMES[1]} ]] ; then
        echo "$KEYS[$I] - ${KEYNAMES[$I]%: *}"
            fi
            I=$I+1
        done
        exit 3
    fi
    echo "valid keys:"
    echo
    PAD=${#KEYNAMES[1]}-1
    repeat $[ (${#KEYS}+1)/3 ] ; do
        echo "  ${(r:5:: :)KEYS[$I]}${(r:$PAD:: :)${(S)KEYNAMES[$I]#:}}\c"
        echo "  ${(r:5:: :)KEYS[$I+1]}${(r:$PAD:: :)${(S)KEYNAMES[$I+1]#:}}\c"
        echo "  ${(r:5:: :)KEYS[$I+2]}${(r:$PAD:: :)${(S)KEYNAMES[$I+2]#:}}"
        I=$I+3
    done
    exit $1
}

function list_valid_groups ()
{
    check_group_all
    echo "valid output groups:"
    echo "  default $GROUPS[@]"
    echo "'default' equals to '$DEFAULT_QUERY'."
    exit $1
}

#-------------------------
# break_stanza_lines
#-------------------------
function break_stanza_lines ()
{
    [[ -n "$S_BROKEN" ]] && return
    S_BROKEN=1
    L_DATA=(${(s:|:)STANZA})
    L_NUM=$[${#L_DATA}/2]
}

#-------------------------
# printing functions
#-------------------------
function print_line_long ()
{
    local S

    [[ -n "$L_PANY" ]] && echo || L_PANY=1
    S=${KEYS[(i)$L_DATA[$LK]]}
    [[ $P_LAST = $S ]] && S=1 || P_LAST=$S
    echo "$KEYNAMES[$S]$L_DATA[$LV]\c"
}

function print_line_short ()
{
    [[ -n "$L_PANY" ]] && echo "$1\c" || L_PANY=1
    echo "$2$L_DATA[$LV]$3\c"
}

function print_stanza ()
{
    local -i I
    local -i J=1
    local -i LK
    local -i LV
    local -i NKEY
    local -i KEY
    local -i K_NUM
    local K_ARRAY
    local S
    local L_PRINTED
    local P_LAST=""

    break_stanza_lines
    # print header
    [[ $O_FORMAT = l ]] && echo "--> $L_DATA[1]"
    # print groups
    repeat $G_NUM ; do
        LK=2
        LV=3
        KEY=1
        S="\$$G_ARRAY[$J]"
        K_ARRAY=( ${(e)S}[@] )
        K_NUM=${#K_ARRAY}
        repeat $L_NUM ; do
            case $L_DATA[$LK] in
            com|nl)
                if [[ -n "$L_PRINTED" ]] ; then
                    if [[ $L_PRINTED = com ]] || [[ $L_DATA[$LK] = nl ]] ; then
                        echo
                        [[ $O_FORMAT = l ]] && echo "$KEYNAMES[1]\c"
                        L_PANY=""
                        print_line_short \\n "$COM_PREFIX" "$COM_SUFFIX"
                        L_PRINTED=com
                    else
                        print_line_short " " "$COM_PREFIX" "$COM_SUFFIX"
                        L_PRINTED=com
                    fi
                fi;;
            **)
                NKEY=${${K_ARRAY}[(i)[\,;.:]#$L_DATA[$LK]]}
                if (( $NKEY > $K_NUM )) || (( $NKEY < 1 )); then
                    L_PRINTED=""
                    KEY=1
                else
                    if [[ $O_FORMAT = l ]] ; then
                        print_line_long
                    elif (( $KEY > $NKEY )) ; then
                        if [[ $O_FORMAT = p ]] ; then
                            case "${K_ARRAY[$NKEY][1]}" in
                            ,|\;|.|:)
                                print_line_short "${K_ARRAY[$NKEY][1]} ";;
                            **) print_line_short "$G_SEP";;
                            esac
                        else
                            print_line_short "$G_SEP"
                        fi
                    else
                        I=$NKEY
                        while true ; do
                            case "${K_ARRAY[$I][1]}" in
                            \\|,|\;|.|:) ;;
                            **) if (( $I > $KEY )) && [[ ! $I = $NKEY ]] ; then
                                    print_line_short "$G_SEP"
                                    break
                                fi;;
                            esac
                            I=$I-1
                            if (( $I <= $KEY )) ; then
                                case "${K_ARRAY[$NKEY][1]}" in
                                \\)  print_line_short " ";;
                                ,|\;|.|:)
                                    print_line_short "${K_ARRAY[$NKEY][1]} ";;
                                **) print_line_short "$G_SEP";;
                                esac
                                break
                            fi
                        done
                    fi
                    KEY=$NKEY
                    L_PRINTED=1
                fi;;
            esac
            LK=$LK+2
            LV=$LV+2
        done
        J=$J+1
    done
}



#-------------------------
# function complex_query
#-------------------------
function complex_query ()
{
###
    [[ -n "${(MS)${(L)STANZA}#${(L)O_QUERY}}" ]]
}



#-------------------------
# parse stanzas
#-------------------------
function parse_stanzas ()
{
    local STANZA=""
    local S_BROKEN=""
    local -i G_NUM
    local -i G_ARNUM
    local -i G_DFNUM
    local S_PANY=""
    local G_ARRAY
    local -i L_NUM
    local L_DATA
    local L_PANY=""
    local K_MERGED=""
    local -i I
    local S
    local T_ARRAY
    local T_NUM

    if [[ -n "$O_GSEPARATE" ]] ; then
        G_ARRAY=($O_ARRAY)
        G_ARNUM=${#G_ARRAY}
    else
        G_ARRAY=(K_MERGED)
        G_ARNUM=1
        I=1
        repeat ${#O_ARRAY} ; do
            S="\$$O_ARRAY[$I]"
            K_MERGED=( $K_MERGED[@] ${(e)S}[@] )
            I=$I+1
        done
    fi
    G_NUM=$G_ARNUM

    # parse input file
    read 'STANZA'
    while [[ -n "$STANZA" ]] ; do
        S_BROKEN=""
        if [[ $O_QTYPE = f ]] || complex_query; then
            if [[ -z "$S_PANY" ]] ; then
                S_PANY=1
            else
                [[ $O_FORMAT = p ]] && echo || echo "\n"
            fi
            L_PANY=""
            print_stanza
            if [[ -z "$L_PANY" ]] ; then
                echo "no keys selected, printing whole record"
                T_ARRAY=($G_ARRAY)
                T_NUM=$G_NUM
                G_ARRAY=(all)
                G_NUM=1
                print_stanza
                G_ARRAY=($T_ARRAY)
                G_NUM=$T_NUM
            fi
        fi
        read 'STANZA'
    done
    [[ -n $S_PANY ]] && echo
}


#-------------------------
# function split_stanzas
#-------------------------
function split_stanzas ()
{
    sed -n "
            bskipline
        :seekhead
            n
        :skipline
            /^EOF$/q
            /^[^[:space:]].*:$/bhead
            bseekhead
        :head
            h
            /$O_FAST/bseektail
            bseekhead
        :seektail
            n
            /^[[:space:]]*$/btail
            s/^\([^$KEY_SEPARATOR]*\)$/\1|/g
            H
            bseektail
        :tail
            x
            s/\n[[:space:]]*/$KEY_SEPARATOR/g
            s/$KEY_SEPARATOR$KEY_SEPARATOR/$KEY_SEPARATOR $KEY_SEPARATOR/g
            p
            x
            bseekhead
    "
}

#-------------------------
# parse options
#-------------------------
local -i I
local S
while getopts ":acC:D:fg:hk:loOps" OPT $DEFAULT_OPTIONS $*; do
    case $OPT in
    a)  O_ARRAY=(all);;
    c|+f)
        O_QTYPE=c;;
    C)  COM_PREFIX="$OPTARG";;
    D)  COM_SUFFIX="$OPTARG";;
    f|+c)
        O_QTYPE=f;;
    g)  [[ -z "$OPTARG" ]] && list_valid_groups 0
        if [[ $OPTARG = default ]] ; then
            O_ARRAY=( $DEFAULT_QUERY[@] )
            break
        fi
        I=${#O_ARRAY}+1
        O_ARRAY=( $O_ARRAY[@] ${(s:,:)OPTARG} )
        repeat $[ ${#O_ARRAY} - $I + 1 ] ; do
            S=${${GROUPS}[(i)${O_ARRAY[$I]}]}
            if (( $S < 1 )) || (( $S > ${#GROUPS} )) ; then
                [[ $O_ARRAY[$I] = list ]] ||
		    echo "invalid group $O_ARRAY[$I]" >&2
                list_valid_groups 2
            fi
            I=$I+1
        done;;
    h)  usage help;;
    k)  [[ -z "$OPTARG" ]] && list_valid_keys 0
        I=${#G_CUST}+1
        G_CUST=( $G_CUST[@] ${(s:,:)OPTARG} )
        repeat $[ ${#G_CUST} - $I + 1 ] ; do
            S=${${KEYS}[(i)${G_CUST[$I]#+}]}
            if (( $S < 2 )) || (( $S > ${#KEYS} )) ; then
                [[ $G_CUST[$I] = list ]] ||
		    echo "invalid key $G_CUST[$I]" >&2
                list_valid_keys 2
            fi
            I=$I+1
        done;;
    l|+s)
        G_SEP=\\n
        O_FORMAT=l;;
    o)  O_GSEPARATE=1;;
    O|+o)
        O_GSEPARATE="";;
    p)  O_FORMAT=p
        O_GSEPARATE=1
        G_SEP=" "
        O_ARRAY=( $PRINT_QUERY[@] );;
    s|+l)
        G_SEP=\\n
        O_FORMAT=s;;
    **) echo "illegal option '${OPTARG:-$OPT}'" >&2
        usage;;
    esac
done

OPTIND=$[ $OPTIND - ${#DEFAULT_OPTIONS} ]
if (( $# > $OPTIND )) ; then
    # trailing parameters?
    echo "trailing parameters after pattern '$argv[$OPTIND]'" >&2
    usage
elif [[ $O_QTYPE = f ]] ; then
    # fast search
    O_FAST="${(L)${argv[$OPTIND]}}"
else
    # complex search
    O_QUERY="$argv[$OPTIND]"
fi

# output groups
if [[ ! ${#G_CUST} = 0 ]] ; then
    O_ARRAY=(G_CUST)
elif [[ ${#O_ARRAY} = 0 ]] ; then
    O_ARRAY=($DEFAULT_QUERY)
fi

#-------------------------
# beginning of data
#-------------------------
# pipe the data group to the parse function (the braces are necessary here)
#{ split_stanzas } <<- "EOF"
{ split_stanzas | parse_stanzas } <<- "EOF"
fvwm (fvwm-workers):
	nam|fvwm
	web|http://fvwm.org
	com|fvwm home page
	web|ftp://fvwm.org/pub/fvwm/
	com|ftp site
	web|http://fvwm.org/fvwm-cats/
	com|fvwm cats page
	ema|fvwm@fvwm.org
	ema|fvwm-workers@fvwm.org
	ema|fvwm-announce@fvwm.org

suse gmbh (suse, linux):
	nam|SuSE GmbH (SuSE Linux)
	pho|0911/7406331
	fax|0911/7417755
	com|Fax
	add|Schanzaeckerstr. 10
	zip|90443
	cit|Nuernberg
	acc|115569
	web|www.suse.de

universitaet dortmund, unido:
	nam|University Dortmund (UniDo)
	pho|0231/7551
	com|Central
	pho|0231/7552256
	com|Students office (Emil-Figge Str. 66)
	add|Emil-Figge Str.
	zip|44221
	cit|Dortmund

vogt, dominik (domivogt):
	fn|Dominik
	sn|Vogt
	nn|Avatar
	occ|fvwm hacker and zsh fanatic
	cmp|fvwm-workers mailing list :-)
	cit|Althengstett
	ema|dominik.vogt@gmx.de
	web|http://fvwm.org

EOF
# The last line before the EOF *must* be empty or the last stanza
# will not be used!!





#                             DOCUMENTATION
#
#
# Note:
#
#   You can find detailed examples at the end of this documentation.
#
# OVERVIEW:
#
#   This script implements a database based solely on zsh functionality. The
#   only external program used is sed (for performace reasons only). The
#   purpose of this script is to provide a small, fast, extendable and portable
#   database. It began as a simple phone and address database, but I added new
#   types of datasets as I needed them. Today I use it for all the data and
#   numbers that were strewn over piles of paper, booklets and files. You can
#   run this script on any platform that provides a bug free sed command.
#   Should this not work you can still 'vi =tele' this file and look up the
#   needed record yourself.
#
#   The data is stored in records that are described by stanzas of a certain
#   format. A stanza consits of a title and one or more key/value pairs. By
#   default a query is limited to the title, but more complex (but slower)
#   queries that look at the complete record can be used too.
#
#   The keys are abbreviations for the interesting data in the record like 'fn'
#   (first name), 'sn' (surname), 'pho' (phone number) and so on. The keys are
#   assembled in groups for convenience reasons. The 'add' (address) group
#   consists of the keys 'add' (address), 'po' (PO box), 'zip' and 'cit' (city)
#   for example. The default query prints the contents of the 'nam' (name),
#   'pho' (phone) and 'add' groups.
#
#   In general you have to specify which records and which keys from these
#   records you want to see.
#
#
# ADDING RECORDS:
#
#   All records are entered in stanzas at the end of this script. The format of
#   a record (stanza) is this:
#
#     TITLE:
#     <tab>KEY|CONTENTS
#     <tab>KEY|CONTENTS
#     ...
#     <empty line>
#
#   The TITLE must begin at the start of a line and end with a colon (':').
#   The following lines must begin with a tab followed by the KEY, a '|' and
#   the data itself. Multiple keys of the same type can be used in one stanza.
#   The last line of the stanza *must* be empty to separate if from the
#   following stanzas. For example:
#
#     vogt, dominik (domivogt):
#     	fn|Dominik
#     	sn|Vogt
#	nn|Avatar
#     	cit|Althengstett
#
#     vogt, melanie (melle):
#     ...
#
#   Note: although you can put anything you like in the title, remember that
#   most queries look at the titles only. So be sure to put all the information
#   you prefer into the title. Personally I put the first name, surname,
#   nickname and other keywords like 'doctor' there. Using lower case letters
#   only in the title makes querying easier.
#
#   Note: Do not use the separator character ('|'). If you need it you can
#   configure a different character (see customizing section).
#
#   The preconfigured keys are:
#
#     tit (title)
#     nam (name)
#     fn  (first name)
#     sn  (surname)
#     nn  (nickname)
#     occ (occupation)
#     cmp (company)
#     add (address)
#     po  (PO box)
#     zip (zip)
#     cit (city)
#     pho (phone)
#     fax (fax)
#     ema (email)
#     web (website)
#     hou (hours of business)
#     bir (birthday)
#     ban (bank)
#     bcn (bank code number)
#     acc (account)
#     cus (customer number)
#     mis (miscellaneous)
#
#   and two special keys:
#
#     nl  (newline)
#     com (comment)
#
#   All comments and newlines are printed whenever the previous line of the
#   stanza is printed. E.g.
#
#     pho|01234/567890
#     com|home
#     nl|
#     pho|09876/54-3210
#     com|office
#
#   would be printed as
#
#     Phone: 01234/567890 home
#
#     Phone: 09876/54-3210 office
#
#
# SYNOPSIS:
#
#   tele [ options ] [ search word ]
#
#     The search word determines which records in the database are selected
#     (and hence printed out). If no search word is gicen, all records are
#     selected. When using the fast search option (-f or +c), tele looks for
#     matches in the label of each record (the first line). The search word
#     is a regular expression as implemented by your version of sed then. With
#     a complex search (-c or +f option) the contents of all keys are searched.
#     For performance reasons only simple strings are supported (to be honest,
#     now that I write this manual I don't understand my script any more. If
#     you want to implement regexp complex search you will have to rewrite the
#     'complex_search' function in this script. If you do so, please send me
#     your version of the function.) In either case the match is case
#     insensitive.
#
#   output options:
#
#    -a
#        Select all keys in the order they appear in KEYS.
#
#    -C string
#    -D string
#        Specify the string printed before (-C) and after (-D) a comment.
#
#    -g list|group[,group]...
#        Use 'tele -g list' for a list of defined groups (see customizing
#        section). If a comma separated list of groups is given, all
#        information in the selected records in one of the given groups
#        is printed. No spaces must occur between the commas and the groups.
#
#    -k list|key[,key]...
#
#        Use 'tele -k list' for a list of defined keys (see customizing
#        section). If a comma separated list of keys is given, the given
#        keys in the selected records are printed. No spaces must occur
#        between the commas and the keys.
#
#    -l
#        Long output style. Each key is printed on a separate line with a
#        label.
#
#    +l
#        Same as -s. Turns off the -l option.
#
#    -o
#        Print keys in the order of the selected groups.
#
#    +o
#        Print keys in the order they occur in the database.
#
#    -O  Same as +o.
#
#    -p
#        Format output for compact printing. No newline is inserted between the
#        groups. Sets the -o option. This may be changed by specifying +o
#        anywhere after the -p option.
#
#    -s
#        Short output style. No labels are printed, information such as names
#        and titles are printed on a single line.
#
#    +s
#        Same as -l. Turns off the +s option.
#
#   record selection options:
#
#    -c
#        Complex search. Search keys as well as record labels.
#
#    +c
#        Same as -f. Turns off the -c option.
#
#    -f
#        Fast search. Search only the record labels for matvches.
#
#    +f
#        Same as -c. Turns off the -f option.
#
#   other options:
#
#    -h
#        Print a help text.
#
#   default options:
#
#        -s -f -O -g nam,add,pho
#
#   default options when using the -p option:
#
#        -s -f -o -g psn,pfn,padd,ppho
#
#
# CUSTOMIZING:
#
#   Please see the customizing section at the beginning of the script. I hope
#   the comments there are detailed enough to allow you to tinker with the
#   details of my script.
#
#
# EXAMPLES:
#
#   I have prepared a few records to demonstrate the usage of this script.
#
#
#   Simple query with default options (short output):
#
#     # tele suse
#     S.u.S.E. GmbH (SuSE Linux)
#     0911/7406331
#     0911/7417755 Fax
#     Schanzaeckerstr. 10
#     90443 Nuernberg
#
#
#   Long output format:
#
#     # tele -l suse
#     --> suse gmbh (suse, linux):
#     name:        SuSE GmbH (SuSE Linux)
#     phone:       0911/7406331
#     fax:         0911/7417755 Fax
#     address:     Schanzaeckerstr. 10
#     zip:         90443
#     city:        Nuernberg
#
#
#   Selecting a single key:
#
#     # tele -l -k occ domi
#     --> vogt, dominik (domivogt):
#     occupation:  fvwm hacker and zsh fanatic
#
#
#   Fast versus complex search:
#
#     # tele -lf avatar
#     --> fvwm (fvwm-workers):
#     name:        fvwm
#
#     # tele -lc fvwm
#     --> fvwm (fvwm-workers):
#     name:        fvwm
#
#     --> vogt, dominik (domivogt):
#     first name:  Dominik
#     surname:     Vogt
#     nickname:    Avatar
#     city:        Althengstett
#
#
#   Viewing the complete record
#
#     # tele -a domi
#     Dominik Vogt Avatar
#     fvwm hacker and zsh fanatic
#     fvwm-workers mailing list :-)
#     Althengstett
#     dominik.vogt@gmx.de
#     http://fvwm.org
#
#
#   Customized comment delimiters:
#
#     # tele -C "<<" -D ">>" -a fvwm
#     fvwm
#     http://fvwm.org <<fvwm home page>>
#     ftp://fvwm.org/pub/fvwm/ <<ftp site>>
#     http://fvwm.org/fvwm-cats/ <<fvwm cats page>>
#     fvwm@fvwm.org
#     fvwm-workers@fvwm.org
#     fvwm-announce@fvwm.org
#
#
#   Ordering keys in output:
#
#     # tele -o -g add,nam suse
#     Schanzaeckerstr. 10
#     90443 Nuernberg
#     SuSE GmbH (SuSE Linux)
#
#     # tele -O -g add,nam suse
#     SuSE GmbH (SuSE Linux)
#     Schanzaeckerstr. 10
#     90443 Nuernberg
#
#
# BUGS:
#
#   Due to a bug in the getopts builtin in zsh 3.0.5 all command line options
#   with a leading '+' do not work. Use the corresponding options with
#   beginning with '-' instead.
#
#   Some implementations of sed don't understand \n to denote a newline in
#   search patterns. If you have such a version of sed the script will not
#   print the records you want. In this case you have to replace this line of
#   the embedded sed script:
#
#            s/\n[[:space:]]*/$KEY_SEPARATOR/g
#
#   with these two:
#
#            s/\
#[[:space:]]*/$KEY_SEPARATOR/g
#
#   I.e. insert a \ followed by a line break instead of the \n.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: contribution: 'address' database as zsh script
  1999-08-02  3:44 contribution: 'address' database as zsh script Dominik Vogt
@ 1999-08-02  5:21 ` Bart Schaefer
  1999-08-02  5:40   ` Geoff Wing
  1999-08-02  7:32 ` Bart Schaefer
  1 sibling, 1 reply; 5+ messages in thread
From: Bart Schaefer @ 1999-08-02  5:21 UTC (permalink / raw)
  To: Dominik Vogt, zsh-workers

On Aug 2,  5:44am, Dominik Vogt wrote:
} Subject: contribution: 'address' database as zsh script
}
} here is the script I want to contribute as I mentioned [...]
} #   Due to a bug in the getopts builtin in zsh 3.0.5 all command line options
} #   with a leading '+' do not work. Use the corresponding options with
} #   beginning with '-' instead.

Good grief.  Why didn't you mention this BEFORE 3.0.6 was released?

The patch in zsh-workers/3590 applies cleanly to 3.0.6 and fixes this bug.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: contribution: 'address' database as zsh script
  1999-08-02  5:21 ` Bart Schaefer
@ 1999-08-02  5:40   ` Geoff Wing
  1999-08-02  7:48     ` Peter Stephenson
  0 siblings, 1 reply; 5+ messages in thread
From: Geoff Wing @ 1999-08-02  5:40 UTC (permalink / raw)
  To: zsh-workers

Bart Schaefer <schaefer@candle.brasslantern.com> typed:
:On Aug 2,  5:44am, Dominik Vogt wrote:
:} Subject: contribution: 'address' database as zsh script
:} here is the script I want to contribute as I mentioned [...]
:} #   Due to a bug in the getopts builtin in zsh 3.0.5 all command line options
:} #   with a leading '+' do not work. Use the corresponding options with
:} #   beginning with '-' instead.
:Good grief.  Why didn't you mention this BEFORE 3.0.6 was released?
:The patch in zsh-workers/3590 applies cleanly to 3.0.6 and fixes this bug.

Wow.  3590.  Talk about lost patches :-)
	From: Peter Stephenson <pws@ifh.de> 
	Date: Wed, 29 Oct 1997 13:41:19 +0100 
	In-reply-to: "Colm Buckley"'s ... "Mon, 30 Dec 1996 12:59:14 MET."

Regards,
-- 
Geoff Wing : <gcw@pobox.com>     Work URL: http://www.primenet.com.au/
Rxvt Stuff : <gcw@rxvt.org>      Ego URL : http://pobox.com/~gcw/
Zsh Stuff  : <gcw@zsh.org>       Phone   : (Australia) 0413 431 874


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: contribution: 'address' database as zsh script
  1999-08-02  3:44 contribution: 'address' database as zsh script Dominik Vogt
  1999-08-02  5:21 ` Bart Schaefer
@ 1999-08-02  7:32 ` Bart Schaefer
  1 sibling, 0 replies; 5+ messages in thread
From: Bart Schaefer @ 1999-08-02  7:32 UTC (permalink / raw)
  To: Dominik Vogt, zsh-workers

On Aug 2,  5:44am, Dominik Vogt wrote:
} Subject: contribution: 'address' database as zsh script
}
} It's a self contained address book and runs with only
} zsh (3.0.5) and sed.

My first thought upon seeing this was that it could be updated to use
associative arrays for 3.1.6.  My second thought (after squawking about
the getopts bug) was that one could then define little here-document
templates to output the records.  My third thought was that I'd have
then re-implemented Perl of pre-2.0 vintage, at which point I decided
I'd better stop thinking.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: contribution: 'address' database as zsh script
  1999-08-02  5:40   ` Geoff Wing
@ 1999-08-02  7:48     ` Peter Stephenson
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Stephenson @ 1999-08-02  7:48 UTC (permalink / raw)
  To: zsh-workers

Geoff Wing wrote:
> Bart Schaefer <schaefer@candle.brasslantern.com> typed:
> :On Aug 2,  5:44am, Dominik Vogt wrote:
> :} Subject: contribution: 'address' database as zsh script
> :} here is the script I want to contribute as I mentioned [...]
> :} #   Due to a bug in the getopts builtin in zsh 3.0.5 all command line opti
> ons
> :} #   with a leading '+' do not work. Use the corresponding options with
> :} #   beginning with '-' instead.
> :Good grief.  Why didn't you mention this BEFORE 3.0.6 was released?
> :The patch in zsh-workers/3590 applies cleanly to 3.0.6 and fixes this bug.
> 
> Wow.  3590.  Talk about lost patches :-)
> 	From: Peter Stephenson <pws@ifh.de> 
> 	Date: Wed, 29 Oct 1997 13:41:19 +0100 
> 	In-reply-to: "Colm Buckley"'s ... "Mon, 30 Dec 1996 12:59:14 MET."

3.1 seems to have had this fixed a different way:  at least, the code is
different and the bug didn't show up.

I've added the script to the contributions at the web site.  They could
still do with some better indexing, since it's hard to find out what's
there.

-- 
Peter Stephenson <pws@ibmth.df.unipi.it>       Tel: +39 050 844536
WWW:  http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~1999-08-02  8:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-08-02  3:44 contribution: 'address' database as zsh script Dominik Vogt
1999-08-02  5:21 ` Bart Schaefer
1999-08-02  5:40   ` Geoff Wing
1999-08-02  7:48     ` Peter Stephenson
1999-08-02  7:32 ` Bart Schaefer

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).