Provided by: expect-dev_5.45-5ubuntu1_amd64 bug

NAME

       tknewsbiff - pop up a window when news appears

SYNOPSIS

       tknewsbiff [ server or config-file ]

INTRODUCTION

       tknewsbiff  pops  up  a  window  when there is unread news in your favorite newsgroups and
       removes the window after you've read the news.  tknewsbiff can optionally  play  a  sound,
       start your newsreader, etc.

SELECTING NEWSGROUPS

       By  default,  the  configuration file ~/.tknewsbiff describes how tknewsbiff behaves.  The
       syntax observes the usual Tcl rules - however, even if you don't know  Tcl,  all  but  the
       most esoteric configurations will be obvious.

       Each  newsgroup  (or  set  of  newsgroups) to be watched is described by using the "watch"
       command.  For example:

       watch dc.dining
       watch nist.*
       watch comp.unix.wizard  -threshold 3
       watch *.sources.*       -threshold 20

       For each newsgroup pattern, any newsgroup that matches it and which you are subscribed  to
       (according to your newsrc file) is eligible for reporting.  By default, tknewsbiff reports
       on the newsgroup if there is at least one unread article.  The "-threshold"  flag  changes
       the threshold to the following number.  For example, "-threshold 3" means there must be at
       least three articles unread before tknewsbiff will report the newsgroup.

       If no watch commands are given (or no configuration file exists),  all  groups  which  are
       subscribed to are watched.

       To  suppress  newsgroups  that would otherwise be reported, use the "ignore" command.  For
       example, the following matches all comp.* and nist.* newgroups except for nist.posix or .d
       (discussion) groups:

       watch comp.*
       watch nist.*
       ignore nist.posix.*
       ignore *.d

       The flag "-new" describes a command to be executed when the newsgroup is first reported as
       having unread news.  For example, the following lines invoke the UNIX  command  "play"  to
       play a sound.

       watch dc.dining -new "exec play /usr/local/sounds/yumyum.au"
       watch rec.auto* -new "exec play /usr/local/sounds/vroom.au"

       You  can cut down on the verbosity of actions by defining procedures.  For example, if you
       have many -new flags that all play sound files, you could define a sound procedure.   This
       would allow the -new specification to be much shorter.

       proc play {sound} {
            exec play /usr/local/sounds/$sound.au
       }

       watch dc.dining -new "play yumyum"
       watch rec.auto* -new "play vroom"

       As an aside, you can put an "&" at the end of an "exec" command to get commands to execute
       asynchronously.  However, it's probably not a good idea to  do  this  when  playing  sound
       files anyway.

       "newsgroup" is a read-only variable which contains the name of the newsgroup that is being
       reported.  This is useful when the action is triggered by a  pattern.   For  example,  the
       following line could run the newsgroup name through a speech synthesizer:

       watch * -new {
            exec play herald.au
            exec speak "New news has arrived in $newsgroup."
       }

       The  flag  "-display"  describes  a  command  to  be  executed every time the newsgroup is
       reported as having unread news.  The special command "display" is the default command.  It
       schedules  $newsgroup  to  be  written  to tknewsbiff's display when it is rewritten.  For
       example, by explicitly providing a -display flag that omits the display command,  you  can
       disable the display of newsgroups that are already reported via -new.

       watch dc.dining -new {exec play yumyum.au} -display {}

       If you want to execute an action repeatedly and still display the newsgroup in the default
       manner, explicitly invoke the display command via the -display flag.  For example:

       watch *security* -display {
            exec play red-alert.au
            display
       }

       Actions associated with the -new and -display  flags  are  executed  only  once  for  each
       matching  newsgroup.  The command executed is the one associated with the first pattern in
       the configuration file that matches and observes the given threshold.

       Any command that is simply listed in the configuration file is executed each  time  before
       the  update  loop  in tknewsbiff.  The reserved (but user-defined) procedure "user" is run
       immediately after the newsgroups are scheduled to be written to  the  display  and  before
       they are actually written.

       For  example,  suppose  unread articles appear in several rec.auto groups and you play the
       same sound for each one.  To prevent playing the sound several times in a  row,  make  the
       -new  command simply set a flag.  In the user procedure, play the sound if the flag is set
       (and then reset the flag).

       The user procedure could also be used  to  start  a  newsreader.   This  would  avoid  the
       possibility  of  starting  multiple newsreaders just because multiple newsgroups contained
       unread articles.  (A check should, of course, be made to make sure that  a  newsreader  is
       not already running.)

