XEmacs / man / ph.texi

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
\input texinfo.tex
@c %**start of header
@setfilename ph.info
@settitle ph.el Manual
@iftex
@afourpaper
@end iftex
@c %**end of header

@footnotestyle end

@ifinfo
This file documents ph.el v2.6

ph.el is part of GNU Emacs.

ph.el is an E-Lisp client interface to the CCSO white pages directory system
also known as PH/QI

Copyright @copyright{} 1997 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim
copies of this manual provided the copyright notice and
this permission notice are preserved on all copies.
     
@ignore
Permission is granted to process this file through TeX
and print the results, provided the printed document
carries a copying permission notice identical to this
one except for the removal of this paragraph (this
paragraph not being relevant to the printed manual).
@end ignore

Permission is granted to copy and distribute modified
versions of this manual under the conditions for
verbatim copying and the terms of the ``GNU General
Public License'', and provided that the entire
resulting derived work is distributed under the terms
of a permission notice identical to this one.
     
Permission is granted to copy and distribute
translations of this manual into another language,
under the above conditions for modified versions,
except that this permission notice may be stated in a
translation approved by the Free Software Foundation.
@end ifinfo

@titlepage
@title{ph Manual}
@subtitle{An Emacs client to the CCSO Nameserver}
@author by Oscar Figueiredo
@code{1.3}

@page
@vskip 0pt plus 1fill
     Copyright @copyright{} 1997 Free Software Foundation, Inc.

     Permission is granted to make and distribute verbatim
     copies of this manual provided the copyright notice and
     this permission notice are preserved on all copies.
     
     @ignore
     Permission is granted to process this file through TeX
     and print the results, provided the printed document
     carries a copying permission notice identical to this
     one except for the removal of this paragraph (this
     paragraph not being relevant to the printed manual).
     
     @end ignore

     Permission is granted to copy and distribute modified
     versions of this manual under the conditions for
     verbatim copying and the terms of the ``GNU General 
     Public License'', and provided that the entire
     resulting derived work is distributed under the terms
     of a permission notice identical to this one.
     
     Permission is granted to copy and distribute
     translations of this manual into another language,
     under the above conditions for modified versions,
     except that this permission notice may be stated in a
     translation approved by the Free Software Foundation.
@end titlepage

@ifinfo
@node     Top, Introduction, (dir), (dir)
@comment  node-name,  next,         previous, up


This manual documents ph.el v2.6, an E-lisp client interface to the CCSO
PH/QI directory system.
@end ifinfo

@menu
* Introduction::                General info about the PH/QI directory system
* Installation::                How to install the package
* Usage::                       The various usage possibilities explained
* Credits::                     Who's done what
* Variables Index::             
@end menu





@node     Introduction, Installation, Top, Top
@comment  node-name,   next,  previous,  up
@chapter Introduction

The Central Computing Services Office (CCSO) of the University of
Illinois at Urbana Champaign (UIUC) created and freely distributes a
directory system that is currently in use in more than 300 organizations
around the world. The system records information about people such as
their address, phone number, e-mail, academic information or any other
details it was configured to.

