* 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 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
* 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
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).