MORE VARIABLES

       The following example lines show variables that can affect the behavior of tknewsbiff

       set delay          120
       set server         news.nist.gov
       set server_timeout 60
       set newsrc         ~/.newsrc
       set width          40
       set height         20
       set active_file    /usr/news/lib/active

       tknewsbiff  alternates  between  checking  for unread news and sleeping (kind of like many
       undergraduates).  The "delay" variable describes how many seconds to sleep.

       The "server" variable names an NNTP news-server.  The default  is  "news".   The  "server"
       variable is only used if the "active_file" variable is not set.

       The  "server_timeout"  variable describes how how many seconds to wait for a response from
       the server before giving up.  -1 means wait forever or until the server itself times  out.
       The default is 60 seconds.

       The  "newsrc"  variable  describes  the name of your .newsrc file.  By default, tknewsbiff
       looks in your home directory for a newsrc file.   A  server-specific  newsrc  is  used  if
       found.  For example, if you have set server to "cubit.nist.gov", then tknewsbiff looks for
       ~/.newsrc-cubit.nist.gov.  (This is the Emacs gnus convention - which is  very  convenient
       when  you  read  news  from  multiple  servers.)   If  there is no server-specific newsrc,
       tknewsbiff uses ~/.newsrc.

       The "width" variable describes the width that tknewsbiff will use to display  information.
       If  any newsgroup names are long enough, they will be truncated so that the article counts
       can still be shown.  You can manually  resize  the  window  to  see  what  was  truncated.
       However,  if  your configuration file sets the width variable, the window will be restored
       to that size the next time that tknewsbiff checks for unread news and updates its display.

       The "height" variable describes the maximum height that tknewsbiff  will  use  to  display
       information.   If  fewer  newsgroups  are  reported,  tknewsbiff  will  shrink  the window
       appropriately.  You can manually resize the window but if your configuration file sets the
       height  variable,  the  window will be restored to that size the next time that tknewsbiff
       checks for unread news and updates its display.

       The "active_file" variable describes the name of the news active file.  If set, the active
       file  is read directly in preference to using NNTP (even if the "server" variable is set).
       This is particularly useful for testing out new configuration files since you can  edit  a
       fake  active  file and then click button 2 to immediately see how tknewsbiff responds (see
       BUTTONS below).

       If the environment variable DOTDIR is set, then its value is used as a directory in  which
       to  find all dotfiles instead of from the home directory.  In particular, this affects the
       tknewsbiff configuration file and the .newsrc file (assuming the newsrc  variable  is  not
       set explicitly).

WATCHING DIFFERENT NEWS SERVERS

       To  watch  multiple  servers,  run  tknewsbiff  multiple times.  (Since you need different
       .newsrc files and the servers have different newsgroups and article numbers anyway,  there
       is no point in trying to do this in a single process.)

       You can point tknewsbiff at a different server with an appropriate argument.  The argument
       is tried both as a configuration file name and as a suffix to the string "~/.tknewsbiff-".
       So  if  you  want  to  watch  the  server  "kidney",  store  the  tknewsbiff configuration
       information in ~/.tknewsbiff-kidney".  The following  two  commands  will  both  use  that
       configuration file.

            tknewsbiff kidney
            tknewsbiff ~/.tknewsbiff-kidney

       In  both cases, the actual server to contact is set by the value of the server variable in
       the configuration file.

       If no configuration file is found, the argument is used as the server  to  contact.   This
       allows tknewsbiff to be run with no preparation whatsoever.

       If  the argument is the special keyword "active" (or ends in "/active"), it is used as the
       name of an active file.  This is in turn used to initialize the variable "active_file"  so
       that tknewsbiff reads from the active file directly rather than using NNTP.

       Creating your own active file is a convenient way of testing your configuration file.  For
       example, after running the following command, you can repeatedly edit your active file and
       trigger  the update-now command (either by pressing button 2 or setting the delay variable
       very low) to see how tknewsbiff responds.

       The active file must follow the format of a real active file.  The format is one newsgroup
       per  line.   After  the  newsgroup  name  is the number of the highest article, the lowest
       article.  Lastly is the letter y or m.  m means  the  newsgroup  is  moderated.   y  means
       posting is allowed.

WINDOW

       When  unread  news  is  found,  a  window is popped up.  The window lists the names of the
       newsgroups and the number of unread articles in each (unless suppressed  by  the  -display
       flag).   When  there  is  no  longer  any unread news, the window disappears (although the
       process continues to run).

