Previous: Insert State, Up: States in Viper

1.3.4 Replace State

This state is entered through Vi replacement commands, such as C, cw, etc., or by typing R. In Replace state, Viper puts <R> in the mode line to let you know which state is in effect. If Replace state is entered through R, Viper stays in that state until the user hits <ESC>. If this state is entered via the other replacement commands, then Replace state is in effect until you hit <ESC> or until you cross the rightmost boundary of the replacement region. In the latter case, Viper changes its state from Replace to Insert (which you will notice by the change in the mode line).

Since Viper runs under Emacs, it is possible to switch between buffers while in Replace state. You can also move the cursor using the arrow keys (even on dumb terminals!) and the mouse. Because of this freedom (which is unattainable in regular Vi), it is possible to take the cursor outside the replacement region. (This may be necessary for several reasons, including the need to enable text selection and region-setting with the mouse.)

The issue then arises as to what to do when the user hits the <ESC> key. In Vi, this would cause the text between cursor and the end of the replacement region to be deleted. But what if, as is possible in Viper, the cursor is not inside the replacement region?

To solve the problem, Viper keeps track of the last cursor position while it was still inside the replacement region. So, in the above situation, Viper would delete text between this position and the end of the replacement region.