Change-Log-4 for VILE

NOTICE: This change log is officially (sez me) closed.
        All further changes documented (hopefully) in "CHANGES".  This
        file was renamed from "CHANGES" to "CHANGES.R4" on Wed Jan 11, 1995.    

Changes for vile 4.13 (released Thu Dec 22, 1994)
        + fixed typo in glob.c which caused compile failure on VMS.

        + added PATCH_AGAINST environment variable to dpatch target.

        + cleaned up selection ifdefs.  no more USE_SEL_FUNCS.  use
          OPT_SELECTIONS to ifdef references to r_attr_id.  (select.c
          region.c, estruct.h)

        + the strings <sp> and <tab> conflict with the new choice for
          "buffer variable" indicator.  so i'm getting rid of them.  and
          i'm adding support for \s (and \a, while i'm at it) to the
          tokenizer. (exec.c, bind.c, macros.doc, vile.hlp)

        + don't depend on a possibly null abbr_map pointer to decide to
          reverse the lhs of a map string.  this caused the first mapping
          of any type (:map or :map!) to be reversed.  i missed this
          because my first mapping was of a single character.  (map.c)

        + wrappers provided for TTgetc and TTtypahead because at least one
          pcc-based compiler balks at passing them as a function pointer. 

        + operators act from pre_op_dot to DOT.  so set pre_op_dot when done
          sweeping, in case some other motion set it.  fixes 'dqf(%%q'.

        + change _IOLBF flag to _IOFBF on setvbuf call, to turn off
          line buffering.  we don't need it, since we flush properly
          anyway, and it slows down output, particularly on an xterm.
          (most systems used to use setbuffer() anyway, until autoconf)

        + correct yet _another_ typo made during the great strncpy()
          conversion.  sheesh.  (bind.c)

        + readability improvements and editorial corrections to the older
          sections of README and README.CFG.

        + moved processing of @cmdfile startup file down to where
          we normally run .vilerc, to make sure all conditions are the
          same for both.  this should make running 'vile @.vilerc' and
          'vile' exactly equivalent.  running a command file caused
          a core in 4.12 due to NULL curwp.  (main.c)

        + include text of manpage.rc in vile.hlp, for installations that
          discard the source directory. (vile.hlp)

        + revisions to help and man page sections on startup. (vile.hlp,

        + install the man page as xvile.1 when installing xvile. (
        + pick up slash right after a drive designator to fix problem
          with DOS globbing in the root directory.  (glob.c)

        + corrected define, so that VMS version builds display-driver

        + line.c (put):  Don't set suppressnl when only putting newlines.
          Note: We may want to visit ldelnewline() and fix it so that the
          line structure doesn't get hosed when DOT is set to the buffer
          header.  The circular structure is apparently maintained, but the
          buffer header is now bypassed.  Suppose there're three lines.  We
          should have something (roughly) like this:

                bufhead -> line1 -> line2 -> line3 -> bufhead

          But I think that after ldelnewline with DOT as described above,
          we end up with (again assuming three lines):

                bufhead -> line1 -> line2 -> line3 -> line1

Changes for vile 4.12 (released Fri Dec 16, 1994)
        + clear up section of man page dealing with vile-manfilt. (vile.1)

        + don't let a mouse click change the current window if we're
          sweeping.  serious lockup results.  (basic.c)

        + fix various places that needed to be made more or less aware of
          the occurence of sweeping.  quoted motions now never include
          their endpoint, except in a few mostly "on one line" kind of
          motions: e, E, f, t, and %.  (csrch.c, edef.h, exec.c, fences.c,
          main.c, select.c, wordmov.c, vile.hlp)

        + display.c (modeline): For case 'f' and 'F' in the format string,
          do not display the pathname if it is the empty string.  This seems
          to be the case for the [unnamed] buffer.

Changes for vile 4.11 (released Thu Dec 15, 1994)
        + changed order of #includes in x11.c, so that our headers come
          first.  since we no longer define VMS at all, we'll be okay on
          most systems.  i hope this doesn't break other systems.  if so,
          estruct.h and edef.h should be moved after the last X11 include,
          until we can figure something out.  (x11.c)

        + changed leading character of so-called "buffer-variables" from
          a '#' character to '<' character.  the '#' conflicts with
          the # function key prefix.  THIS MAY BREAK OLD MACROS.  i'm
          sorry about this, but the choice of '#' as the function key
          prefix is not really negotiable...  (eval.c, vile.hlp)

        + fixed buffer-reading examples in macros.doc to reflect the above
          change.  (macros.doc)

        + fixed "WRITEABLE" case of the non-HAVE_ACCESS case of ffaccess.
          the sense was inverted.  (fileio.c)

        + implemented autowrite mode.  unlike vi, will only save files when
          suspending or running a shell command, since saving on any buffer
          switch seems a little silly.  (buffer.c, cmdtbl, main.c, modetbl,
          proto.h, spawn.c, vile.hlp)

        + fix OPT_LCKFILES as per johan rosman's suggestion, to make
          multiple edits by the original locker work correctly.  also fix
          behavior when file is renamed.  (buffer.c, main.c, file.c)

        + put in kev's suggested change to allow xvile to grow its screen
          more gracefully, albeit somewhat delayed. (eval.c)

        + fixed (for the last time, i hope) the sequence of messages that
          appear with ":w", ":wq", ":ww", ":wwq", and 'ZZ'.  Now, the "press
          return to continue" only happens if you're _not_ quitting, you
          haven't suppressed it with an argument, and something was actually
          written. (buffer.c, main.c, vile.hlp)

        + the "modeline-format" setting is now a variable rather than a
          "setting".  so 'set modeline-format "...."'  must change to
          'set-variable $modeline-format "...."' in .vilerc files. (edef.h,
          eval.c, display.c, main.c, modetbl, vile.hlp)

        + make sure getregion() assigns a unique attr_id to regions
          it creates, so find_release_attr() doesn't find spurious
          matches.  this keeps selections from disappearing when an
          unrelated delete (killregion()) occurs. (region.c, select.c,

        + fixed bug in trimline() which caused it to leave DOT at end
          of line, if there was trimming to do.  this caused a bug
          where if two newlines were inserted into a line ending with
          whitespace, and autoinsertion occurred, then the newlines
          would insert incorrectly, one correctly, and one _after_ the
          line that had been broken.  trimline now preserves DOT if
          possible.  (region.c)

        + rearrange multimotion() to ensure regionshape is set to exact
          when we begin a normal quoted motion. (select.c)

        + the xterm-mouse code is now a proper motion, so that you can
          use it to follow an operator.  that is, hit 'd', point with
          the mouse, and click button 1 to delete to the mouse position.
          x11 code now forces execution of a null motion routine, to
          make this to work in xvile as well.  (basic.c, cmdtbl, tcap.c,
          proto.h, x11.c, estruct.h, vile.hlp) [hitting '.' after doing
          this in the xterm version is interesting, since the motion is
          relative to the edges of the screen, not to the buffer.  in
          xvile, the motion that is repeated is null, so nothing happens]

        + mask off VAML and VAMLFOC bits when comparing attributes in
          tcap.c, since it doesn't know how to deal...

        + reset insertmode and set WFMODE if we abort out of replacechar().

        + rearranged X resource section of help file slightly, to group
          all resources and subresources more closely together. if we
          split out all the scrollbar resources into sub-resources, this
          presentation might make less sense.  (vile.hlp)

        + modified to support "--with-CFLAGS=", and turn -O
          on by default.  it can now be suppressed with '--with-CFLAGS=" "'.
          is it possible to give the configure script a usage message?
          (, configure, README.CFG)

        + eliminated usage of the return value of strncpy(), since it's
          broken on at least one version of AIX, and there's no big
          gain in using it, other than aesthetic value, which, although
          subjective, really is a fact. :-)  (bind.c, buffer.c, eval.c,
          filec.c, glob.c, spawn.c)

        + eliminated all uses of the ScratchName macro, since it getting hard
          to write it portably.  all vile-created buffer names are now
          defined as char arrays in edef.h, and they all have the suffix
          "_BufName", e.g. "HELP_BufName" and "OUTPUT_BufName". (bind.c,
          buffer.c, edef.h, estruct.h, eval.c, exec.c, filec.c, finderr.c,
          history.c, line.c, main.c, map.c, modes.c, msgs.c, oneliner.c,
          spawn.c, tags.c)

        + eliminated the CPP_xxx checks that were used to help create the
          ScratchName macro. ( aclocal.m4, configure,

        + fixed bogus cut-n-paste'd help messages for Macro buffers.  (cmdtbl)

        + rearranged utime()/utimes() code so that utimes is now favored
          over utime if both are present.  we think that systems with bad
          utime() implementations are the ones that have utimes(). 

        + eliminate funky structure assignment "structthing = {foo, bar}".

        + mention -O flag on by default, and necessity of working
          VPATH support in make program.  (README.CFG)

        + xvile does not need to (and shouldn't) attempt to reopen /dev/tty
          when stdin is a pipe.  the prevented xvile from starting from
          anywhere but the command line.  ifdefed code on DISP_X11. (main.c)

        + change make_backup() to correctly check boolean return code from
          ffexists() when deciding whether to back up a file.  (fileio.c)

        + changed rcsdiff commands to use unified diff format. (

        + fix bug in BUG check in mapped_c() -- was not clearing NOREMAP
          bit before comparing to poundc.  this caused arrow keys (probably
          all function keys not mapped by user) to appear to fail when
          noremap mode was set. (map.c)

        + blankline() was incorrectly de/entabbing its region, even when it
          wasn't rectangular.  (region.c)

        + implemented ":abbr" command.  ( CHANGES, README, cmdtbl,
          insert.c, map.c, proto.h, vile.hlp)

        + added "show-system-mapped-keys" command to show the mappings
          for the function keys.  this replaces passing numeric arg hack in
          :map and :map!.  (map.c, cmdtbl)

        + added "populate" admin target to

        + wording changes to vile.hlp and vile.1.

        + added "show-bindings" to cmdtbl, to match claims made in

        + turned region formatting back on.  lost OPT_FORMAT in final
          merge for 4.10. (estruct.h)

        + changed shorten_path to not return NULL unless arg was NULL.
          this prevents possible core dump (or ugly display) when doing
          "show-tagstack" after "vile -t tagname". (path.c)

        + change getfile() to return FALSE if getfile2bp() returns NULL,
          and prevent a core dump.  this can happen, for instance, if the
          bp->b_fname is the result of non_filename(), which can happen if
          a tag lookup is done from a listbuffer, and a subsequent tag-pop
          command is done which tries to return there.  (file.c)

        + change tags() to push the buffername rather than the filename
          if we're tag'ging from an internal buffer.  this improves our
          chances of getting back to it.  (if it's gone from the screen,
          you still won't be able to get back)  (tags.c)

        + x11.c (x_setfont): Call XSetFont() for all of the newly added

        + x11.c (display_cursor): Draw the little rectangle with the cursor
          color instead of the normal text color when the window loses focus.

        + proto.h (x_resize): Declared.

        + eval.c (SetVarValue): Call x_resize() for EVPAGELEN and EVCURWIDTH.

        + x11.c (x_resize): New function.  Call it from x_configure_window().

        + vile.hlp: Documented new color cursor and modeline capabilities.

        + estruct.h (VACURS, VAMLFOC, VAML): New attributes.

        + display.c (modeline): Set VAMLFOC and VAML attributes as

        + x11.c (x_preparse_args, flush_line, struct _text_win): Added new
          code for changing the color of the cursor as well as the

        + x11.c (update_scrollbar_sizes): Make grips the same color as the
          background of a modeline which does not have focus.  It's too
          much work to make the grip color always match the color of the

        + estruct.h (OPT_FORMAT): Added back in after being lost in
          the shuffle.  Also checked the other "OPT_" features occuring
          in cmdtbl to make sure that no others were also lost in the

        + corrected a null-pointer reference in 'getfile()' (file.c).

        + modified 'pathcat()' to (on VMS) ensure that the result is a valid
          pathname (path.c).

        + adjusted autoconf tests for cpp substitutions (aclocal.m4, estruct.h).
          [but that stuff's gone.  i've preserved these changes on an RCS
          branch (cpp_stuff) in case we need it.  -pgf ]

        + supplied missing DISP_VMSVT setting (estruct.h).

        + added FL_EXECABLE, FL_WRITEABLE, FL_READABLE flags to 'flook()' call
          to use in 'access()' call (estruct.h, bind.c, eval.c, exec.c, filec.c,
          fileio.c, main.c, tags.c, version.c).

Changes for vile 4.10 (released Mon Dec 05, 1994)
        + changed keystroke8() and keystroke_raw8() to loop and
          beep until a simple 8-bit char is typed.  no SPEC prefixes
          allowed. (input.c)

        + tuned kev's changes to mapped_c().  new routine called
          mapped_keystroke_raw() which calls mapped_c in such a
          way that function keys will expand to #c, but no further.
          used when getting a :map lhs from the user. (map.c, input.c,

        + fix lint warnings from "questionable" pointer practices,
          rationalized names of routines called by liststuff() (now all
          makeXXXlist()).  (bind.c, buffer.c, eval.c, line.c, map.c,
          modes.c, proto.h, random.c, region.c, tags.c)
        + removed no-doubt obsolete ifdefed "overlay" statements (window.c,

        + lint: removed unused assignment in desfunc().  (bind.c)

        + change the temp storage of unmatched chars in maplookup()
          from char to int, to prevent loss and subsequent extension
          of sign information. (map.c)

        + added short on-line help for all commands.  ifdefed on
          OPT_ONLINEHELP.  shows up in describe-bindings and apropos
          listings.  adds 13.5K. (bind.c, cmdtbl, mktbls.c, estruct.h)

        + added "list-motions" and "list-operators" commands, which show
          their respective subsets of the commands. (bind.c, proto.h,

        + added "describe-function" command.  added "appendit" argument
          to liststuff, to let the contents of popups (like Binding List)
          be grown incrementally.  the "describe-key" now describes the
          function the key is bound to as well.  (bind.c, buffer.c, cmdtbl,
          eval.c, line.c, map.c, modes.c, proto.h, random.c, tags.c,

        + map.c (mapped_c): Minor changes to make quoted spec characters
          generate pound sign sequences.  This is important for interactive
          mapping of function keys.  Example: Try ":map <F1> h" prior to
          this fix and afterwards.  Also try "a^V<F1>".  <F1> denotes
          a press of the F1 function key.

        + x11.c (kqdel): Took out call to char2int() which I had put in
          a few days earlier..

          (x_key_press): Don't convert function and arrow keys to a
          sequence of bytes via kcod2escape_seq().  Leave them in the SPEC
          form instead.  This was causing # sequences to be displayed
          in insert mode and it also broke command line history (as well
          as a bunch of other stuff, I suspect).

        + vile.hlp: Fixed a few typos.

        + map.c, x11.c (maplookup, kqdel): Judiciously call char2int() in
          order to strip off sign extension.  These fixes are in response
          to the use of the META key being broken.

        + added autoconf-test for getpgrp().  (aclocal.m4,

        + reduced timeout to 30 seconds on MSDOS to avoid overflow (main.c)

        + various nits/fixes for VMS, CLIX, IRIX, TurboC (descrip.mms,
          estruct.h eval.c, glob.c, ibmpc.c, makefile.tbc, region.c, termio.c,
          vile.hlp, x11.c)

Changes for vile 4.9 (released Tue Nov 29, 1994)
        + changed all OS #defines to SYS_xxx.  like SYS_UNIX, SYS_MSDOS,
          etc.  changed all compiler #defines to CC_xxx.  like CC_LATTICE,
          CC_TURBO, etc.  changed all screen #defines to DISP_xxx.  like
          DISP_TERMCAP, DISP_X11, etc.  changed all feature #defines to
          OPT_xxx.  i think you see the pattern.  eliminated some ifdefs
          around things that we've never turned off, or that can't be
          turned off without severely breaking vi compatibility.  got rid
          of some old "ifdef NEVER" kind of stuff.  (this affected most
          source files)

        + catnap() now checks for tty input at least periodically on all
          platforms.  the nap is broken into .1 second increments, and
          typahead() is called in between each one. (random.c)

        + new mode, "maplonger", which controls whether vile favors the
          longer or shorter of two nested mappings.  (modetbl, map.c)

        + new mode, "remapfirst", which controls whether vile will remap the
          first character of a mapping.  vi doesn't, vim does.  (modetbl,

        + rationalized (?) and documented (!) the various levels of character
          input routine.  see top of input.c.

        + renamed typahead() to tttypahead() to match ttclose() et al, and
          added typahead entry to the TERM struct.  (termio.c and others)

        + all former callers of tgetc() now call one of the keystroke()
          variants instead.  (many files)

        + all former callers of tungetc() now call unkeystroke() instead.
          (many files)

        + when creating backup files, ifdef check of matching dev and inode
          on UNIX only.  it doesn't work under watcom (DOS), and i don't
          know where else it will.  (fileio.c)

        + show offending errno when it's out of bounds in mlwarn(). (display.c)

        + added itbuff.c/o/obj to the rest of the makefiles ( descrip.mms,
          makefile.djg,, makefile.tbc, makefile.wat,
          makefile.wnt, vms_link.opt,

        + removed mapchars.[ch] from distribution, and removed references
          to them.  (, cmdtbl, main.c)

        + ifdefed out some more unused code.  also made multimotion()
          yank the selection as a side-effect, to be more like ^A-s.

        + ran lint on Solaris (i think.  maybe it was SunOS).  (display.c,
          fileio.c, input.c, itbuff.c, map.c, select.c, tbuff.c, tcap.c,

        + cloned and modified tbuff.c to create itbuff.c.  the routines
          there work on "integer tbuffs".  use these routines, and
          the corresponding ITBUFF data structure everywhere user keyboard
          input is accumulated.  this allows us to store wide keycodes,
          and greatly simplifies keystroke playback and :map implementation.
          (tbuff.c, itbuff.c, makefile, input.c, insert.c, line.c, map.c,
          estruct.h, edef.h, proto.h)

        + added new routines to tbuff.c/itbuff.c:  [i]tb_unnext() to undo
          tb_next, itb_seek() to change the itb_last pointer, itb_delete()
          to remove N elements from middle of an ITBUFF, itb_insert() to
          insert a new element in the middle.

        + changed :map implementation to support "user" and "system"
          timeouts, and to support controllable remapping via "set
          [no]remap" and vim-style ":noremap" commands.  (map.c, modetbl,
          main.c, vile.hlp, proto.h)

        + moved xterm-mouse functionality to tcap.c.  it's now driven
          by a system :map of ESC [ M, which is bound (indirectly) to the
          old xterm_button() routine. (input.c, tcap.c, cmdtbl, proto.h)

        + promoted '#' to be a regular peer of the ^X and ^A prefixes, and
          defined a set of "standard" #-key bindings, which are in turn
          available from system function keys (see vile.hlp).  screen
          driver modules may use the new header "nefkeys.h" to access this
          standard list.  i may have lost some of the linux-specific
          bindings from cmdtbl -- should they be reintroduced, they
          should go in tcap.c, as an ifdef'ed addtosysmap() call.  (bind.c,
          input.c, vile.hlp, main.c, cmdtbl, mktbls.c)
        + collapsed kcod2pstr() to rely on kcod2escape_seq().  (bind.c,
          input.c, proto.h)

        + changed names of "dummy" binding functions: cntl_a_func(), 
          cntl_x_func(), unarg_func(), esc_func(), poundc_func(). (main.c,
          input.c, proto.h)

        + added footnotes to the ":map" listing to denote whether mappings
          are remappable or not.  system maps (i.e. function keys) may
          be viewed with "1:map". (map.c)

        + moved system-specific function key mappings to tcap.c and ibmpc.c.
          removed them from cmdtbl.  use standard defines for the SPEC
          bindings. (ibmpc.c, tcap.c, x11.c, x11simp.c, cmdtbl)

        + the lhs of map sequences may now contain null characters.  the UI
          still doesn't support entering them.  necessary since ibmpc
          function keys start with a 0 character.  (map.c, ibmpc.c,

        + changed alignment of settings in the [Settings] buffer so that
          the characters by which the names are sorted are vertically
          aligned. (modes.c)

        + changed a bunch of whitespace in modetbl for better alignment.

        + don't bother attempting to catnap for 0 time.  (random.c)

        + added '#' to the name in the short history list that
          corresponds to previous buffer. (noautobuffer mode only) (buffer.c)

        + improved description of buffer lists wrt autobuffer mode.

        + attempted to rationalize some of the informational commands and
          added text to help file.  (cmdtbl, vile.hlp)

            new command names:          synonymous with:
                show-bindings           describe-bindings
                show-help               help
                show-buffers            list-buffers
                show-mapped-chars       map
                show-mapped!-chars      map!
                show-tagstack           tagstack

            changed command names:      old name was:
               show-terminal-chars      show-terminal    
               list-variables           list-vars        
               show-variables           show-vars        

        + prevent shrinkwrap() from claiming more than 3/4 of a windows
          rows when popping up a new window.  (window.c)

        + corrected missing b_last_used values for invisible buffers which
          caused buffers to be delinked when toggling autobuffer mode

        + modified logic of 'modeline_modes()' to make it compile on vms

        + modified auto-config for 'utime()' for solaris, vms compiles
          (estruct.h, aclocal.m4,

        + corrected ifdef for "backup-style" mode (main.c).

        + modified 'find_user()' to use $HOME if 'getpwuid()' fails (path.c).

        + improved #/% toggle so that it doesn't toggle into invisible buffers

        + corrected some ifdef combinations (cmdtbl, file.c, tcap.c, wordmov.c)

        + modified ifdef for incremental searches to use symbol OPT_ISRCH
          (cmdtbl, isearch.c, proto.h).

        + modified ifdef for find-error to use symbol OPT_FINDERR
          (cmdtbl, file.c, finderr.c, main.c, spawn.c, proto.h).

        + modified ifdef for advanced-editing features to use symbol OPT_AEDIT
          (cmdtbl, opers.c, random.c, region.c, proto.h).

        + corrected error in globbing that caused incorrect list to be built
          for expressions such as "*/foo" (glob.c).

        + modified logic of 'flook()' to allow search of $PATH only, so that
          the lookup in version.c can find the correct executable, i.e., not
          necessarily the copy of vile in the current directory (bind.c,
          fileio.c, version.c).

        + modified logic of 'filefind()', which implements ":e" command to load
          only the first buffer matched in a wildcard, and to make all matches
          treated as command-arguments so that ":n" applies to them (buffer.c,
          file.c, main.c, random.c)

        + corrected 'namebuffer()', prohibiting blank buffer-names (buffer.c).

        + added function 'mktrimmed()' to support correction to 'namebuffer()',
          as well as new macro function "&trim" (eval.c).

        + modified "error-buffer" command to accept filenames as well as buffer
          names (buffer.c, finderr.c).

        + animated [Tag Stack] buffer (tags.c).

        + modified 'gettagsfile()' to check modification-times of tags files,
          and re-read as necessary (tags.c).

        + corrected a conflict between foreground/background colors (tcap.c).

        + fixed some errors shown by Purify (display.c, regexp.c, window.c).

        + insert.c (nextindent): Get the indent of the first character on
          the line after advancing a word when there was no first
          character.  This fixes a core dump which may be reproduced as
          follows: Get into vile, making sure that autoindent is set.  Put
          about five or so blank lines in the buffer.  Now go to the top of
          the file and type 'cc' (change line).  This will cause a core
          dump.  A core dump will also be produced if there are a number of
          blank lines and then a non blank line.  The key here is that the
          indentation level (indicated by fc) was determined to be -1 and
          was not reset to a kosher value for the code below.

        + display.c (offs2col): Declare local variable length as an int
          instead of as SIZE_T.  (Remember that SIZE_T is unsigned on a lot
          of machines.) Also adjusted test which is used for determining
          which character that we're on.  This fixes a bug which (prior to
          this fix) may be reproduced as follows: Get into vile and enter
          the following: "ahere is a blank line<ESC>".  Select the word
          "is".  Type "u" for undo.  Note that the selection highlighting
          remains even though the line is blank.  Then type "o" to open up
          a new line.  It is at this point that a core dump occurs.

          Note that this fix does nothing to solve the problem of the
          highlighting sticking around.  It just makes that code more
          robust so that it doesn't core dump when the line length is
          less than zero (which can happen for empty lines).

        + undo.c (repointstuff): Always repoint marks.  I've #if'd out the
          lines which used to check to see whether or not the suggested new
          pointer was valid or not.  Paul should check this stuff over and
          make sure that it's ok.  In any event, it seems to (with one
          exception) fix the other half of the problem described above.  It
          also seems to make the behavior of marks wrt undo work more like
          real vi.  Don't know whether this is an argument for or against,
          just an observation...

        + aclocal.m4: Added missing dnl to last line of file.

        + buffer.c (sortlistbuffers): Don't forget to keep the unused
          buffers when rebuilding the buffer list.

Changes for vile 4.8 (released Mon Oct 31, 1994)
        + changed name of SIZEOF macro to TABLESIZE, to avoid conflicts
          with X11 headers.  (buffer.c display.c estruct.h fences.c
          ibmpc.c line.c mktbls.c modes.c tcap.c version.c vmspipe.c x11.c

        + incorporated patches from Johan Rosman for simple file locking
          protocol.  it's not rigorous, which he freely admits, but it
          solves their problem, so i'm including the code, though turning
          it off by default.  ( buffer.c display.c estruct.h file.c main.c
          modes.c proto.h modetbl and new file lckfiles.c)

        + fixed code in filename() which allowed one to rename a file
          to the null string by backspacing out of the "Name:" prompt.

        + added mask with XtIMXEvent to all calls to XtAppPending(), to
          prevent spurious returns due to non-events (timers). (x11.c)

        + massaged the distribution targets in the makefile, so i
          can more easily produce a tar.gz file, and not make
          people unpack the shar anymore. (

        + changed all places where we check a char against abortc
          to check against intrc, and check interrupted() as well.
          this lets us not translate intrc to abortc in tgetc(),
          which fixes some bugs where interrupts are treated like
          escapes.  this only showed up when ESC was being used for
          something other than aborting -- like completion.
          (csrch.c estruct.h eval.c exec.c history.c input.c insert.c
          isearch.c select.c spawn.c window.c)

        + turned off filter() for UNIX and DOS, since the filterregion()
          code is superior and better tested. (spawn.c)

        + added support in exec_named_command() for detecting a trailing '!'
          on a command name, and if the BANG flag is set for its function
          entry, passing a special argument so the function can know it was
          invoked with a "xxx!" form.  (estruct.h, exec.c, cmdtbl)

        + implemented support for ":w!" to overrided failed writes of the
          backup file.  detect the special argument (see above) in
          filesave() and filewrite(), and pass "forced" flag down through
          writeout(), writereg(), and ffwopen(). (fileio.c, file.c, proto.h,

        + created mode to control file backups, and implemented ~-style
          backups in addition to the existing .bak style.  new mode is
          "backup-style", and takes values "off", ".bak", and "tilde". 
          code is ifdefed on OPT_FILEBACK, and is turned off for VMS,
          since i don't know what's appropriate.  also, left (minimal)
          hooks to someday implement emacs-style numbered backups.
          (estruct.h fileio.c main.c modes.c modetbl vile.hlp)
        + added link(), utime(), utimes() to the list of system
          calls to check for, and for whose declarations to check. 
          (configure proto.h)

        + implemented 'q' command, for doing "quoted motion", for lack
          of a better mnemonic.  (cmdtbl display.c proto.h region.c
          select.c vile.hlp wordmov.c x11.c)

        + fixed bad "set" line in vile.hlp, in the my_cd_action example.
          It said "set $foo=$bar" syntax; which can be either "set foo=bar"
          or "setv $foo=$bar".

        + changed dos-mode behavior yet again.  with global dosmode set, we
          were stripping carriage returns at the same time we were deciding
          whether a buffer was doslike or not.  this led to the deletion of
          CR's even if we decided the file was unixlike.  the correct
          behavior, which unfortunately involves another pass through the
          buffer, is to figure it out (i.e.  count lines ending in CR), and
          then, only if it _is_ doslike (more CR lines than lines without)
          then go through and strip them.  i discovered the bug when i had a
          command file containing a few :map commands that ended in ^M.  the
          ^M's were being silently discarded.  (file.c)

        + added double-quote as commenting character in the macro language.
          for vi compatibility, this should act as a comment everywhere
          except shell commands and map commands, but we only currently
          honor it at the beginning of line.  (exec.c)

        + fix behavior of commands which behave differently when not
          given arguments, when used in an executed file.  :map and :f
          were both ignoring their arguments when sourced in a file
          interactively. fix was in end_named_cmd() and more_named_cmd().

        + new routine, macliteralarg(), which returns the rest of a command
          line literally as a single token.  used for the <rhs> of :map.

        + call new macliteralarg() from map_common() when getting the <rhs>,
          if cline is true.  (map.c)

        + removed "if (did_tungetc()) tgetc()" from readpattern() -- it
          was obsolete, and only screwed things up when executing a :map.

        + always do full update() in mlyesno() and mlquickask(), since
          they may be invoked from a command file, and we want the
          display as current as possible. (input.c)

        + use mlforce() rather than mlprompt() to force appearance of
          the questions in mlyesno() and mlquickask(), in case discmd is
          false. (input.c)

        + line length reformatting in oneliner.c

        + aclocal.m4, (VC_SYS_ERRLIST): Check for presence of

        + estruct.h (sys_errlist): Only declare if HAVE_EXTERN_SYS_ERRLIST
          is not defined.

        + manpage.rc: Set noview prior to calling
          attribute-cntl_a-sequences-til.  Set view afterwards.

        + display.c (vtalloc): Allocate space for rows in vscreen[] and
          pscreen[] when the height changes.  I was getting core dumps
          in xvile when resizing vertically.

        + (manfilt): New target which should not be necessary,
          but is due to the lameness of certain `make' programs.

        + termio.c (ttopen): ifdef'd IUCLC which doesn't exist on all

        + msgs.c (popup_msgs, msg_putc): Don't save/restore DOT unless
          curwp has been initialized.  Lack of this check was responsible
          for core dumps when executing "xvile @~/.vilerc".

        + buglist: Deleted items which have been satisfactorily dealt with.

        + display.c (PutMode, vtprintf): Deleted these functions.

          (modeline): Rewritten to use a format string for outputting the
          mode lines.

          (mlfs_prefix, mlfs_suffix, mlfs_skipfix): New modeline() helper

        + modetbl (ModeLine-Format, MLFORMAT): New string mode.

        + main.c (global_val_init): Initialize format string for mode lines.

        + modes.c (adjustmode): Adjusted "#if OPT_WORKING ... #endif" pairs
          for the case where OPT_WORKING is disabled.

        + x11.c (x_open): Initialize term.t_mcol and term.t_mrow.

        + eval.c (SetVarValue): Call mayneedundo() for EVCURCHAR and EVLINE
          ($char and $line) variables.

        + x11.c (x_key_press): Call char2int() when putting characters
          in the queue as integers in order to prevent sign extension.

        + map.c (maplookup): Call char2int() when returning first unmatched
          character in order to prevent sign extension.

        + vile.hlp: Removed vile-manfilt compilation / installation
          instructions.  vile-manfilt is now built and installed as part
          of the default installation procedure.

          Also removed note concerning selections; this note said that the
          selected area includes all highlighted chars except for special
          case in which the last highlighted character is the first
          character on a line.  This is no longer true or necessary since
          we now permit selections to select the end-of-line character.

          Added documentation concerning scrollbar and selection
          subresources.  Also added some sample .Xdefaults entries.

          Reformatted paragraphs which had lines too long for an eighty
          column display.

        + map.c (struct maprec): Documentation.

        + added OPT_VMS_PATH to estruct.h, used this to ifdef the vms pathname
          parsing (and also some test-code) on UNIX for off-line testing of the
          VAX code (estruct.h, fakevms.c, file.c, filec.c, glob.c, input.c,
          main.c, path.c, proto.h, vms2unix.c).  Now, VMS name-completion is
          done internally using UNIX-style pathnames.

        + other mods to support name completion on VMS, and off-line testing
          (bind.c, file.c, filec.c, glob.c, path.c).

        + mods to msgs.c to avoid struct init in declaration for SunOS K&R

        + added files fakevms.c, fakevms.h and

        + added OPT_MSDOS_PATH symbol to simplify related ifdefs for parsing of
          pathnames for MSDOS/WIN31/NT/OS2 (estruct.h, file.c, filec.c, glob.c,
          main.c, path.c, proto.h).

        + corrections to VMS version of 'shorten_path()' (path.c)

        + some lint (bind.c, display.c, eval.c, input.c, insert.c, map.c,
          region.c, select.c)

        + fixes for SMALLER-ifdef (display.c, insert.c, map.c, window.c)

        + added ifdef-symbol OPT_MLFORMAT for modeline-format (estruct.h,
          display.c, main.c, modetbl)

        + corrected handling of empty-.vilerc file: was hanging, not formatting
          modeline correctly (display.c).

        + added ifdef-symbol OPT_ENUM_MODES for the fixed-string modes
          (estruct.h, bind.c, main.c, modetbl, modes.c)

        + added logic to allow termcap-driver on Linux to display colors
          (tcap.c, estruct.h)

        + renamed REBIND to OPT_REBIND, modified logic for kbindtbl[] so that
          an arbitrary number of key bindings can be stored.

        + modified the TTrev() logic in the termcap driver to display video
          attributes (i.e., bold, underline, reverse) when OPT_VIDEO_ATTRS
          is set (tcap.c, display.c, estruct.h).

        + modified flags of attribute commands so that they accept a range
          as well as a repeat-count (cmdtbl).

        + added binding ^A-N to allow reset of attributes on a region (cmdtbl,

        + corrected video-attribute highlighting for IBMPC driver (ibmpc.c).

        + corrected ifdef'ing for 'kbindtbl[]' (mktbls.c).

        + modified error-test in 'ffropen()' to avoid noisy error when vile
          cannot find .vilerc in MSDOS filesystem from Linux (fileio.c).

Changes for vile 4.7 (unreleased Tue Sep 27, 1994)
        + removed * chars from install complete message to
          keep them from being shell-expanded, and make sure rw and list
          use the right makefile (i.e. since "makefile" may
          not be built yet.

        + off-by-one on strcpy() in bind.c (otto lind)

        + added code to detect and honor new-style NeXT tags file format
          in tags.c. (otto lind)

        + rationalized setting of dos mode (too bad i didn't call this
          "crlf" mode instead) so that for all internally generated, or non-
          existent buffers, dos mode is set based on the OS's line-style.
          otherwise, for existing files, empty or not, the lines vote on
          the style for the buffer. (file.c, main.c, random.c, vile.hlp)

        + added Home and End key support to x11.c, per user contrib. (x11.c)

        + added line-percentage indication to ruler mode display, per user
          contrib. (display.c)

        + new command, "beep", implemented in function userbeep(), which
          lets the user beep when they want to.  this intentionally does
          not call kbd_alarm, but rather TTbeep directly.  (random.c, cmdtbl,

        + new mode, "working", which enables/disables the working... messages.
          i think i've got it set up so the signals themselves stop if
          noworking is set.  (modes.c, display.c, main.c, vile.hlp)

        + added shrinkwrap support for the [Help] window. (bind.c)

        + fix core dump from giving arg of 1 to prevwind().  (window.c)

        + create l_strtol, which also accepts 'c' constants.  use it
          in eval.c whenever parsing user input to numeric functions. (eval.c,

        + prevent core dump if ~endm given when not in macro definition

        + change "BOTTOM" and "TOP" in "Search reached XXX without matching..."
          to "bottom" and "top". (search.c)

        + added "[Search wrapped]" message to /, ?, n, N commands.
          (search.c, oneliner.c, isearch.c, proto.h)

        + fixes to swbuffer() to prevent coredump when errors encounted
          when running the bufhook routine. (buffer.c)

        + fix to dobuf() to prevent handling of a ~endm when execlevel is
          non-zero.  if this is true, then the store-macro/store-procedure
          won't have happened (due to the early return in docmd()), and it'll
          look like an unmatched ~endm. (exec.c)

        + in liststuff(), don't switch to the list unless it's its first
          popup.  actually, switch (in popupbuff) and then switch back.
          this guarantees that the last call to swbuffer is for curbp.
          (buffer.c)  [ it would be better if popupbuff() didn't need
          to do the swbuffer at all ]

        + renamed CMASK to CHARTYPE to avoid name conflicts.
          (edef.h estruct.h input.c line.c proto.h eval.c main.c)

        + the screen is now resized dynamically, instead of having a
          fixed maximum.  (display.c, x11.c)

        + changed term.t_nrow and term.t_mrow to hold the actual number
          of screen rows, rather than the highest index.  this makes it
          a) symmetric with t_[nm]col and b) a whole lot easier to
          remember how it works.  also introduced routine bottomleft() for
          moving the cursor there.  (ansi.c, display,c eval.c ibmpc.c
          isearch.c main.c spawn.c st520.c tcap.c termio.c vmsvt.c
          win31drv.c window.c x11.c x11simp.c)

        + some fixes for DEBUGM ifdefs (eval.c exec.c)

        + gnu warning cleanup in vmalloc.c

        + main.c: changed initial value of popup-choices to "delayed", to
          match readline behavior

        + convert ^M character in replacement pattern to a newline, for
          vi compatibility.  (oneliner.c)

        + display.c (updupd): Don't permit typahead to be called for X11
          from this function.  This caused some core dumps since x_typahead()
          is basically another event loop.  When a timer event was set
          (to blink the cursor), core dumps would occur due to the display
          structures not being in an updated state.

        + x11.c (x_getc, x_typahead): The recent addition of the
          beginDisplay/endofDisplay pairs seems to have caused a plethora
          of undesirable messages from imworking().  I've removed the
          beginDisplay/endofDisplay pairs which I had added to both of
          these functions.  x_getc() had already been protected from
          imworking by the doing_kbd_read flag (set in tgetc() in input.c). 
          But x_typahead() needs the same protection.  I've added some code
          which sets the doing_kbd_read flag and restores its old value
          prior to returning from x_typahead().
        + random.c (catnap): Ifdef'd for X11 to call x_typahead when called
          with flag which indicates that the input queue should be watched
          for user input.  We may want to restructure this code and the code
          which calls catnap() somewhat to use Paul's idea for a timed read.

        + x11.c, proto.h, termio.c (x_typahead): Now takes as a parameter the
          time in milliseconds to wait for type-ahead to occur.

        + x11.c (kqpop): Return character popped from end of queue, not

          (x_getc, x_typahead): Protect guts of function from imworking()
          with beginDisplay / endofDisplay pairs.  I originally thought
          that this was causing some problems in the mapping code which
          seemed to be caused by the imworking interrupt.  Even though
          the problem was with kqpop(), I'm leaving the beginDisplay /
          endDisplay pairs in since the keyboard queue routines are
          probably not reentrant.

        + random.c (catnap): Changed argument to sleep call to allow
          for catnaps longer than one second.

        + termio.c (typahead): Call x_typahead instead of x_is_pasting.

        + x11.c, proto.h (x_is_pasting): Deleted.

        + x11.c, proto.h (x_typahead): New function.

        + termio.c (typahead): Modified first version of this function to
          match the second with regard to X11 code.

        + random.c (catnap): Block SIGALRM signals while in select().

        + (sigprocmask): Check for existence of this function.

        + random.c (catnap): Use both tv_sec and tv_usec in the HAVE_SELECT
          code.  This is necessary (on certain systems at least) in order to
          sleep for longer than one second.

        + input.c (tgetc): Added infinite loop detection.  Infinite loops
          can occur as a result of mapping.

        + map.c: Added new data structures and functions for dealing more
          fully with map and map!.  Removed the old structures and functions
          for dealing with a simple case of map.  

        + input.c, proto.h (tungetstr): New function.

        + main.c, insert.c (map_check): Removed calls to this function.

        + map.c, proto.h (map_check): Deleted.

        + map.c, proto.h, cmdtbl (map_proc): Deleted.

        + proto.h, map.c (relist_mappings): Deleted declaration from proto.h.
          Moved to map.c and declared static with new parameter.

        + input.c (kbd_reply): Added code for KBD_NOMAP.

        + estruct.h (KBD_NOMAP): New kbd_reply() option.

        + map.c (addtomaps, addtomap, maplookup): New functions for dealing
          with mapped keys and key sequences.  There is also a new data
          structure (struct maprec) and a couple of global variables for
          storing the maps.  [I discovered after I'd gotten this code
          working that Tom had written some similar looking stuff which is
          located in mapchars.h and mapchars.c.]

        + input.c (kbd_key): Added call to maplookup.  Made small change
          to the ANSI_SPEC stuff to avoid catnapping if we've already
          catnapped in maplookup().  My initial inclination was to
          remove the ANSI_SPEC stuff, but I've decided to leave it in
          place for a while.  I don't yet understand the workings of
          input.c well enough to muck about with it too much.

        + tcap.c (keyseqs): Table associating function key capability names
          (in terminfo/termcap) with the code which vile should use when
          one of these sequences is received.

          (tcapopen): map key sequences found in keyseqs[].

        + input.c (tungottenchars, tungetc, tgetc): Use a TBUFF instead of
          fixed size array for storage of ungotten characters.  tungetc()
          will now cause ungotten characters to be stacked.  Previously,
          only one keystroke (which may consist of multiple characters) could
          be ungotten.  Now, multiple keystrokes may be ungotten.

        + x11.c (x_key_press): Set the high bit (HIGHBIT) if one of the
          Mod1 (Meta) keys are held down.

        + x11.c (selgc, revselgc): New fields in struct _text_win.
          (x_preparse_args): Initialize selgc and revselgc.

          (x_setfont): Set font in selgc and revselgc.

          (x_scroll): Use selgc and revselgc to display selections.

          (display_cursor): Call flush_line() instead of calling
          XDrawImageString() directly.

        + select.c, display.c (VASEL): Use instead of / in addition to
          VAREV in certain places.

        + estruct.h (VASEL): New preprocessor constant used for indicating

        + select.c (extended_region):  Fixed a bug which manifested itself
          when extending a selection with text before the selection.

          (operattrital): Fixed message passed into operator().

        + line.c (put): Rewritten somewhat to be faster for non-rectangular
          regions.  Tests on a SPARCstation IPC indicate that the new code
          is 8-16 times faster.  The old code may be reenabled by searching
          for SLOWPUT in line.c and changing this preprocessor constant from
          0 to 1.

        + vile.hlp (popup-choices): Changed documentation regarding this global

        + main.c (global_val_init): Initialize GVAL_POPUP_CHOICES to immediate.

        + modes.c (FSM_CHOICES, struct FSM, fsm_popup_choices, fsm_error,
          fsm_tbl, fsm_idx, is_fsm, legal_fsm, fsm_complete): New stuff for
          dealing with fixed string modes. (fsm stands for fixed string mode).

          (adjvalueset): Call the fsm stuff.

        + modetbl (POPUP_CHOICES): Made this a string mode.

        + input.c (kbd_reply):  Conditionally compile call to
          popdown_completions() based upon how OPT_POPUPCHOICE is defined.

        + bind.c (fill_partial): Unconditionally call TTflush() since it is
          needed to force the partial completion to be written out.

          (kbd_complete): Changed logic yet again regarding the use of
          cmplcol.  It is only used for scrolling now.  The completion
          list is automatically displayed if no progress was made in
          performing the completion.  This means that _something_ will
          happen visually when you press tab.  Either the completion will
          be wholly or partially successful, or the completion list will
          pop up.

        + filec.c (trailing_slash): Fixed problem (for unix systems at least)
          where we were unable to get completions off of "/".

        + filec.c (pathcmp): Wrote a simpler, faster, but possibly less
          functional version.  Tom should look this code over to make sure
          that I haven't broken something.  This new version seems to speed
          things up quite a bit.

          (makeMyList): This now takes as a parameter the name which is being
          searched for.  We exclude from the list constructed those pathnames
          which are in subdirectories below the directory in which name might
          be found.

          (bs_find): Took out calls which make copy of the pathname and
          lengthened it.  If everything is done right prior to calling
          bs_find, it should already be in canonical form.  I'm hoping
          that this will increase the speed somewhat.

          (makeString): Added length parameter in order to avoid calling
          strlen.  Fixed all callers.

          (makeString): Allocate an extra byte to be used as a directory
          scan indicator.

          (already_scanned): Use the scan indicator byte to see if directory
          has already been scanned.  This should avoid rescanning directories
          and it also fixes the problem of being unable to get completions
          for directories which have already had a subdirectory scanned.
                :set dirc
                :e /home/kev/GNU/<tab><tab>
                Backspace so that just /home/ is showing.  Press <tab><tab>.
                Type in kev/<tab><tab>.  Only completion shown is GNU/.

          (bs_init): Removed the flag parameter which indicates whether or
          not to clear the buffer.

          (bs_find): Removed the iflag parameter and fixed all callers.

        + proto.h (bs_find): Nuke iflag parameter in declaration.

          (bs_init): Removed flag parameter from declaration.

        + bind.c (scroll_completions): New function called from kbd_complete.
          (cmplcol): Changed the way in which this variable is used 
          for deciding whether to show or scroll a completion list.

        + window.c (newlength): Fixed the off-by-one errors which were
          causing xvile to exit with the X error "BadValue" for opcode
          X_ConfigureWindow.  What was happening was the bottom window was
          being left with size zero...this bug may be observed in ordinary
          vile (in an xterm) by starting vile, splitting the [unamed]
          window and resizing the bottom window to one line.  Then use the
          (X) window manager to resize the xterm window down in size by one
          line.  You will then observe that there are two mode lines at the
          bottom of the xterm one above the other with no buffer displayed
          for the bottom-most one.

        + window.c (wpopup): Don't let an error message be displayed when
          we can't split a window.  Also permit curwp to be used if it's
          the only window available.

        + proto.h, buffer.c (zotwp): Moved delcaration from latter to former.
          Also removed "static" from definition of zotwp in buffer.c.
        + input.c (kbd_reply): Call popdown_completions() to get rid of
          the [Completions] buffer.

        + bind.c (popdown_completions): New function for getting rid of
          the [Completions] buffer.

        + buffer.c (zotwp): Switch back to most recent buffer on buffer
          list after deleting windows for the selected buffer.

        + proto.h (shrinkwrap, popdown_completions): Declared these

        + bind.c (show_completions): Call shrinkwrap() if completions buffer
          is already popped and gets larger (in order to see as many
          completions as possible).

        + random.c (liststuff): Only call shrinkwrap() if buffer not already
          popped up.

        + x11.c (x_open): Don't call setpgrp() on bsd compat systems.  Also
          added comment explaining why.

        + random.c (liststuff): Call shrinkwrap().

        + window.c (shrinkwrap): New function.

        + bind.c (makecmpllist): Fixed line of code which was causing
          completion list to be truncated.

        + display.c (imworking): Took out the #if 0 which I used to remove
          the two lines which I suspected of causing portions of the
          "working..." message to hang around afterwards.  Instead, I
          supplemented the test used to change the column to erase at.
          It now checks to see if the message line is being read.

        + bind.c (makecmpllist): Print completions sorted by column rather
          than by row.

        + bind.c (makecmpllist, show_completions): New functions.
          (GNU_COMPLETIONS): New feature test indicating GNU readline style
          completions.  Define this to be 0 to get the old vile behavior.

          (fill_partial): Don't beep when GNU_COMPLETIONS is enabled.

          (cmplcol): New static global variable.

          (kbd_unquery): Adjust cmplcol.

          (kbd_complete): Adjusted logic to handle GNU readline style

        + (AC_PID_T): Call this macro to make sure that pid_t
          will be defined.

          (CFLAGS): Only use -Wall when the --with-warnings option is used.
          Otherwise, we get too many warnings due to missing extern decls.

        + x11.c (display_cursor, x_preparse_args): Added casts in calls to
          XtAppAddTimeOut and XtAddEventHandler which were causing warnings.

        + (setpgrp, setsid): Check to see if these are missing
          extern declarations.

        + proto.h (setpgrp, setsid): Added prototypes.

        + (setsid): Check for existence of this function. 
          Also added comment about VC_SETPGRP being called by VC_KILLPG.

        + x11.c (x_open): Call either setsid() or setpgrp() to break
          association with controlling terminal.  This will prevent signals
          from being sent back to the starting process.  I'm hoping that
          this will fix problems reported concerning xvile crashing the X
          server when control-C is pressed.  (I have never experienced this

        + display.c (imworking): Removed (via #if 0) the two lines which
          I suspect are causing portions of the "working..." message to
          hang around afterwards.

        + estruct.h (signal_pg): Tightened up conditions by which we will
          permit getpgrp() to be called with no argument.  We still need
          to design an autoconf test for this.  The more permisive conditions
          were causing getpgrp() to be called improperly on SunOS. This
          in turn made it impossible to use Ctrl-C in xvile to interrupt
          lengthy processing.

        + x11.c (x_set_watch_cursor): New function called from x_working()
          and x_getc().  Also added field curs_watch to the TextWindowRec
          (x_working): Ignore certain types of events which could cause
          us problem with reentrancy.  Other types of events are saved
          in a queue for later processing.

          (struct eventqueue, evqhead, evqtail): Declared saved event
          queue structure and variables pointing to front and rear of
          this queue.

          (evqempty, evqadd, evqdel): New procedures for manipulating the
          queue of events which must be processed, but not from x_working.

          Note!!!  Not all of our reentrancy problems are solved.  The new
          code which I wrote for saving events in a queue for later
          processing calls malloc().  If it should happen that the
          interrupt which got us into x_working() interrupted a malloc() in
          progress, the results could be disasterous if malloc() is
          non-reentrant.  So far as I know, most implementations of
          malloc() are not reentrant.  malloc() is not the only call which
          might get us into trouble.  Other library calls (particularly the
          X11 and X toolkit functions) may well invoke malloc() or some
          other non-reentrant library call.  The proper way (though not
          easy) to implement all of this is to split imworking() up into
          two parts; the signal handler and a display function.  The signal
          handler will do very little; it will examine the state of a few
          other flags (which already exist to implement the current version
          of imworking) and then set the flag which will be examined by the
          display function.  The display function is not invoked from the
          signal handler.  It is called from various points in vile at
          which it is possible to be in a lengthy process.  A good
          candidate would be to call it from interrupted() as it is already
          used for this purpose.

        + estruct.h (sys/time.h, time.h): Moved includes for these files
          ahead of include of sys/resource.h.  SunOS needs to have struct
          timeval declared prior to including resource.h.  I'm beginning
          to think that it might be better to nuke the include of
          sys/resource.h and nuke the AC_AIX line from

        + (AC_HAVE_HEADERS): Added check for sys/resource.h,
          which appears to be necessary to include prior to sys/wait.h in
          order to keep gcc-2.6.0 from complaining on AIX.  It first appeared
          that sys/m_wait.h in order to get union wait, but I believe the
          bug to be in the "fixed" include files.

        + estruct.h (sys/resource.h): Include prior to wait.h.

        + ($(TARGET)): Changed order of LIBS and X_EXTRA_LIBS in
          link line.  X_EXTRA_LIBS now comes after LIBS.

        + mktbls.c (main): Moved initialization of "section" to after the
          call to setjmp() in order to avoid gcc warning.

        + proto.h (fputs): Added declaration.

        + (Makefile): Test for the presence Makefile instead of
          makefile after calling xmkmf.  xmkmf creates Makefile, not
          makefile.  This was preventing X_CFLAGS from getting set properly.

          (with_warnings): Call AC_WITH to set this value.  We shouldn't
          assume that autoconf will create a configure script which will
          automatically create/set this variable.

          (VC_MISSING_EXTERN): Split checks into two parts, one which is
          enabled with --with-warnings (for type checking purposes), the
          other which is mandatory.  This should speed up the configuration
          process for non-developers.

        + display.c (CLEAR_PLINE): Make sure that attributes get cleared too.

        + x11.c (update_scrollbar_sizes -- NO_WIDGETS version): Created a
          separate loop for drawing the new scrollbars which occurs after
          the sizes have been changed.  Otherwise, the scrollbars don't always
          properly update due to a lower bar covering an upper bar up prior
          to being resized.

        + x11.c (exposed): New field in TextWindowRec.
          (x_preparse_args): Initialize cur_win->exposed.
          (x_process_event): Set cur_win->exposed to true when an Expose event
          is received.
          (x_flush): Return immediately if no Expose events have been
          received.  The reason for all of this is to prevent drawing to the
          window prior to the display server being ready for us to send the
          (x_touch): Make sure the cell has something in it before marking it
          as dirty.  The reason for this is that x_touch is called most of
          the time to refresh a region of the screen which is clear (set
          to the background color).   I'll handle the other cases by making
          sure that the required area is clear...
          (x_scroll): Don't call XFlush() unless visibility is partially
          (x_scroll): Call XClearArea() to clear area vacated by scrolling.
          Should be faster because we won't have to clear portions of each
          line individually.
          (x_setfont): Added call to XClearWindow() before calls to x_touch().
          (x_preparse_args): Use ButtonMotionMask instead of PointerMotionMask
          when focus_follows_mouse is false.  Otherwise, too many motion events
          are generated when moving the mouse through the vile window.  Folks
          who want focus_follows_mouse will just have to live with the extra
          motion events for the time being.

        + display.c (CLEAR_PLINE): Don't mark cells in cleared line as dirty.

        + select.c (pop_fake_win): fixed typo in comment.

        + buffer.c (update_on_chg): Call b_is_temporary() instead of
          b_is_invisible().  This matches the logic found in makebufflist().
          (makebufflist):  Call update_on_chg() macro in order to help prevent
          future inconsistencies.

        + window.c (set_curwp):  Added a check at the beginning of the
          function to return immediately if curwp is already set to the
          window pointer to change to.  Among other things, this will 
          avoid calling updatelistbuffers() which was responsible for
          preventing us from being able to select (via the mouse) from
          the [Buffer List] window.

        + x11.c (modeline_resources, selection_resources): New array
          which describes resources for modelines and selections.
          (x_preparse_args): Get subresources for the modelines and
          (modeline_fg, modeline_bg, modeline_focus_fg, modeline_focus_bg,
          selection_fg, selection_bg): New fields in TextWindowRec.

        + x11.c (char_descent): New field in TextWindowRec.
          (query_font): Set char_descent field.
          (flush_line): Use char_descent for determining where to write out
          underlines.  This fixes a bug in which spurious underlines were
          left around on the screen when displaying certain fonts.

        + x11.c (scrollbar_resources): New array describing certain scrollbar
          (cur_win_rec): Statically allocated TextWindowRec.  cur_win is
          also statically initialized to point at this structure.  Needed by
          scrollbar_resources in order to make the default foreground and
          background for the scrollbars be the same as the already determined
          foreground and background for the rest of the application.
          (x_preparse_args): Get scrollbar subresources and use these as
          appropriate in creating the scrollbar graphics context.
          (x_preparse_args): Make sure that background and foreground pixel
          values are different.  They can start out different in the resource
          file, but get mapped to the same values on monochrome displays.

        + region.c (yank_line): New code to yank the newline (if appropriate).
          Used when yanking mouse selections.

        + basic.c (setwmark): Don't permit dot to be set past end-of-buffer.
          (setcursor): Removed comment saying that position may be set past

        + vile.hlp: Corrected some minor typos.

        + display.c (hilite): Mark the vscreen row as changed when changing
          the attributes in the OPT_VIDEO_ATTRS portion of this code.

        + x11.c (x_preparse_args): Use 1 and 0 as the foreground and background
          pixel values in the call to XCreatePixmapFromBitmapData().  I think
          that this make sense since the depth is one.

        + autoconf-macro VC_SIZE_T fixes problem with size_t on CLIX and Ultrix

        + added autoconf tests for poll.h, setjmp.h (

        + some lint and compiler warnings/errors for SunOS, CLIX, IRIX (eval.c,
          region.c, tags.c, version.c, x11.c

        + make IBMPC the default driver for MSDOS (estruct.h)

        + supplied definition for VMS to make ScratchName work (estruct.h)

        + "#error" doesn't work on SunOS; changed this to "error" (estruct.h)

        + corrected autoconf ifdef'ing of getwd/getcwd (estruct.h)

        + corrected lint rule in

        + removed /Debug option when compiling vile on VMS (descrip.mms).

        + corrected logic of 'is_vms_pathname()' to handle the case of rooted
          logicals, e.g., "dev:[foo.][bar]name" (path.c).

        + corrected error on VMS which left terminal in wrong state when
          closing terminal (termio.c).

        + corrected 'resolve_filename()'; the call to update the status line
          had gotten lost somehow (file.c).

        + ifdef'd 'get_modtime()' to handle VAX C's backwards treatment of the
          st_mtime/st_ctime members of stat structure (file.c).

        + commented-out X-Window libraries in VMS link options file
          (vms_link.opt); (these should be autoconfigured :-)

        + minor cleanup of directory scanning code for NT (path.c).

        + modified kev's GNU choices to implement the "popup-choices" mode
          (modetbl, bind.c, main.c).

        + modified (for UNIX) the behavior of 'filter-buffer' so that filter
          commands with pipes work (i.e., ":filter-buffer sort|uniq") (spawn.c).

        + changed the yank-til command to use the same limits as delete-til, so
          that "yW" will yank trailing spaces of a word (opers.c).

        + implemented mode "popup-msgs" with new file 'msgs.c'.  This is mainly
          useful in debugging macros; it forces a buffer [Messages] to be
          popped up when multiple messages are generated by a single command. 
          (display.c, main.c, msgs.c, estruct.h, modetbl, also makefile.* and

        + added mode 'errorbells' to control whether vile beeps (or flashes) at
          all.  This relies on intercepting the TTbeep calls, which are all
          done within 'kbd_alarm()' (mostly via 'mlwarn()') now (bind.c,
          display.c, exec.c, fences.c, input.c, isearch.c, main.c, modes.c, opers.c,
          search.c, undo.c, window.c).

Changes for vile 4.6 (unreleased Tue July 12, 1994)
        + changed authorship in README, added credits in vile.hlp

        + applied further OS/2 patches from Charles Moschel

        + applied Windows/NT patches from Joe Greer.  don't get excited.
          it's just console support.  :-)

        + added admin targets to  these are all (?) useful
          directly, with "make -f ..." since they don't depend
          on any of the config variables.

        + minor wording changes to README.CONFIG and INSTALL.

        + eliminated global variable "slash", renamed macro "slashc()" to
          "is_slashc()", use new define SLASHC in place of "slash".

        + did a lot of hand merging of NT and WIN31 ifdefs (since they
          both affected most of the same lines.   this note is really just
          a heads-up, in case i missed/broke something.

        + re-renamed manpage.vmc to manpage.rc, to avoid introducing yet
          another file suffix.  changed CHANGES and vile.hlp to match.

        + eliminated makefile.sav from the distribution.

        + eliminated all "Log" keywords, added "Header" keywords everywhere.

        + manfilt.c (sys/types.h): Include this file so that size_t will be
          defined on certain systems.

        + x11.c (alternate_font): Added cast to second arg in call to
          castalloc to avoid conversion warning.

        + (fputs): Added this function to the missing check
          list.  Not needed for vile, but for manfilt.c.

        + manfilt.c: Converted from ANSI C to the style of C in which the
          rest of vile is written in.

        + buffer.c (makebufflist): Added cast to convert return value of
          strlen to SIZE_T.

        + filec.c (fillMyBuff): Added cast to second arg in call to bs_find().
          Some platforms declare strlen to return int instead of size_t.

        + estruct.h (realloc): Changed prototype declaration so that second
          arg is unsigned.

        + estruct.h, mktbls.c (malloc): Changed extern declaration so that
          first parameter is an unsigned int rather than just int.  This
          eliminates "conversion" warnings on some systems.

        + mktbls.c (free): Added extern declaration with prototype.

        + x11.c (estruct.h, edef.h): Moved includes of these files to before
          the X11 includes.  I was having trouble on an SVR3 system in which
          flock was getting declared twice.  It turns out that <X11/Xos.h>
          (which is included from <X11/Intrinsic.h> does a check to prevent
          fcntl.h (from which flock is ultimately defined) from being
          included twice.  In my opinion, the authors of the system include
          files for this SVR3 system didn't do their job very well.  Rather
          than propogate checks to see if a particular system include file
          has already been included into estruct.h, I figured that a slight
          reordering (in x11.c) would be better.  Let's just hope it doesn't
          break something else.

        + estruct.h (MISSING_EXTERN_REALLOC): Fixed my misspelling of this
          (lack of) feature test.

        + mktbls.c: Conditionally include config.h in order to use
          configuration parameters for Unix systems.  Non-unix systems
          should still compile as they did before (if I didn't botch
          something).  I was having trouble with the fprintf extern on
          certain systems.

        + (MKTBLS): Use CPPFLAGS to build the mktbls program.
          This will cause HAVE_CONFIG_H to be defined.

        + README.CFG: New file which describes the configuration process as it
          relates to (x)vile.  I recommend changing the name of README to NEWS
          and README.CFG to README to be more consistent with FSF software. 
          I'll leave this up to Paul though.

        + README (impatient?):  Changed message slightly.

        + (install, installdirs, uninstall, makefile,
          config.status, mostlyclean, clean, distclean, realclean, TAGS,
          tags, dist): These targets added or modified to conform to the
          GNU standards document.

        +, INSTALL, New files copied from the GNU
          autoconf distribution ( renamed from mkinstalldirs
          to simplify copying files to/from MS-DOS -- tom).

        +  Renamed from  I really wish I could
          use autoheader to generate as the autoconf doc
          describes.  Unfortunately, it isn't powerful enough (without
          some rewriting) to do what I want.

        + aclocal.m4 (VC_SETPGRP): New vile configuration macro.

        + line.c (ksetup): Initialize kcharpending.  This lack of
          initialization was responsible for the bug in which a newline was
          sometimes being inserted before a yanked region when it shouldn't
          have been.  Also moved definition of kcharpending so that it appears
          prior to the definition of ksetup().  The bug may be observed as
          follows: Create a buffer with a single line containing the
          characters "foo".  Enter the command ":list-registers" in order to
          view the registers.  Go back to the beginning of the newly created
          buffer (containing "foo").  Type "yw".  "foo" will appear as the
          unnamed register.  Type "yw" again.  The unamed register will now
          (prior to this fix) have the "foo", but also a newline in front of

        + (tcgetattr): Test to see if this function exists.

        + termio.c (HAVE_TCGETATTR): Added this test to see whether or
          not to define USE_POSIX_TERMIOS.  Also added commentary describing
          reason for this.

        + x11.c (x_flush): Removed all explicit calls to this function.  It
          was being called after update() which is unnecessary since
          update (indirectly) calls x_flush().  Calls to update() now
          pass the force argument (the only argument) as TRUE to ensure
          that the update will not be deferred due to type-ahead.
          (resize_bar): Removed code for determining vertical positioning
          involving XQueryPointer() and/or XTranslateCoordiates.  With a
          little bit of care, we can get the vertical position accurately
          without making a round trip server request.

        + x11.c (repeat_scroll): Added call to XSync() in order to make sure
          that repeated scrolling (via the timer) doesn't get ahead of display
          of the scrolling. 
          (resize_bar): Ifdef'd to try out XTranslateCoordinates() in place
          of XQueryPointer().  This should work better since it will give
          us the coordinates of the pointer at the time of the event instead
          of the current pointer value.

        + x11.c (visibility):  New field in struct _text_win.
          (wait_for_scroll): Do not call x_flush().  Return only when
          we're sure that all contiguous GraphicsExpose events have been
          processed.  This code was previously returning after the first one.
          (x_scroll, x_flush): Return immediately if window is fully obscured.
          (x_scroll): Don't wait for the scroll if the window is unobscured.
          (x_preparse_args): Initialize visibility.  Initialize
          graphics_exposures field of cur_win->textgc.
          (x_process_event): Added new case for VisibilityNotify which note
          changes in the visibility of the window and modify cur_win->textgc

        + x11.c (ISC):  Removed #undef of ISC.  Should not be necessary
          any longer.
          (X_PIXEL): Removed #define.  Not used anywhere.
          (NPAUSE): Nuked.  Not needed.  Replace occurrence in term structure
          with zero.  (This was supposedly the number of times to busy loop
          in the catnap routine.
        + x11.c (x_preparse_args):  Support for left scrollbars in OpenLook
        + basic.c, csrch.c (setnmmark, getnmmarkname, get_csrch_char): Changed
          name of "stat" variable to "status" in order to avoid shadowing the
          stat function.  This didn't actually cause any problem, it just
          makes gcc shut up when used with Tom's preferred set of switches.
        + proto.h (setvbuf): Prototype.
        + display.c (updateline):  In OPT_PSCREEN version, return immediately
          if v_flag for the row doesn't have VFCHG set.
          (psc_putchar, psc_eeol): Set VFCHG flag on proper row.
        + termio.c (ttputc, ttflush, ttgetc): Don't define these for X11.
          Also got rid of calls to setbuffer, etc for X11.
        + proto.h (getscreensize): Declare even when SIGWINCH is not
        + estruct.h (malloc, realloc): Prototypes.
        + main.c, fileio.c (fcntl.h): Removed include from here.  estruct.h
          now includes it.
        + estruct.h (time.h):  Included here.  Don't include both time.h
          and sys/time.h if they conflict with each other.
        + version.c: Removed include of time.h.
        + proto.h: Reorganized prototypes for system calls to use the
          MISSING_ test to determine whether an extern declaration needs
          to be made.
        + estruct.h (libc.h): Include this file (NeXT has hundreds of
          prototypes declared here).
        + termio.c (LINUX): Nuked ifdefs surrounding calls to tcdrain().
        + estruct.h, random.c (sys/select.h): Moved inclusion of
          sys/select.h from random.c to estruct.h (so that any types
          declared in sys/select.h will be available for later inclusion of
        + estruct.h (AUX2, AIX, OSF1, LINUX, V7, BSD386, UNIXPC): Eliminated.
        + eval.c (AUX2, pyr, AIX):  Replaced in #if with
          HAVE_LOSING_SWITCH_WITH_STRUCTURE_OFFSET.  I'm open to suggestions
          on a better name for this.
        + proto.h, estruct.h (fcntl.h, sys/wait.h):  Included from estruct.h
          instead of proto.h.
        + npopen.c (sys/wait.h): Removed include from this file.

        + x11.c (start_selection):  Yank selection prior to releasing selection
          when persistent_selections are disabled.
          (x_process_event): Check to see if multiclick time has expired prior
          to discarding motion event when cur_win->numclicks is greater than
          one.  (If it's expired, we don't want to discard the event).

        + display.c, termio.c (getscreensize): Moved from display.c to
          termio.c.  This is a better place for it since we are invoking
          ioctl.  (This also explains why it was necessary to include
          the termios / termio / sgtty stuff in display.c.)
        + estruct.h (SVR3, ODT, ISC, HPUX): Eliminated.
        + termio.c (ttopen): Changed preprocessor feature test for
          call to setvbuf.  Also added code to handle systems (old
          SVR3 systems) which have the second and third arguments to
          setvbuf reversed.
        + main.c (catchintr): Always reinstate the signal handler regardless
          of system.  The code should probably be revisited...
        + spawn.c (rtfrmshell): Ditto.
        + estruct.h (USE_BCOPY): Usage eliminated as it was never being defined
          (SYSV_STRINGS): Eliminated since it was defined, but never
          (strings.h, memory.h): Included as per GNU recommendations.
          (ULTRIX): Removed references to this unix variant.
        + random.c (current_directory): Eliminated reference to POSIX and
          reorganized preprocessor tests for how to get the current directory
          a little bit.
        + fileio.c: Eliminated reference to BERK.
        + termio.c: Eliminated reference to BERK and other unix varieties.
          We now use HAVE_TERMIOS_H, and company.  I also eliminated code
          specific to OSF1.  If there's a problem with it, we should try
          to deal with it elsewhere (such as the configuration script).
        + dirstuff.h:  Added stuff for including obscure readdir headers.
          Eliminated reference to BERK.
        + estruct.h (SIGT): Wrapped an ifndef around the logic that defines
          SIGT and SIGRET since they will be determined by the configuration
          script.  Also removed tests for various specific varieties of UNIX
          from this logic. 
          (HAVE_SELECT, HAVE_POLL): Removed preprocessor logic for both of
          these.  The configuration script now determines which of these
          are available.  We do undef HAVE_POLL if HAVE_SELECT is defined
          (USE_INDEX, HAVE_GETHOSTNAME, signal_pg): Changed preprocessor logic.
          (BERK): Eliminated all occurences.
        + display.c (termios.h, termio.h, sys/ioctl.h, ioctl.h, sys/types.h
          sys/stream.h, sys/ptem.h):  Removed includes and ifdef logic
          connected with these header files.  They don't appear to be used
          anywhere in display.c (though I have no doubt that they were at
          one time).
        +  New file; a template for creating the makefile.  This
          file was created by hacking the old makefile.
        +  New file for creating the configure script.
        + config.d:  Template file for creating config.h.

        + modified 'mktbls' so it can be used as a function in a Windows 3.1
          application (e.g., fixed memory leaks, top-level return).

        + built with kevin's autoconf script on Linux (both termcap and
          Xt versions), adjusted/corrected various files for autoconf and for
          MSDOS filename compatibility (aclocal.m4, bind.c, cmdtbl
, edef.h, epath.h, estruct.h, file.c, fileio.c, glob.c,
          ibmpc.c main.c,, makefile.tbc, map.c, mktbls.c, npopen.c,
          path.c proto.h, random.c, spawn.c, termio.c, x11.c).

        + made a driver-stub for Windows 3.1, to get a clean compile/link.

        + corrected 'ibmscroll()' function, which was broken in vile 4.4

        + corrected reopening of stdin when a file is piped to vile; on Linux
          this caused vile to hang (main.c).

        + moved include of estruct.h after X Window includes in x11.c, since
          the definition of VMS causes the compile to break otherwise.

        + added new (some incomplete) files for Windows 3.1 port, map command
          and debugging: commdlg.msg mapchars.c mapchars.h trace.c trace.h
          win31drv.c win31drv.def win31tbl.c win31tbl.def win31tbl.h

        + modified 'gtfun()' and 'sindex()' to use single return points, to
          ease debugging.

        + added/used new macro 'window_b_val()' to handle the cases in which we
          reference a mode value for the current window, e.g., when executing a
          macro (estruct.h, isearch.c, oneliner.c).

        + initialize VIDEO-struct in 'vtinit()' that Purify found (display.c).

        + corrected globbing logic so that expressions such as `which script`
          work properly when the glob mode is "on" (glob.c).

        + added autoconf test VC_CPP_SUBS to make the ScratchName macro port.

        + corrected :-command parsing so that repeated ":" at the beginning of
          the line is ignored (exec.c).

        + reset mouse position when changing the screen resolution to avoid
          confusing users about its visibility (ibmpc.c).

Changes for vile 4.5 (released Wed Apr 27, 1994)
        + backed out change to "set all" which switched to Settings buffer.
          it didn't work, and was confusing in any case.  (modes.c)

        + redid the variables that identify os and vile variant.  now the
          $progname variable says "vile" or "xvile", and the new $os variable
          says "unix", "dos", "vms", or "os/2".  (modetbl, eval.c, version.c,
          proto.h, main.c, edef.h, vile.hlp, macros.doc)

        + vile.hlp: Documented manual page stuff.

Changes for vile 4.4 (not released April 26, 1994)
        + fix for ": & 1" in empty buffer.  (exec.c)

        + ensure that problems opening a file are correctly reported
          at startup, by giving swbuffer() a real return value.  nextbuffer()
          returns this, which lets main() do the right thing.  i hope
          letting swbuffer() return readin() errors doesn't have too large
          a ripple effect.  we'll see.  the return from swbuffer() is ignored
          in many cases anyway.  (buffer.c, main.c)

        + on file open errors in readin, continue with the routine, so the
          buffer gets set up correctly.  cmode was wrong before, for instance.

        + added select operator (bound to ^S) to do selections.  it yanks
          by default.  (region.c, opers.c, cmdtbl, select.c)

        + implement support (via new arg to scwrite, not yet put into other
          "screens" that provide this routine) for OPT_VIDEO_ATTRS under DOS.
          (display,c, ibmpc.c, proto.h)

        + removed KBD_LOWERC from the DOS KBD_OPTIONS, as an experiment, even
          thought tom told me not to.  i've seen no ill effects so far. 
          there must be something, though...  (could this be compiler
          (well, libc) dependent?) (filec.c)

        + added proper dependencies to makefile.wat

        + recalc kregwidth on last call to kinsertlater, since we may
          never get a newline to force it.  (line.c)

        + added mode "view-on-readonly" which causes view mode to be set
          if file is read-only on first open. (modetbl, file.c, vile.hlp)

        + implemented sel_motion() routine, that allows referencing the
          selected region from an operator.  fixed various off-by-one
          nits in various places to mkae this work right.  (basic.c,
          opers.c, region.c, select.c, proto.h, cmdtbl, x11.c)

        + cleaned up beeping.  too many double beeps.  (file.c, fileio.c,

        + now preserve DOT during yank operations, so yy and Y don't cause
          motion. (opers.c)

        + added "haveregion" backdoor to getregion() -- if the "haveregion"
          pointer is set, getregion just returns it as the region. see
          select.c for uses of this.  (region.c)

        + added #error statement to little/dis-used screen drivers, to
          find out which are really used. (at386.c, hp110.c, st520.c,
          z100bios.asm, z_ibmpc.c, dg10.c, hp150.c, vt52.c, z309.c)

        + function lookup is now first match, rather than exact, to match
          documentation.  (eval.c)

        + fix core dump from referencing empty line for macro label goto.

        + eliminated unimplemented "target" variable. (modetbl)

        + created doc for programmed macros, based on uemacs 3.10 doc.
          (macros.doc, makefile)

        + check all getregion() return values. (word.c, select.c)

        + moved operselect() to select.c from opers.c.

        + reset haveregion after use in getregion().  (region.c)

        + sel_motion and operselect, if now used together in a single
          command, can be used to extend a keyboard selection. (select.c)

        + giving any argument to "shell-command" or ":!" now suppresses
          the press-return prompt. (spawn.c, proto.h)

        + added calls to update() if screen is garbage in mlyesno and
          mlquickask, in case they are called after a shell-escape from
          a macro. (input.c)

        + fixed cursor position after ^B command (should rest at bottom
          of window) (basic.c)

        + fix ordering of kdone/kinsertlater stuff (kcharpending was being
          reset by kdone called from kinsert) to fix problem where a yank
          containing an initial blankline would not record that blank line.

        + changed kcod2str, fnc2str, string2prc to deal in "p-strings", i.e.
          binary strings with length stored in first byte.  needed this so
          bindings involving null character could pass through everywhere.
          the :map code in map.c still has problems.  (bind.c, x11.c,
          x11simp.c, input.c, map.c, proto.h)

        + separate target for Sony NeWS -- for sys/ioctl.h problem (makefile,

        + patch from Michael Finken, to allow keeping the buffer name in
          the window and icon names (x11.c, display.c, proto.h, vile.hlp)

        + tungetc() now pushes back 16 bit keycodes using kcod2escape_seq()
          to translate them to a user-typable sequence, and maintaining a
          stack of pushed back chars.  it should still only be used for
          one key's worth of pushback.  (input.c, some others?)

        + insert mode now encodes SPEC keys (when recording them) as poundc
          followed by poundc+1 followed by c.  real poundc chars are stored
          as poundc followed by poundc.  there is no more "altpoundc".

        + merged OS/2 patches from Charles Moschel (  reworked
          them somewhat to use better ifdefs in many cases.   This touched
          a lot of files.

        + introduced routine strncpy0() which jams a '\0' into the last
          copyable byte.  changed several of the most bug possibilities
          to use it.  (bind.c display.c eval.c finderr.c input.c isearch.c
          main.c makefile proto.h tags.c)

        + eliminated #elif from x11.c, for HP users.

        + reworked Charles Moschel's os2 screen driver into a "borland"
          console i/o driver.  i can't test it on OS/2, but i think it's
          the equivalent of his.  now there are separate ifdefs to control
                which os we want                MSDOS or OS2
                the pc keyboard                 IBM_KBD
                the physical screen driver      IBMPC
                the console i/o driver          BORLAND
          the Borland compiler is still represented with "TURBO", since
          that's still predefined in Borland C++.
          (borland.c edef.h estruct.h ibmpc.c main.c makefile.tbc spawn.c
          termio.c version.c)

        + split routine execproc() in two, to make it internally callable,
          given the name of the procedure to run. (exec.c, proto.h)

        + added cdhook variable, which is the name of a procedure which
          is run when changing current directory.  (edef.h eval.c
          exec.c modetbl proto.h random.c)

        + added variable $ocwd, the previous directory (modetbl, eval.c,
          random.c, proto.h)

        + backed out changes that implemented the "keep buffer name in window
          and icon title" resources.  this is better done with hooks. (x11.c,
          proto.h, display,c, vile.hlp)

        + apply patch from richard hussong to fix scrolling problem on some
          video bios'es (ati ultra pro) (ibmpc.c)

        + added more hook variables: read-hook, write-hook, buffer-hook,
          exit-hook.  modified help file to describe procedures, and hooks.

        + added new variable, $abufname, which is the "alternate buffer",
          i.e. what you'd get if you type '#'. (modetbl, eval.c, vile.hlp)

        + apply fix to map_proc from lee johnson -- :map g G followed by
          1g didn't work, since 1 was considered default. (map.c)

        + change macros BAD and GOOD to BADEXIT and GOODEXIT to avoid
          conflicts on AIX.  (display.c estruct.h file.c ibmpc.c main.c
          mktbls.c spawn.c tcap.c termio.c version.c window.c x11.c

        + it is now possible to use forward-char-scan et al from a macro.

        + "response variables", the ones that ask questions (e.g. @foo)
          now remember a default response.  (eval.c)

        + added support for using the ansi.c screen driver under MSDOS.
          (ansi.c, termio.c, estruct.h, makefile.wat)

        + added w!  and x!  as synonyms for w and x, since they are the
          same under vile.  (cmdtbl, vile.hlp)

        + added support for new GNU libio stdio pkg, for isready_c() macro.

        + fix globber() so :g/foo/p leaves you in the p-lines buffer, which
          is probably where you want to be.  (globals.c)

        + fix problem in main that caused us to skip first file if noautobuffer
          was set.  (main.c)

        + now that there are so many modes, it's desirable to switch
          to the ":set all" ("show-modes") window when it pops up. (modes.c)

        + warning/lint cleanup (bind.c buffer.c display.c edef.h estruct.h
          eval.c fences.c insert.c line.c proto.h random.c region.c select.c
          tags.c x11.c)

        + select.c (EFFICIENCY_HACK, attribute_cntl_a_sequences):  New code
          which makes attributing regions with large numbers of attributes
          much more efficient.

        + x11.c (CLEAR_THRESH): Changed value and added explanation.
          (NONDIRTY_THRESH): New constant.
          (x_getc): Added inner loop for getting as many X events as possible
          prior to returning in order to let the typeahead check in update()
          do its job.

        + manfilt.c (fatal_error): New function.
          (INITIALSIZE): New constant.  Got rid of old constants which
          hardwired the buffer sizes.
          (line_in_size, line_out_size): New variables for keeping track
          of the buffer sizes.
          (getline): Rewritten so that input lines may be of arbitrary

        + display.c (update): Keep track of original row and column in
          case we're reading the message line.  If we are reading the
          message line, update the hardware cursor to the original row
          and column instead of the current window.  I think that this
          problem was evident only when the OPT_PSCREEN feature was enabled.

        + estruct.h (do_mark_iterate): Reassert ownership of selection if

        + proto.h, select.c (sel_reassert_ownership): New function.
        + display.c (reframe):  Fixed an off-by-one error which was causing
          the cursor to be placed on the mode line after a reframe in a
          one line buffer.

        + input.c (kbd_reply): Fixed off by one error which was causing core
          dumps on the NeXT.

        + x11.c (x_get_selection, copy_paste): Added caste for third argument
          in calls to tb_bappend.
         (alternate_font): Removed debugging printf.

        + x11.c (x_configure_window): New code for unmanaging / managing
          the children of a motif form which will hopefully prevent the
          problems with huge scrollbars. 

        + random.c (line_count): Added null buffer check.  This lack of
          check was causing core dumps on start up in xvile when $font was
          being set from the .vilerc file to a value which caused a resize.

        + cmdtbl, proto.h, select.c (operattrital): New operator for italics.

        + x11.c (x_setfont, query_font): Cleaned up memory leaks, one stemming
          from the fact that the XFontStruct structure pointed at by
          the pfont field was never getting freed, the other concerning
          allocation of memory for font names.
         (starting_fontname): New field in the TextWindow structure.  This
          field points to the initially requested font name. The fontname
          field is reserved for holding the name of the font once it has
          been successfully loaded.
         (query_font): Attempt to find the fully qualified font name (rather
          than an alias or template).  Also, free storage associated with 
          new fields in struct _text_win (see below).
         (fsrch_flags, pfont_bold, pfont_ital, pfont_boldital, left_ink,
          right_ink): New fields in struct _text_win.
         (alternate_font): New function.
         (flush_line): New code for handling bold and italics.  Old code for
          doing bold retained as a fallback position in the event that a
          bold font is unavailable.
         (x_get_font_atom_property): New function.
         (x_flush): New code for cleaning up the mess sometimes left when
          using monospaced fonts. [Glyphs in monospaced fonts sometimes extend
          outside the bounding box associated with the font.  Thus when
          a dirty cell adjacent to a non-dirty cell is updated, the non-dirty
          cell also needs to be updated in the event that the character
          previously written to the dirty cell extended outside of its
          bounding box and into the non-dirty cell.]

        + window.c (delwp):  Always set WFHARD on the receiving window
          (instead of just when the current window pointer is the same as
          the one being deleted).  This corrects a problem with the mode
          line attribute sometimes not getting reset. [Scenario: Edit a
          file.  Split the window.  Type '*'.  Move to a different window
          than the "*" window.  Type '*' again.  Both vile and xvile leave
          the line that the message line used to be on bold.]

        + macros.doc: Fixed some minor typos.

        + select.c (extended_region): Added prototype.

        + New file. Perl script for filtering backspace sequences.
        + cmdtbl (operattrcaseq): Replaces operattrbsseq.
        + proto.h, select.c  (attribute_cntl_a_sequences, operattrcaseq):
          Replaces attribute_backspace_sequences and operattrbsseq.

        + random.c (getcol): Now works for empty lines where offs > 0.  This
          is probably one of many functions which will need to be fixed now
          that it is possible to position the cursor on the newline character.
          (See Paul's changes.)
        + file.c (getfile2): Don't prompt user if noninteractive.  This
          change prevents an infinite loop when executing my manual page
          macro (or any macro which needs needs a buffer where there is a
          name conflict.  Paul and Tom should look at this to make sure that
          it doesn't break keyboard macros.

        + display.c (updattrs): Garbage collect attributes which should
          display something (i.e., have nonzero ar_vattr field), but refer
          to an empty region.

        + display.c (updattrs): Added a parameter to this function and
          changed call in update() to reflect this change.  Also moved
          placment of call from within update.  The result of all of this is
          that the attributes will only be updated only when WFHARD or
          WFEDIT is set for the window.  WFEDIT is needed in order to
          display changed boundaries of the attributed text in the event
          that the marks denoting the ends are moved as the result of an
          editing operation.

        + estruct.h (do_mark_iterate): Rewritten to be faster.  This improved
          performance a lot when there are a large number of attributes.
          A terminfo man page took roughly 14 seconds to attribute prior to
          this change.  Afterwards, it took about 8 seconds.  (The terminfo
          man page is somewhat unusual in that it has a large number of
          underline and bold sequences).

        + cmdtbl (operattrbsseq): New command for attributing sequences of
        + select.c, proto.h (attribute_backspace_sequences, operattrbsseq):
          New functions.  Also moved together the prototype declarations of
          functions defined in select.c to one place.

        + display.c (modeline): if insertmode is defined (as a macro), display
          the modeline for each modeline instead of just the current window.

        + display.c (updattrs): Make sure that start_col is not less than

        + exec.c (execute):  In test to see if we're not in insert mode...
          Short circuit the test with a test to see if curwp is NULL since
          we get in trouble when insertmode is not a global variable and
          is defined in terms of a window trait (see estruct.h).  (We were
          getting core dumps when starting up with xvile @manpage.rc).

        + cmdtbl, opers.c (operattrbold, operattrul): New commands for
          attributing regions of text.
        + edef.h (videoattribute): New variable for communicating with
        + select.c, proto.h (attributeregion): New function.
        + select.c (selectregion): Took out checks to see if startbufp and
          selbufp are NULL before calling detach_attrib as detach_attrib
          already performs these checks.
        + display.c (updattrs): Use logical or to set attributes other
          than VAREV in order to allow overlapping attributes.  Use
          exclusive or to set VAREV causing overlapping reversed regions
          to reverse themselves (this is perhaps _too_ tricky; we might
          consider just using logical or.  It would simplify the code
          and it might actually be what the user wants.)  Previously, we
          were just using assignment to set the attribute which cause
          the attribute displayed to be the last attribute processed.
        + x11.c (flush_line, x_flush): Modified to handle bold and underline
          attributes in addition to reverse video.  Some work still needs
          to be done on this to use a bold font for displaying bold if
          it exists with the present code as a fallback if there is no
          bold font available.
        + manpage.rc: New file containing vile macros for getting and
          attributing manual pages.

        + estruct.h (do_mark_iterate):  Fixed problem which was causing
          r_orig for the first attribute to not get processed.  I think
          that this was responsible for some core dumps.

        + x11.c, proto.h (own_selection): New externally available function.
          It used to be x_own_selection which was private to x11.c.  All
          calls to x_own_selection in x11.c eliminated.
        + estruct.h (OWN_SELECTION): Macro which will either call
          own_selection() or do nothing depending on whether or not (x)vile
          is compiled on a system which is prepared to share selections
          with other clients or not.
        + select.c (selectregion, sel_extend):  Call OWN_SELECTION().

        + proto.h (sel_yank):  Name changed from sel_yankmaybe since there
          is very little "maybe" left about its action.
        + select.c (sel_yank, push_fake_win, pop_fake_win): sel_yankmaybe
          rewritten to become sel_yank.  sel_yank now uses push_fake_win()
          and pop_fake_win() to allocate a fake window so that the selection
          in the selection buffer may be yanked no matter what (unless
          there is no selection).
        + x11.c (x_process_event, x_stash_selection): Call to sel_yankmaybe
          eliminated from x_process_event.  Call to sel_yank added to
          x_stash_selection.  This means that the selection will only be
          yanked when needed thus permitting modification of the selection
          prior to pasting.

        + basic.c (setnmmark):  Nuked old keyboard selection code.
        + select.c (WHICHEND, whichend): New type and variable for keeping
          track of which end of the selection is fixed while sweeping
          a selection.
        + select.c (sel_begin): Set whichend.
        + select.c (sel_extend):  Selection yanking code removed.  Usage
          of parameter to sel_extend modified to indicate if wiping (sweeping)
          with mouse.  Code added to check whichend and act accordingly.
          Also do the "one-off" fixup here instead of in x11.c.
        + select.c (output_selection_position_to_message_line): Fixed "one off"
          error in reporting extent of selection.
        + x11.c (x_preparse_args): Set foreground and background in 
          scrollbar graphics context.
        + x11.c (extend_selection): Changed call to sel_extend to reflect
          new interpretation of its parameter.
        + x11.c (multi_click): Put back decrement after end of word is
          found.  (Paul had previously removed it.)
        + x11.c (x_process_event):  Changed call to extend_selection
          when button 3 is pressed to indicate that we are _not_ wiping.
          (Wiping is permitted however and mouse motion will do the 
          right thing).

        + x11.c (pscreen): Added extern declaration.
          CELL_ATTR): New macros comprising the interface to pscreen.
          These could be moved to estruct.h or another header file for
          use by other screen interfaces.
        + x11.c (BLINK_TOGGLE): Added comment about this macro.
        + x11.c (cur_row, cur_col, sc, cur_row, cur_col): Removed these
          fields from the TextWindow structure.
        + x11.c (x_putc, x_move, x_eeol, x_eeop, free_win_data,
          x_resize_screen): Deleted these functions and changed all callers.
        + x11.c (term): Substituted psc_putchar, psc_flush, psc_move,
          psc_eeol, and psc_eeop for x_putc, x_flush, x_move, x_eeol,
          and x_eeop.  Also added x_flush after x_scroll which will
          initialize the t_pflush field in the TERM structure.
        + x11.c (x_touch):  Call MARK_CELL_DIRTY and MARK_LINE_DIRTY instead
          of using old mechanism.
        + x11.c (wait_for_scroll):  Nuked XXX comment since it doesn't
          seem to apply any longer.
        + x11.c (CLEAR_LINE, SWAP_LINE): Nuked these macros which I recently
          wrote for use in x_scroll.
        + x11.c (x_scroll):  Nuked code for clearing and moving lines around.
        + x11.c (flush_line): Minor reformatting.
        + x11.c (clear_line): Eliminated this dead code.
        + x11.c (x_flush): Rewritten.  It will now call flush_line for
          any change in attribute instead of just reversed video.  flush_line
          still needs to be rewritten to handle the other attributes.
          Handling of cursor should be better too.
        + x11.c (x_putline, x_fastpoutline, x_setrowcolors, x_cls): Removed
          this "notyet" code.  The need for such functions has been replaced
          by new attribute mechanism and interface to pscreen.
        + x11.c (multi_click, display_cursor):  Use CELL_TEXT instead of old
          data structures.
        + x11.c (x_process_event): Call display_cursor() on ButtonRelease
          event instead of in x_getc().

        + display.c (updateline): Wrote new version for OPT_PSCREEN.  I
          tried modifying the !MEMMAP version, but this version is difficult
          enough to understand without adding to the rat's nest of #if,
          #else, and #endif statements.
        + display.c (updgar, scrolls): Preprocessor statements and a little
          bit of code for OPT_PSCREEN.
        + display.c, proto.h (psc_putchar, psc_flush, psc_move, psc_eeol,
          psc_eeop, psc_rev): New functions and their prototypes.

        + estruct.h (t_pflush): New field in the TERM structure used
          by OPT_PSCREEN interface to flush the output.  TTpflush is
          defined to allow easy access to this field via the variable term.
        + estruct.h (OPT_PSCREEN): New feature test.  Used for determining
          if the screen interface wishes to access the pscreen structure
          directly.  Definitions of VADIRTY and VATTRIB in this file
          depend on OPT_PSCREEN.

        + x11.c (x_beep): Use GXxor instead of GXinvert as the logical
          function in the graphics context for flashing the screen.  GXxor
          will give better results on color displays.
        + x11.c (x_getc): Removed if'd out call to display_cursor().
        + x11.c (x_flush):  Add bounds check to make sure that it is ok to
          write out the cursor.

        + estruct.h (VIDEO):  Added new field v_attrs.
        + estruct.h (VIDEO_ATTR):  Accommodations for color.  Also eliminated
          VACOL mask.  Added VADIRTY, VAFGCOL, and VABGCOL.
        + display.c ([pv]scrat):  Eliminated in favor of using the v_attrs
          field in the VIDEO structure.  Also small modifications to ignore/set
          dirty bit in updateline().

        + x11.c (display_cursor):  Called from x_flush instead of x_getc to
          avoid flicker.  Call of display_cursor from x_getc if'd out.

        + display.c ([pv]scrat):  Replaced calls to memset with "for" loops
          using explicit assignment in anticipation of making VIDEO_ATTR
          a sixteen bit quantity when COLOR is enabled.  This code will
          still need to be tinkered with somewhat in order to set the
          foreground and background colors properly for the line whose
          attributes are being reset.  (I have placed FIXME's in the code
          to indicate where this needs to be done.)

        + display.c (scrolls): New local variables longinplace and inplace
          are used in determining whether or not a potential match of lines
          to be shifted is really better than a previously computed match. 
          The undesirable behavior that this corrects can be best observed
          in vile (I used an xterm with 50+ lines).  Edit a file with
          enough lines to be able to do a bit of scrolling.  Split the
          window and make the upper window about half the size of the lower
          window.  Then start scrolling through lines in the the upper
          window which are duplicated in the lower one.  (Try it in both
          directions.) You will notice that portions of the lower window
          will be updated along with the upper.  The problem was that
          longer matchs were being obtained by scrolling lines from the
          lower window up to the upper with the cost of having to later
          update a large segment of the lower window.  This new code will
          count the number lines which are already properly placed (e.g.,
          do not need to be moved at all) in a section to be potentially
          moved.  It will then use this count to help decide if the new
          potential match is better than the old one.

        + modetbl (font):  Commented out dependency on X11.
        + eval.c (SetVarValue, gtenv): Added code to ignore EVFONT when X11
          is not defined.  The reason for all of this is so that a .vilerc
          file which has a "set font" line in it may be shared between both
          vile and xvile.

        + edef.h, main.c (insert_mode_was): Eliminated.  This variable was
          _only_ referenced (i.e, not set anywhere) and only referenced
          in one place.

        + estruct.h (insertmode, insmode): insmode is a new field in the
          W_TRAITS structure.  Define macro insertmode in terms of the
          insmode field in the W_TRAITS structure when OPT_MOUSE is
        + edef.h (insertmode): Don't declare insertmode as a variable when
          it is already defined as a macro
        + main.c (loop): Check to see if insertmode is set after getting a
          character.  If it is, re-enter insert mode.  The reason for the
          above three changes is to prevent insert mode from "moving" to a
          new window when using the mouse to set focus to another vile
          window.  These changes allow a window to "remember" which mode it
          was in when the window was left so that that mode may be
          reentered when we return to the window.

        + select.c, proto.h (free_attrib): New function.
        + line.c (lremove): Traverse attribute list and fix marks
          indicating the beginning and ending of each attributed region. 
          The attributed region is freed if both beginning and end both
          refer to the line about to be removed.

        + vile.hlp: Documented new resources.

        + x11.c (blink_id, blink_status, blink_interval):  New fields in
          TermInfo structure.  Also created new resource XtNblinkInterval
          and XtCBlinkInterval for setting the blink_interval field.  Setting
          this field to zero will disable blinking entirely.  Positive
          values will enable blinking all the time with the blink rate
          being the value in milliseconds.  Negative values will enable
          blinking only when the cursor is positioned within a highlighted
          region.  Again the blink interval is in milliseconds.

        + x11.c (display_cursor):  New function called from x_getc() for
          displaying the cursor.  Handles blinking cursors.

        + x11.c (XtNpersistentSelections, XtCPersistentSelections): New
          resource instance and class name for resource
          persistentSelections.  This resource controls whether or not
          highlighting of selection (and indeed the selection itself), is
          released when clicking button one.  start_selection() modified to
          check whether this resource is set or not and to take the
          appropriate action.

        + x11.c (invert_display, x_beep): Eliminated invert_display(). 
          Rewrote OPT_FLASH stuff in x_beep() to reduce dependence on
          structures in x11.c which know about the attributes.  (These
          structures will eventually be eliminated.) The flash obtained from
          the new code also looks better (it was kind of choppy before).

        + x11.c (x_getc): Make sure that cur_win->show_cursor is TRUE before
          displaying the cursor.

        + x11.c (x_setfont): Call update_scroll_bar_sizes when a font change
          will change the size of the window.

        + x11.c (turnOnCursor, turnOffCursor, CELL_CURSOR): Nuked all code
          referencing these.  This is yet another step toward integrating
          use of [pv]screen and [pv]scrat into x11.c.

        + x11.c (x_getc): Display the cursor here before calling

        + x11.c: Slowed down initial scrolling of selections (you don't want
          the lines whizzing by if you only want a few more lines).  Sped up
          scrolling of selections that have been scrolling for a while

        + x11.c: Added resources for scrollRepeatInterval and
          scrollRepeatTimeout for xvile NO_WIDGETS version.

        + display.c (vt_leaks): free pscrat and vscrat.
        + display.c (updateline): consider virtual screen attributes when
          noting nonblanks in right match.

        + modetbl, main.c, select.c (WMDTERSELECT): New window mode for
          controlling whether selections are terse or verbose.

        + vile.hlp: Documentation for selections and other x11 stuff.

        + makefile (select.{c,o}): Added to the SRC and OBJ file list.

        + select.c: New file implementing selection/attribute stuff.

        + proto.h (free_attribs, sel_begin, sel_extend, sel_release,
          sel_yankmaybe, sel_attached, sel_buffer, sel_setshape):
          New prototypes.

        + estruct.h (OPT_VIDEO_ATTRS, OPT_SELECTIONS): New feature tests.
        + estruct.h (NKREGS): Set to 37 (rather than 36) when OPT_SELECTIONS
        + estruct.h (SEL_KREG): Define the selection kill reg number.
        + estruct.h (MAXROWS, MAXCOLS): Moved here from x11.c.
        + estruct.h (REGIONSHAPE): New typedef.
        + estruct.h (REGION): Position of typedef moved ahead of that of
          BUFFER (so that AREGION can use REGION and BUFFER use AREGION).
        + estruct.h (VIDEO_ATTR): New typedef.  New mask values for this
          typedef also (VACOL, VAREV, VAUL, VAITAL, and VABOLD).
        + estruct.h (AREGION): New typedef.
        + estruct.h (b_attrib): New field in struct BUFFER.
        + estruct.h (do_mark_iterate): New macro for iterating over named
          marks and region marks for the current buffer.

        + buffer.c (bfind): Initialize b_attribs field.
        + buffer.c (bclear): Call free_attribs to free attributes associated
          with buffer.

        + line.c (linsert, lnewline, ldelete, ldelnewline): Use macro
          do_mark_iterate to fix the marks.

        + tmp.c (dumpBuffer, AdjustPtrs): Call do_mark_iterate for adjusting

        + undo.c (lineundo, repointstuff): Call do_mark_iterate for mark

        + display.c (vscrat, pscrat): New variables representing virtual
          and physical screen attributes.
        + display.c (updattrs): New function called from update().
        + display.c (vtinit): Initialize vscrat and pscrat.
        + display.c (update): Nuked assignment of the ruler line in
          OPT_SCROLLBAR code (x11.c no longer needs this).
        + display.c (updgar): update pscrat.
        + display.c (hilite, modeline): use vscrat to do highlighting.
        + display.c (scrolls): move attributes in pscrat to account for
        + display.c (updateline): Use pscrat and vscrat in updating the line.

        + edef.h (regionshape): Declare as REGIONSHAPE instead of short.

        + basic.c (setnmmark): Added code if'd by OPT_SELECTIONS which
          implements a mechanism for making selections from the keyboard.
          "m." will mark the start of a selection. "m\" extends the selection
          rectangularly. "m'" extends a selection by full lines. "m\" extends
          a selection exactly.
        + line.c (reg2index): Added code if'd by OPT_SELECTIONS which makes
          the name "." the kill reg associated with the current selection.

        + x11.c (PANE_WIDTH_DEFAULT): Changed to 15 for NO_WIDGETS.
        + x11.c (MAXROWS, MAXCOLS): Moved to estruct.h.
        + x11.c (scroll_repeat_id, wipe_permitted, sel_scroll_id): New
          fields in struct _text_win.
        + x11.c (sel_start_col, sel_start_row, sel_end_col, sel_end_row,
          wipe_row, wipe_col, show_selection): These fields removed from
          struct _text_win.
        + x11.c (row2line, clear_row_selection, save_selection,
          change_selection): These functions removed along with all references
          to them.
        + x11.c (scroll_selection, repeat_scroll): New functions.
        + x11.c (do_scroll): Added code so that scroll will repeat when
          button is held down.
        + x11.c (x_preparse_args): Get button release events too for the
          screen widget.
        + x11.c (x_scroll): Rewritten to move attributes (found in
          cur_win->attr) along with screen data.  Should be more efficient
          as well.
        + x11.c (x_flush): Changed way in which cursor is displayed in
        + x11.c (in_selection): This macro deleted.
        + x11.c (x_putline): Leave cursor one past last char in line section
          just put unless at end of line.
        + x11.c (x_eeol, x_eeop): Erase to end of line/page in reverse video
          if in reverse video.
        + x11.c (x_lose_selection, x_stash_selection, x_give_selection,
          x_own_selection, extend_selection, multi_click, start_selection,
          x_process_event): Modified/rewritten to use new selection stuff.
          Other cosmetic improvements/modifications were made to the
          above functions resulting in the following user visible changes:
            + clicking button 1 on mode line will set focus on
              corresponding window without scrolling the window by
              one line.  Double clicking on mode line will clear the
              current selection.
            + selecting text by dragging will now scroll the window
              up or down when the bottom or top is reached.  It is
              now also possible to drag with the right mouse button.
              Speed at which text is scrolled while being selected  will
              increase with the passage of time.
            + rectangular regions may be selected by using the control
              key as a modifier.
            + highlighting of selection is not lost unless another
              selection is made either in xvile or somewhere else
              or unless mode line is double clicked upon.
            + it is now possible to start a selection in one window
              and extend it in another window (provided the "other"
              window is open to the same buffer).

Changes for vile 4.3 (released March 29, 1994)
        + make all functions called by do_lines_in_region be prepared to
          take empty lines. (region.c)

        + added terse addition to the README

        + corrected test in 'eol_command()' to allow command-names with '-'

        + corrected last 'mlerror()' change (display.c).

        + added 'tags' rule to override conflict with default rule (makefile).

        + corrected 'readpattern()' so that '%' can be used as delimiter in
          ":g" command (search.c)
        + call update_scrollbar_sizes() when changing fonts. (x11.c)

Changes for vile 4.2 (briefly released March 25, 1994)
        + fixed Register buffer animation, using static flag to limit
          the work done for each call to relist_registers(). (line.c)

        + use common update_scratch() routine to trigger animation of
          modes and maps.  (mode.c, map.c)

        + add lines to vile.hlp about ".vilerc" vs. "vile.rc"

        + fixed several bugs in rectangular operations (region.c)

        + disabled "memory" command under Watcom, since _memavl() doesn't
          _really_ report how much memory there is left -- just how much
          is left before it needs to grow the heap. (main.c)

        + npopen() should be silent on errors. (npopen.c)

        + gave mlerror() a default message if errno is out of range (display.c)

        + rationalized use of mlerror() and FIOERR.  now, the function that
          first generates FIOERR is guaranteed to have put out a message,
          probably via mlerror. (file.c, fileio.c)

        + systems without EISDIR now all generate EACCES for directory
          errors.  (fileio.c)

        + cleanup for OPT_MAP_MEMORY compilation ( display.c fileio.c
          insert.c line.c random.c region.c tags.c undo.c)

        + cleanup of OPT_WORKING ifdef (estruct.h)

        + changed "#elif" to old-style because HP/UX bundled compiler doesn't
          treat these properly. (fileio.c, should also change x11.c).

        + corrected logic for arrow-keys in xvile's history by new function
          'kcod2escape_seq()' (input.c, x11.c, x11simp.c).

        + corrected 'l_ptr()' function to ensure signed comparison (tmp.c).

Changes for vile 4.1 (not released March 11, 1994)

        + add include of stddef.h if POSIX, to pick up offsetof, so we don't
          get a warning when building xvile on linux (estruct.h)

        + again, fix core from is_falsem/is_truem. (eval.c)

        + fix compiler warning (bind.c)

        + removed -rows and -columns from usage message and help. (version.c

        + fixed for the Watcom compiler; dense line modes now work. (ibmpc.c)

        + the 'J' (and :j) command no longer perturbs the yank/kill registers, so
          the sequence 'dw<move somewhere>J<move somewhere>p' puts back the word
          you deleted, not the newline that 'J' deleted.  (region.c, word.c, proto.h)

        + DOS now uses pressreturn() after a shell escape.

        + streamlined tb_sappend() (tbuff.c)

        + changed x11 pasting to not trim leading whitespace, and to use
          the xxx_no_aindent() functions for performing insertions.  this
          means you now paste what you cut, with indentation preserved from
          the original, rather than recreated (or lost) by autoindent or
          cmode. (x11.c, x11simp.c)

        + new routine, fnc2str(), to support above change, since the no-aindent
          commands are multi-char sequences.  (bind.c, proto.h)

        + implemented rectangular regions, using new "regionshape" global,
          new commands ("goto-named-mark-rectangular",
          "put-as-rectangle-after", "put-as-rectangle-before",
          "open-rectangle", "blank-region"), and new behavior for
          rectangles of the "shift-right-region" (opens up),
          "shift-left-region" (deletes), the delete and yank operators. 
          new rectangular (basic.c, cmdtbl, region.c, random.c, line.c, edef.h,
          estruct.h, line.c, opers.c, proto.h)

        + many changes in region.c, to make the region code rectangle-aware.
          new routines do_lines_in_region()/do_chars_in_line() to support
          simple cases of walking a region in two dimensions.  reimplemented
          yankregion using these, so it is now rectangle aware.  new blankline
          routine.  getregion() knows how to set up rectangular regions.

        + changed getcol/getccol/gocol/gotocol to support rectangle code.

        + changed the 'fulllineregions' boolean to a 'regionshape' descriptor.
          (exec.c, edef.h ibmpc.c, fences.c, insert.c, basic.c, main.c, word.c,
          x11.c, x11simp.c)

        + moved a bunch of region-related code from random.c to region.c

        + during undo, attempt to retain offset information for marks
          pointing at a line being replaced.  this makes exact marks
          last longer, and they're more important now with rectangles.

        + added extra column arguments to some of the line-processing
          routines, like entab/detab/trimline.  (insert.c, word.c)

        + fixed autoindent inconsistency, when breaking a brace-terminated
          line in half. (insert.c)

        + turned off the POISON #define.  this should have gone away a while
          ago (it fills memory with a bad patter when we free it). (line.c)

        + fixed old bug in the maintenance of MK.o when adjusting due
          to character edits. (line.c)

        + maintain record of longest line in a kill-register (line.c)

        + the histbuffer (_) command now stutters with a call to tgetc
          instead of kbd_seq, so that the pushback of an unused command
          works okay. (buffer.c)

        + anycb() now returns a pointer to the first modified buffer
          it encounters, so callers can treat the single buffer case
          specially.  changed callers as well: quit(), zzquit(), and
          spawn().  (buffer.c, spawn.c, main.c)

        + DOS video drivers are now selected more cleanly by name.  any
          driver can be selected from the command line (as long as its
          name starts with a digit).  drivers can have multiple entries
          corresponding to multiple names.  the same name can refer to
          two different entries, in cases where there are two resolutions
          for the same screen geometry. (main.c, ibmpc.c)

        + made backspacing be non-destructive in overwrite mode (insert.c)

        + eliminated the full-buffer-loop in undo.c, by using a cookie to
          identify the current undo operation, and using it to mark lines
          that have already been copied.  should be a big performance win
          for big files on slow machines.  (estruct.h, tmp.c, undo.c)

        + added support for setting the IBM color palette. (ibmpc.c, vile.hlp)
        + updated help text for X11 (version.c, vile.hlp)

        + added command line arguments -row, -cols, -leftbar, and -rightbar.

        + fix for motif resizing (x11.c)

        + updated help text for X11 (version.c, vile.hlp)

        + added command line arguments -row, -cols, -leftbar, and -rightbar.
        + Set XmNresizePolicy to XmRESIZE_NONE in x_configure_window in
          order to fix resize problems with the Motif widget set in
          which the scrollbars were getting set very big or very small.

        + Support for scrollbars on the left in motif added.  openlook
          still needs to be done.

        + Added an initialization of XtNgeometry to XtVaAppInitialize
          setting this resource to NULL.  This overrides any user
          specified geometry request for the top level shell.  The
          geometry request is still available through the geometry
          variable which Tom added to the TextWindow structure.  Tom's
          code for parsing the geometry has been preserved, but
          enhanced somewhat to set default values for the number of
          rows or columns in case if the user specified only the
          position.  Width and height specifications are considered to
          be in character widths or heights instead of in pixels.  We
          let the initialization of the screen and pane widgets
          determine the size of the outer widgets.  (Much of this is
          as it was before...the only thing really new here is one
          line added in the call to XtVaAppInitialize).

        + Added code to set XtNgeometry on the top level widget if the
          user's geometry request specified the initial window
          position.  Only the positional information is set; the width
          and height are left out in order so that the sizes of the
          children will correctly influence the initial size of the
          top level shell widget.

        + Added scrollbar support for NO_WIDGETS by using core widgets
          for both the scrollbars and the resize grips.  Geometry
          management is handled with a simple homebrew widget
          subclassed from Composite.  I believe that the scrollbar
          resize mechanism is superior to that found in xvile
          implemented with the other widget sets (particularly
          OpenLook).  We might consider either totally getting rid of
          OpenLook support (how many people are going to use it?) or
          at the very least reimplement scrollbar resize with the same
          mechanisms used by the NO_WIDGETS version.  We might also
          consider dropping the Athena widget set since it seems to be
          buggy on some platforms.  The code will be easier to
          maintain though and users will not be so confused by the
          number of configuration options if we manage to drop a
          couple of the widget sets.  (A middle ground might be to use
          only the scrollbar widgets from various widget sets.  Much
          of the complexity comes from the differences in the Form and
          Pane widgets.  This way we could still use other widgets
          from the other widgets sets in the future.  This won't make
          the configuration any easier, but it might make the code
          easier to maintain.)
        + Modified manner in which the top of the scrollbar is set for
          all widget sets.  Rather than forcing dot to be in the
          middle of the screen, we attempt to leave dot where it is. 
          The top of the scrollbar is set based upon the top line of
          the window rather than dot.  This gives consistent scrolling
          behavior.  Tom's concerns that the "thumb" or slider remain
          visible even at the end of the buffer are also addressed
          with this approach.  When at the very end of the buffer (so
          that the screen has a large number of tildes on it),
          xt-vile and xaw-vile will still display a sliver indicating
          the portion of the buffer actually shown.  If this is
          undesirable, ntildes should be set to something small (like
          zero).  Once this is done, the thumb will maintain a uniform
          size from the top of the buffer to the bottom.  I've tested
          these versions with small buffers (buffers containing zero
          thru 2*curwp->w_ntrows lines) and the appearance seems to be
          consistent throughout.  Large buffers (> 4000 lines) seem to
          still have a slight problem at the end of the buffer in

        + Made the insertion bar the mouse cursor (for the xvile
          screen only) in all versions.

        + fixed x_working so that xvile may once again be interrupted.

        + added missing assignment so that insertion bar is now really
          used when the cursor enters window corresponding to the xvile
          screen widget.

        + implemented scrollbarOnLeft resource for NO_WIDGETS version.

        + nuked ATHENA_WIDGETS code.  This code was eliminated because
          it was observed that the NO_WIDGETS version functions as
          well if not better than the ATHENA_WIDGETS version and it
          runs on machines which have a buggy (Athena) widget library. 
          On the down side, it will be somewhat harder to add new
          widgets in the future if this is desired.

        + modified kevin's resources in x11.c to use "geometry" rather than
          "rows" and "columns".  Adjusted logic so that geometry resource means
          chars, not pixels.

Changes for vile 4.0 (not released Tue Feb 22, 1994)
        + fix core from one-too-many chars to strncpy(). (eval.c)

        + change #elif constructs in version.c to oldstyle #else/#if

        + applied contributed patch for implementing 0^D in insert mode,
          and expanded it to implement ^^D. (insert.c)

        + insert mode now parses function key #c pairs returned from
          kbd_key(), so arrow keys work.  (input.c insert.c)

        + no longer turn off dot recording for non-redoable commands if
          we're in insert mode. (exec.c)

        + display high-bit keyboard input on message line in either octal
          or hex, depending on global value of unprintable-as-octal. (bind.c)

        + implemented "alt-function-prefix" to make function-key parsing
          in insert mode less ambiguous.  (edef.h, insert.c, input.c, cmdtbl,

        + new help for arrow keys, and cd/pwd commands.  also some more
          pcvile differences.  (vile.hlp)

        + fixed djgpp implementation of get_vga_bios_info, by packing
          the structs int 10/1b deals with.  this makes 43 and 50 line modes
          work.  (still don't work with watcom, though) (ibmpc.c)

        + made :memory work under DJGPP (main.c)
        + made catnap() work under DJGPP, so flash mode works now. (random.c)

        + added more dependencies to makefile.djg

        + apply patch for honoring the trailing $ in a tag lookup patterns.
          (tags.c, eric krohn)

        + make animation of buffer list take into account whether it contains
          an apropos list or a full "decribe bindings" (bind.c)

        + some makefile cleanup, for mips and NeXT, and compulsion's sake.

        + modified heuristic for setting dos-mode on an ambiguous (usually
          empty) buffer -- only set it if the global mode is set, and if
          we're actually running on DOS. (main.c, random.c, file.c, estruct.h)

        + added new function 'parse_pathlist()' to encapsulate the logic used
          in lookup of vile.hlp (PATHLOOK) and the CDPATH environment variable
          (fixes buffer overflow in the latter).

        + corrected treatment of arrow-keys (in history.c) broken in 3.65
          using new function 'kbd_escape_seq()' (input.c, history.c).

        + modified ifdef's in 'interrupted()' to test type-ahead only
          for DJGPP configuration (main.c).

        + restored code that translated CDSENSE to driver type, because it did
          not set screen defaults to maximum size (ibmpc.c)

        + I have added scrollbars to xvile.  I made a copy of x11.c,
        modified it (heavily) and called it xt.c.  [ I've renamed it x11.c,
        and moved the old x11.c to x11simp.c.  We can merge later. ] Minor
        modifications were necessary to several other of the source files. 
        (display.c, estruct.h, main.c, makefile, and window.c.)
        xt.c uses the X toolkit and the Athena widget set to provide the
        following new functionality:

            A scrollbar for each vile window.  The standard translations
            provided by Athena scrollbars control movement of text in the
            vile window.

            Resize of vile windows by moving the border between
            corresponding scrollbars (with the mouse).

            Splitting and deleting of windows may now be done with the
            mouse.  Ctrl<Btn1Down> on a scrollbar will cause the scrollbar
            and the corresponding vile window to be split with the new
            border at or near the mouse cursor.  Ctrl<Btn2Down> will delete
            the window.  Ctrl<Btn3Down> will make the corresponding window
            the only window.

            Problems with getting the input focus set properly have been

            Quitting via the window manager works better.  It basically
            works the same as if you had typed :q.  vile will display a
            message if there are any unwritten buffers.  We may eventually
            want to pop up an alert box when attempting to quit with
            modified buffers from the window manager.

        + added "ntildes" variable, which controls max number of tildes
          displayed at the end of a buffer, expressed as a percentage of
          window size.  [pgf made it a percentage] (edef.h eval.c display.c
          modetbl vile.hlp)

        + added support for the Motif and OpenLook widget sets.  

        + fixed bug where focusFollowsMouse would take us out of the message
          line when we should remain there.

This change log started on Tue Feb 22, 1994.