BUTTONS

       Button or key bindings may be assigned by bind commands.  Feel free to change  them.   The
       default bind commands are:

       bind .list <1> help
       bind .list <2> update-now
       bind .list <3> unmapwindow

       By  default button 1 (left) is bound to "help".  The help command causes tknewsbiff to pop
       up a help window.

       By default, button 2 (middle) is bound to "update-now".   The  update-now  command  causes
       tknewsbiff to immediately check for unread news.  If your news server is slow or maintains
       a very large number of newsgroups, or  you  have  a  large  number  of  patterns  in  your
       configuration  file,  tknewsbiff  can  take considerable time before actually updating the
       window.

       By default, button 3 (right) is bound to "unmapwindow".  The  unmapwindow  command  causes
       tknewsbiff to remove the window from the display until the next time it finds unread news.
       (The mapwindow command causes tknewsbiff to restore the window.)

       As an example, here is a binding to pop up an xterm and run rn  when  you  hold  down  the
       shift key and press button 1 in the listing window.

       bind .list <Shift-1> {
            exec xterm -e rn &
       }

       Here  is  a  similar  binding.   However it tells rn to look only at the newsgroup that is
       under the mouse when you pressed it.  (The "display_list" variable is described  later  in
       this man page.)

       bind .list <Shift-1> {
            exec xterm -e rn [lindex $display_list [.list nearest %y]] &
       }

OTHER COMMANDS AND VARIABLES

       Built-in  commands  already  mentioned  are:  watch,  ignore,  display,  help, update-now,
       unmapwindow, and mapwindow.

       Any Tcl and Tk command can also be given.  In particular, the list of newsgroups is stored
       in  the  list  widget  ".list",  and  the  scroll  bar  is  stored in the scrollbar widget
       ".scroll".  So for example, if you want to change the foreground and background colors  of
       the newsgroup list, you can say:

            .list config -bg honeydew1 -fg orchid2

       These  can  also  be  controlled  by  the  X  resource  database  as  well.   However, the
       configuration file allows arbitrarily complex commands to be evaluated rather than  simple
       assignments.

       Certain Tcl/Tk commands can disrupt proper function of tknewsbiff.  These will probably be
       obvious to anyone who knows enough to give these commands in the first place.  As a simple
       example,  the  program assumes the font in the list box is of fixed width.  The newsgroups
       will likely not align if you use a variable-width font.

       The following variables are accessible and can be  used  for  esoteric  uses.   All  other
       variables are private.  Private variables and commands begin with "_" so you don't need to
       worry about accidental collisions.

       The array "db" is a database which maintains  information  about  read  and  unread  news.
       db($newsgroup,hi)  is the highest article that exists.  db($newsgroup,seen) is the highest
       article that you have read.

       A number of lists maintain interesting information.  "active_list"  is  a  list  of  known
       newsgroups.   "seen_list"  is  a list of newsgroups that have been seen so far as the -new
       and -display flags are being processed.   "previous_seen_list"  is  "seen_list"  from  the
       previous  cycle.  "ignore_list" is the list of newsgroup patterns to ignore.  "watch_list"
       is the list of newsgroup patterns to watch.  "display_list" is the list of newsgroup  will
       be displayed at the next opportunity.

UPDATING YOUR FILES

       tknewsbiff  automatically  rereads  your configuration file each time it wakes up to check
       for unread news.  To force tknewsbiff to reread the file immediately (such as if  you  are
       testing a new configuration or have just modified your newsrc file), press button 2 in the
       display (see BUTTONS above).

CAVEATS

       tknewsbiff defines the number of unread articles as the highest existing article minus the
       highest article that you've read.  So if you've read the last article in the newsgroup but
       no others, tknewsbiff thinks there are no unread articles.  (It's  impossible  to  do  any
       better  by  reading  the  active  file and it would be very time consuming to do this more
       accurately via NNTP since servers provide no efficient way of reporting their own holes in
       the newsgroups.)  Fortunately, this definition is considered a feature by most people.  It
       allows you to read articles and then mark them "unread" but not have  tknewsbiff  continue
       telling you that they are unread.

UNWARRANTED CONCERNS

       Your news administrator may wonder if many people using tknewsbiff severely impact an NNTP
       server.  In fact, the impact is negligible even when the delay is very low.  To gather all
       the  information  it  needs,  tknewsbiff  uses  a single NNTP query - it just asks for the
       active file.  The NNTP server does no computation, formatting,  etc,  it  just  sends  the
       file.  All the interesting processing happens locally in the tknewsbiff program itself.

BUGS

       The man page is longer than the program.

SEE ALSO

       "Exploring  Expect: A Tcl-Based Toolkit for Automating Interactive Programs" by Don Libes,
       O'Reilly and Associates, January 1995.

AUTHOR

       Don Libes, National Institute of Standards and Technology

                                          1 January 1994                            TKNEWSBIFF(1)