The system consists of two parts: a database server traditionally called
@code{qi} and a command-line client called
@code{ph}. @file{ftp://uiarchive.cso.uiuc.edu/pub/packages/ph} is the
main distribution site.
@file{http://www.uiuc.edu/cgi-bin/ph/lookup?Query=.} provides a listing
of the QI servers in activity.

@code{ph.el} provides a client interface to this directory system
letting you:

@itemize @bullet
@item 
query the server through a customizable form
@item
expand inline queries in buffers (for instance you can expand a name
to a mailing address in a mail message buffer)
@item
insert server records into your own BBDB database
(@pxref{Top,,BBDB,bbdb,BBDB Manual})
@end itemize

The original command-line @code{ph} client that comes with the
@code{ph/qi} distribution provides additional features like the
possibility to communicate with the server in login mode which makes it
possible to change records in the database. This is not implemented in
this e-lisp client.

@node Installation, Usage, Introduction, Top
@comment  node-name,  next,  previous,  up
@chapter Installation

If you are using @code{ph} from your GNU Emacs or XEmacs distribution
you can skip this section.

@code{ph} should work right out of the box with XEmacs 19.15 and above. 
It will not work with versions of XEmacs below.

@code{ph} will work with Emacs 19.34 provided you have the @code{custom}
and @code{widget} libraries by Per Abrahmsen installed. You can get them 
from @file{http://www.dina.kvl.dk/~abraham/custom/}

When installing @code{ph} yourself you should move @code{ph.el} to a
proper directory in your @code{load-path} and byte-compile it (see the
section on byte-compilation in your users manual if you do not know what 
that means). Install @code{ph.info} into a directory where the info
system can find it or update your @code{Info-default-directory-list}
variable. 

Then you can add the following into your @file{.emacs} startup file:
@lisp
(require 'ph)
(eval-after-load 
 "message"
 '(define-key message-mode-map [(control ?c) (tab)] 'ph-expand-inline))
(eval-after-load 
 "mail"
 '(define-key mail-mode-map [(control ?c) (tab)] 'ph-expand-inline))
@end lisp

Upon starting a new session you will find a new @code{Ph} sub-menu in the 
@code{Tools} menu that will let you access all the interesting @code{ph} 
functions.







@node Usage, Credits, Installation, Top
@comment  node-name,  next,  previous,  up
@chapter Usage

This chapter describes the usage of @code{ph.el}. Most functions are
available through the @code{Ph} sub-menu of the @code{Tools} sub-menu.

@menu
* Querying QI Servers::         How queries are performed and handled 
* Query Form::                  How to use and customize the query form
* Inline Query Expansion::      How to use and customize inline queries
* Creating BBDB Records::       How to insert query results into your BBDB
* The Server Hotlist::          How to use and manage the server hotlist
@end menu


@node Querying QI Servers, Query Form, Usage, Usage
@comment  node-name,  next,  previous,  up
@section Querying Servers

@code{ph} basic functionality is to let you query a QI server and return 
the results back to you. There are several things you may want to
customize in this process.


@menu
* Selecting a Server::          The first thing to do
* Return Fields::               How to configure query results
* Handling Duplicate Fields::   What to do when records have duplicate fields
@end menu

@node Selecting a Server, Return Fields, Querying QI Servers, Querying QI Servers
@subsection Selecting a Server

Before doing any query you will need to set the query server, this is
the name of the host machine running the @code{qi} software. If you do
not set it in any fashion, @code{ph} will ask you for one when you
make your first query.

@defvar ph-server
The name or IP address of the CCSO (PH/QI) server. A port number may be
specified by appending a colon and a number to the name of the
server. You will not need this unless your server runs on different port 
than the usual 105.
@end defvar

@node Return Fields, Handling Duplicate Fields, Selecting a Server, Querying QI Servers
@subsection Return Fields

@code{qi} servers are configured to return a default set of fields for
each record matching a query if the query specifies none. The variable
@code{ph-default-return-fields} controls the return fields you want for
your queries.

@defvar ph-default-return-fields
A list of the default fields to extract from CCSO entries.  If it
contains @code{all} then all available fields are returned. @code{nil}
means return the default fields as configured in the server. Default is
@code{nil}
@end defvar

The server may return several matching records to a query. Some of the
records may however not contain all the fields you requested. You can
chose to discard those records.

@defopt ph-strict-return-matches
If non-@code{nil}, entries that do not contain all the requested return
fields are ignored.  Default is @code{t}.
@end defopt

@node Handling Duplicate Fields,  , Return Fields, Querying QI Servers
@subsection Handling Duplicate Fields

@code{qi} authorizes records to have different instances of the same
field. For instance the record of a person may contain several e-mail
fields containing different e-mail addresses. This is difficult to
distinguish from fields having multi-line values such as the postal
address that may contain a line for the street and another one for the
zip code and city name. In both cases, @code{ph} considers the field be
duplicated. 

@code{ph} has several methods to deal with duplicate fields. The
available methods are:

@table @code
@item list
Makes a list with the different values of the duplicate field. The
record keeps only one instance of the field the value of which is a list
of all the different values. This is the default method that is used to
handle duplicate fields for which no other method has been specified.
@item first
Discards all the duplicate values of the field keeping only the first
one.
@item concat
Concatenates the different values using @code{\n} as a separator. The
record keeps only one instance of the field the value of which is a
single multi-line string.
@item duplicate
Duplicates the whole record into as many instances as there are different
values for the field. This is the default for the e-mail field. Thus a
record containing 3 different e-mail addresses is duplicated into three
different records each having a single e-mail address. This is
particularly useful in combination with @code{select} as the method to
handle multiple matches in inline expansion queries (@pxref{Inline Query
Expansion}) because you are presented with the 3 addresses in a
selection buffer
@end table

Because a method may not be applicable to all fields, the variable
@code{ph-duplicate-fields-handling-method} lets you specify either a
default method for all fields or a method for each individual field.

@defvar ph-duplicate-fields-handling-method
A method to handle entries containing duplicate fields.  This is either
an alist (@var{field} . @var{method}) or a symbol @var{method}.  The
alist form of the variable associates a method to an individual field,
the second form specifies a method applicable to all fields. Available
methods are: @code{list}, @code{first}, @code{concat}, @code{duplicate}
duplicates the entire entry into as many instances as different values.
Defaults to @code{list}.
@end defvar



@node Query Form, Inline Query Expansion, Querying QI Servers, Usage
@comment  node-name,  next,  previous,  up
@section Query Form

The simplest way to query your directory server is to use the query
form. You display the query form with the @code{Query Form} menu item or
by typing @kbd{M-x ph-query-form}. The fields presented in this form are
defined by the @code{ph-form-fields} variable (unless a non-@code{nil}
argument is supplied to @code{ph-query-form}).

@defvar ph-form-fields
A list of fields presented in the query form. You can get a list of
valid field names with the @code{List Valid Field Names} menu item or
@kbd{M-x ph-get-field-list}. Defaults to @code{name}, @code{email} and
@code{phone}.
@end defvar

@deffn Command ph-query-form get-fields-from-server
Display a form to query the CCSO PH/QI Nameserver.
If given a non-nil argument the function first queries the  server 
for the existing fields and displays a corresponding form.
@end deffn

Since the names of the fields may not be explicit enough or adapted to
be directly displayed as prompt strings in the form, the variable
@code{ph-fieldname-formstring-alist} lets you define prompt strings for
the various fields.

@defvar ph-fieldname-formstring-alist
This is an alist mapping CCSO database field names onto prompt strings
used in query/response forms. Prompt strings for fields that are not in
this alist are derived by replacing underscores with spaces and
capitalizing the individual words.
@end defvar

Upon successful completion the command will display a buffer containing
the results of the query. The fields that are returned for each record
are controlled by @code{ph-default-return-fields} (@pxref{Return
Fields}) 

@node Inline Query Expansion, Creating BBDB Records, Query Form, Usage
@comment  node-name,  next,  previous,  up
@section Inline Query Expansion

Instead of using a query form, you may prefer inline expansion. This is
a powerful method to get completion from your directory server. The most
common usage is for expanding names to e-mail addresses in mail message
buffers. The expansion is performed by the command
@code{ph-expand-inline}. The operation is controlled by the variables
@code{ph-inline-expansion-format}, @code{ph-inline-query-format-list},
@code{ph-expanding-overwrites-query} and
@code{ph-multiple-match-handling-method}

@deffn Command ph-expand-inline replace-p
Query the server and expand the query string before point.  The query
string consists of the buffer substring from the point back to the
preceding comma, colon or beginning of line. If it consists of more than
one word the variable @code{ph-inline-query-format-list} controls how
these are mapped onto CCSO database field names.  After querying the
server for the given string, the expansion specified by
@code{ph-inline-expansion-format} is inserted in the buffer at point. If
@var{replace-p} is @code{t} then this expansion replaces the query
string in the buffer.  If @code{ph-expanding-overwrites-query} is
non-@code{nil} then the meaning of @var{replace-p} is negated.
@end deffn

@defvar ph-inline-query-format-list
Format of an inline expansion query.  If the inline query string
consists of several words, this list specifies how these individual
words are associated to CCSO database field names.  If @code{nil} all
the words will be mapped onto the default CCSO database key (generally
@code{name}). Default is @code{nil}.
@end defvar

@defvar ph-inline-expansion-format
This variable lets you control what is exactly inserted into the buffer
upon an inline expansion request. It is a list whose first element is a
string passed to @code{format}. Remaining elements are symbols
corresponding to CCSO database field names, corresponding field values
are passed as additional arguments to format. Default is @code{("%s"
email)} but you may want to consider a value like @code{("%s <%s>" name
email)}
@end defvar

@defvar ph-multiple-match-handling-method
This variable controls what to do when multiple entries match a query
for an inline expansion.  Possible values are:
@table @code
@item first
The first match is considered as being the only one, the others are
discarded.
@item select
A selection buffer pops-up where you can choose a particular match. This 
is the default value of the variable.
@item all
The expansion uses all records successively
@item abort
An error is signaled. The expansion aborts.
@end table


Defaults to @code{select}
@end defvar



@node Creating BBDB Records, The Server Hotlist, Inline Query Expansion, Usage
@comment  node-name,  next,  previous,  up
@section Creating BBDB Records

With @code{ph}, you can automatically create BBDB records
(@pxref{Top,,BBDB,bbdb,BBDB Manual}) from records you get from a PH/QI
server. You do this by moving the point to the appropriate record in a
query result display buffer and invoking the command
@code{ph-insert-record-at-point-into-bbdb} with the corresponding
keyboard binding, @kbd{b} @footnote{This keybinding does not actually
call @code{ph-insert-record-at-point-into-bbdb} but uses
@code{ph-try-bbdb-insert} instead.} or with the menu. @code{ph} cannot
update an existing BBDB record and will signal an error if you try to
insert a record matching an existing one.

Because the CCSO directory system does not enforce a strict record
format, local installations of the QI server use different names for the
record fields and have different ways to organize the
information. Furthermore BBDB has its own record structure that has
little to do with what is commonly found on QI servers. For these
reasons the process of converting a record from its QI format to the
BBDB format is highly customizable.

@defvar ph-bbdb-conversion-alist
This is the variable that lets you customize how BBDB fields map to
PH/QI records. Its value is an alist of cells of the form
@code{(}@var{bbdb-field} . @var{spec-or-list}@code{)}. @var{bbdb-field} is the name of a field that must be defined in your BBDB
environment (standard field names are @code{name}, @code{company}, @code{net}, @code{phone},
@code{address} and @code{notes}). @var{spec-or-list} is either a single
mapping specification or a list of mapping specifications. Lists of
mapping specifications are valid for the @code{phone} and
@code{address} BBDB fields only. @var{spec}s are actually s-expressions
which are evaluated as follows:

@table @asis
@item a string 
evaluates to itself
@item a symbol
evaluates to the symbol value. Symbols corresponding to PH/QI fields
present in the record evaluate to the value of the field in the record
@item a form
is evaluated as a function. The argument list may contain PH/QI field
names which evaluate to the corresponding values in the record. The form
evaluation should return something appropriate for the particular
@var{bbdb-field} (see @code{bbdb-create-internal}).
@code{ph-bbdbify-phone} and @code{ph-bbdbify-address} are provided as
convenience functions to parse phones and addresses.
@end table
@end defvar

The default value of @code{ph-bbdb-conversion-alist} is:

@lisp
((name . name)
 (net . email)
 (address . (ph-bbdbify-address address "Address"))
 (phone . ((ph-bbdbify-phone phone "Phone")
           (ph-bbdbify-phone office_phone "Office Phone"))))
@end lisp

This means that:

@itemize @bullet
@item 
the @code{name} field of the BBDB record gets its value
from the @code{name} field of the PH/QI record
@item
the @code{net} field of the BBDB record gets its value
from the @code{email} field of the PH/QI record
@item
the @code{address} field of the BBDB record is obtained by parsing the
@code{address} field of the PH/QI record with the function
@code{ph-bbdbify-address}
@item
two @code{phone} fields are created (when possible) in the BBDB record.
The first one has "Phone" for location and its value is obtained by
parsing the @code{phone} field of the PH/QI record with the function
@code{ph-bbdbify-phone}. The second one has "Office Phone" for location
its value is obtained by parsing the @code{office_phone} field of the
PH/QI record with the function @code{ph-bbdbify-phone}.
@end itemize

@defun ph-bbdbify-phone @var{phone} @var{location}
This is a convenience function provided for use in
@code{ph-bbdb-conversion-alist}. It parses @var{phone} into a vector
compatible with @code{bbdb-create-internal}. @var{phone} is either a string
supposedly containing a phone number or a list of such strings which are
concatenated. @var{location} is used as the phone location for BBDB.
@end defun

@defun ph-bbdbify-address @var{addr} @var{location}
This is a convenience function provided for use in
@code{ph-bbdb-conversion-alist}. It parses @var{addr} into a vector
compatible with @code{bbdb-create-internal}. @var{addr} should be an
address string of no more than four lines or a list of lines. The last
line is searched for the zip code, city and state name. @var{location}
is used as the phone location for BBDB.
@end defun

Note that only a subset of the fields you selected with
@code{ph-default-return-fields} and that are actually displayed may
actually be inserted as part of the newly created BBDB record.


@node The Server Hotlist,  , Creating BBDB Records, Usage
@comment  node-name,  next,  previous,  up
@section The Server Hotlist

@code{ph} lets you maintain a list of frequently used servers so that you 
can easily switch from one to another. This hotlist appears in the
@code{Server} sub-menu. You select a server in this list by clicking on
its name. You can add the current server to the list with the command
@code{ph-bookmark-current-server}. The list is contained in the variable
@code{ph-server-hotlist} which is stored in and retrieved from the file
designated by @code{ph-options-file}.

@deffn Command ph-bookmark-server server
Add @var{server} to the hotlist of servers
@end deffn

@deffn Command ph-bookmark-current-server
Add the current server to the hotlist of servers
@end deffn

@defvar ph-options-file
The name of a file where @code{ph} stores its internal variables
(currently only the hotlist is stored there). @code{ph} will try to load 
that file upon initialization so, if you choose a file name
different from the defaults @file{~/.ph-options}, be sure to set this
variable to the appropriate value @emph{before} @code{ph} is itself
loaded.
@end defvar

There is currently no way to remove a server from the list other than
editing directly the @code{ph-options-file}.



@node Credits, Variables Index, Usage, Top
@comment  node-name,  next,  previous,  up
@chapter Credits

The original CCSO Nameserver software (@code{ph} & @code{qi}) was
written at the University of Illinois at Urbana Champaign.

The Emacs client @code{ph.el} was written and is maintained by Oscar
Figueiredo.

Thanks to Soren Dayton for his suggestions, his enthusiasm and his help
in testing and proofreading the code and docs.

@node Variables Index,  , Credits, Top
@comment  node-name,  next,  previous,  up
@unnumbered Variables Index

@printindex vr

@contents
@bye
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.