VIXEN(1) VIXEN(1)
NAME
vixen - vi-like text editor
SYNOPSIS
wm/vixen [ -d debug ] [ -c macro ] [ -i ] path
DESCRIPTION
Vixen is a vi-like text editor for Inferno.
Options
Vixen edits path, or a new buffer if no path is given. If
path is a directory, nothing is read.
-d debug
Print debug messages to standard error. Each character
in debug enables debug printing for functionality asso-
ciated with that character ( `a-z' only). See the
source code for the mapping of character to functional-
ity. As a special case, `+' enables all debug print-
ing.
-c macro
After startup, before giving control to the user, macro
is executed.
-i Reads initial buffer from standard input instead of
from file. This can be used to start vixen with a
directory as filename and pipe the output of a command
to it.
Modes
Vixen is a modeful text editor. It starts in command mode,
interpreting key strokes as commands. Commands can move the
insertion cursor, modify the buffer, change the mode, and
more. Many commands that modify the buffer expect to be
followed by a motion commands, causing the command to oper-
ate on text from the insertion cursor to the position after
the motion. Insert mode, entered by i (among others),
inserts further keys at the insertion cursor and advances
it. Replace mode, started by r, is similar but overwrites
text instead of inserting it. Visual mode, started by v,
accepts commands just as command mode, but commands operate
on the selection (indicated by reverse colors), and motion
commands change the selection. Visual line mode only allows
whole lines to be selected. Ex commands can be entered by
typing a colon, though this is not considered a separate
mode. Pressing escape in any mode switches back to command
Page 1 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
mode.
User interface
The main text window is a view of the current buffer. The
title contains the name ``vixen'' and the absolute path of
the file being edited. Vixen makes sure the insertion cur-
sor is always visible, unless the view is scrolled by the
scrollbar. Under the window is the status bar, it contains
the current mode, the buffer's file name (or that none has
been set yet), the number of lines and characters in the
file, the current insertion position, the characters that
have been collected as a command, and optionally an error
message. When entering line-based commands, such as ex com-
mands and searches, the status bar is temporarily replaced
by a text entry widget. The end of the buffer is indicated
by an EOT character in blue color on white background color.
The insertion cursor is shown before the character it is
positioned at. The visual selection is indicated in reverse
colors. A text search match is indicated with black text on
a yellow background, after a change of the text the colors
are removed. After an incoming plumb message, the added
text or addressed line is indicated by white text on a blue
background. The colors are removed on the first key stroke
or command. The edit entry, for ex commands and searches,
has file name completion and a history. Pressing tab inter-
prets the word before the cursor as a filename completes it
to the largest common prefix of the matches. If the word is
already the largest common prefix, each tab fills in the
next match. History is accessed with the up and down arrow
keys. Up selects the previous line that prefix-matches the
text typed so far, down the next.
Buffer
The buffer is the data that commands operate on. All data
is utf-8, arbitrary binary files cannot be edited. Vixen
always has exactly one buffer The buffer can be in `modi-
fied' state, i.e. not yet flushed to disk. A file name may
be associated with a buffer, either because the buffer was
read from that file or because the buffer has previously
been written to it.
Insertion cursor and positions
The buffer always has a insertion cursor (or just `cursor'),
where text in insert or replace mode will be inserted, and
commands will operate from. The position of the insertion
cursor is represented as a line (starting at 1) and column
(starting at 0) within that line. Positions always repre-
sent a character with one exception: it can be positioned
after the last character in the buffer, at the end of file.
Page 2 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
Different from most vi clones, the insertion cursor can be
positioned at a newline. In an empty buffer, e.g. when
starting vixen without parameters, the only valid position
is ``1.0''.
Selection
The selection is indicated by reverse colors, and only pre-
sent while in one of the visual modes. On entering the
visual mode, the start and end of the selection is set to
the cursor position. On entering the visual line mode, the
selection is set from start of the cursor's line to the end
of the cursor's line (including newline). Motion commands
are interpreted from the end of the selection, even if its
position is before the start of the selection (possible due
to backwards motions).
Registers and macro's
Registers can hold textual data. They are useful to tem-
porarily store text, for later use. Special registers exist
too, automatically updated. Some commands, especially those
that delete or insert text, modify a register. This regis-
ter can be changed by prefixing the command with the <reg>
command. The same applies to commands that use a register,
e.g. yank. The contents of a register can also be executed
with the @<reg> command, as a macro. Macro's can also be
recorded by the q<reg> command, and ended by a subsequent q
command. <reg>.
Registers:
Holds text removed during last deletion.
. Holds last insertion with insert or replace mode.
% Current filename, may be empty. Read-only.
/ Pattern of last text search.
* Contents of snarf buffer.
! Command last executed by ex command :b command.
a-z Registers available to user.
A-Z Aliases for registers a-z. Writes to these registers
append to the lower cased registers, instead of writing
them.
Page 3 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
Marks
Marks are positions in the file. They can be set by the
m<mark> command and jumped to by `<mark> and '<mark> com-
mands (the first jumps to the exact position, the second to
the first non-blank character of the position's line). Some
marks are automatically set when navigating the buffer, some
cannot be modified by the user, see the table below. A mark
is automatically deleted when the text at its position is
deleted. Marks always point to the same character, and are
automatically adjusted on insertions and deletions before
them. The following marks are available:
< First character of visual selection (regardless of
direction of selection, so not necessarily the start of
the selection). Set automatically when changing the
visual selection, read-only. m-command.
> Last character of visual selection.
` and '
Many non-trivial motion commands are considered jumps.
These identical marks contain the position of the
insertion cursor before the last jump.
. Location of last change, insertion or deletion. Read-
only.
^ Location of last insertion of text. Read-only.
a-z No special meaning. Note that marks A-Z and 0-9 are
not available.
Changes and undo/redo
Each modification of the buffer, e.g. by a command or an
insertion through insert mode, is recorded as a change. It
can be undone by the u command. Undone commands can be
redone by the ^r command.
Inserting text
Text can be inserted in the buffer while in an editing mode,
insert or replace mode. The last typed character can be
removed by ^h, the last typed word by ^w, the last typed
line by ^u. Only text typed after switching to the current
editing mode can be removed with the commands above. Com-
mands have to be used for other deletions. When in replace
mode, text is overwritten. Newlines are never overwritting
though, so when the cursor is at the end of a line, replace
mode is effectively the same as insert mode. Erasing over-
written text reveals the original text again.
Page 4 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
Plumbing
Plumbing is supported through the non-visual gP,gpp and
gp<motion> commands, and the (identical) visual commands gp
and gP. Quick write and compile cycles are supported by the
gb and ex' :b [command] commands. Vixen uses a helper pro-
gram vixenplumb (not otherwise documented) to keep track of
which files are being edited, and routes plumb requests
accordingly or starts a new vixen.
COMMANDS
Motion commands
Motion commands set the insertion cursor. While in visual
select, they change the selection. As modifier in commands,
they indicate the range of text for the command to operate
on. Many motion commands can be prefixed by a repeat count
(not starting with zero). For example j moves the cursor
down one line, while 3j moves the cursor down three lines.
The table below lists the motion commands and their cursor
destination when a repeat has not been specified. Commands
prefixed with <n> interpret a repeat count, but all commands
accept them.
0 or Home
Column 0 of line.
<n>h or <n>Left
Character to the left, stopping at column 0.
<n>l or <n>Right
Character to the right, stopping at the newline.
<n>space
Character to the right, not stopping at newlines.
<n>w Start of next word, stopping at interpunction.
<n>W Start of next word, not stopping at interpunction.
<n>e End of next word, stopping at interpunction.
<n>E End of next word, not stopping at interpunction.
<n>b To start of previous word, stopping at interpunction.
<n>G If <n> was not specified, moves to the end of the file.
Otherwise, interprets <n> as line number and moves to
first non-blank character on the line.
$ or End
Page 5 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
End of current line (at newline if any).
^ First non-blank character on line.
<n>- First non-blank character on previous line.
<n>+ or <n><newline>
First non-blank character on next line.
<n>_ First non-blank on current line or <n>-1 lines relative
from cursor.
<n>[fFtT]<char>
Find next (for f and t) or previous (for F and T) char
on current line. f and F place the cursor at the char-
acter, t on the character before it, T on the character
after it.
<n>; Repeat last character find command ( [fFtT])
<n>, Repeat last character find command, but in reverse
direction (effectively executing the command with
swapped case).
<n>/ or <n>?
Search forward or backward. The regex(6) pattern to
search for must entered in the edit entry at the bottom
of the window.
<n>* or <n>#
Search for the word under the cursor, # searches in
reverse. This sets the last search string used by com-
mands n and N.
<n>n or <n>N
Repeat last search, N reverse the search direction.
<n>% If n was given it is interpreted as a percentage of the
lines in the file, and the cursor is moved to that
line, to the first non-blank character. Otherwise,
jump to the counterpart of the nearest (forward) char-
acter in (){}[], taking nesting into account.
<n>| Column n on current line, or column 0 by default.
<n>( or <n>) or <n>{ or
Next/previous sentence ( ) and () or next/previous
paragraph ( } and {). In other vi implementations, the
{ and } commands also stop at troff paragraph commands,
vixen does not.
`<mark> or '<mark>
Page 6 Plan 9 (printed 12/13/25)
VIXEN(1) VIXEN(1)
To mark.
Entire file is kept in memory twice: in vixen and in Tk.
Page 7 Plan 9 (printed 12/13/25)