Change-Log-3 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.R3" on Tue Feb 22, 1994.

Changes for vile 3.65: (released Mon Feb 7, 1994)
    Big change this release is 8-bit cleanliness.  See the help file
    for 8-bit settings.  
    NOTE: If you had a FN-key binding which was bound to a "meta" (high
    bit) key, you must change your binding to be a M- binding.  FN- and M-
    are no longer synonymous.  In addition, we now preserve more of the
    termio settings, so you may have to explicitly use "stty" to get
    your meta-bit back.  (We used to clear istrip and the parity settings.)

    NOTE2: pc vile, if built with djgpp or watcom compilers, cannot change
    screens to 43 or 50 line mode.  i'm working on it.

        + fix bug in charprocreg() that allowed a buffer to be marked
          modified even if no changes were made and there is nothing to
          undo.  (region.c)

        + Brackets '[' and ']' are now treated like braces and parentheses
          when inserting in c-mode. added new #defines for [LR]BRACK to assist
          this. (insert.c, estruct.h, main.c)

        + A buffer's local "dos" mode is now set to the same as the global
          "dos" mode when empty, fresh, or when dos-style lines equal unix-
          style lines. (main.c, file.c, random.c)

        + giving an argument to "set-dos-mode" causes it to turn dos-mode
          off rather than on. (file.c)

        + allow backspacing over autoindented whitespace, whether  or not
          backspacelimit is set. (insert.c)

        + new commands, ^A-i, ^A-o, and ^A-O, corresponding to i, o, and O,
          but which do autoindent-override during an insert.  Most useful
          when pasting into a buffer, since the pasted text often already
          has leading whitespace, and autoindent just adds more.   this
          is a different kind of override than used when pasting in xvile.
          hmmm.  (insert.c, cmdtbl)

        + fixed core dump resulting from calculating indentlen and checking
          for '#' char at start of empty line.  (insert.c)

        + add directory and host names to "vile died" message.  added ifdef
          and prototype for usage of gethostname.  currently only used #if
          BERK is true.  (greg mcfarlane) (file.c, proto.h, estruct.h)

        + apply (greg mcfarlane's) fix for bug in unqname, when it's being
          used at startup, and can't ask for input from user. (file.c)

        + only reclaim or destroy empty unmodified buffers if they don't
          correspond to existing files.  new routine ffexists() to support
          this. (buffer.c, file.c, fileio,c, proto.h)

        + changed calls to kbd_key() to tgetc(), since SPEC is now outside
          the range that callers can handle.  (window.c spawn.c
          insert.c history.c exec.c eval.c csrch.c bind.c)

        + changed all references to last1key to refer to lastkey instead,
          to accompany above change.  last1key is gone. (basic.c, opers.c,

        + kbd_key() now translates system-specific function-key sequences
          to canonical '#-c' sequences, which kbd_seq() now interprets.

        + allow 8-bit input, by changing SPEC definition, and some table
          sizes. (estruct.h, input.c, mktbls.c)

        + translate X key-events to a default set of xvile FN-bindings,
          without using the SPEC define, since it won't fit through the
          8-bit wide pipe we've constructed. (x11.c)

        + added new modes, printing-low and printing-high, which define
          the range of 8-bit chars which should _not_ be displayed in
          octal, but rather as themselves.  (modetbl, modes.c, main.c)

        + change how we display 8-bit chars. (display.c)

        + new mode, unprintable-as-octal, to control display of non-printing
          chars in hex or octal. (display.c, modetbl)

        + new mode, meta-insert-bindings, which allows meta-bindings (M-c)
          to work while in insert mode.  when off, all characters, meta
          or not, are simply inserted as themselves.  when on, meta keys
          which are bound to functions execute those functions, all others
          insert themselves. (insert.c, modetbl)

        + tb_get now returns a true 8 bits, no sign-extension.  (tbuff.c)

        + allow focusFollowsMouse to be disabled by XDefaults (x11.c)

        + apply fix (kev) for infinite loop on extended lines with certain
          kinds of tab values. (display.c)

        + attempt at better video support, and raw i/o, for djgpp (ibmpc.c)

        + new routines for ctrl-c/ctrl-break/critical-error handling in
          djgpp environment. (main.c, proto.h, new file djhandl.c, makefile,

        + added DJGPP to the direct/dirent ifdef in dirstuff.h

        + fix for sys5 tgetent behavior, when attempting to determine if
          we're an xterm. (tcap.c)

        + new targets for motorola delta machines (makefile)

        + fixes for core dumps on window resize (from kev) (x11.c)

        + new define for min no. of lines per window. (estruct.h)

        + change if_OPT_WORKING to simple ifdefs. (file.c fileio.c display.c

        + added vanillashar target to makefile, so i can produce shars
          that the gnuish DOS unshar program will unpack.  (makefile)

        + clarify help file regarding regions as used by the operator
          commands (vile.hlp)

        + applied contributed fix for null fontname (x11.c)

        + changed logic of tags lookup, so i can understand it, and to
          correct logic surrounding "taglength" (again).  if taglength is
          0, matches must be exact (i.e.  all characters significant).  if
          the user enters less than 'taglength' characters, this match must
          also be exact.  if the user enters 'taglength' or more
          characters, only that many characters will be significant in the
          lookup. (tags.c)

        + fixed bug with wrap-around reverse searching for a string occurring
          on the last line of a buffer.  (search.c)

        + fixed bug in search/replace operations where replacement string
          was of the form 'text\1moretext'.  the length of the \1 replacement
          pattern was being obtained incorrectly. (oneliner.c)

        + changed GO32 ifdef to DJGPP, to avoid name conflict with
          predefinition. (input.c, fileio.c, estruct.h, ibmpc.c, path.c,
          random.c, termio.c)

        + changed the 'interrupted' global to a routine, so we can poll for
          a control-C character when real signals aren't available. (buffer.c,
          edef.h, fences.c, main.c, search.c, word.c)

        + corrected EVCURCHAR case in 'gtenv()' that tried to return the
          characters at the current position, even when the buffer was empty

        + added ifdef-controls OPT_SHOW_EVAL, OPT_SHOW_REGS, OPT_SHOW_TAGS
          (cmdtbl, eval.c, estruct.h, line.c, proto.h, tags.c), and renamed
          OPT_MAP_DISPLAY to OPT_SHOW_MAPS (map.c, estruct.h).

        + use OPT_UPBUFF in 'killbuffer()' (buffer.c).

        + added ifdef-control OPT_WIDE_CTYPES (estruct.h, input.c, main.c).

        + use new macro 'chrBIT()' to fix long/short bitmasks in character
          tests (estruct.h, line.c).

        + changed 'set_bname()' to a procedure so that it can trim trailing
          blanks from the buffer-name.  This is done so that a ^X-k command
          applied to a buffer-name beginning with "!" will work.

        + corrected length-computation in 'delins()' so that command
          ":s/abc\[\(..\))/abc[\1]/" works properly (oneliner.c).

        + corrected offset-computation in 'scanner()' so that wrapped search
          finds text on the first line after wrapping (search.c).

        + added call to 'update()' in 'ms_processing()' so that
          "show-registers" display will be properly updated at the end of
          mouse-selection (ibmpc.c).

        + corrected logic in 'execute_named_command()' that prevented user from
          typing ":0r foo" in an empty buffer (exec.c).

        + corrected 'bclear()', so that the b_ulinep member is reset if it is
          freed (buffer.c).

        + lint (fileio.c, npopen.c, spawn.c)

        + absorbed 'fnc2key()' into 'fnc2kcod()' (bind.c), to simplify
          unbinding of prefix-keys in 'install_bind()'.

        + corrected 'install_bind()' by new procedure 'reset_prefix()', so that
          mapping characters that happen to be prefix-keys will override their
          binding (bind.c).

        + added definition LTRIMMED, to use in special cases (i.e., scratch
          buffers) where we don't really want to show "^J" at the end of lines
          when "list" mode is enabled (estruct.h, display.c, file.c, line.c,

        + animated [Mapped Characters] buffer (map.c).

        + modified display of mappings so that using a repeat-count for the
          ":map" command causes the actual characters to be shown, e.g.,
          "#1" instead of "FN1", (map.c, modes.c).

        + added alternate boolean "glob" mode (in contrast to the normal string
          mode), for configurations in which vile cannot read filename
          expansions via a pipe, e.g., VMS or UNIX (mktbls.c, modetbl, glob.c).

        + moved "glob.h" definitions into estruct.h and proto.h because
          the preceding change requires some definitions to precede inclusion
          of "nemode.h" within estruct.h (descrip.mms, eval.c, filec.c, glob.c,
          main.c, makefile, makefile.djg, makefile.tbc, makefile.wat, proto.h,
          random.c, revlist, tags.c).

        + corrected test in 'index2ukb()', which caused the unnamed-buffer
          to be shown incorrectly when yanking text after lines had been
          deleted (line.c).

        + use 'DOT', 'mode_row()', 'buf_head()' and 'win_head()' macros (basic.c, buffer.c,
          csrch.c, display.c, eval.c, exec.c,
          file.c, filec.c, finderr.c, globals.c, line.c, random.c, tags.c,
          tcap.c, tmp.c, undo.c, window.c, word.c) for consistency and readability.

        + modified lines/cols initialization so that 24x80 is assumed if all
          other lookups fail, needed for apollo sr10.2 dial-in (tcap.c).

        + added macro 'KbSize()' (file.c, estruct.h, x11.c, spawn.c, line.c).

        + corrected 'imdying()' to not save temporary buffers, and to suppress
          "implybuffer" mode (file.c).

Changes for vile 3.64: (released Wed Dec 23, 1993)
        + change arithmetic expression in mktbls.c, so we don't assume
          boolean expression returns exactly 0 and 1.  this exercised
          a bug in an HP compiler (mktbls,c, from chris sherman)

        + added fallback definition of VDISABLE to termio.c, in case
          system doesn'd define it. (termio.c)

        + increased stack size for Watcom DOS builds to 16K.  probably
          overkill, but the other DOS builds seems to use 16K as well.

        + cleaned up some of the scanf nonsense, but not nearly enough.

        + don't let display-page changes affect the user's chosen cursor.

        + use _previous_ indentation level after a line beginning with '#'
          in cmode.  (insert.c, proto.h)

        + use COMSPEC environment variable when spawning a DOS shell (spawn.c)

        + assume we're an xterm if the word "xterm" appears anywhere in the
          first field of the tcbuf, rather than just in the user's TERM
          variable. (tcap.c)

        + increased size of tcbuf since SCO core dumps on overflow (tcap.c)

        + initialized tb_last in tb_alloc(). (tbuff.c)

        + couple of minor user suggestions for vile.hlp and the README.

        + don't beep when motions fail due to being aborted. (main.c)

        + check modification time on first change to buffer (file.c, exec.c,

        + the filename found for a tags lookup is now passed through doglob(),
          which means tagfiles can now refer to environment variables etc.
          (tags.c, from S.Suresh)

        + new X resource, "focusFollowsMouse", causes xvile's current window
          to track with the mouse cursor. (x11.c, from S.Suresh)

        + added '~' to the characters considered part of a pathname, so
          ^X-e will pick up ~pgf/foo correctly (main.c).

        + corrected last change to allow pipe to vile, in case it is invoked
          via 'rsh' and cannot open /dev/tty (main.c).

        + added config flag OPT_TERMCHRS (estruct.h, bind.c).

        + animated [Terminal] and [Binding List] buffers (bind.c, buffer.c).

        + corrected call on 'slowreadf()' that resulted in wrong line numbers
          when a file was piped to vile (main.c).

        + modified TurboC makefile to merge duplicate strings, saving a little
          memory (makefile.tbc).

        + corrected logic that makes ".bak" file on MSDOS so that when
          appending to a file (e.g., ":w >>foo") the file is copied after
          renaming (fileio.c).

        + consolidated some code that sets errno when user attempts to read or
          write a directory-file (fileio.c).

        + applied fix from eric krohn to fix uninitialized structure member

        + corrected "EGA" table entry (ibmpc.c)

        + prevent 'flash' mode from being used until after 'TTopen()' (ibmpc.c)

        + corrected a hole in 'swbuffer()' that tried to use a null value for
          'curwp' (buffer.c).

        + modified to allow "@" startup file to have errors w/o defaulting to
          "vile.rc", by checking to see if a buffer was created (main.c)

        + corrected logic of 'vtputc()' and 'vtset()' to make line-wrap display
          properly when the line contains control characters (display.c).

        + corrected limits of highlighting in 'change_selection()' (x11.c)

Changes for vile 3.63: (released  Wed Nov 10, 1993)
        + corrected 'pathcat()', to avoid using autoincrement in 'slashc()'
          macro (path.c).

        + cleanup for gcc-2.4.5's -Wall warnings (estruct.h, display.c, exec.c,
          finderr.c, glob.c, mktbls.c, modes.c, npopen.c, proto.h).

        + compiled with CenterLine 'clcc' compiler (bind.c, buffer.c,
          display.c, eval.c, file.c, filec.c, glob.c, globals.c, line.c,

        + corrected 'backpage()' to update mode-line after "previous-page".

        + modified ibmpc.c to make flash/mouse code more portable.

        + corrected call on 'strncpy()' in 'kbd_reply()' where 'extbuf' may be
          copied onto itself.  On HP/UX, this causes the destination to be
          cleared (input.c).

        + modified initialization of IBMPC to make "flash" mode work better on
          MSDOS (ibmpc.c).

        + modified so that on MSDOS and VMS vile properly handles files that
          are redirected to it via the standard input (main.c).

        + corrected bug that caused ":e#" command to ignore the '#' character

        + corrected handling of ":tag" command so that if a tag's length is
          shorter than the taglength setting, the shorter value is used

        + modified 'writereg()' to prevent inadvertant file-write using a
          read-pipe expression (file.c).
        + fixed indenting bug in formatregion().  (word.c)

        + added SHELL=/bin/sh to makefile

Changes for vile 3.62: (released  Mon Oct 11, 1993)
        + enable DOS mouse processing for Turbo-C only, since some code
          uses Turbo-isms to get at registers (_AX, etc)  (estruct.h)

        + change references to, x.bx, x.di, etc to be x._AX_, x._BX_, etc.
          to satisfy the Watcom 386 need for eax, ebx, edi, etc.

        + improper automatic indent on brace insertion fixed (insert.c,
          fmatch,c, proto.h)

        + the ls -a output in imdying() was producing a line with a lone '.'
          on it, which was terminating /bin/mail.  use sort -r to rearrange
          it. (file.c)

        + re-ifdefed getscreensize, for machines without SIGWINCH

        + guard against zero values for tabstop and shiftwidth  (buffer.c)

        + added global control variable to make it easy to turn off the
          "working..." message. (display.c)

        + don't let hst_append() do anything if clexec is set (history.c)

        + click the mouse (with xterm-mouse set) no longer calls showcpos().
          if you want the mouse position, turn on "ruler-mode" (tcap.c)

        + flash mode is now off by default.  beeps should be beeps until
          requested otherwise. (main.c)

        + applied vms path fix in pathcat() (path.c)

        + don't insert tabs during reformat if notabinsert is set (word.c)

        + applied patches for djgpp from Jim Crigler. (estruct.h, ibmpc.c)

        + TurboC compiler warnings (history.c, mktbls.c, oneliner.c, search.c).

        + added TurboC compiler warning patterns (finderr.c).

        + implemented mouse highlighting for MSDOS (display.c, ibmpc.c).

        + made the table-driven combinations for $sres work properly (ibmpc.c).

        + corrected 'repointstuff()', so that undo works properly for multiple
          windows; other window's dot wasn't being updated (undo.c).

        + modified 'execute_named_command()' to set dot-moved flag if the
          range-computation moves it, fixes warning from 'updpos()' (exec.c).

        + linted remaining size_t usage (basic.c bind.c display.c estruct.h
          eval.c exec.c filec.c glob.c history.c isearch.c mktbls.c npopen.c
          oneliner.c proto.h regexp.c search.c spawn.c vmsvt.c).

        + guarded &left, &right, related functions against negative indices,
          etc., (eval.c).

        + changed sizes in regexp-struct to SIZE_T (from short, int) to support
          lint (estruct.h).

        + added command-line option "-wm" to set X11 window-manager title
          (main.c, version.c, x11.c).

        + modified prompts to make ^V echo until the character is followed by
          what we want to see a la vi (input.c).

        + modified treatment of '!' character (in shell prompts) to expand it
          immediately, more like vi (main.c, history.c, input.c, spawn.c).

        + corrected some ifdefs that broke !-commands when compiling small
          configuration for testing (cmdtbl, bind.c, eval.c).

        + whitespace spawn.c

        + corrected redisplay logic in 'execute_named_command()' when repeated
          backspace characters were received (exec.c).

        + modified logic in 'imworking()' to be a little more conservative when
          erasing leftover text in the message line, e.g., when it happens
          during filename-completion on large directories (display.c).

        + corrected a hole in 'hst_append()' that allowed non-interactive use
          of the bind-key function to erroneously set the 'clexec' flag
          breaking subsequent named-commands (history.c).

        + trailing blank, e.g., "int<sp><nl>tgetc(quotec)<nl>" breaks apollo
          ctags by making it generate a pattern only for the "int<sp>" (bind.c,
          input.c, isearch.c, search.c).

        + modified 'imply_buffer()' so that c-mode is set as in 'readin()'

        + corrected 'getfile()' to treat names longer than NBUFN as filenames,
          and 'unqname()' to assume its 'bname' argument can have a trailing
          null (buffer.c, exec.c, file.c, main.c).  (This fixes a bug I
          introduced in 3.60 that prevented using ":e %+" properly, where "%"
          expands to a long buffer name, because the buffer names are compared
          with 'strncmp()').

        + modified 'getfile()' to suppress redundant prompt by using returned
          state of 'unqname()' (file.c).

        + modified 'mlreply_file()' to prompt if a wildcard expands to multiple
          files (e.g., when reading a file) (filec.c).

        + modified 'tokval()' to expand ~-paths so macros can refer to user's
          home paths (eval.c).

        + corrections to vms filename-completion (path.c).

        With Purify demo

        + corrected memory leak in 'FreeBuffer()' (buffer.c).
        + corrected uninit-memory reference in 'kbd_show_response()' (input.c,
          history.c), in 'dfputsn()' (display.c).

        + corrected reference to freed memory in 'listmodes()' and modified
          logic to use 'animated' logic, and variables 'relisting_b_vals' and
          'relisting_w_vals'.  As a side-effect, this allows local buffer and
          window modes to be set in [Settings] (buffer.c, display.c, edef.h,
          main.c, modes.c).

        + corrected a null-pointer reference to 'fromline' when a ":0" command
          was entered in an empty buffer (exec.c).

Changes for vile 3.61: (released  Thu Sep 16, 1993)
        + when files are saved in /tmp, and mail is sent, the list is now
          created with "ls -a" to make all files visible. (file.c)

        + when trying to get back to the current buffer in globber(), use
          set_curwp() instead of swbuffer(), since swbuffer() may not take
          us back to the same window we started in, if the buffer is
          multiply displayed. (globals.c)

        + moving the cursor with the mouse (xterm-mouse) causes showcpos()
          to be called, as if a ^G had been typed.  the message line needed
          to be cleared in any case, to delete old ^G output, so i thought
          i'd try updating it instead (should a similar change be made in
          x11.c?). (tcap.c)

        + in cmode, parentheses are treated like braces, in that if a line
          ends with a left one, the next line is indented, and if it starts
          with a right one, the line is aligned with the line containing the
          match.  this may be useful for parentheses-heavy languages like

        + nits from 3.60 integration (file.c, mktbls.c, proto.h, glob.h)

        + allow "number" mode to be set/unset in scratch buffers (modetbl,
          display.c, random.c).

        + use 'delay()' function in TurboC for 'catnap()' (random.c)

        + ifdef'd "dirc" and "history" modes so that they don't appear in
          [Settings] when not configured (modetbl, main.c).

        + brought TurboC makefile up-to-date (makefile.tbc).

        + corrected logic of 'makemodelist()' so that both buffer and window
          local modes are shown (modes.c).

        + corrected my last change to 'unqname()' to ensure that if the b_bname
          field is short enough, it will have a null terminator (file.c).

        + moved logic that reports lines-deleted from 'ldelete()' to common
          logic of 'operdel()' and 'operlinedel()', so that using 'ldelete()'
          internally won't generate spurious messages (line.c, opers.c).

        + used 'doingopcmd' to modify return-status of motion commands (h,l) to
          get rid of special-case handling so that when used internally they
          don't fail; obsoleted 'forwchar_in_line()' (basic.c).

        + use macro 'cmdBIT()' to clarify flags for CMDFUNC, added flag OPTREG
          to simplify test in 'execute_named_command()', and make test for
          optional register and/or line-count more explicit by allowing it only
          when non-punctuation follows the command (fixes ":s/pattern")
          (cmdtbl, estruct.h, exec.c, input.c).

        + corrected my last change to make "2p work correctly, by using new
          function 'index2ukb()' (line.c).

        + modified 'mlreply_file()' so that filename completion works on the ^W
          and ^R screen commands (filec.c).

        + modified 'getregion()' to use line-number to simplify computation,
          and to work with left-margin.  Also whitespaced (region.c).

        + corrected test in 'loop()' that caused j/k commands to go awry in the
          [Registers] buffer at blank lines (main.c).

        + corrected test in 'kbd_reply()' to avoid name-completion when the
          current-response is a shell-command, e.g., "!foo -?" (input.c).

        + corrected logic in 'forwchar_to_eol()' and 'ins_anytime()' that lets
          arrow-keys to go past the end of the line while in insert (or
          replace) mode (basic.c, insert.c).

        + corrected logic that allowed a user to begin an insertion in one
          buffer, then click the mouse to reposition into a readonly buffer
          and continue inserting -- in the readonly buffer (basic.c, insert.c).

        + added mode 'flash' (ibmpc.c, main.c, tcap.c, x11.c)

        + added logic to support msdos-mouse, using defines OPT_MS_MOUSE and
          OPT_MOUSE.  This version only supports repositioning clicks (basic.c,
          display.c, estruct.h, ibmpc.c, termio.c).

        + use symbol ALLOC_T to clarify distinction between size_t/int/unsigned
          (display.c, edef.h, estruct.h, eval.c, filec.c, fileio.c, finderr.c,
          line.c, oneliner.c, proto.h, regexp.c, tbuff.c, undo.c, x11.c)

Changes for vile 3.60: (unreleased)
        + added "stop" command (synonym for "suspend-vile", aka ^Z) (cmdtbl)

        + ensure shiftwidth and tabstop are always set correctly after modes
          are adjusted -- any of cmode, cts/ts, csw/sw can affect. (modes.c)

        + added support to finderr() for OSF1 (DEC Alpha's, at least) compiler
          errors, of the form:
                /usr/lib/cmplrs/cc/cfe: Error: test.c, line 8: Syntax Error

        + took out leftover dbwrite() call from rangespec() -- may fix errant
          behavior on ":.$d" (exec.c)

        + fixed helpfile note about X11 -name option -- it sets the name
          used for resource lookups, not the window name.  (vile.hlp)
          how do we set the window name?

        + under DOS, leave the cursor shape and the keyboard repeat rate
          alone.  if we get complaints, perhaps we should mode-ify these,
          but in general, settings like that are personal, and we shouldn't
          muck with them.  (ibmpc.c)

        + don't introduce extra path separators in pathcat() (path.c)

        + protect against NULL returns from getcwd, in case the directory
          we're in has been removed. (random.c)

        + changed symbol "glob()" to "doglob()" to stop name conflict with
          standard libraries (glob.c, eval.c, random.c, filec.c)

        + added prototypes for glob.c to proto.h

        + eliminated infinite loop when using goto-beginning-of-sentence from
          end of buffer (basic.c)

        + added mode "multibeep" to control the "one beep per failed motion"
          logic -- if multibeep is on (default), then every failed motion
          produces a beep.  if it's off, then only the first (of a set of
          identical) causes a beep. (modetbl, main.c)

        + corrected possible use of uninited locals in file.c (was really
          only a warning suppression) and  display.c

        + turned off beeping in search.c and csrch.c, now that all failed
          motions cause beeps.

        + change "Date" to "installed" in version.c, since modtime really
          only reflects installation date.

        + don't let vile use a screen dimension of less than 2 in either
          direction (display.c, tcap.c)

        + fixed bug that made all TERM types be thought of as xterms. (tcap.c)

        + fixed documentation of the help commands.  it's been wrong
          for over three years now, and it's in the first screen of
          help! (^X-^H and ^A-^H should be ^X-h and ^A-h) (vile.hlp)

        + added AIX to the machines that need sys/ioctl.h, to pick up
          TIOCGWINSIZE (display.c)

        + reset the "calledbefore" flag in docmd().  fixes chris sherman's
          problem where a second substitute-til in a macro would appear to
          do nothing.  (actually it was reusing its previous args, so there
          was simply nothing to do)  (exec.c)

        + added '>' to the characters known to the reformatting code, so
          you can reformat most email replies. (word.c)

        + added automatic patchfile generation to the makefile.  hopefully
          i can generate patches for all future releases, in addition to
          shar files. (makefile)

        + made ansi.c work with TurboC (ansi.c, main.c, display.c, termio.c),
          to use as test-case for COLOR.

        + corrected highlighting code for ":%s" command with ibmpc display
          (display.c, ibmpc.c).

        + modified 'bfind()' to always return a buffer (unless it cannot create
          the buffer), use 'find_b_name()' for the no-create mode (bind.c,
          buffer.c, eval.c, exec.c, file.c, filec.c, finderr.c, history.c,
          main.c, map.c, modes.c, oneliner.c, random.c, spawn.c, tags.c).

        + use macros 'set_bname()' and 'eql_bname()' and function 'get_bname()'
          to encapsulate buffer name, which does not necessarily have a
          trailing null (bind.c, buffer.c, display.c, estruct.h, eval.c,
          exec.c, file.c, finderr.c, input.c, main.c, modes.c, oneliner.c,
          spawn.c, tags.c, tmp.c).

        + removed nonstandard 'strncpy()' (main.c).

        + corrected 'kbd_show_response()' to work with expand-chars mode

        + corrected 'kbd_reply()' to make the number of characters shown have
          the same limit as the caller's buffer-length, and to make it always
          return the data with a trailing null (input.c).

        + made 'animated' mode work for [Registers] buffer (line.c), and
          modified the logic so that numbered-buffers are displayed in a
          vi-compatible manner.

        + make shift-commands work more like vi, allowing repeated '<' or '>'
          characters in a :-command to imply a repeat count (bind.c, exec.c,

        + corrected logic of 'dofile()' so that if an error is found in the
          startup file, vile properly sets curbp and curwp (exec.c).

        + simplified/corrected command-history logic of to fix error that
          prevented scrolling past ":e!" command, and to allow scrolling of
          '<', '>' command even when repeated (bind.c, exec.c, history.c,

        + added flag KBD_EXPCMD to handle the case (from rewrite of history)
          where %,#,: expansion must be done for shell commands (estruct.h,
          bind.c, input.c).

        + added OPT_HISTORY to allow ifdef'ing of history.c code (estruct.h,

        + cache home-directories looked up in 'home_path()' to make it run
          faster (path.c)

        + modified glob-expansion to allow "~" expansion.  This doesn't work
          with wildcards in the user-portion (e.g., "~ab?"), but suffices for
          most cases (glob.c).

        + added a find-error case for apollo's C++ compiler (finderr.c).

        + modified logic for 'displaying' vs 'imworking()' slightly, to get rid
          of erroneous cursor movement (display.c).

        + added function 'slowtime()' to force updates in 'slowreadf()' more
          often (file.c).

        + adjusted definitions for better lint checks on apollo sr10.2
          (estruct.h, makefile).

        + make piped-input also set error-buffer (main.c).

        + revised logic that sets VAL-structs for modes to correct places where
          buffer & window traits are saved without converting to local values.
          Also removed code (e.g., copy_val) that checks reference counts,
          since they aren't really necessary (buffer.c estruct.h main.c modes.c

        + modified behavior of 'unsetl' command to delete local setting
          (eval.c, modes.c).  It was only modifying (toggling) boolean modes.

        + corrected 'reframe()' to handle linewrapping case submitted by
          alistair (display.c).

        + corrected cursor-update in 'x_scroll()' that left stray cursor images
          remaining after ^D/^U commands (x11.c).

        + corrected logic that caused selection-text to be lost when keypress
          was received (x11.c).

        + modified X-windows pasting to trim unneeded whitespace when inserting
          into cmode or autoindent buffer (bind.c, x11.c).

        + corrected kill-buffer flag KAPPEND, which had the same value as
          KLINES (estruct.h, line.c).

        + corrected error in 'doindent()' that caused a "<nl>}" insertion to
          delete nonwhite characters (insert.c).

        + corrected ":tags" command for exact (taglen=0) lookups (tags.c)

        + make failed motion-commands sound an alarm like vi (main.c).

        + modified logic for h,j,k,l,^D,^U,^F,^B commands to return false when
          they fail, so failed-motion alarm works (basic.c).

        + corrected logic for b,B,w,W,e,E commands to return false only when
          backing/forwarding past the buffer ends (word.c).

        + modified alternate-window motions 'scrnextup()', 'scrnextdw()',
          'mvdnnxtwind()', 'mvupnxtwind()' to also return failed-motion status,
          for consistency (window.c)

        + made new function 'forwchar_in_line()' to do the vi "l" command,
          dissociating it from the internal motion-command (basic.c, cmdtbl).

        + made 'backhpage()', 'forwhpage()' motion-commands (cmdtbl).

        + make failed quit-commands return false (main.c).

        + make version-command show UNIX or VMS executable's date (main.c)

        + corrected behavior of 'histbuff()' when user simply toggles with the
          "_" command.  This did not handle the case in which the alternate
          buffer was temporary, and thus had no number (buffer.c).

        + introduced new buffer-attribute 'b_lim_left', macro
          'w_left_margin()', ifdef'd with OPT_B_LIMITS, use this to control
          cut/paste selection in [Registers] (basic.c, buffer.c, csrch.c,
          display.c, random.c, region.c, window.c, x11.c).

        + modified 'execute_named_command()' to recognize register name and
          line-count for commands such as ":yank", making it handle cases such
          as ":5>6", ":y a 6", ":10,20y b" (exec.c, input.c, line.c).

        + modified ":put" command to report the number of lines added (line.c).

        + split out 'version.c' because main.c got too large for apollo lint
          (main.c, makefile*, vms_link.opt, link.msc).

Changes for vile 3.59: (released Wed Aug 18, 1993)
        + added VIEWOK flag for functions that execute macros.  it says
          it's okay to execute them in view mode, even though they have the
          UNDO bit set.  this fixes not being able to run @, :map'ed, or
          ^X-& macros in view-only buffers.

        + made the xterm-mouse mode available in xvile as well as vile, to
          make it easier to share .vilerc between the two versions.  the
          alternative is to insist that people put ~force set xterm-mouse
          in .vilerc, to override the error they'll get in xvile from the
          mode not being present. (input.c, modes.c, estruct.h)

        + changed default value of "xterm-mouse" to off, to make vile behave
          like it used to, and like other character applications, by default.

        + turned off support for the "working..." message for builds that
          define USG, since they probably have non-restartable system calls.

        + accept any TERM variable that ends in "xterm" to be an xterm.
          (tcap.c, vile.hlp)

        + fixed "uninitialized variable 'req'" when compiling without REVSTA
          defined. (display.c)

        + fixed missing closing double quote in "make all" help output.

        + bumped the maximum row count from 100 to 200.  i personally can't
          read more than about 70 lines on a 19" mono monitor, but maybe
          i need glasses. (tcap.c, x11.c)

        + took out extraneous trace.h include from x11.c

        + corrected 'col2offs()' to make it easier to position the mouse on a
          tab character (display.c).

Changes for vile 3.58: (released Fri Aug 13, 1993)
        + added "sys$login:" to VMS file search path for vile.rc

        + refined 'imworking()' to get rid of leftover working-message
          (display.c, file.c).  Make working-message show up only when 'terse'
          mode is off (the default).

        + added code to support xterm mouse-clicking (to move dot), with
          additional code for later use with highlighted selections.  Made this
          a mode (xterm-mouse) because it does not implement cut & paste yet
          (basic.c, display.c, input.c, main.c, modes.c, tcap.c).

        + added calls to 'TTkopen()' and 'TTkclose()' to termio.c so that (for
          all systems) we call these within 'ttclean()' and 'ttunclean()'
          (termio.c, tcap.c).

        + optimized display of 'ruler' (display.c)

        + use 'displaying' as a semaphore rather than true/false flag, as a
          guard against interrupt by 'imworking()' which modifies ttcol and
          ttrow (bind.c, display.c, main.c, tcap.c, x11.c).

        + make ":=" command accept address (like vi) to show arbitrary address
          value (cmdtbl, estruct.h, exec.c, random.c).

        + don't let 'write-til' move dot (cmdtbl).

        + modified 'doindent()' to trim leading whitespace (like vi) from the
          portion of the line after dot (insert.c).

        + modified insert-code to treat the combination of repeat-count and
          newline like vi, causing the repeat count to apply only to the
          insertion-string before a newline.  (edef.h, input.c, insert.c)

        + corrected handling of '.' repeat-count for r,R commands (insert.c)

        + modified user-variables to make them dynamically-allocated, and to
          remove the restriction on the length of their names (mktbls.c,
          estruct.h, eval.c, main.c).  Also corrected treatment of newline in
          prompt for user-variable name.

        + used 'strncpy()' to copy return-values from 'kbd_reply()', just in
          case macro-tokens are too long (input.c).

        + don't expand '%' or '#' in 'kbd_reply()' if it would be the name of
          an invisible buffer (input.c).

        + added universal-modes 'expand-chars' to list the characters to expand
          in 'kbd_reply()', and 'expand-path' to control whether %/# are shown
          as full, or shortened paths (modetbl, input.c, main.c).

        + modified X-windows config to allow processing of events when the
          working-message code is executed (display.c, x11.c).  This makes the
          screen refresh and keyboard handling work better.

        + added 'animated' buffer-mode to control whether vile updates
          scratch buffers when their contents would change (e.g., the buffer
          list), made this work for buffer-list (buffer.c, display.c,
          estruct.h, modes.c, modetbl).

        + revised the 'killbuffer()' code to work properly with the animated
          mode (buffer.c).

        + modified mktbls to check for illegal mode-names (mktbls.c).

        + linted with SMALLER set (to get rid of unused functions), introduced
          new ifdef with OPT_EVAL to simplify (basic.c bind.c buffer.c cmdtbl
          estruct.h eval.c insert.c line.c lint.out modes.c npopen.c proto.h

Changes for vile 3.57: (released Fri Aug 06, 1993)
        + the bug check for b_ulinep pointing at a newly inserted line is
          no longer valid, since we can now insert a line, make changes (which
          will set b_ulinep), undo those changes, and then undo the insert.
          we now just null out b_ulinep when we remove the line it references.

        + changed name of setmode() to avoid library conflict with djgpp, and
          changed the other del/setg/delg versions as well.  (cmdtbl, modes.c,

        + took out #define USG 0 since djgpp uses an #ifdef on this in a header
        + whitespace in basic.c

        + corrected definition of ScratchName macro for apollo SR10.2
          (estruct.h) and a compiler warning (in glob.c).

        + corrected gcc warnings about 'signal()'-arguments for SunOs.

        + use new macros ACTUAL_SIG_ARGS, etc., instead of ACTUAL_SIGNAL so
          that the tag-file can find the signal-handling procedures (estruct.h,
          display.c, file.c, main.c, proto.h, spawn.c, x11.c).

        + customized the c-suffix default values for VMS, MSDOS and UNIX.

        + VAX/VMS C does not allow continuation-lines in ifdefs (mktbls.c).

        + VAX/VMS C may incorrectly set ferror() when feof() is true (fileio.c)

        + VAX/VMS C 'rewind()' does not work correctly (fileio.c)

        + added code to show "working..." message for time-consuming operations
          (display.c, npopen.c, vmspipe.c), and to allow 'slowreadf()' to show
          its progress (file.c, fileio.c).

        + linted calls on 'signal()', (main.c, display.c, spawn.c, termio.c).

        + linted calls on 'firstnonwhite()' (basic.c, exec.c, insert.c, line.c,
          opers.c, region.c, spawn.c, word.c).

        + use new functions 'end_named_cmd()', 'more_named_cmd()' for clarity
          (exec.c, file.c, map.c, oneliner.c)

        + added new mode 'ruler' (to display line+column in a window on the
          modeline), and new window-flag WFSTAT to support it (by allowing
          non-modal information to affect the modeline).  (display.c)

        + corrected error I introduced into 'reframe()', and in 'row2window()'
          while adding 'linewrap' mode (display.c).

        + corrected code that frees buffer's fname-field for the special case
          of out-of-memory (buffer.c, random.c).

        + added new command 'tagstack' to show the contents of the tag-stack.
          Modified 'tags()' to use module-level 'tagname[]' rather than local
          copy of tag-string.  (tags.c)

        + always update the modtime-at-warn buffer field when prompting
          for the check-modtime mode (file.c).

        + removed (obsolete) code for DEC Rainbow (estruct.h, display.c,

        + modified 'line_no()' to return values in the range 1..MAX+1
          instead of 0..MAX (random.c).

        + corrections to make X11 version work with 'number', 'linewrap' modes,
          to guard against selection extending outside a window, to highlight
          only the actual text within a window, and to use 'yankregion()' to
          save the paste-text.  (basic.c, display.c, window.c, x11.c)

        + modified 'typahead()' to know when X-windows is pasting, and the
          paste-init code to supply an escape to end insert-mode, and to use
          TBUFF's so that nulls can be inserted (termio.c, x11.c).

        + put the repeat-count in 'map_proc()' back the way Otto Lind had it

Changes for vile 3.56:  (released Tue Jul 27, 1993)
        + after a confirm substitute operation, we now mlerase the confirm
          prompt (oneliner.c)

        + be sure the [vileinit] buffer is marked as scratch while doing the
          bprintf into it, so undo record-keeping will be suppressed. (main.c)

        + rearranged calls to chg_buff and ldelnewline in ldelete, so that
          the buffer will still be marked clean on first toss/copy/tag to
          undo.  unmodified state is now restored correctly after a :g/^$/d is
          undone. (line.c)

        + In regular expressions, \s and \S are now true atoms.  they both
          must now be followed by * or + to match more than one.  also, \s
          no longer matches BOL or EOL (thanks to alistair and eric for
          pointing out and fixing) (regexp.c)  In practice this means that
          one should use \s* or \s\+ where one used to use just \s.  also,
          if a match against ^ or $ is necessary, it must be done explicitly,
          e.g. /\(^\s*\|\s\+\)word/ instead of /\sword/

        + adjusted paragraph/section/comment/sentence regexps, with help
          from eric, to reflect change to \s and \S

        + make the #ifdef USE_TERMIO version of ttclean() be a no-op under
          X11, as it is in the other cases.  eric's right -- termio.c needs
          a rewrite.  (termio.c)

        + don't pass the (0) to getpgrp if we're POSIX and ANSI -- the
          library is probably the right one, and there's a high probability
          of a prototype conflict if we _do_ pass it.  (spawn.c)

        + When looking up X defaults, the old code checked the class first,
          then the specific program name.  This is backwards since if the
          class value exists, there is no way to override it with the -name
          option.  (x11.c)

        + AIX and pyramid think we have non-constant case expressions (eval.c)

        + There is no requirement in ANSI C for SCRTCH_LEFT and SCRTCH_RIGHT
          to be expanded before the ##.  Some preprocessors do and some don't.
          However, the other #define using just #s and string concatenation
          seems to work everywhere.  (estruct.h)

        + clarified usage of &sin function, which searches its first argument
          for an occurrence of the second.  (vile.hlp)

        + renamed UCHARAT to UCHAR_AT; added defs for UCHAR USHORT, UINT and
          ULONG for easier linting/reading (bind.c, dirstuff.h, estruct.h,
          file.c, history.c, ibmpc.c, input.c, isearch.c, line.c, oneliner.c,
          proto.h, tbuff.c, vmalloc.c, vmsvt.c, x11.c, z_ibmpc.c)

        + make 'prc2kcod()' return an int again, some optimization of 'token()'
          (bind.c, file.c).

        + clean-compiled/tested X11 + DEBUGM + OPT_MAP_MEMORY with gcc
          (basic.c, edef.h, exec.c).

        + disable filename-completion when OPT_MAP_MEMORY is enabled.

        + added mode 'newline', set to true when reading files that have a
          trailing newline (the normal vi-convention), modified (file.c,
          buffer.c, random.c).

        + fixed place where ":ww" garbages the screen before reporting
          "wrote 0 buffers" (buffer.c).

        + simplified 'writereg()' and 'ffputline()' (fileio.c, file.c) to allow
          'newline' mode to control whether a trailing newline is written to
          output files.

        + modified 'kifile()' so that it does not insert the trailing newline
          if it wasn't present in the file.

        + made 'ldelete()' return from one point (line.c) to simplify 'report'

        + added mode 'report', to specify the number of changes before a
          message is emitted:
                NN lines deleted                6dd
                NN more lines                   u
                NN fewer lines                  u
                NN fewer lines                  :g/^$/d
                NN lines yanked                 "a8yy
                NN substitutions on MM lines    :%s/x/XX/g
                NN substitutions                :%s/x/X/
          (globals.c, line.c, undo.c, oneliner.c, random.c, region.c)

        + corrected unnecessary screen-update in 'substline()' (oneliner.c)
          introduced in confirm-changes.

        + added 'linewrap' mode (basic.c, buffer.c, display.c, windows.c).

        + corrected cursor movement for large repeat counts with 'H' command

        + ifdef'd 'screen_string()' to handle apollo compiler warning when
          testing SMALLER configuration.

        + added stubs for modes 'popup-msgs', 'popup-choices'.

Changes for vile 3.55: (released Mon Jul 19, 1993)
        + new routine, mlquickask(), which prompts for and returns a single
          key answer from a user.  use this when getting a confirm from a
          user for a substitute command. (input.c, oneliner.c, proto.h)

        + documented the 'c' for confirm (vile.hlp)

        + the token() routine now expands numeric escape codes, like \nnn and
          \xNNN where nnn are octal and NNN are hex digits.  this may affect
          vilerc files that have \ sequences in them.  support for mapping
          to key-sequences like 0xNN is gone -- use \xNN instead.  this will
          make it easier to do multi-char maps in the future.

          note that \000 will cause internal problems, since things are null-
          terminated, and the sequences "<sp>", "<tab>", and "^C" are all
          problematic when multi-char sequences come around.

        + added highlighted confirm to ":s" command.  (oneliner.c, display.c)

        + modified 'makebindlist()' (in bind.c) to format using tabs rather
          than spaces.

        + many mods to map.c (and bind.c) to eliminate redundancy between it
          and bind.c

        + modified 'prc2kcod()' to look for only one prefix, but allow
          hexadecimal code in form 0xff.

        + corrected a recursion bug in 'install_map()' (file map.c)

        + modified ":map" (file map.c) to show show mappings if no values are

        + fix strict gcc warnings in x11.c, consolidated some initialization
          code and corrected font-ascent value (so 9x15 works properly).

        + added "on" and "off" to literals in 'stol()' (file eval.c) to use
          this in x11.c

        + modified 'killbuffer()' in buffer.c to recognize a repeat-count
          (e.g., allows ^X-k within the buffer list to remove a succession of

        + fix strict gcc warnings in ansi.c

        + make command-history record properly for bind-key and map commands
          (files bind.c and map.c).

        + modified 'engl2fnc()' (in bind.c) to allow unique abbreviation (so
          that scripts don't have to be spelled out), added "se" symbol to
          cmdtbl for vi-compatibility.

        + modified 'docmd()' (file exec.c) to allow leading ':' in scripts
          for vi-compatibility.

        + corrected logic in modes.c to (re)allow trailing whitespace on
          the end of set-commands.

        + merged files makmktbl.tbc and makvile.tbc into makefile.tbc

        + eliminated 'VIDEO *' arguments from 'updateline()' in file display.c
          because the 'row' argument already provides this information.

        + added 'offs2col()' to correct position of highlighting when
          confirming substitutions.

Changes for vile 3.54: (released Fri Jul 09, 1993)
        + will now call setvbuf instead of setbuffer if USG defined in the
          POSIX version of ttopen.  this to support SVR4 (well, solaris)

        + took out the more stringent prototype warnings (-Wstuff) from the
          gcc OPTFLAGS, since we don't pass them yet (someday, alistair).

        + mode and variable symbol names generated by mktbls are now of the
          form "s_name__" instead of "s_name", to be more unique.  (there
          was a conflict with a (naturally named) typedef of signed char to
          "s_char".)  (mktbls.c)

        + upped the max number of screen columns for x11.c.  was 150, now is
          200.  reduced the max rows number from 200 to 100.  the screen
          buffers should be made re-allocatable, so we wouldn't eat the space
          unless necessary.  made the normal (tcap.c) maximums match these.
          (tcap.c x11.c)

        + applied Tuan Dang's fixes for my merging of his watcom and djgcc
          patches.  Thanks Tuan!  (makefile.wat, ibmpc.c, estruct.h, path.c,

        + turn DOS mode on by default for DOS versions of vile. (main.c,

Changes for vile 3.53:  (released Thu Jul 07, 1993)
        + stop core dump on file completion (":e fi<tab>") by making sure
          BFSIZES bit is cleared when building MyBuff

        + in rtfrmshell(), there was a "curwp->w_flag = WFHARD" statement,
          with a comment asking if it was needed.  in fact, it's wrong, so
          i took it out.  it was tromping other flags, like WFMODE, for that
          window only (spawn.c).

        + in update(), don't add nu_width to screencol if the buffer is empty,
          since there is no line number in that case. (display.c)

        + fixed bug when undoing the first insertion into an empty buffer.
          the value of dot was being restored to the inserted (and now gone)
          line.  (line.c)

Changes for vile 3.52:
        + added a couple of tweaks to tom's check-modtime changes -- prompts
          are not suppressed if you're writing the buffer out, and running
          a shell only checks visible buffers for modtime changes, rather
          than all buffers. (mostly file.c, estruct.h, random.c)

        + changed name of "timeout-value" to "timeoutlen", to match some
          versions of vi.  (modetbl, vile.hlp)

        + applied patches from Tuan DANG ( to support
          DJGCC v1.09 (display.c, estruct.h fileio.c ibmpc.c main.c mktbls.c
          modes.c path.c random.c spawn.c termio.c)

        + consolidated TURBO, WATCOM, MSC, ZTC, and GO32 under a new,
          presumptuous #define, called NEWDOSCC. (mostly same files as djgpp

        + fixed calloc macro (estruct.h) in RAMSIZE ifdef

        + added map.c/map.obj source file for VMS (descrip.mms, vms_link.opt)

        + removed bogus dbgwrite in exec.c, where linespec returns a value
          for "toline" which can be null.

Changes for vile 3.51:
        + added a couple of tweaks to tom's check-modtime changes -- prompts
          are not suppressed if you're writing the buffer out, and running
          a shell only checks visible buffers for modtime changes, rather
          than all buffers.

        + added regexp metacharacter "index" in margin of vile.hlp.

        + renested some limit setting in scanner(), so I can understand it
          again. (search.c)

        + changed name of ABS macro to ABSM to avoid namespace conflict
          on OSF/1. (cmdtbl, exec.c estruct.h)

        + made :map to SPEC key-sequences work (map.c insert.c)

        + undo now preserves current column as well as row (undo.c estruct.h)

        + changed name of "naptime" to "timeout-value"  (main.c modetbl
          vile.hlp input.c)

        + added new variable $mode, which is the name of the user-mode we
          e're in: "command", "insert", "overwrite".  the value is set
          when we enter insertmode, and restored when we leave.  this lets
          macros invoked from within insert mode find out if they should
          enter insertmode.  (eval.c, modetbl, insert.c, proto.h, vile.hlp)

        + prc2kcod will now accept literal control chars, and also will
          accept hex specifications.  so now key-sequences can be specified
          as follows:           (bind.c map.c vile.hlp)
                an optional prefix:
                        ^A      (one char)
                        ^A-     (three chars)
                        ^X      (one char)
                        ^X-     (three chars)

                followed by an optional "function" prefix:
                        FN-     (three chars)
                        M-      (two chars)
                    (these two are synonymous)

                followed by a character:
                        C       (one char)
                        ^C      (one char)
                        ^C      (two chars)
                        0xNN    (four chars)
                        0XNN    (four chars)
                        <tab>        (five chars)
                        <sp> (four chars)

        + removed old BEFORE ifdefs (input.c insert.c)

        + better error checking on parsing of key-sequences in exec'ed files.

        + if dobuf() encounters an error, it switches to that buffer.  but
          until now, this error propagated back through nested dobuf()'s,
          and we ended up looking at the 'source "filename"' line in the
          outermost buffer.  now we only switch on the most deeply nested
          dobuf().  also, we no longer set file buffers that we're executing
          to view-mode.  (exec.c)

        + if we get an error on startup, we skip right to the editing loop,
          so the user gets confronted with the error right away.  (main.c)

        + gave adjustmode a real return value -- used to always return TRUE.

        + when looping backwards backspacing, check if the input char was
          killc or wkillc before checking isbackspace(c), since otherwise
          if killc is DEL, we'll treat it as backspace first.  (this is
          because ^H and DEL are both assumed to be backspacers initially)
          (insert.c input.c)

        + implemented new universal mode, "naptime", which is the number of
          milliseconds to delay before accepting a lone ESC character,
          rather than as the start of a function key sequence.  also added
          boolean arg to catnap(), which controls whether detection of user
          input will abort the catnap delay.  the default for this mode is
          500 milliseconds.  the old value was 50, which was fine for fast
          local displays, but didn't work well for serial terminals or
          rlogin sessions.  (which surprises me somewhat -- 9600 baud
          translates to roughly 1 character per millisecond -- why is a
          delay of 50 ms not enough for the second character of a function
          key generated by a terminal?) (proto.h fences.c input.c random.c
          modetbl vile.hlp main.c)

        + applied patches for Watcom C/386, from Tuan DANG (
          I haven't had a chance to try them yet. ( mktbls.c cmdtbl estruct.h
          dirstuff.h ibmpc.c main.c fileio.c random.c termio.c display.c
          glob.c npopen.c path.c proto.h spawn.c makefile)

        + renamed turbo makefiles, to be more similar to the watcom makefiles.

        + fixed insert-string to really insert instead of overwrite.

(tom (3.51))
        + added buffer-mode 'check-modtime' to check if the disk-file is newer
          than the buffer when reading, writing or popping a window (adapted
          from a patch by Randy Winney, modifies (files file.c, fileio.c,
          buffer.c, random.c, spawn.c).  Note that moving the cursor between
          buffers does not perform this check.

        + use macro 'for_each_line()' in some more places (files: buffer.c,
          globals.c, random.c, spawn.c, vmalloc.c).

        + use new function 'SetCurrentWindow()' in file window.c.

        + added checking in 'SetVarValue()' (file eval.c) to guard readonly
          buffers from modification.

        + added checks in file mode.c to prevent major-mode changes to scratch
          buffers (and corrected the settings of WFMODE in file modetbl).

        + tested/augmented RAMSIZE configuration option (files main.c,
          display.c), made a mode 'showram' to control it.

        + merged field that shows major-modes in the modeline (e.g.,
          "view-only"), and added "cmode" when it is active.

        + added buffer-flag BFSIZES; use it in 'bsizes()' to compute byte/line
          counts only when buffer has been changed.  Also, added function
          'add_line_at()' to merge file-reading logic which initializes the
          byte/line counts (files: buffer.c, file.c).

        + if dos-mode is set on a buffer, trim carriage-returns from files that
          are inserted into it (file file.c).

        + renamed macros in file buffer.c that test BUFFER.b_flags, added
          macros for setting/clearing these flags, moved the macros to
          estruct.h to use in files bind.c, buffer.c, file.c, history.c,
          modes.c, random.c, spawn.c, tags.c, undo.c.

        + corrected size shown for buffer-list within the buffer-list display
          (file buffer.c).

        + use window-colors for modelines rather than global values (file

        + disable ":p" command from within buffer-list display (oneliner.c)

Changes for vile 3.50:
        + finished (yeah, right) the changes for infinite undo. implemented
          mode to control how many changes are stored (called "undolimit").
          the modified bit (BFCHG) now gets reset if the right number of
          undos is done.  (estruct.h main.c modetbl undo.c buffer.c vile.hlp)

        + rearranged calls to copy_for/tag_for/toss_to_undo and chg_buff
          so that the BFCHG flag is unmodified before the first call to
          preundocleanup().  this gives undo the true state of BFCHG.
          (line.c region.c)

Changes for vile 3.49:
        + implemented infinite undo, on keys ^X-u (undo) and ^X-r (redo).
          probably affected location of cursor after some undo operations --
          don't if this will be significant or not -- i doubt we matched
          vi before in this regard anyway.  (undo.c, cmdtbl, buffer.c, proto.h
          estruct.h, vile.hlp)

        + use an explicit %s when printing lone filename, to protect against
          filenames with % in name. (display.c)  (eric krohn)

        + don't allow kbd_putc to print to last column of display, since if
          the terminal autowraps, this causes a scroll.  this should check
          the :am: capability, but we're at the wrong layer to do that, and
          it doesn't seem worth adding to the TERM struct to make that info
          available (unix-pc behavior pointed out by eric krohn).

        + added Otto Lind's initial :map implementation (map.c, main.c,
          cmdtbl, makefile, proto.h)  This is a good start, but has the
          following limitations:  1) no string to string maps.  only simple
          keysequences are mappable.  2) not integrated with the keyboard
          macro routines -- this would make sense, and allow for recursion
          to be detected more properly.  but the keyboard macros are pretty
          tied into the named registers, which are stored in KILLREGS,
          which doesn't seem right for the :map'ed things.  perhaps we could
          dispense with the KILLREGS, and replace them with tbufs.  then some
          small changes the layering of start/finish_kbm and kbm_started
          could allow the :map code to share those routines.

        + added alistair crooks' lint stuff and change for the NeXT. (proto.h,

        + modified file undo.c so that changes to scratch buffers can be

        + modified 'imply_alt()' in file buffer.c so that the top/current line
          numbers are propagated into the alternate buffer.

        + changed environment variable 'directory' to 'cwd' so that 'directory'
          can be used for vi-compatible directory variable (used to control
          where the temp-file is written).

        + implemented environment variable 'directory' (files modetbl, eval.c)
          and used it to control temp-file location (npopen.c, tmp.c).  This is
          set by the environment variable TMP.

        + changed logic that opens/closes temp-file in tmp.c to use 'tempnam()'
          to derive the filename; added entrypoint 'tmp_cleanup()' to remove
          the temp-file on exit, and 'exit_program()' to file main.c to make a
          single exit-point from which to call 'tmp_cleanup()'.

        + Use macro 'ExitProgram()' to hide whether we call 'exit_program()' or
          'exit()' (files main.c, display.c, ibmpc.c, spawn.c, vmsvt.c, vt52.c,
          termio.c, termcap.c, file.c, window.c, x11.c).

        + modified 'mktbls.c' to generate definitions for 'nemode.h' in a
          form that allows modes to be conditionally compiled.

        + added a column to 'modetbl' to ifdef out modes that are not used.

        + made 'crypt', 'fcolor' and 'bcolor' modes ifdef-able (files main.c,
          modes.c, modetbl).

        + simplified 'promptpattern()' and 'expandp()' in file isearch.c

        + corrected USE_D_NAMLEN ifdef in 'expand_pattern()' (file glob.c)

        + corrected behavior when user inserts a newline into an empty buffer
          (file line.c).

        + moved environment variable definitions from cmdtbl to modetbl to
          ensure that name-completion table for modes+vars is updated in one
          place.  Sorted the environment variable names in modetbl and vile.hlp

        + include "nevars.h" within main.c to allow common name-completion
          table (without introducing lots of extra string-pointer variables).

        + modified mktbls.c to put the environment-variable names into the
          'all_modes[]' array in nemode.h (to support common name-completion).

        + modified 'listvars()' in file eval.c to optionally show all modes
          and environment variables in one list (if the user supplies a numeric
          argument before the "show-variables" command).

        + modified 'gtenv()' in file eval.c to recognize mode-names as well as
          environment names, and logic in file modes.c to recognize environment
          names.  Thus, for example, the commands
                ":setl dos" and
                ":setv $dos=true".
          are equivalent.

        + changed use of 'sprintf()' to 'lsprintf()' (files buffer.c, modes.c)

        + use macros 'FreeAndNull()' and 'FreeIfNeeded()' to simplify code
          (buffer.c, eval.c, file.c, filec.c, main.c, modes.c,
          npopen.c, oneliner.c, search.c, random.c, x11.c)

        + changed case-statements for EV-variables to if-then-else-if in
          file eval.c because VAX-C cannot handle constant-expression
          OFFSETOF as case-values.

        + added 'tempnam()' to file vms2unix.c (to support testing of
          mapped-data configuration).

Changes for vile 3.48:
        + added FILEC_PROMPT flag to mlreply_file call in writeregion, to
          make ^W file-writing operator work.

        + folded some long lines (opers.c filec.c file.c)
        + corrections to make undo work properly with mapped-memory option
          (files buffer.c and tmp.c).

        + use symbol 'null_ptr' to tidy up references to '(LINE *)0'
          (files buffer.c fences.c line.c main.c undo.c)

        + changed LINE.l_size to SIZE_T (to make it lintable)

        + corrected "poison" code in 'lfree()' (file line.c)

        + added logic to finderr.c to handle lint output on apollo.

        + added logic to handle line truncation (files buffer.c, file.c,
          line.c, tmp.c)

        + added function 'l_region()' to file tmp.c; use this (with some
          reorganization) in files file.c, oneliner.c, region.c, word.c to
          track LINEPTR adjustments in REGION structs.  (Converted most of the
          calling procedures to single-return to clarify this).

        + moved options-logic in 'substreg1()' (file oneliner.c) down to make
          this simpler (and avoid unnecessary goto).  (This procedure has too
          much logic to convert to single-return).  Also fixed a place that
          should have used 'end_string()'.

        + used macro 'same_ptr()' to compare LINEPTR's directly (a bit more

        + implemented page-swapping logic in file tmp.c

        + modified ifdefs in files bind.c, eval.c, finderr.c to get rid of
          compiler warnings when SMALLER, REBIND and APROP ifdefs are turned

        + used 'memcpy()' and 'memset()' in files buffer.c, line.c to simplify
          loops copying text into LINE's.

        + modified interfaces of functions that may modify 'LINE *' pointers
          (or, equivalently, cause swapping of a LINE to a different address)
          to use LINEPTR arguments (for example, 'line_no()' can iterate over
          all lines, causing swapping).  Also modified functions (especially in
          files line.c and undo.c) to use LINEPTR variables where they call
          lower-level functions that may page-swapping.  Affects files
          buffer.c, display.c, exec.c, file.c, filec.c, input.c, line.c,
          oneliner.c, random.c, region.c, search.c, vmalloc.c, word.c

        + replaced call on 'lalloc()' in file exec.c with 'addline()' (only
          difference is that the latter also sets b_dot).

        + converted several functions in file undo.c to static (to simplify
          tinkering with LINE/LINEPTR tradeoffs).

        + modified calls on 'lalloc()' in file undo.c to use special codes for
          l_used member directly.

        + added options -Wconversion -Wstrict-prototypes -Wmissing-prototypes
          to gcc flags in makefile; addressed these warnings (except for
          'signal()' arguments, which cannot be fixed) on sunos.  Modified
          files bind.c, file.c, filec.c, fileio.c, glob.c, insert.c, line.c,
          path.c, random.c, region.c, spawn.c, tcap.c.

        + corrected ifdef in 'string_has_wildcards()' (file glob.c) for VMS.

Changes for vile 3.47:

    (part a)
        + introduced 'l_ref()' and 'l_ptr()' functions, rippled-through changes
          to support mapped data (files basic.c buffer.c csrch.c display.c
          estruct.h eval.c exec.c fences.c file.c filec.c finderr.c globals.c
          history.c insert.c line.c oneliner.c path.c proto.h random.c region.c
          search.c spawn.c tags.c tmp.c undo.c window.c word.c)

        + added logic to file tmp.c to allocate LINE structs from a pool of
          pages (note that deallocation isn't done, nor is swapping to a
          tmp-file as yet).

    (part b)
        + added code to test return-value of 'glob()' in file eval.c

        + corrected 'get_recorded_char()' (file input.c) to reset 'buffer'
          variable after 'finish_kbm()' makes it obsolete.

        + provided more useful defaults for TERMCAP, IBMPC and COLOR
          definitions in file estruct.h

        + corrected value of MK in 'FreeBuffer()' (file buffer.c), which caused
          multiple frees of the same LINE struct.

        + supplied initialization for wp->w_dot.l and wp->w_line.l in
          'reframe()' (file display.c) to handle the case when vile is invoked
          with no filename parameters.

Changes for vile 3.46:
        + suppress attempts at reading a null file into the [vileinit]
          buffer (main.c)

        + don't require the d_namlen field in a DIRENT struct -- some systems
          don't have it, and most of those that do null terminate the name
          anyway.  (dirstuff.h, filec.c, glob.c, path.c)

        + changed compile flags for uts, on user suggestion (makefile)

        + in ffread(), after doing read(), do an fseek to sync up.  this
          keeps some stdio implementations from not bothering to seek back
          to the start in case we have to discard the read and resort to
          slowreadf() due to long lines. (fileio.c)

        + avoid realloc(ptr,0) when long lines are encountered in quickreadf()

        + make M and L commands take account of too few lines in window (i.e.
          do the right thing when end of file is on screen). (basic.c)

        + even if the global dos-mode is on, empty (new) buffers should come
          up as non-dos.  (file.c)

        + fnc2engl() now tries to return a longer, meaningful name for a
          function (i.e. "exit" rather than "Q"). (bind.c)

        + test-compiled VMALLOC, DEBUGM options on apollo.

        + introduced 'set_lforw()' and 'set_lback()' macros to use in mapped
          memory option.  Added stubs in new file 'tmp.c'.  Modified files
          buffer.c exec.c file.c filec.c line.c undo.c, verified mechanically.

        + added definition of LINEPTR and 'lsync()' to files estruct.h, proto.h

        + fixed a memory leak in 'glob()', and changed interface to
          'glob_free()' (files filec.c, glob.c, glob.h).

        + revised logic in ibmpc.c that sets screen resolution ($sres) to
          make it more table-driven.

        + corrected 'forwline()' in file basic.c (repeated movement down
          sometimes reset the cursor to column 1 unlike vi).

        + added prototypes to 'mktbls.c'.

        + modified file main.c so that if the standard input isn't a terminal
          then vile reads it into a buffer and reopens /dev/tty (unix only).

        + modified files main.c and epath.h to allow (for unix systems) vile
          to find vile.hlp even if vile isn't in the path.

Changes for vile 3.45:
        + got rid of LOOKTAGS mode, and all of its ifdefs (filec.c, main.c,
          modetbl, proto.h, tags.c)

        + got rid of NeWS ifdefs (basic.c, bind.c, buffer.c, edef.h,
          estruct.h, exec.c, file.c, input.c, isearch.c, main.c, modes.c,
          spawn.c, termio.c)

        + resolved vile.hlp modes documentation and modetbl (vile.hlp)

        + added missing mlreply call in goto-named-mark processing, to
          allow "goto-named-mark a" to be used in a command file. (basic.c,

        + added man page (don't get excited -- it's short), and turbo makefiles
          vile.mak, mktbls.mak.  (makefile)

        + fix to ins/inschar/istring to correct for bad backspace limiting

        + fixed off-by-one bug for column count under X. (x11.c)

        + turned off typahead detection for X11.  updates were being held
          off incorrectly. (termio.c)  related change, possibly unnecessary:
          reordered initial mlforce() and initial update() in main, because
          xvile was not starting up properly.

        + no longer set _bspace bit in _chartypes[backspc], and isbackspace()
          macro tests backspc directly.  will make rebinding of backspace
          simpler. (estruct.h, termio.c)

        + some changes to set-terminal stuff -- took out the keys that can
          be rebound with bind-key, i.e. those that have effect only in
          command mode.  added help.  (bind.c, vile.hlp)

        + no longer strip the SPEC bit in ttgetc, so a meta key can be used
          to generate "function keys"  (termio.c, vile.hlp)

        + updated README

Changes for vile 3.45:

        + more fixes for long/int complaints from TurboC (files tags.c spawn.c
          random.c main.c display.c bind.c).

        + added logic to fileio.c so that (MSDOS only) overwriting a file
          saves the old version renamed to ".bak" suffix.

        + simplified argument processing in file main.c; reduced size a little.

        + reorganized code that uses tungetc so that it isn't used as often.
          This also makes 'tpeekc()' obsolete.  Moved extern-defs for 'tungotc'
          to edef.h (files input.c, exec.c, globals.c, oneliner.c, termio.c).

        + modified 'setvar()' in eval.c to show warning message if attempt is
          made to modify a readonly variable, or if for some other
          reason an environment variable cannot be set.

        + modified 'ibmcres()' in ibmpc.c to allow user to reset using value of
          CDSENSE as argument.

        + corrected inequality-test in 'newscreensize()' (file display.c) that
          prevented user from correctly setting $sres back to VGA in IBMPC

        + renamed entrypoints in file crypt.c to 'ue_setkey()' and 'ue_crypt()'
          to avoid confusion with unix crypt(3) (files fileio.c, file.c
          crypt.c, main.c, cmdtbl).

        + corrected core dump when using encryption from command line by
          splitting out 'ue_makekey()' from 'ue_setkey()'; used this from
          'resetkey()' in file.c

        + corrected handling of -k (crypt option); added a global 'cryptkey'
          which is used to set the encryption key only in files listed as
          command arguments (files edef.h, main.c, buffer.c).

        + overwrite -k parameter value in main.c (for those systems where this
          has an effect, it changes the value shown in a "ps" command).

        + made 'quickreadf()' decrypt file.

        + corrected 'resetkey()' so that it doesn't automatically use crypt key
          for files that aren't the same as the buffer.

        + The prompt added to 'resetkey()' also required moving some calls on
          'ttclean()' (file.c).  Simplified some of the ttclean code using
          CleanToPipe and CleanAfterPipe macros.

        + corrected 'resetkey()' so that if no password is provided (at least
          for pipes), the operation will proceed properly (i.e., read/write
          without encryption).

        + modified 'modeline()' in display.c to show if the current buffer is

        + made NAMEC and TESTC define to variables name_cmpl and test_cmpl,
          which can be modified at run-time (files estruct.h, edef.h).

        + added commands "set-terminal" and "show-terminal" to set/show special
          characters (including NAMEC/TESTC values!).  Put this into file
          bind.c (reusing pieces of 'bindkey()').

        + make '#' (special prefix-key) rebindable, like cntl_a-prefix.

        + make display-routines in bind.c show the actual characters to which
          CTLA and CTLX are bound (function 'kcod2str()').  Note that
          'prc2kcod()' still assumes that CTLA and CTLX are bound to control

        + changed argument type of TERM.t_cres to 'char *' to allow consistent
          usage of variable 'sres[]' (files tcap.c, ibmpc.c, z_ibmpc.c).

        + changed values recognized by ibmpc.c for "$sres" to be the names
          that it returns (e.g., "VGA") and the number-of-lines (from main.c's

        + finished off 'npopen()' for MSDOS (allows write-pipes) and
          implemented 'inout_popen()'; used in file spawn.c for filter-region

Changes for vile 3.44: (pgf)
        + fixed indentation if openup used in cmode, with a single word on
          the current line -- indentation was coming from the _next_ line,
          instead (insert.c).

        + finderrbuf() now remembers its last argument (finderr.c)

Changes for vile 3.44:
        + corrected file descrip.mms; the vms_link.opt file no longer applies
          to mktbls.exe; also fixed 'clobber' rule.

        + corrected file glob.c (don't treat '$' as a wildcard on vms).

        + correction: moved call on 'global_val_init()' before
          'expand_wild_args()', to make wildcard globbing work on vms and
          ms-dos (file main.c).

        + corrected logic of 'kbd_reply()'; last_eolchar was not being set
          properly when NAMEC wasn't space (file input.c).

        + modified 'kbd_engl_stat()' in file bind.c so that if NAMEC is not
          bound to space, then name-completion for :-commands is turned on.

        + added option KBD_NULLOK to 'kbd_reply()' and used it in function
          'kbd_engl_stat()' to re-allow commands to be empty (files bind.c,
          input.c, estruct.h), needed after decoupling NAMEC and space.

        + corrected 'slowreadf()' in file file.c so that dos-mode files are
          read properly.  (The code stripped CR's even when dos-mode wasn't

        + implemented 'npopen()' and 'npclose()' for MSDOS; used this to make
          MSDOS logic for ^X-!  the same as on UNIX (modified files fileio.c,
          npopen.c, spawn.c).

        + modified 'makename()' to yield essentially the same result for
          MSDOS as for UNIX (in file.c), because 'npopen()' works similarly.

        + added tests in 'ffropen()' and 'ffwopen()' to prevent accidentally
          opening a directory-file.

        + corrected handling of FIOFNF in 'readin()'; made this work on MSDOS
          as well as UNIX (files file.c, fileio.c, display.c).  The value of
          'errno' was not being saved to report in the error message.  Added
          'mlerror()' to display.c to encapsulate the error reporting better.

        + moved 'errno' declarations into 'estruct.h' (files display.c, file.c,
          npopen.c, termio.c).

        + added function 'set_febuff()' to encapsulate the 'febuff[]' and
          'newfebuff' variables; moved these to finderr.c (files file.c,
          finderr.c, spawn.c).

        + corrected test in 'filename()' (file.c) for ":f" command.

        + corrected test in filec.c for pre-existing file (don't prompt if it
          is a pipe-command).

        + corrected tests in filec.c for prompt for re-read (didn't look for

        + test-compiled CRYPT, VMALLOC configuration flags on TurboC.  Modified
          files crypt.c, estruct.h, vmalloc.c

        + began addressing TurboC warnings for conversion between long/int.

        + deleted obsolete defines in file estruct.h (CLRMSG, CTRLZ).

        + added 'set_rdonly()' to encapsulate the places where an automatically
          created buffer is made read-only.  This makes them more consistent.
          Files: bind.c, exec.c, main.c, oneliner.c, random.c, spawn.c

        + modified 'update()' in file display.c so that '.' commands don't
          redisplay if VISMAC is configured (previously, only keyboard macro
          redisplay was suppressed).

Changes for vile 3.43:
        + changed NAMEC from SPACE to TAB (estruct.h).  changed eolchar arg
          passed to kbd_reply in kbd_engl_stat from NAMEC to ' ', to
          compensate.  added check against command term'ed with ' ' in
          execute_named_cmd() (exec.c).

        + added check for iswild() when scanning for wildcard chars in glob.c

        + allow nulls as well as newlines to separate filenames in glob-pipe

        + added finderrbuf() routine (command is "error-buffer" or "find-next-
          error-buffer-name"), to set the name of the buffer to scan for errors.
          (finderr.c, proto.h, cmdtbl, vile.hlp)

        + fixed pathname bug when scanning output that contains Entering/
          Leaving pairs.  We no longer just keep a pointer to where we
          found the directory name, but now malloc space for it.

        + horizontal scrolling moves by half screens by default (window.c,

        + added AIX to machines that need sys/ioctl.h (termio.c, display.c)

        + further fix to repeat counts and the '.' command, so that all cases
          ( 6dw , 3d2w , etc.) work.

        + support for letting a named register on a '.' command override
          what was originally typed:  "adw"b.  will put one word in register
          a and the nex in register b.  (input.c line.c exec.c)

        + corrected define in dirstuff.h to make TurboC compile again.

        + corrected logic of 'makename()' in file.c for MS-DOS.

        + added type CMASK to correct use of _chartypes[] array on MS-DOS
          (e.g., in 'screen_string()' in input.c).

        + deleted VMS-DCL file '', since this causes conflict on

        + lowercased color names in file modes.c

        + modified ibmpc.c to get true white and yellow colors (had gray and

        + modified files ibmpc.c and display.c to allow MS-DOS version to do

        + removed unused assignments from file insert.c

        + substituted all l_fp references to lforw macro, l_bp references to
          lback macro, verified mechanically.

        + make special case in 'dotcmdplay()' to allow (like vi) the repeat
          count on '.' command to replace that on the replayed command.

        + modified logic of 'writereg()' to allow its call on 'imply_alt()' to
          correctly set the 'copy' parameter (only if a whole file is written).

        + introduced new function 'same_fname()' to correct places where
          matches between a filename and the buffer's filename broke (either
          because it was not in canonical form, or because VMS version numbers
          were not stripped).

        + modified fileio.c to read/write binary files on MS-DOS to avoid
          truncating files at ^Z.  This does not make ^M visible however.

        + ifdefd out contents of 'dot_replays_macro()' in input.c to avoid

        + corrected logic of 'tungetc()' in file input.c; this had broken
          replay of keyboard macro "iX<esc>/Y^MaZ<esc>".

        + split out 'expand_wild_args()' from main.c into a new file glob.c,
          which contains globbing code.  Moved 'glob()' from path.c to glob.c

        + moved function 'is_directory()' from filec.c to path.c; made it

        + added function 'no_memory()' to encapsulate the more common places
          that vile/msdos runs out of memory; use this in several places to
          simplify error reporting.

        + added universal-mode "history", to allow turning that function off,
          and instrumented history.c to automatically turn logging off if vile
          runs out of memory.  (It is annoying to get out-of-memory errors on
          _every_ command).

        + modified display.c to fill in the long space before program & version
          identifier for the scratch buffer (on the mode line).

        + added option to 'mlreply_file()' to allow expansion of wildcard to
          multiple files.  Use this in file.c (for ":e" and ":view" commands).

        + modified files descrip.mms and vms_link.opt because (with new module
          glob.c) the link-command line got too long.  Other mods to file
          descrip.mms to make file generated (to avoid leaving it
          around for ms-dos configuration), and the 'clean' and '.last' rules
          (to make them less noisy).

        + corrected 'ffronly()' in fileio.c; on VMS this caused some files to
          be touched.

        + implemented scrolling in file vmsvt.c

        + implemented 'glob' mode to control how wildcards are expanded
          (affects files main.c, modes.c, glob.c) and the corresponding piped
          commands for glob-mode.

        + added logic to 'makename()' to handle embedded blanks in filenames.

Changes for vile 3.42:
        + added routine tb_stuff() (tbuff.c), which is roughly the
          converse of tb_peek(), to allow simple replacement of a character
          in a tbuff.

        + used tb_stuff() to increment the buffer number when referencing
          the numbered buffers -- i.e. "1p becomes "2p in a '.' command.

        + backed out change to 'get_recorded_char()' (input.c) that caused
          dd..."1P... to continue deleting lines after the P operation.

        + added horizontal scrolling mode, to cause whole screen to shift
          instead of just one line when cursor goes "off screen".  this
          mode ("set hs", or "set horizscroll" is now the default. (display.c,
          vile.hlp, main.c, modetbl, proto.h)

        + allow cursor to rest in last column, if line is just that long, to
          prevent extra horizontal scrolling. (display.c)

        + split up the ins() function, to provide an inschar() function that
          istring could use.  istring() now called by insstring() and
          overwstring(), which are bound to "insert-string" and new
          "overwrite-string" commands.  all this to allow "insert-string"
          to take advantage of autoindent, cmode, wordwrap, etc.  will
          need tweaks later when tty chars are rebindable (^U, ^W, etc.)

        + compiled with "-Wmissing-prototypes", which turned up a bunch of 'em.

        + some linux gcc cleanup, mostly just including some more headers
          (display.c file.c main.c)

        + ifdefed out the onamedcmd() function, and it's binding (cmdtbl,

        + took out the extern declarations of getpwnam and getpwuid that i
          put in recently.  they seem to be causing more problems than they
          were fixing.  in general, providing prototypes for system routines
          is a real pain.  i wish there were an "ifnprototype" construct.

Changes for vile 3.41:
        + ifdef ioctl.h for APOLLO (note: you shouldn't use '"'-form for system
          includes, since that could pick up files in the current directory,
          and also because it does weird things to the include-path).

        + moved code to support USE_LS_FOR_DIRS from filec.c to path.c, making
          it look like unix-style directory routines.  Added ifdef for
          OLD_STYLE_DIRS just in case...

        + modified 'slowreadf()' in file.c so that piped input scrolls from the
          bottom of the window, rather than the middle.

Changes for vile 3.40:

        + the makefile no longer supplies any -I options.  this will cause some
          machines to not find "ioctl.h" where it's in the sys subdirectory,
          but I just spent a day tracking a bug caused by picking up the wrong
          system headers (i needed the gcc "fixincludes", and they had moved).

        + now honor LINES and COLUMNS in getscreensize (display.c)

        + now handle searching multiple tags files specified in "set tags"

        + bugfix to fences.c, which fixes indentation when inserting '}'

        + added firstnonwhite() calls to godotplus, so we can publish it as
          "whole-lines" (files basic.c, cmdtbl).

        + added 'setjmp()' code to files main.c, input.c to handle ^C with
          BSD-style signals.

        + added define USE_LS_FOR_DIRS to files dirstuff.h and filec.c to
          accommodate systems w/o a 'readdir()' function.

        + corrected $pagewid (was returning length instead of width) in file

        + use lsprintf to form [Macro nn] names (file exec.c)

        + corrected 'ffwopen()' in fileio.c so that write of current buffer on
          VMS works properly (forgot to strip version number).

        + made 'flook()' work properly for vms (file bind.c)

        + moved 'dname[]' table into file exec.c and 'cname[]' table into file
          modes.c; did this to get rid of 'comma' macro, which does not work as
          intended on Turbo-C (the comma got evaluated too soon).

        + to prevent redefinition error in Turbo-C, removed redundant includes
          for <stdio.h>, <string.h> and <signal.h> (already in file estruct.h)
          from the ".c" files: ansi.c at386.c basic.c bind.c buffer.c crypt.c
          dg10.c display.c eval.c exec.c file.c globals.c hp110.c hp150.c
          ibmpc.c input.c isearch.c line.c main.c modes.c npopen.c oneliner.c
          regexp.c region.c search.c spawn.c st520.c tcap.c termio.c tipc.c
          vmsvt.c vt52.c window.c word.c wordmov.c x11.c z309.c z_ibmpc.c

        + moved macro 'P' from file proto.h to estruct.h, adjusted definitions
          in file 'estruct.h' to allow use of 'P' macro in CMDFUNC definition.
          Added definition of type 'CmdFunc' for the actual pointer-type.

        + use P-macro for TERM struct definitions (and added TTscroll),
          modified files estruct.h and display.c

        + corrected logic of 'dot_replays_macro()' in file input.c (for the
          special case of macro "@w" followed by "dd" command, I noticed that
          '.' replayed both commands).

        + compiled with Turbo-C, turned on warning if function was called w/o a
          prototype.  Added prototypes (including those for static procedures)
          to get rid of these and other compiler warnings.  Doing this found an
          error in eval.c and one in history.c (files modified: bind.c buffer.c
          display.c eval.c exec.c fences.c file.c fileio.c history.c ibmpc.c
          input.c insert.c main.c mktbls.c modes.c npopen.c opers.c path.c
          random.c regexp.c region.c spawn.c tbuff.c window.c).

        + corrected MSDOS-specific pathname translation in files path.c and

        + corrected d_namlen value supplied in readdir function for VMS (file

        + implemented first version of filename completion for VMS.  (Directory
          names are not completed; there are still some ambiguities between
          scratch buffer names and VMS directory paths).

        + added option KBD_UPPERC to input.c; use this to force prompts for VMS
          filenames to uppercase.

        + removed redundant declarations for 'getenv()'; it is already in file

        + added new file 'vmspipe.c' which provides a piped-read facility

        + modified file finderr.c to recognize lint output on SUNOS; also
          corrected it to ensure that sscanf doesn't scan past the string
          limits (no EOS was formerly on each line).

        + added/used new functions 'pathleaf()' and 'pathcat()' to file path.c
          to hide vms/unix pathname differences.

Changes for vile 3.39 (from Tom Dickey):

        + corrected error in 'get_recorded_char()' (file input.c) that caused
          command "ix^[j.j.j.j." to not repeat properly.

        + corrected prompt-string in 'ShellPrompt()' (file spawn.c)

        + corrected behavior of filename completion (file filec.c) so that
          internal names and shell names can have blanks in them.

        + provided a last-replay value for 'execfile()' in file exec.c (it was
          defaulting to the current buffer, which is wrong).

        + corrected pointer test in 'tb_sappend()', which was null in the
          special case of a ":w" command before any ":e" or other read.

        + simplified MSDOS-drive translation (untested) in file random.c to
          accommodate changes made for VMS in other files.

        + modified 'cd()' procedure in file random.c to chdir to home directory
          on systems that have one.

        The following are changes to support VMS:

        + added new files (shown in makefile and descrip.mms): dirstuff.h,

        + use new file 'dirstuff.h' for definitions in filec.c and path.c

        + corrected some dependencies in descrip.mms

        + corrected logic in 'imply_alt()' (file buffer.c) that lost the
          original filename argument (replaced it with the lengthen-path).

        + corrected logic in 'getfile()2' (file file.c) to account for the
          distinction between buffer-names and file-names.  Simplified
          'getfile()' and 'getfile2()' because of modifications to
          'shorten_path()' and 'lengthen_path()'.

        + corrected logic of 'ffread()' (file fileio.c); on VMS a single read
          does not necessarily read an entire file.

        + corrected definition of macro 'isready_c()' for VMS.

        + modified 'shorten_path()' (file path.c) to provide the "./" prefix
          that was added in files buffer.c and display.c; also absorbed the
          test for MSDOS device prefix (e.g., "c:") there.  This was needed to
          allow VMS port to show native pathnames.  The equivalent of "./" on
          VMS is "[]".

        + use VMS function 'fgetname()' and 'getname()' to determine the
          fully-resolved path in 3 cases: after writing a file, after reading a
          file, and in 'lengthen_path()' (files file.c and path.c).  This makes
          it know the current version number of each file.

        + modified 'makename()' (file file.c) to account for VMS pathnames.
          Note that DecShell names (which the C runtime library accepts as
          arguments to fopen, etc.) look much like unix filenames.

        + added new function 'is_internalname()' to file path.c; this serves
          the same purpose as the (now obsolete) macro isScratchName.  This
          makes a better check (to keep VMS paths distinct from scratch buffer
          names) than the macro.

        + deleted macro isScratchName from file estruct.h; changed macro
          isInternalName to use function 'is_internalname()'.  Adjusted other
          macros in estruct.h and display.c to make VMS port work properly.

        + added new function 'non_filename()' to file path.c; use this in files
          bind.c and random.c to encapsulate the program+version string.  Use
          'non_filename()' in 'is_internalname()'.

        + corrected logic of 'screen_string()' (file input.c) to handle the
          distinction between "[" and "]" used to delimit pathnames on VMS, and
          to indicate scratch-buffer names.

        + corrected wildcard, path and scratch-buffer characters for VMS (file

        + corrected/modified file path.c so that the functions therein support
          VMS filenames.  Added several new functions to do this.

        + corrected code for 'catnap()' (file random.c) for VMS.

        + corrected several 'exit()' arguments (file termio.c)

        + corrected VMS's ttgetc function (its interaction with 'typahead()'
          was wrong; also 'typahead()' was not really implemented (file

        + ifdef'd out a redundant 'ttclean()' call (which caused the output on
          VMS to be closed more than once, which is really an error).

        + guard 'vtinit()' (file vmsvt.c) against t_mcol or t_mrow too small

Changes for vile 3.38:
        + cleaned up internal naming and help for alt-tabpos mode.
          alt-tabpos on implies emacs-style, and it's off by default

        + corrected status-check in 'ffclose()' (in fileio.c) that generated
          spurious 'Error on close' message, visible when nothing was read from
          a pipe.  (Also eliminated redundant defs for 'npopen.c' in fileio.c
          and proto.h).

        + corrected place in 'globals.c' where (if the buffer was readonly),
          the '/' delimiter after an s-command was not eaten.

        + modified loop-limit in "show-registers" command to display the
          numbered registers.

        + corrected file fences.c, allowing C preprocessor lines to have
          leading whitespace before '#'.  The cursor may be on any character
          from the first column through the '#'.

        + rewrote procedure 'cpp_fence()' in file fences.c, allowing it to
          recognize "elif" keyword.  Added 'nextchar()' to file basic.c to
          support this.

        + modified procedure 'ShellPrompt()' in file spawn.c to eliminate the
          ": " before prompts for ^X-!.

        + corrected 'kbd_reply()' in file input.c to invoke 'tgetc()' directly
          when ^V is used to escape a character.

        + corrected 'kbd_kill_response()' in file input.c; ^W is not supposed
          to trim blanks before a word.

        + corrected 'update()' in file display.c; the VISMAC define does not
          apply to "." command.  This fix allows showmatch to work with "."
          command.  Also, in 'fmatch()' in file fences.c; test return-value of
          'update()' to avoid catnap when update fails.

        + corrected 'insert()' and 'insertbol()' in file insert.c; the cursor
          was not being advanced after repeated insertions like vi.

        + corrected file input.c so that it can handle a "." command within a
          keyboard macro.  The macro was "iA^[l2." (for testing).

        + modified file input.c (new procedure 'dot_replays_macro()' so that
          the "." command after defining or executing a keyboard macro causes
          the macro to be (re)invoked.

        + split 'kcod2prc()' in file bind.c into 2 parts; the new one (i.e.,
          'kcod2str()') is used to support 'dot_replays_macro()'.  Also use new
          function 'fnc2kcod()'.

        + added new function 'kbm_started()' to file input.c to get rid of then
          non-recursive variable 'kbdplayreg'.

        + save/restore "." repeat counts in 'start_kbm()' and 'finish_kbm()' so
          that repeat works properly for keyboard macros.

Changes for vile 3.37:
        + works on osf/1 alpha now, with hacks applied to termio.c and
        + added files 'descrip.mms' and 'vms_link.opt'; compiled on VAX/VMS
          (but did not make it run) (tom dickey)

        + pathname tracking fixes (calling shorten_path() correctly everywhere)

Changes for vile 3.36 (from Tom Dickey):

        + supplied initial value for dirc-mode

        + guarded 'mlreply_file()' against missing curbp->b_fname (for use in
          .vilerc startup).

        + corrected logic in 'kbd_reply()' (file input.c) that caused backspace
          to be treated as a command-delimiter.

        + corrected logic in 'kbd_reply()' (file input.c) that caused '/'
          character in complex substitutions to be eaten, e.g.,
          broke after the 's'.

        + corrected calls (broke in 3.35) on 'mlreply_file()' from 'insfile()'
          and 'operwrite()' (mods to files estruct.h, filec.c, file.c and
          opers.c).  The ^R and ^W commands always prompt for name, rather than
          taking it from the screen.

        + corrected end-of-line logic in 'do_a_mode()' (file modes.c).  This
          had allowed history scrolling to display keywords that were separated
          by blanks; fixed this by testing for both space and "=" characters.

        + added calls to 'hst_glue()' in 'unqname()' and 'getfile2()' to add
          blank in command history before the responses these functions solicit
          from 'mlreply()'

        + added macro 'char2int()' to file estruct.h, use this in fileio.c and
          tbuff.c to hide byte-masking.

        + changed data in TBUFF to 'char' (unsigned char does not buy that much
          conciseness); absorbed macros 'tb_values()' and 'tb_length()' into
          file tbuff.c as functions.

        + corrected logic of 'tb_leaks()' (file tbuff.c); I had only exercised
          this at the end of execution.

        + removed unused define for TMPSTOP

        + recoded handling of keyboard macros in file input.c to use TBUFF
          structs (so there is no limit on length of keyboard macros).

        + modified 'execkreg()' to remove length-limit on macros there as well
          (file line.c)

        + modified 'execkreg()' to allow invoking registers 0-9 (file line.c)

        + modified files input.c and line.c so that "." and @-commands can be
          invoked from within a keyboard-macro (i.e., ^X-&).

        + modified files insert.c and input.c so that repeated "." command
          works properly for i,I,R commands (the cursor must appear at the end
          of the insertion).

        + modified so that ^Z (job suspension) works properly on apollo sr10.3
          (files termio.c and spawn.c).

        + modified 'ttgetc()' in file termio.c so that (for apollo) it reads in

        + added flag to 'tgetc()', allowing it to suppress the conversion of
          intrc to abortc (files basic.c csrch.c eval.c exec.c input.c
          insert.c).  This change also lets users quote ESC characters.

        + corrected unused args in 'globber()' (file globals.c)

        + corrected special case in use of 'canonpath()' on apollo (user could
          type in path beginning with "/", which was not getting "//" portion
          of pathname prepended.

        + renamed "vitabpos" mode to "alt-tabpos" mode, avoiding conflict with
          "view" mode.

        + added "implybuffer" (ib) mode to use in splitting out vi-style
          buffer-implication from 'autobuffer' mode (files modetbl and main.c).

        + added "samebangs" (sb) mode to allow the ^X-!!  and :!!  commands to
          be optionally the same.

        + Corrected logic of 'imply_alt()' so that it works with files read, as
          well as written (files buffer.c and file.c).

        + split out the pathname functions into file path.c

        + added function 'is_appendname()' to path.c to better encapsulate the
          isAppendToName macro's knowlege of the ">>" length (files path.c,
          filec.c, fileio.c, random.c).  Used this to make functions
          'canonpath()', 'lengthen_path()', 'shorten_path()' and
          'is_pathname()' work properly with ">>" prefix.

        + added code to 'path.c' to resolve "~" as user's home-directory.

        + corrected code in 'makebufflist()' that caused b_bfname member to
          be modified (file buffer.c).

        + moved MSDOS drive-logic from 'ch_fname()' into 'lengthen_path()'
          (files random.c and path.c)

        + added procedure 'copy_val()' to modes.c to encapsulate the make-local
          and make-global macros.  This fixes a case in which memory could be
          freed more than once: if the user had done 'setl' commands for two
          different buffers.

        + made variables 'doslines' and 'unixlines' local to the procedures
          'slowreadf()' 'readin()' in file.c; initialized these so that
          successive reads of a set of files will treat the dos/unix line
          counts separately.

        + added command "set-dos-mode" to force the current buffer to be
          in DOS-mode (trimming CR's).

Changes for vile 3.35 (from Tom Dickey):

        + addressed compiler warnings from gcc 1.36 on apollo sr10.3.  (I know
          it is old, but it gives useful warnings).  This required some minor
          adjustments to defines/includes in files estruct.h, proto.h, main.c,
          fileio.c, npopen.c, random.c to accommodate order-of-definition
          problems in stdio.h and signal.h

        + tested with gcc 1.40 on sunos 4.1.1

        + tested compiling with SMALLER=1; fixes to files eval.c, input.c,
          mktbls.c, npopen.c, proto.h, random.c (On my machine, this only cuts
          about 10% from the binary).

        + added EOS at mismatch-point in 'fill_partial()' in file bind.c, fixes
          bug that caused incorrect display after repeated name completion and
          query operations.

        + guarded 'kbd_complete()' against embedded nulls in its buf-argument,
          by testing for nulls before completion logic in file input.c

        + added a flag 'kbd_expand' to make calls on 'kbd_putc()' via
          'mlforce()' and related functions show tabs as a space.  This
          modifies files bind.c, edef.h, display.c to fix a problem I
          introduced in 3.32

        + use 'kbd_expand' flag in file input.c to fix non-displaying ^M; other
          fixes include quoting and backslash fixes, as well as correction to
          wkillc handling.

        + modified finderr.c to make the embedded tabs as "\t" digraphs, so
          they are visible.  Added pattern to use with apollo C compiler.

        + corrected logic in 'updpos()' (file display.c) so that vile displays
          cursor location just-like-vi for tabs and control characters.

        + made 'wordcount()' code (file word.c) work properly.

        + corrected 'join()' (file word.c) so that blanks are not inserted when
          joining after a space, or joining a blank line.  Also (like 'vi'), if
          there is trailing whitespace on the first line, don't modify it.

        + corrected flags for join-lines in file cmdtbl so that the region-
          oriented code can work.

        + made join-lines work with regions (files opers.c, word.c).

        + restored GLOBOK flag for join-lines-til (regions work now).

        + interchanged order of calls on 'toss_to_undo()' and 'lremove()' in
          'ldelnewline()', since this was causing incorrect cursor placement
          after an undo.  (The particular case arose in the rewritten
          join-lines, when joining a blank line to a non-blank line).

        + modified 'edithistory()' in file history.c to ifdef out the ESC code
          (with new symbol KSH_HISTORY), merge the loops to use 'escaped' flag
          to avoid redundant logic, and pick up control chars (e.g., ^N and ^P)
          for scrolling.  This also modified files input.c and exec.c

        + corrected logic in history.c (from 3.34) that uses the function
          'WillExtend()' to modify/macroize !-commands.  The code did not
          provide for the case in which the user would modify the text after
          scrolling to it.

        + corrected call on 'hst_flush()' in file pipecmd.c (it was not called
          if the pipe-command failed).

        + revised 'tgetc()' in file input.c to make it use a single return
          point (simplifies testing and debugging).

        + corrected file modes.c so that user can abort from a set command.

        + deleted code for unused global 'lineinput' (files bind.c, input.c,

        + renamed ifdef for LAZINESS to (global mode) TAGSLOOK, added an entry
          to modetbl for "looktags" to test/update this code.  Note that this
          is turned off by commenting out the "LookTags" line in modetbl.  This
          affects also files main.c, file.c modes.c and tags.c

        + added file 'filec.c' to perform filename completion.  Moved code that
          was ifdef'd LAZINESS there, and recoded so that it stores paths
          normally (not reversed!).

        + created function 'mlreply_file()' in filec.c, used this to
          consolidate prompting for filenames in file.c (Note that now all
          filename prompts can get data from the screen).

        + made most of the calls on 'mlreply_file()' default to the current
          filename; this is simpler than the last name given to the command.

        + moved check for writing view-only buffer from 'filewrite()' as new
          local function 'writable()', before calls on 'writereg()' This
          affects 'filewrite()', 'filesave()', 'imdying()' and 'writeregion()'

        + use 'mlreply_file()' in 'execfile()' (file exec.c)

        + use 'mlreply_file()' in 'operwrite()' (file opers.c)

        + added 'no_such_file()' to file.c; use this in 'execfile()' so that
          ":source" will report an error if the file is not found.

        + created function 'mkreply_dir()' modeled after 'mlreply_file()' in
          filec.c, used this to allow pathname completion in 'cd()' in random.c

        + added mode "dirc" to file modetbl, to support directory name

        + added l_number to LINE struct, b_bytecount to BUFFER struct (file
          estruct.h) to use in caches for # of bytes and lines displays.

        + added macro 'for_each_line' to file estruct.h

        + added procedure 'bsizes()' to buffer.c to compute values for l_number
          and b_numchars, b_numlines values.  Will later get this to cache
          results to speed up 'line_no()' and related code.

        + corrected column-splitting in file modes.c (error in 3.34 changes)
          which caused dos-mode to not be shown.

        + corrected flag in 'modetbl' for dos-mode: this makes dos-mode show in
          the status-line.

        + added new entrypoints to tbuff.c: tb_copy, tb_scopy, tb_bappend

        + merged code in 'spawn1()' and 'pipecmd()' (file spawn.c) so that
          !-commands and !!-commands work consistently.

Changes for vile 3.34 (from Tom Dickey):

        + modified mktbls.c to use 3rd column of modetbl (window-flags).  Moved
          window-flag defines in estruct.h to allow their use in nemode.h

        + in modes.c, moved the code that updates window hints-flags from the
          'adjustmode()' to 'adjvalueset()' procedure so that it can use the
          new window-flags entry in nemode.h

        + modified mktbls.c (and estruct.h, edef.h) to support global modes.

        + added to modes.c: 'new_regexval()', 'free_regexval()', and
          'free_val()'.  Use these in main.c and modes.c to simplify

        + added to estruct.h defines to use in testing memory leaks using both
          dbmalloc as well as apollo-specific traces.

        + added to main.c ifdef for NO_LEAKS; used this in testing for
          permanent memory leaks (freeing data also finds specific types of
          allocator corruption).  Added test-code for this purpose to:
          buffer.c, display.c, line.c, regexp.c, tbuff.c, window.c

        + plugged memory-leak in 'getfile()' in file.c by splitting it after
          the temporary-buffer allocation, making tbp a static value, and
          deleting the line that set the tbp.b_fname pointer to null.

        + revised the value-checking in 'adjvalset()' (file modes.c) so that
          unnecessary changes are ignored.

        + further modified file modes.c so that typing ' ' (except after string
          or pattern values) will continue the prompting for further set-modes,
          as in noninteractive use.

        + put the TTputc for '\r' back into 'kbd_putc()'; omitted this when
          taking code for 'mlmsg()' from display.c

        + added new function 'GetEnv()' to eval.c to guard against
          null-return from 'getenv()'.

        + added new command (to file line.c) "show-registers" to show the
          contents of kill-buffers and registers.

        + added new module 'history.c'.  This implements up/down scrolling in
          an invisible buffer "[History]", which logs all :-commands.

        + coded-around apollo sr10.3 optimizer-bug in 'execkreg()':
                kbdend = &kp->d_chunk[i];
          resulted in kbdend == kp->d_chunk.

        + moved autobuffer and c-suffixes modes to global-table.  Deleted 'cwd'

        + modified mktbls.c so that each table will be sorted by name (not by
          type&name).  Modified modes.c to take advantage of this and display
          the modes sorted in columns (more like 'vi'), except for long strings
          (which are deferred to the bottom of the display, still).

        + make modes.c show the actual color name in addition to the index.

        + rewrote 'kbd_string()' to interface it with 'edithistory()'.  Split
          out entrypoint 'kbd_reply()' to support integration of history with

        + redefined 'kcod2key()' in terms of N_chars; added macro 'isspecial()'
          to estruct.h

        + revised 'kbd_engl_stat()' and 'namedcmd()' to use the 'kbd_reply()'
          entrypoint so that user can scroll through history of any portion of

        + modified 'search.c' to log history for '/' and '?' commands.

        + modified x11.c to use memcpy rather than bcopy (for consistency).

        + made x11.c compile properly on apollo sr10.3 (there is a conflict
          between prototypes in <string.h> and <strings.h>).

Changes for vile 3.33:

        * many: cleanup for gcc-2.3's -Wall warnings

        * bind.c: added new function, insertion_cmd(), which returns char
        that gives us simple insert mode.  used in x11.c and input.c, for
        pasting and for insert-mode arrow keys

        * estruct.h: don't redefine "const" on linux

        * makefile: added aix warnings, changed name of ENV to ENVIR, due
        to name conflict with linux make

        * random.c: add include of sys/select.h for AIX

        * x11.c: added code to support arrow keys and function keys from
        Phil Rubini

Changes for vile 3.32 (from Tom Dickey):

        * modified estruct.h, proto.h and display.c to compile vile on HP/Apollo
          SR10.2 (CC 6.7).  Added new definitions ANSI_PROTOS and ANSI_VARARGS
          to simplify this.

        * modified 'mktbls.c' to produce nemode.h; use these definitions
          to replace buffer/window mode definitions in estruct.h and edef.h
          (note that this obsoletes symbol MAX_STRING_W_VALUE, reordered
          window int-modes).  Further modified 'mktbls.c' to only create
          ".h" files for the cases where it has data (so that I can split
          modetbl off from cmdtbl, avoiding unnecessary recompiles).

        * supplied an ifdef (at least for APOLLO!) in termio.c so that ^C
          and ^U work properly.

        * added buffer-mode 'wrapmargin' to file insert.c (which overrides
          wrapwords iff it is set to nonzero).

        * added new module 'tbuff.c' to manage dynamic buffers in places
          where local static buffers exist now.

        * modified 'ins()' in insert.c so that it reallocates 'insbuff[]',
          allowing arbitrarily-large re-inserts.

        * modified 'input.c' to dynamically allocate 'tmpcmd' and 'dotcmd'
          buffers.  This allows arbitrarily-large commands to be repeated
          with '.'.

        * guard 'lengthen_path()' in file.c against shell/pipe/internal names.

        * added variable "$shell" (files cmdtbl and eval.c) to override
          environment-variable "SHELL" in pipe-commands.

        * made 'show-vars' (file eval.c) show leading '$' or '%' to be
          consistent with the way the user must type them.

        * suppress 'show-vars' (file eval.c) ERROR values (these correspond to
          unimplemented variables)

        * corrected error in nextbuffer/swbuffer (file buffer.c) that allowed
          vile to crash if "set noautobuffer" was specified in .vilerc

        * corrected display in 'show-vars' (file eval.c) of "$kill" (reference
          to volatile data).

        * made new function 'kbd_complete()' (file bind.c) to allow keyboard
          completion in tables other than NTAB.

        * modified logic in new function 'kbd_complete()' to show permissible
          completions in response to '?'.

        * consolidated logic in exec.c, display.c, bind.c, input.c with new
          procedures 'kbd_putc()', 'kbd_puts()', 'kbd_erase()', 'kbd_alarm()'
          These hide random use of 'ttcol'.

        * make 'kbd_engl_stat()' (file bind.c) recognize word-delete character.

        * eliminated redundant unget/get (files bind.c, exec.c) in the interface
          of 'kbd_engl_stat()'; this caused an infinite loop in the call from

        * modified bug-test in 'updpos()' (file display.c); I had a process hang
          in that loop for some reason.

        * collapsed expand/dobackslashes args of 'kbd_string' (file input.c)
          into one mask.

        * modified 'mktbls.c' further to produce table 'all_modes[]', to use
          this for name-completion of mode.

        * modified 'mktbls.c' to recognize color-types so I could get rid of
          upper/lower case kludge in modes.c

        * modified 'modes.c' to use color-types.  The interactive behavior now
          uses 'kbd_string()' to split the input at the '=' mark (if given).

        * added option-flag KBD_LOWERC to 'kbd_string()' (file input.c) so that
          things that are forced to lowercase will be shown in that way on

        * modified 'token()' (file exec.c) to handle the 'eolchar' for
          non-interactive calls on 'kbd_string()'.

        - modified 'eval.c' to recognize '=' as a separator between
          variable-name and value, as in 'modes.c'.

        - modified 'eval.c' to perform name-completion for environment
          variables (i.e., those beginning with '$').

        - modified 'modes.c' to accept vi-style multiple assignments in a ":set"
          command (this works non-interactively).

        - corrected 'imply_alt()' in buffer.c; ensure that the fname-argument is
          non-null.  If called via 'filterregion()', it will be null.

Changes in 3.31:  (Tom Dickey)

        * corrected test in 'find_alt()', which caused the %/# toggle to work
          incorrectly in noautobuffer mode.

        * updatelistbuffers after 'cd' command

        * added 'chg_buff()' & 'unchg_buff()' to encapsulate logic to update
          buffer-list after buffers are modified.  The function 'lchange()'
          is replaced by 'chg_buff()'.

        * modified 'histbuffer' to toggle according to 'find_alt()'

        * make the filename/buffer/number change for 'killbuffer' apply to

        * corrected handling of repeat-count in 'C' command.

        * updated vile.hlp

        * revised 'mktbls.c':

                * filter out redundant ifdef's
                * tab-align data items for readability
                * modify 'nefunc.h' to use prototypes rather than K&R style
                  definition, also split the extern-definitions from the
                  data items for readability.
                * make procedures static, linted
                * modified so that 'evar.h' definitions are automatically
                  generated, so that "show-variables" can show a sorted
                  list of variables.  The new filename is "nevars.h".

        * corrected window refresh flag for 'U' (lineundo) command.

        * added an apollo-specific code in 'imdying()' to generate a walkback
          for debugging.

        * corrected an error in 'zotwp()': reference to data that had been

        * corrected an error in 'onlywind()': it did not delink window-pointer
          after freeing it.

        * noticed that references to 'dfoutfn' weren't reentrant:  I did a
          ":show-var" from the buffer-list and got only part of the heading.
          Reorganized display.c to ensure that it is reentrant by using a
          local copy of 'dfoutfn'.  Note that I didn't add 'dfoutfn' as an
          argument to 'dofmt()' to avoid complications with varargs.

        * corrected 'dfputli()': it didn't do hexadecimal.

        * corrected 'updateline()': it sometimes failed to highlight the ends
          of the mode-line.

        * corrected (my last change) to 'vtset()' so that "^J" is shown in

        * moved 'writeall()' from main.c to buffer.c; it belonged there, and
          I used local macros for simplifying it.

        * remove SIGHUP handler before normal call on 'exit()' to avoid
          vile-died messages when running it in an xterm.

        * corrected VMS definition of exit codes; added def of BAD-macro.
          modified main.c, display.c, window.c accordingly.

Changes in 3.30, mostly from Tom Dickey:

This is lots of changes, mostly in buffer.c:

        * lint-clean: buffer.c

        * linted also: file.c, modes.c (though I left size_t alone for now).

        * added "list-vars" & "show-vars" to show the current variables

        * modified 'killbuffer' so I could add binding ^X-k to point to
          a buffer-name in the buffer-list and kill it.

        * also modified 'killbuffer' to recognize filename if buffer-name is
          not found, also buffer-number.

        * modify buffer.c so that the number shown by '_' and '*' is consistent

        * fixed ^X-o and ^X-O so they update buffer-list, as well as some
          other places I missed before.

        * make some functions static (where they are really private), because
          my per-module lint library got too large.  (I believe there are
          too many externals).  In modes.c, this involved reordering, since
          my practice is not to have forward-refs on static functions, to
          make this work with some awful compilers.  This meant that I
          deleted lines from 'proto.h'.

        * introduced new macro 'isreturn()', used this in correction in
          'histbuff()'.  I used it in one bug fix & also where I could find
          explicit compare for \r, \n.

        * added mode 'autobuffer':

                * the default is 'autobuffer' (the vile lru buffering)
                * curbp no longer is necessarily equal to bheadp
                * added members b_created, b_last_used, b_relink to support
                  the autobuffer/noautobuffer mode.
                * if "noautobuffer" is set, ":rewind" and ":n" apply only
                  to the original command-line files.

        * added macros SCRTCH_LEFT, SCRTCH_RIGHT, ScratchName, IsInternalName
          to encapsulate use of '[' in names.

        * added macros SHPIPE_LEFT, isShellOrPipe to encapsulate use of '!' in

        * added function is_pathname to encapsulate tests for pathnames
          beginning with '.'.  This fixes the display of ".vilerc" from the current
          directory as "./.vilerc".

        * added new char-types _scrtch and _shpipe to support killbuffer from
          screen.  Use these types in new macro 'screen_to_bname()' which uses
          modification of 'screen_string()'.  Used 'screen_to_bname()' to
          make ^X-e and ^X-k "correctly" parse the bname, fname columns from

        * fixed the error you mentioned in modeline (the position of col-80 mark
          taking into account sideways and number modes).

        * supplied a missing TTflush in input.c

        * modified 'makebufflist()' to show only the flags actually used in the

        * modified 'makebufflist()' to show '%' and '#' by the corresponding

        * added macros 'for_each_buffer()' and 'for_each_window()' to simplify
          code as well as to keep visible references to bheadp & wheadp
          confined to buffer.c and window.c respectively.

        * added/used macro SIZEOF


Changes in 3.29:

(fixes supplied by tom dickey, eric krohn, and willem kasdorp)

buffer.c: changes for keeping the buffer list more up to date when
        on screen
fences.c: allow match of fence that is first char. in buffer
file.c: avoid inf. loop when choosing unique name for buffers that have names
        containing "x" in the NBUFN-1 position and allow ":e!" with no file
        to default to current file
globals.c: implemented 'v' command
isearch.c, line.c, display.c: ifdef of some unused code
main.c: added .C, .i to cmode suffixes, for C++ and cpp output files
makefile, install target: test for presence of vile in destdir before
        trying to move it to ovile
oneliner.c: don't allow pregion to be used if the plines buffer is current,
        and set the WINDOW list mode, not the BUFFER list mode, so :l works
        again, and fix for s/.//g bug
regexp.c: fixes for interaction of BOL and \s etc.
spawn.c: lint cleanup  mostly casting strcXX() to void.
tcap.c: hack to supply CS or SR for scrolling region control, missing
        from some xterms
termio.c: added missing fflush in two of the ttclean() routines
word.c: fix for counts on 'J' command


The rest of the changes lister here are grouped only roughly, and represent
the delta of version 3.28 from vile version three.  -pgf Dec 30 1992



- made ^N, ^P, and ^T do exactly what they do in vi.  (next line,
        previous-line, and tag-pop) Use ^X-o to switch windows, and ^X-2 to
        split them.

- ANSI style arrow keys now work from either command or insert mode.  Any
        ANSI function key of the form ESC [ c can be used as a command
        key -- the binding is FN-c

- the '#' key may now be used to force the following character to be treated
        as a function key.  Thus #1 is now equivalent to FN-1.

- some modes/values have changed names: aindent is now autoindent, swrap is
        now wrapscan, exact is now noignorecase, and they all have the vi
        shorthands (e.g.  tabstop is the same as ts, ic is the same as

- the "paragraphs" and "sections" values are now implemented, but as
        regular expressions -- they look pretty ugly, but I think they
        do what vi does.

- the sentence motions ')' and '(' now work.  they may not do exactly what
        vi does, but they're close.  they're controlled by regular
        expressions that find the ends of sentences -- then they move
        forward to the start of the next one.  The regular expressions are
        set in the new "sentences" value setting.

- "showmatch" mode now works, and momentarily shows the previous matching '('
        or '{'.

- "magic" mode, or rather "nomagic" mode, now works more like vi:  special
        characters are still available by escaping them in nomagic mode.

- there is a new mode, settable as "set terse" and "set noterse", which will
        suppress some of the extra messages that vile prints, reducing
        traffic for slow terminals.

- the '%' command now scans forward for a fence character if you're not on
        one to begin with (thanks to Dave Lemke).  I also added '^X-%', which
        scans backward instead.

- the ":&" command now works, and repeats the last ":s" or '^X-s'
        substitution.  it re-uses trailing p and l options, which vi does

- the '&' now works, and repeats the last ":s" or '^X-s' substitution.

- replacement sub-expressions work (\( and \), \1, etc.), as do \U \L \u \l

- there is a new operator, '^A-&', which is similar to '&' but acts on a
        region.  I expect that if you want it, you'll probably rebind it to
        something else (like '&') since typing it is awkward, to say the least.

- ^W and ^U are now both read from the tty settings, and they work in both
        insert mode and on the : line.  There is a "backspacelimit" setting
        that controls whether these (and regular backspacing (^H or DEL)
        will backspace past the insert point in insert mode.

- The '@' command can now be used to execute the contents of a named register,
        as if it were entered at the keyboard.  Thus @k executes register k.

- The "keyboard macro" obtained with ^X-( and ^X-) can be saved into a named
        register with the ^X-^ command.  This lets you record a keyboard
        macro and save it for use with the new '@' command.

- And, along to further complement the '@' command, it is possible to pre-load
        the named registers with the "load-register" command.  In a .vilerc
        you can say:
                use-register a load-register ihello^[
        (where ^[ is really an ESC entered with ^V-ESC), and then from
        within vile you can execute '@a', and the word "hello" will be

- the H, M, and L commands are now absolute motions

- insert mode now takes a repeat count, so '80i=ESC' inserts 80 '=' chars

- two new functions, to make normal motions more vi compliant --
        forward-character-to-eol and backward-character-to-bol, which won't
        move past the boundaries of the current line.

- you can no longer backspace from the beginning of a line to the end of
        the previous.  (rebind 'h' and '^h' from "backward-character-to-bol"
        to "backward-character"

- a motion caused by an undo is considered absolute, and the "last dot"
        mark is reset.

- added 'vi +/searchstring file.c' invocation syntax

- you can now specify a count to the ~ command.

- backslashes now have a protective effect on the : line -- they guard
        against expansion of #, %, :, and \.

- a lone ":f" without filename now gives same info as ^G

- 'x', 's', 'r' will no longer delete a line if used on an empty line.

- after a ":e!" command, the buffer name changes to match the filename, as
        if this were a new file read.  It used to just suck a new file into
        an old buffer, and the names didn't match.

- there is now a "taglength" setting, and the name of the tags file is in
        the "tags" setting.

- the "cd" and "pwd" commands now work

- shiftwidth has been implemented, so ^T, ^D, '<', and '>' all do pretty
        much what they do in vi

- there is a separate c-shiftwidth, used when in cmode, much as c-tabstop
        replaces tabstop when in cmode.

- ": args" is now similar in spirit to the vi command of that name


- reading files in general is _much_ faster, unless the file contains lines
        longer than 255 characters, in which case things slow down again.

- regular expressions are more powerful and much, much faster than they
        were.  vile now uses Henry Spencer's regexp code.  This has the
        side effect of making '\|' a new metacharacter, for alternation
        of expressions.  '\+' and '\?' are also new, and stand for "one
        or more" and "zero or one" occurrences.  they can be used from
        the I-search commands as well.

- in addition, \< and \> find beginnings and ends of words, and \w, \s,
        and \d find "word" characters, "space" characters, and digits.
        \W, \S, and \D find the converse

- related to the above change, replacement metacharacters now work, so you
        can use '&' and '\1' through '\9' in the replacement string, and
        you'll get the right thing.

- Dave Lemke contributed code to support vile under X windows -- including
        support for cutting/pasting, etc.  Thanks Dave!

- the '%' command will now find matching #if/#else/#endif sets.

- the '%' command will now find matching C comment sets.  Yes, it does
        the (non-)nesting correctly.

- tabstops can now be set to any value, and there is a separate value for
        tabstops in C mode.  (c-tabstop)

- there is now some support for horizontal scrolling, using ^X-^R and ^X-^L

- the ! filter command for running text through an external filter now

- quite a bit of code cleanup, at least I think so -- it has ported pretty
        easily to a R6000, linux, 386bsd, Sony NeWS, NeXT, and the UNIXPC.
        it's close to lint-free, and Saber has very few problems with the
        code.  it'll now use prototypes if __STDC__ is defined, and it
        passes gcc -Wall -Wshadow with no warnings, if you ignore implicit
        declarations of system calls and lib routines.  the code should now
        be more portable, to various compilers and systems.  there are new
        targets in the makefile to make building on various platforms
        easier.  the makefile even supports microsoft C.

- the code now builds and runs under DOS, using (at least) Microsoft C 6.0.
        Peter Ruczynski has done a great job porting vile to DOS -- he
        calls that version "pcvile".  He has used the Zortech compiler in
        the past -- I didn't try to break that, but you never know.

- quite a few bug fixes, including all (I think) of those reported by users

- the "last dot" mark, accessed with the names ' and ` doesn't get reset
        needlessly as often -- that is, if an absolute motion results in no
        move (e.g.  a failed search or tags operation, or an undo) then the
        "last dot" mark is unchanged.

- the "source" ("execfile") command now does globbing on the file being run
        -- be sure to put it in quotes, as in :source "$HOME/.vilestuff"

- entab, detab, and line-trim are now all operators (^A-tab, ^A-space, and

- "make install" installs to /usr/local/bin or $HOME/bin, whichever is

- the english names of functions, particularly new ones, have been
        "rationalized", hopefully making it easier to remember their names.

- if you invoke a substitute command with ^X-s, it will always act globally
        across lines.  (i.e.  it behaves like "s/s1/s2/g", not like

- a QUIT signal will no longer cause core dump unless built with DEBUG on

- the display optimizes scrolling if possible when the window scroll
        commands ^E and ^Y are used.

- values/modes have been reworked.  Some are now attached to buffers, some
        to windows.  By default, all values use the global settings of
        those values, and will track changes to the global settings.  If a
        local setting is specified, it breaks the link between the local
        and global value, and the local value will no longer track the
        global value.  ":set all" is now more informative.

- the "set list" value is now attached to a window, not a buffer, so a
        single buffer can be displayed in two windows, "list"ed in one but
        not the other.

- reading from other processes into a buffer is now _much_ faster

- it is no longer legal to write out the contents of a buffer that has view
        mode set.

- the format region command (^A-f) now restarts with each fresh paragraph,
        so you can format an entire file at once, without collapsing it all
        into a single paragraph.  It also knows a little bit about C and
        shell comments, so you can now reformat blocks of commentary text.
        (There can't be any non-commentary stuff in front of the comments.)

- the position of the cursor within a window (the framing) is now preserved
        while the window if "off-screen" -- it no longer reframes when made
        visible again.

- there is now a mode indicator on the modeline: I for insert, O for
        overwrite, and R for replace-char.

- a line starting with '#' won't shift-right if the buffer is in C mode.

- :s/s1/s2/5 now works, to change the 5th occurrence on a line

- there are new commands to write all buffers: :ww is a synonym for
        "write-changed-buffers", and :wwq is now a synonym for

- it is now legal to "kill-buffer" a displayed buffer

- there are new variables, $word, $pathname, and $identifier, which return
        the appropriate type of string from the cursor's location

- all of the variables, and the functions and directives of the extension
        language have been documented, and most have been tried, if not

- two new functions: &rd and &wr, return whether a file is readable or writable

- a new mode, "tabinsert", has been created to fill the needs of the
        "I hate tabs" camp.

- filenames are now put into canonical form -- this keeps "junk", "./junk",
        "./somedir/../junk" from appearing as different files to the editor.

- there is a new mode, "tagsrelative", which, when set, causes filenames
        looked up via tags to have the directory name of the tags file
        prepended to them before being accessed.  This allows one to cd into
        a build tree from within the editor, to facilitate a grep or a local
        build, and have tags lookups continue to work.

- the find-next-error code now honors the "Entering/Leaving directory"
        messages that GNU make (and others?) puts out.

- job control now works right


- internally, most pointers into the buffer, consisting of a LINE * and an
        int offset are now represented with a MARK structure -- in the
        nineties, it's time to start using structure assignment.

- the set of values that are frequently handed about between buffers and
        windows, or windows and their "children" are now grouped into
        B_TRAITS and W_TRAITS structures, for easier bookkeeping.  There
        are lots of macros to hide the added data structure depth.

- if you add a new setting that should be inherited by and selectable
        on a per-buffer or per-window basis, add it to the W_VALUES or
        B_VALUES structs.  Otherwise, if its just a global value, like the
        X font, make it a variable.  I intend to merge the setting of
        variables in with the other values one of these days.

- there is now a generic printf facility built in, which is layered under
        mlwrite() for the message line, bprintf() to print into a buffer,
        and lsprintf() to print into a string

- LINE structures can now have NULL l_text pointers -- empty lines don't
        have memory associated with them (except for the LINE struct

- line text is now "block malloc"ed -- now for most files there is are two
        mallocs and a single read, no copies.  previously there were two
        mallocs per line, and two copies (stdio's and ours).  This change
        implies that LINE structures and their text should not be moved
        between buffers -- the space they occupy may have come from the big
        chunks attached to the buffer structure, and not from the malloc
        pool directly.  So lfree() and lalloc() now take a buffer pointer

- there is "line poisoning" code, in line.c, which trashes the contents of
        freed lines and LINE structs, to make it easier to find bad usage.

- do_fl_region() is a convenient wrapper for writing operator commands that
        work on full lines -- there isn't yet a similar wrapper for partial
        line operators.

- use mlwrite() for informative messages that terse mode will suppress,
        mlforce() for messages that _must_ be seen, and mlprompt() for
        messages that need a response from the user unless they're in a
        command file.