status line

In visual mode, the input and output windows are separated by a status line, which by default looks something like this:
  More 156_WorldName____________(Read)_(Active: n)_(Log)_(Mail)_(Over)_12:34

Configuring the status area

The status area may contain 1 or more rows; the number is determined by %status_height. The rows are numbered from the top starting at 0. Each row is defined as a list of fields. A status field is defined as follows:

The current list of status fields for row N can be fetched with status_fields(N). The following commands modify the fields of the status area:
/clock off
Remove the clock from the status bar (equivalent to "/status_rm @clock").

/clock on
Add a clock to the end of status row 0 if there is not already a clock on status row 0. The width of the @clock field will be set exactly wide enough to hold a time formatted according to %clock_format.

/clock [format]
Add a clock to the end of status row 0 if there is not already a clock on status row 0; in either case, use format to control the format of the clock (see ftime() for the meaning of format). If format is omitted, it defaults to "%H:%M". The width of the @clock field will be set exactly wide enough to hold a time formatted according to format.

Example: display a clock in 12-hour format:
/clock %I:%M

/status_defaults
Restore list of status fields for all rows and their formats (%status_int_* and %status_var_*) to their default values. (Previous versions of tf had a %status_field_defaults variable; this is now deprecated.)

/status_save name
Save the current list of fields in row 0 into memory slot with label name. Name must be a legal variable name. (Saved fields will be forgotten when tf exits.)

/status_restore name
Restore the list of fields in row 0 that was previously saved with "/status_save name".

/status_rm [-rN] name
Remove status field name from status row N. If -r is not specified, all rows are searched. Only the first matching field is removed. If there are unnamed pad fields on both sides of the named field, the one with the smaller width is also removed; if the named field is at the beginning or end of a row, the neighboring pad field (if any) is removed.

Example: Remove the @mail field from the status bar:
/status_rm @mail

/status_add [options] name[:width[:attributes]] ...
Add status field name to the status bar with optional width and attributes. Options:
-rN
add to row N (default 0)
-A
add after all other fields (i.e., at end)
-Afield
add after existing field field
-B
add before all other fields (i.e., at beginning)
-Bfield
add before existing field field
-sN
insert padding of N spaces between the new field and the neighbor selected by -A or -B (default 1)
-x
don't add the field if one with the same name is already present
-c
clear all existing fields before adding new fields
If neither -A nor -B is given, -A is assumed.

Example: Add a new field after the world name to display the contents of the variable "hp":
/status_add -A@world hp:4

Multiple fields may be specified, but padding is not automatically added between them; you must specify padding explicly. For example,
/status_add -Aclock foo:4 :1 bar:4 :2 baz:4
is equivalent to
/status_add -Aclock foo:4
/status_add -Afoo bar:4
/status_add -Abar -s2 baz:4

/status_edit [-rN] name[:width[:attributes]]
If field name currently exists in any status row, replace it with name[:width[:attributes]]. Neighboring padding is unchanged. If -r is given, only row N is searched. Only the first matching field is edited.

Example: Change the @log field to say "L" instead of "(Log)", and change the field's width to match:
/set status_int_log=nlog() ? "L" : ""
/status_edit @log:1

For backward compatiblity, you can get and set the status fields for row 0 via the %status_fields variable, but doing so is deprecated.

The default list of status fields is:

    @more:8:Br :1 @world :1 @read:6 :1 @active:11 :1 @log:5 :1 @mail:6 :1 insert:6 :1 kbnum:4 :1 @clock:5
  
There are several types of fields:

Any variable may be monitored, but there is a fixed list of internal statuses. The internal statuses available are:

@more
Updated when there is a change in the number of lines below the bottom of the window.
@world
Updated when when the foreground world changes. During the evaluation of the format expression, the current socket is the new socket.
@read
Updated when entering or exiting a read() function call.
@active
Updated when the number of active worlds changes. During the evaluation of the format expression, the current socket is the socket that became active.
@log
Updated when the number of open log files changes.
@mail
Updated when mail arrives (See "mail").
@clock
Updated every minute, on the minute.

A field's width determines how many columns it will take up on the screen. If the width of a string literal field field is omitted, it defaults to the length of the string literal. One other field width may be omitted or set to 0, which means that field will use whatever columns are unused by the other fields. Normally, fields are left-justified within the width, but a negative field width will right-justify the field within the absolute value of the width. A width of "-0" can be used to right-justify the variable-width field. If the formatted text is wider than the field width, it will be truncated to fit within the specified width. Fields may also be truncated if they would not fit on the screen.

The attributes explicily given in the field definiton are combined with those in the corresponding %status_attr_int_fieldname (for internal state fields) or %status_attr_var_varname (for variable fields). The combined attributes are applied to the field text when it is displayed, but not to the padding used to bring the field to the specified width. The entire status line, including padding, is displayed with the attributes given by %status_attr, which is none by default.

To bring fields up to their specified width, they are padded with %status_pad, which is "_" by default. By setting status_pad to " " and status_attr to "r", you can create a status line that looks more like the one in emacs or the irc client.

When a status field is updated, the text displayed for that field is determined by evaluating the expression contained in the variable status_int_name (for internal state @name) or status_var_name (for variable name). Also, for variable fields, if status_var_name is not set, the value of the variable will be displayed directly. Changing a format variable will cause the status line to update.

All this may sound rather complex, so an example might help. The default value of status_fields is:

  @more:8:Br :1 @world :1 @read:6 :1 @active:11 :1 @log:5 :1 @mail:6 :1 insert:6 :1 kbnum:4 :1 @clock:5
  
and the corresponding format variables are:
  /set status_int_more \
       moresize() == 0 ? "" : \
       moresize() > 9999 ? "MuchMore" : \
       pad("More", 4, moresize(), 4)
  /set status_int_world   strcat( \
       fg_world() !~ "" & !is_open(fg_world()) ? "!" : "",  fg_world())
  /set status_int_read    nread() ? "(Read)" : ""
  /set status_int_active  nactive() ? pad("(Active:",0,nactive(),2,")") : ""
  /set status_int_log     nlog() ? "(Log)" : ""
  /set status_int_mail \
       !nmail() ? "" : \
       nmail()==1 ? "(Mail)" : \
       pad("Mail", 0, nmail(), 2)
  /set status_var_insert  insert ? "" : "(Over)"
  /set status_int_clock   ftime(clock_format)
  

The first field is "@more:8:Br". So, whenever the number of unseen lines changes, TF looks for the variable status_int_more, and evaluates the expression it contains. The result of the expression is printed in the first 8 columns of the status line, with attributes "Br" (bold and reverse). The expression was carefully written so that it will never be more than 8 characters, because it would be confusing to generate something like "More:12345" and then have it truncated to "More:123" because of the field width of 8.

Since the "@world" field has no explicit width, its width is determined dynamically. The fields on its left are pushed to the left side of the screen, the fields on its right are pushed to the right side of the screen, and the "@world" field uses whatever space remains in the middle.

Another example: Say your mud has a prompt like "H:42 M:17> " that shows your hit points and mana, and you want it displayed on the status line like " 42, 17", after the world name. To do this, call "/status_add -Aworld hp_mana:7", and define a prompt hook:

  /def -mregexp -h"PROMPT ^H:([^ ]*) M:([^ ]*)> $" hp_mana_hook = \
      /set hp=%P1%; \
      /set mana=%P2%; \
      /set hp_mana=$[pad(hp, 3, ",", 0, mana, 3)]%; \
      /test prompt({*})

See: visual


Back to index
Back to tf home page
Copyright © 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys