Table of Contents
- Multiple dots
- More compact syntax
- Changes do not need to be in sequence just non-overlapping
- Different regex anchor behavior
- The substitute command s was dropped
- Count specifier for g and v commands
- Count specifier for text commands
- \1 - \9 and & in text commands
- \t in text commands
- Marks as addresses
- Searches do not wrap around
- Limited command prompt support for multi-line commands
- Unsupported commands
- Multi-file support is not yet well supported
- Mouse support
- External commands
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Below we list some deliberate differences in behavior compared to sam and/or acme.
Multiple dots
We support multiple "dots" (or ranges, selections) at the same time, enabling a more interactive experience. In sam the following two independent commands run one after another
,x/pattern
c/replacement
have the effect that x sets dot to the last occurrence of pattern which is
then subsequently replaced.
Whereas in vis the x commands creates a new selection for every occurrence of
pattern and switches to visual mode. If the change command c is later executed
it affects all selections.
More compact syntax
Commands within groups (braces) do not have to appear on separate lines.
x/Emacs/ { i/>/ a/</ } is valid syntax.
Changes do not need to be in sequence just non-overlapping
x/Emacs/ { d i/V/ a/i/ } works as expected.
Different regex anchor behavior
In vis ^ and $ always match the beginning / end of the range they are applied to.
This differs from sam where they only match the beginning / end of a line.
Rob Pike writes on this topic in his
Structural Regular Expressions paper:
The program to capitalize ‘i’s should be writable as
x/[A-Za-z]+/ g/^i$/ c/I/
That is, the definition of ^ and $ should reflect the structure of the input.
For compatibility and because of some problems in the implementation, however,
^ and $ in sam always match line boundaries.
The above command works as expected in vis.
The substitute command s was dropped
Use /pattern/ c/replacement/ to substitute the first,
/pattern/ // c/replacement to change the second or
x/pattern/ c/replacement/ to replace all matches.
Count specifier for g and v commands
Sam's substitute command supports an explicit count specifier: s3/pattern/replacement/
indicates that only the third occurrence of pattern should be substituted.
In vis a more generalized variant of the same concept has been integrated
into the g and v commands.
The equivalent of the above sam command is x/pattern/ g3 c/replacement/.
Count specifier for text commands
The text given for the a, i and c commands can optionally be prefixed
with a count specifier, indicating how many times it should be inserted.
\1 - \9 and & in text commands
These refer to the corresponding register values capturing the (sub) expression
matches of the last performed search. & contains the complete matched text.
Hence, x/Vi/ c/>&</ has the same effect as x/Vi/ { i/>/ a/</ }.
And x/(.)-(.)/ c/\2-\1/ applied to o-O results in O-o.
\t in text commands
In addition to \n for newlines, \t can be used to specify literal tab characters.
Marks as addresses
'm where m denotes one of the vi marks
can be used as an address.
Searches do not wrap around
Currently searches with +/pattern, -/pattern do not wrap around at the
end (start) of the file.
Limited command prompt support for multi-line commands
Sam has a dedicated command window, whereas in vis' command prompt multi-line commands
need to be entered using <Ctrl-v><Enter>.
Unsupported commands
Commands for functionality covered by traditional vi keybindings are not implemented.
Examples include: m (move), t (copy), k (set mark) and u undo.
Multi-file support is not yet well supported
While the commands X and Y are recognized, multi-file support is not yet well supported
and will need further design work.
See also issue #219 and the mailing list discussion.
Mouse support
The mouse is currently not used at all.
External commands
Changes of external commands < and | are only applied if they exit with success. Append || true to the command to match the sam behavior of using the output irrespective of exit status.