diff options
Diffstat (limited to 'man-pages-posix-2003/man1p/vi.1p')
-rw-r--r-- | man-pages-posix-2003/man1p/vi.1p | 4968 |
1 files changed, 4968 insertions, 0 deletions
diff --git a/man-pages-posix-2003/man1p/vi.1p b/man-pages-posix-2003/man1p/vi.1p new file mode 100644 index 0000000..361936b --- /dev/null +++ b/man-pages-posix-2003/man1p/vi.1p @@ -0,0 +1,4968 @@ +.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved +.TH "VI" 1P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual" +.\" vi +.SH PROLOG +This manual page is part of the POSIX Programmer's Manual. +The Linux implementation of this interface may differ (consult +the corresponding Linux manual page for details of Linux behavior), +or the interface may not be implemented on Linux. +.SH NAME +vi \- screen-oriented (visual) display editor +.SH SYNOPSIS +.LP +\fBvi\fP \fB[\fP\fB-rR\fP\fB][\fP\fB-c\fP \fIcommand\fP\fB][\fP\fB-t\fP +\fItagstring\fP\fB][\fP\fB-w\fP \fIsize\fP\fB][\fP\fIfile\fP \fB...\fP\fB]\fP\fB\fP +.SH DESCRIPTION +.LP +This utility shall be provided on systems that both support the User +Portability Utilities option and define the +POSIX2_CHAR_TERM symbol. On other systems it is optional. +.LP +The \fIvi\fP (visual) utility is a screen-oriented text editor. Only +the open and visual modes of the editor are described in +IEEE\ Std\ 1003.1-2001; see the line editor \fIex\fP for additional +editing +capabilities used in \fIvi\fP. The user can switch back and forth +between \fIvi\fP and \fIex\fP and execute \fIex\fP commands from within +\fIvi\fP. +.LP +This reference page uses the term \fIedit buffer\fP to describe the +current working text. No specific implementation is implied +by this term. All editing changes are performed on the edit buffer, +and no changes to it shall affect any file until an editor +command writes the file. +.LP +When using \fIvi\fP, the terminal screen acts as a window into the +editing buffer. Changes made to the editing buffer shall be +reflected in the screen display; the position of the cursor on the +screen shall indicate the position within the editing +buffer. +.LP +Certain terminals do not have all the capabilities necessary to support +the complete \fIvi\fP definition. When these commands +cannot be supported on such terminals, this condition shall not produce +an error message such as "not an editor command" or +report a syntax error. The implementation may either accept the commands +and produce results on the screen that are the result of +an unsuccessful attempt to meet the requirements of this volume of +IEEE\ Std\ 1003.1-2001 or report an error describing the +terminal-related deficiency. +.SH OPTIONS +.LP +The \fIvi\fP utility shall conform to the Base Definitions volume +of IEEE\ Std\ 1003.1-2001, Section 12.2, Utility Syntax Guidelines. +.LP +The following options shall be supported: +.TP 7 +\fB-c\ \fP \fIcommand\fP +See the \fIex\fP command description of the \fB-c\fP option. +.TP 7 +\fB-r\fP +See the \fIex\fP command description of the \fB-r\fP option. +.TP 7 +\fB-R\fP +See the \fIex\fP command description of the \fB-R\fP option. +.TP 7 +\fB-t\ \fP \fItagstring\fP +See the \fIex\fP command description of the \fB-t\fP option. +.TP 7 +\fB-w\ \fP \fIsize\fP +See the \fIex\fP command description of the \fB-w\fP option. +.sp +.SH OPERANDS +.LP +See the OPERANDS section of the \fIex\fP command for a description +of the operands supported +by the \fIvi\fP command. +.SH STDIN +.LP +If standard input is not a terminal device, the results are undefined. +The standard input consists of a series of commands and +input text, as described in the EXTENDED DESCRIPTION section. +.LP +If a read from the standard input returns an error, or if the editor +detects an end-of-file condition from the standard input, +it shall be equivalent to a SIGHUP asynchronous event. +.SH INPUT FILES +.LP +See the INPUT FILES section of the \fIex\fP command for a description +of the input files +supported by the \fIvi\fP command. +.SH ENVIRONMENT VARIABLES +.LP +See the ENVIRONMENT VARIABLES section of the \fIex\fP command for +the environment variables +that affect the execution of the \fIvi\fP command. +.SH ASYNCHRONOUS EVENTS +.LP +See the ASYNCHRONOUS EVENTS section of the \fIex\fP for the asynchronous +events that affect +the execution of the \fIvi\fP command. +.SH STDOUT +.LP +If standard output is not a terminal device, undefined results occur. +.LP +Standard output may be used for writing prompts to the user, for informational +messages, and for writing lines from the +file. +.SH STDERR +.LP +If standard output is not a terminal device, undefined results occur. +.LP +The standard error shall be used only for diagnostic messages. +.SH OUTPUT FILES +.LP +See the OUTPUT FILES section of the \fIex\fP command for a description +of the output files +supported by the \fIvi\fP command. +.SH EXTENDED DESCRIPTION +.LP +If the terminal does not have the capabilities necessary to support +an unspecified portion of the \fIvi\fP definition, +implementations shall start initially in \fIex\fP mode or open mode. +Otherwise, after +initialization, \fIvi\fP shall be in command mode; text input mode +can be entered by one of several commands used to insert or +change text. In text input mode, <ESC> can be used to return to command +mode; other uses of <ESC> are described later +in this section; see Terminate Command or Input Mode . +.SS Initialization in ex and vi +.LP +See \fIInitialization in ex and vi\fP for a description of \fIex\fP +and \fIvi\fP initialization for the \fIvi\fP utility. +.SS Command Descriptions in vi +.LP +The following symbols are used in this reference page to represent +arguments to commands. +.TP 7 +\fIbuffer\fP +See the description of \fIbuffer\fP in the EXTENDED DESCRIPTION section +of the \fIex\fP +utility; see \fICommand Descriptions in ex\fP . +.LP +In open and visual mode, when a command synopsis shows both [ \fIbuffer\fP] +and [ \fIcount\fP] preceding the command name, +they can be specified in either order. +.TP 7 +\fIcount\fP +A positive integer used as an optional argument to most commands, +either to give a repeat count or as a size. This argument is +optional and shall default to 1 unless otherwise specified. +.LP +The Synopsis lines for the \fIvi\fP commands <control>-G, <control>-L, +<control>-R, <control>-], +\fB%\fP, \fB&\fP, \fB^\fP, \fBD\fP, \fBm\fP, \fBM\fP, \fBQ\fP, \fBu\fP, +\fBU\fP, and \fBZZ\fP do not have +\fIcount\fP as an optional argument. Regardless, it shall not be an +error to specify a \fIcount\fP to these commands, and any +specified \fIcount\fP shall be ignored. +.TP 7 +\fImotion\fP +An optional trailing argument used by the \fB!\fP, \fB<\fP, \fB>\fP, +\fBc\fP, \fBd\fP, and \fBy\fP commands, which +is used to indicate the region of text that shall be affected by the +command. The motion can be either one of the command +characters repeated or one of several other \fIvi\fP commands (listed +in the following table). Each of the applicable commands +specifies the region of text matched by repeating the command; each +command that can be used as a motion command specifies the +region of text it affects. +.LP +Commands that take \fImotion\fP arguments operate on either lines +or characters, depending on the circumstances. When operating +on lines, all lines that fall partially or wholly within the text +region specified for the command shall be affected. When +operating on characters, only the exact characters in the specified +text region shall be affected. Each motion command specifies +this individually. +.LP +When commands that may be motion commands are not used as motion commands, +they shall set the current position to the current +line and column as specified. +.LP +The following commands shall be valid cursor motion commands: +.sp +.RS +.nf + +\fB<apostrophe> ( - j H +<carriage-return> ) $ k L +<comma> [[ % l M +<control>-H ]] _ n N +<control>-N { ; t T +<control>-P } ? w W +<grave accent> ^ b B +<newline> + e E +<space> | f F +<zero> / h G +\fP +.fi +.RE +.LP +Any \fIcount\fP that is specified to a command that has an associated +motion command shall be applied to the motion command. If +a \fIcount\fP is applied to both the command and its associated motion +command, the effect shall be multiplicative. +.sp +.LP +The following symbols are used in this section to specify locations +in the edit buffer: +.TP 7 +\fIcurrent\ character\fP +.sp +The character that is currently indicated by the cursor. +.TP 7 +\fIend\ of\ a\ line\fP +.sp +The point located between the last non- <newline> (if any) and the +terminating <newline> of a line. For an empty line, +this location coincides with the beginning of the line. +.TP 7 +\fIend\ of\ the\ edit\ buffer\fP +.sp +The location corresponding to the end of the last line in the edit +buffer. +.sp +.LP +The following symbols are used in this section to specify command +actions: +.TP 7 +\fIbigword\fP +In the POSIX locale, \fIvi\fP shall recognize four kinds of \fIbigwords\fP: +.RS +.IP " 1." 4 +A maximal sequence of non- <blank>s preceded and followed by <blank>s +or the beginning or end of a line or the edit +buffer +.LP +.IP " 2." 4 +One or more sequential blank lines +.LP +.IP " 3." 4 +The first character in the edit buffer +.LP +.IP " 4." 4 +The last non- <newline> in the edit buffer +.LP +.RE +.TP 7 +\fIword\fP +In the POSIX locale, \fIvi\fP shall recognize five kinds of words: +.RS +.IP " 1." 4 +A maximal sequence of letters, digits, and underscores, delimited +at both ends by: +.RS +.IP " *" 3 +Characters other than letters, digits, or underscores +.LP +.IP " *" 3 +The beginning or end of a line +.LP +.IP " *" 3 +The beginning or end of the edit buffer +.LP +.RE +.LP +.IP " 2." 4 +A maximal sequence of characters other than letters, digits, underscores, +or <blank>s, delimited at both ends by: +.RS +.IP " *" 3 +A letter, digit, underscore +.LP +.IP " *" 3 +<blank>s +.LP +.IP " *" 3 +The beginning or end of a line +.LP +.IP " *" 3 +The beginning or end of the edit buffer +.LP +.RE +.LP +.IP " 3." 4 +One or more sequential blank lines +.LP +.IP " 4." 4 +The first character in the edit buffer +.LP +.IP " 5." 4 +The last non- <newline> in the edit buffer +.LP +.RE +.TP 7 +\fIsection\ boundary\fP +.sp +A \fIsection boundary\fP is one of the following: +.RS +.IP " 1." 4 +A line whose first character is a <form-feed> +.LP +.IP " 2." 4 +A line whose first character is an open curly brace ( \fB'{'\fP ) +.LP +.IP " 3." 4 +A line whose first character is a period and whose second and third +characters match a two-character pair in the \fBsections\fP +edit option (see \fIed\fP) +.LP +.IP " 4." 4 +A line whose first character is a period and whose only other character +matches the first character of a two-character pair in +the \fBsections\fP edit option, where the second character of the +two-character pair is a <space> +.LP +.IP " 5." 4 +The first line of the edit buffer +.LP +.IP " 6." 4 +The last line of the edit buffer if the last line of the edit buffer +is empty or if it is a \fB]]\fP or \fB}\fP command; +otherwise, the last non- <newline> of the last line of the edit buffer +.LP +.RE +.TP 7 +\fIparagraph\ boundary\fP +.sp +A \fIparagraph boundary\fP is one of the following: +.RS +.IP " 1." 4 +A section boundary +.LP +.IP " 2." 4 +A line whose first character is a period and whose second and third +characters match a two-character pair in the +\fBparagraphs\fP edit option (see \fIed\fP) +.LP +.IP " 3." 4 +A line whose first character is a period and whose only other character +matches the first character of a two-character pair in +the \fIparagraphs\fP edit option, where the second character of the +two-character pair is a <space> +.LP +.IP " 4." 4 +One or more sequential blank lines +.LP +.RE +.TP 7 +\fIremembered\ search\ direction\fP +.sp +See the description of \fIremembered search direction\fP in \fIed\fP. +.TP 7 +\fIsentence\ boundary\fP +.sp +A \fIsentence boundary\fP is one of the following: +.RS +.IP " 1." 4 +A paragraph boundary +.LP +.IP " 2." 4 +The first non- <blank> that occurs after a paragraph boundary +.LP +.IP " 3." 4 +The first non- <blank> that occurs after a period ( \fB'.'\fP ), exclamation +mark ( \fB'!'\fP ), or question mark ( +\fB'?'\fP ), followed by two <space>s or the end of a line; any number +of closing parenthesis ( \fB')'\fP ), closing +brackets ( \fB']'\fP ), double quote ( \fB' ),'\fP or single quote +( \fB'"\fP ) characters can appear between the +punctuation mark and the two <space>s or end-of-line +.LP +.RE +.sp +.LP +In the remainder of the description of the \fIvi\fP utility, the term +"buffer line" refers to a line in the edit buffer and +the term "display line" refers to the line or lines on the display +screen used to display one buffer line. The term "current +line" refers to a specific "buffer line". +.LP +If there are display lines on the screen for which there are no corresponding +buffer lines because they correspond to lines that +would be after the end of the file, they shall be displayed as a single +tilde ( \fB'~'\fP ) character, plus the terminating +<newline>. +.LP +The last line of the screen shall be used to report errors or display +informational messages. It shall also be used to display +the input for "line-oriented commands" ( \fB/\fP, \fB?\fP, \fB:\fP, +and \fB!\fP). When a line-oriented command is executed, +the editor shall enter text input mode on the last line on the screen, +using the respective command characters as prompt +characters. (In the case of the \fB!\fP command, the associated motion +shall be entered by the user before the editor enters text +input mode.) The line entered by the user shall be terminated by a +<newline>, a non- <control>-V-escaped +<carriage-return>, or unescaped <ESC>. It is unspecified if more characters +than require a display width minus one +column number of screen columns can be entered. +.LP +If any command is executed that overwrites a portion of the screen +other than the last line of the screen (for example, the \fIex\fP +\fBsuspend\fP or \fB!\fP commands), other than the \fIex\fP \fBshell\fP +command, the user shall be prompted for a character before the screen +is +refreshed and the edit session continued. +.LP +<tab>s shall take up the number of columns on the screen set by the +\fBtabstop\fP edit option (see \fIed\fP), unless there are less than +that number of columns before the display margin that will cause +the displayed line to be folded; in this case, they shall only take +up the number of columns up to that boundary. +.LP +The cursor shall be placed on the current line and relative to the +current column as specified by each command described in the +following sections. +.LP +In open mode, if the current line is not already displayed, then it +shall be displayed. +.LP +In visual mode, if the current line is not displayed, then the lines +that are displayed shall be expanded, scrolled, or redrawn +to cause an unspecified portion of the current line to be displayed. +If the screen is redrawn, no more than the number of display +lines specified by the value of the \fBwindow\fP edit option shall +be displayed (unless the current line cannot be completely +displayed in the number of display lines specified by the \fBwindow\fP +edit option) and the current line shall be positioned as +close to the center of the displayed lines as possible (within the +constraints imposed by the distance of the line from the +beginning or end of the edit buffer). If the current line is before +the first line in the display and the screen is scrolled, an +unspecified portion of the current line shall be placed on the first +line of the display. If the current line is after the last +line in the display and the screen is scrolled, an unspecified portion +of the current line shall be placed on the last line of the +display. +.LP +In visual mode, if a line from the edit buffer (other than the current +line) does not entirely fit into the lines at the bottom +of the display that are available for its presentation, the editor +may choose not to display any portion of the line. The lines of +the display that do not contain text from the edit buffer for this +reason shall each consist of a single \fB'@'\fP +character. +.LP +In visual mode, the editor may choose for unspecified reasons to not +update lines in the display to correspond to the underlying +edit buffer text. The lines of the display that do not correctly correspond +to text from the edit buffer for this reason shall +consist of a single \fB'@'\fP character (plus the terminating <newline>), +and the <control>-R command shall cause +the editor to update the screen to correctly represent the edit buffer. +.LP +Open and visual mode commands that set the current column set it to +a column position in the display, and not a character +position in the line. In this case, however, the column position in +the display shall be calculated for an infinite width display; +for example, the column related to a character that is part of a line +that has been folded onto additional screen lines will be +offset from the display line column where the buffer line begins, +not from the beginning of a particular display line. +.LP +The display cursor column in the display is based on the value of +the current column, as follows, with each rule applied in +turn: +.IP " 1." 4 +If the current column is after the last display line column used by +the displayed line, the display cursor column shall be set +to the last display line column occupied by the last non- <newline> +in the current line; otherwise, the display cursor column +shall be set to the current column. +.LP +.IP " 2." 4 +If the character of which some portion is displayed in the display +line column specified by the display cursor column requires +more than a single display line column: +.RS +.IP " a." 4 +If in text input mode, the display cursor column shall be adjusted +to the first display line column in which any portion of that +character is displayed. +.LP +.IP " b." 4 +Otherwise, the display cursor column shall be adjusted to the last +display line column in which any portion of that character is +displayed. +.LP +.RE +.LP +.LP +The current column shall not be changed by these adjustments to the +display cursor column. +.LP +If an error occurs during the parsing or execution of a \fIvi\fP command: +.IP " *" 3 +The terminal shall be alerted. Execution of the \fIvi\fP command shall +stop, and the cursor (for example, the current line and +column) shall not be further modified. +.LP +.IP " *" 3 +Unless otherwise specified by the following command sections, it is +unspecified whether an informational message shall be +displayed. +.LP +.IP " *" 3 +Any partially entered \fIvi\fP command shall be discarded. +.LP +.IP " *" 3 +If the \fIvi\fP command resulted from a \fBmap\fP expansion, all characters +from that \fBmap\fP expansion shall be discarded, +except as otherwise specified by the \fBmap\fP command (see \fIed\fP). +.LP +.IP " *" 3 +If the \fIvi\fP command resulted from the execution of a buffer, no +further commands caused by the execution of the buffer +shall be executed. +.LP +.SS Page Backwards +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-B +\fP +.fi +.RE +.sp +.LP +If in open mode, the <control>-B command shall behave identically +to the \fBz\fP command. Otherwise, if the current line +is the first line of the edit buffer, it shall be an error. +.LP +If the \fBwindow\fP edit option is less than 3, display a screen where +the last line of the display shall be some portion +of: +.sp +.RS +.nf + +\fB(\fP\fIcurrent first line\fP\fB) -1 +\fP +.fi +.RE +.LP +otherwise, display a screen where the first line of the display shall +be some portion of: +.sp +.RS +.nf + +\fB(\fP\fIcurrent first line\fP\fB) -\fP \fIcount\fP \fBx ((window edit option) -2) +\fP +.fi +.RE +.LP +If this calculation would result in a line that is before the first +line of the edit buffer, the first line of the display shall +display some portion of the first line of the edit buffer. +.LP +\fICurrent line\fP: If no lines from the previous display remain on +the screen, set to the last line of the display; otherwise, +set to ( \fIline\fP - the number of new lines displayed on this screen). +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Scroll Forward +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-D +\fP +.fi +.RE +.sp +.LP +If the current line is the last line of the edit buffer, it shall +be an error. +.LP +If no \fIcount\fP is specified, \fIcount\fP shall default to the \fIcount\fP +associated with the previous <control>-D +or <control>-U command. If there was no previous <control>-D or <control>-U +command, \fIcount\fP shall default +to the value of the \fBscroll\fP edit option. +.LP +If in open mode, write lines starting with the line after the current +line, until \fIcount\fP lines or the last line of the +file have been written. +.LP +\fICurrent line\fP: If the current line + \fIcount\fP is past the +last line of the edit buffer, set to the last line of the +edit buffer; otherwise, set to the current line + \fIcount\fP. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Scroll Forward by Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-E +\fP +.fi +.RE +.sp +.LP +Display the line count lines after the last line currently displayed. +.LP +If the last line of the edit buffer is displayed, it shall be an error. +If there is no line \fIcount\fP lines after the last +line currently displayed, the last line of the display shall display +some portion of the last line of the edit buffer. +.LP +\fICurrent line\fP: Unchanged if the previous current character is +displayed; otherwise, set to the first line displayed. +.LP +\fICurrent column\fP: Unchanged. +.SS Page Forward +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-F +\fP +.fi +.RE +.sp +.LP +If in open mode, the <control>-F command shall behave identically +to the \fBz\fP command. Otherwise, if the current line +is the last line of the edit buffer, it shall be an error. +.LP +If the \fBwindow\fP edit option is less than 3, display a screen where +the first line of the display shall be some portion +of: +.sp +.RS +.nf + +\fB(\fP\fIcurrent last line\fP\fB) +1 +\fP +.fi +.RE +.LP +otherwise, display a screen where the first line of the display shall +be some portion of: +.sp +.RS +.nf + +\fB(\fP\fIcurrent first line\fP\fB) +\fP \fIcount\fP \fBx ((window edit option) -2) +\fP +.fi +.RE +.LP +If this calculation would result in a line that is after the last +line of the edit buffer, the last line of the display shall +display some portion of the last line of the edit buffer. +.LP +\fICurrent line\fP: If no lines from the previous display remain on +the screen, set to the first line of the display; +otherwise, set to ( \fIline\fP + the number of new lines displayed +on this screen). +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Display Information +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-G +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIex\fP \fBfile\fP command. +.SS Move Cursor Backwards +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-H +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fBh +.sp + +the current\fP \fIerase\fP \fBcharacter (see stty) +\fP +.fi +.RE +.sp +.LP +If there are no characters before the current character on the current +line, it shall be an error. If there are less than +\fIcount\fP previous characters on the current line, \fIcount\fP shall +be adjusted to the number of previous characters on the +line. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the character before the starting cursor +up to and including the \fIcount\fPth character before +the starting cursor. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to ( \fIcolumn\fP - the number of columns +occupied by \fIcount\fP characters ending with the +previous current column). +.SS Move Down +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<newline> +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB<control>-J +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB<control>-M +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB<control>-N +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fBj +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB<carriage-return> +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB+ +\fP +.fi +.RE +.sp +.LP +If there are less than \fIcount\fP lines after the current line in +the edit buffer, it shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall include the starting line and the next \fIcount\fP +- 1 lines. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to \fIcurrent line\fP+ \fIcount\fP. +.LP +\fICurrent column\fP: Set to non- <blank> for the <carriage-return>, +<control>-M, and \fB+\fP commands; +otherwise, unchanged. +.SS Clear and Redisplay +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-L +\fP +.fi +.RE +.sp +.LP +If in open mode, clear the screen and redisplay the current line. +Otherwise, clear and redisplay the screen. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.SS Move Up +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-P +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fBk +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fB- +\fP +.fi +.RE +.sp +.LP +If there are less than \fIcount\fP lines before the current line in +the edit buffer, it shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall include the starting line and the previous \fIcount\fP +lines. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to \fIcurrent line\fP - \fIcount\fP. +.LP +\fICurrent column\fP: Set to non- <blank> for the \fB-\fP command; +otherwise, unchanged. +.SS Redraw Screen +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-R +\fP +.fi +.RE +.sp +.LP +If any lines have been deleted from the display screen and flagged +as deleted on the terminal using the \fB@\fP convention (see +the beginning of the EXTENDED DESCRIPTION section), they shall be +redisplayed to match the contents of the edit buffer. +.LP +It is unspecified whether lines flagged with \fB@\fP because they +do not fit on the terminal display shall be affected. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.SS Scroll Backward +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-U +\fP +.fi +.RE +.sp +.LP +If the current line is the first line of the edit buffer, it shall +be an error. +.LP +If no \fIcount\fP is specified, \fIcount\fP shall default to the \fIcount\fP +associated with the previous <control>-D +or <control>-U command. If there was no previous <control>-D or <control>-U +command, \fIcount\fP shall default +to the value of the \fBscroll\fP edit option. +.LP +\fICurrent line\fP: If \fIcount\fP is greater than the current line, +set to 1; otherwise, set to the current line - +\fIcount\fP. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Scroll Backward by Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<control>-Y +\fP +.fi +.RE +.sp +.LP +Display the line \fIcount\fP lines before the first line currently +displayed. +.LP +If the current line is the first line of the edit buffer, it shall +be an error. If this calculation would result in a line that +is before the first line of the edit buffer, the first line of the +display shall display some portion of the first line of the edit +buffer. +.LP +\fICurrent line\fP: Unchanged if the previous current character is +displayed; otherwise, set to the first line displayed. +.LP +\fICurrent column\fP: Unchanged. +.SS Edit the Alternate File +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-^ +\fP +.fi +.RE +.sp +This command shall be equivalent to the \fIex\fP \fBedit\fP command, +with the alternate +pathname as its argument. +.SS Terminate Command or Input Mode +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<ESC> +\fP +.fi +.RE +.sp +.LP +If a partial \fIvi\fP command (as defined by at least one, non- \fIcount\fP +character) has been entered, discard the +\fIcount\fP and the command character(s). +.LP +Otherwise, if no command characters have been entered, and the <ESC> +was the result of a map expansion, the terminal shall +be alerted and the <ESC> character shall be discarded, but it shall +not be an error. +.LP +Otherwise, it shall be an error. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.SS Search for tagstring +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-] +\fP +.fi +.RE +.sp +.LP +If the current character is not a word or <blank>, it shall be an +error. +.LP +This command shall be equivalent to the \fIex\fP \fBtag\fP command, +with the argument to +that command defined as follows. +.LP +If the current character is a <blank>: +.IP " 1." 4 +Skip all <blank>s after the cursor up to the end of the line. +.LP +.IP " 2." 4 +If the end of the line is reached, it shall be an error. +.LP +.LP +Then, the argument to the \fIex\fP \fBtag\fP command shall be the +current character and all +subsequent characters, up to the first non-word character or the end +of the line. +.SS Move Cursor Forward +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<space> +.sp + +\fP\fB[\fP\fIcount\fP\fB]\fP \fBl\fP (ell) +.fi +.RE +.sp +.LP +If there are less than \fIcount\fP non- <newline>s after the cursor +on the current line, \fIcount\fP shall be adjusted +to the number of non- <newline>s after the cursor on the line. +.LP +If used as a motion command: +.IP " 1." 4 +If the current or \fIcount\fPth character after the cursor is the +last non- <newline> in the line, the text region shall +be comprised of the current character up to and including the last +non- <newline> in the line. Otherwise, the text region +shall be from the current character up to, but not including, the +\fIcount\fPth character after the cursor. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +If there are no non- <newline>s after the current character on the +current line, it shall be an error. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column that displays any portion +of the \fIcount\fPth character after the current +character. +.SS Replace Text with Results from Shell Command +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB!\fP \fImotion shell-commands\fP \fB<newline> +\fP +.fi +.RE +.sp +.LP +If the motion command is the \fB!\fP command repeated: +.IP " 1." 4 +If the edit buffer is empty and no \fIcount\fP was supplied, the command +shall be the equivalent of the \fIex\fP \fB:read\fP \fB!\fP command, +with the text input, and no text shall be copied to any +buffer. +.LP +.IP " 2." 4 +Otherwise: +.RS +.IP " a." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " b." 4 +The text region shall be from the current line up to and including +the next \fIcount\fP -1 lines. +.LP +.RE +.LP +.LP +Otherwise, the text region shall be the lines in which any character +of the text region specified by the motion command +appear. +.LP +Any text copied to a buffer shall be in line mode. +.LP +This command shall be equivalent to the \fIex\fP \fB!\fP command for +the specified +lines. +.SS Move Cursor to End-of-Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB$ +\fP +.fi +.RE +.sp +.LP +It shall be an error if there are less than ( \fIcount\fP -1) lines +after the current line in the edit buffer. +.LP +If used as a motion command: +.IP " 1." 4 +If \fIcount\fP is 1: +.RS +.IP " a." 4 +It shall be an error if the line is empty. +.LP +.IP " b." 4 +Otherwise, the text region shall consist of all characters from the +starting cursor to the last non- <newline> in the +line, inclusive, and any text copied to a buffer shall be in character +mode. +.LP +.RE +.LP +.IP " 2." 4 +Otherwise, if the starting cursor position is at or before the first +non- <blank> in the line, the text region shall +consist of the current and the next \fIcount\fP -1 lines, and any +text saved to a buffer shall be in line mode. +.LP +.IP " 3." 4 +Otherwise, the text region shall consist of all characters from the +starting cursor to the last non- <newline> in the line +that is \fIcount\fP -1 lines forward from the current line, and any +text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the \fIcurrent line\fP + \fIcount\fP-1. +.LP +\fICurrent column\fP: The current column is set to the last display +line column of the last non- <newline> in the line, +or column position 1 if the line is empty. +.LP +The current column shall be adjusted to be on the last display line +column of the last non- <newline> of the current line +as subsequent commands change the current line, until a command changes +the current column. +.SS Move to Matching Character +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB% +\fP +.fi +.RE +.sp +.LP +If the character at the current position is not a parenthesis, bracket, +or curly brace, search forward in the line to the first +one of those characters. If no such character is found, it shall be +an error. +.LP +The matching character shall be the parenthesis, bracket, or curly +brace matching the parenthesis, bracket, or curly brace, +respectively, that was at the current position or that was found on +the current line. +.LP +Matching shall be determined as follows, for an open parenthesis: +.IP " 1." 4 +Set a counter to 1. +.LP +.IP " 2." 4 +Search forwards until a parenthesis is found or the end of the edit +buffer is reached. +.LP +.IP " 3." 4 +If the end of the edit buffer is reached, it shall be an error. +.LP +.IP " 4." 4 +If an open parenthesis is found, increment the counter by 1. +.LP +.IP " 5." 4 +If a close parenthesis is found, decrement the counter by 1. +.LP +.IP " 6." 4 +If the counter is zero, the current character is the matching character. +.LP +.LP +Matching for a close parenthesis shall be equivalent, except that +the search shall be backwards, from the starting character to +the beginning of the buffer, a close parenthesis shall increment the +counter by 1, and an open parenthesis shall decrement the +counter by 1. +.LP +Matching for brackets and curly braces shall be equivalent, except +that searching shall be done for open and close brackets or +open and close curly braces. It is implementation-defined whether +other characters are searched for and matched as well. +.LP +If used as a motion command: +.IP " 1." 4 +If the matching cursor was after the starting cursor in the edit buffer, +and the starting cursor position was at or before the +first non- <blank> non- <newline> in the starting line, and the matching +cursor position was at or after the last non- +<blank> non- <newline> in the matching line, the text region shall +consist of the current line to the matching line, +inclusive, and any text copied to a buffer shall be in line mode. +.LP +.IP " 2." 4 +If the matching cursor was before the starting cursor in the edit +buffer, and the starting cursor position was at or after the +last non- <blank> non- <newline> in the starting line, and the matching +cursor position was at or before the first non- +<blank> non- <newline> in the matching line, the text region shall +consist of the current line to the matching line, +inclusive, and any text copied to a buffer shall be in line mode. +.LP +.IP " 3." 4 +Otherwise, the text region shall consist of the starting character +to the matching character, inclusive, and any text copied to +a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line where the matching character is +located. +.LP +\fICurrent column\fP: Set to the last column where any portion of +the matching character is displayed. +.SS Repeat Substitution +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB& +\fP +.fi +.RE +.sp +.LP +Repeat the previous substitution command. This command shall be equivalent +to the \fIex\fP +\fB&\fP command with the current line as its addresses, and without +\fIoptions\fP, \fIcount\fP, or \fIflags\fP. +.SS Return to Previous Context at Beginning of Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB'\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if there is no line in the edit buffer marked +by \fIcharacter\fP. +.LP +If used as a motion command: +.IP " 1." 4 +If the starting cursor is after the marked cursor, then the locations +of the starting cursor and the marked cursor in the edit +buffer shall be logically swapped. +.LP +.IP " 2." 4 +The text region shall consist of the starting line up to and including +the marked line, and any text copied to a buffer shall be +in line mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line referenced by the mark. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Return to Previous Context +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB`\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if the marked line is no longer in the edit buffer. +If the marked line no longer contains a character in +the saved numbered character position, it shall be as if the marked +position is the first non- <blank>. +.LP +If used as a motion command: +.IP " 1." 4 +It shall be an error if the marked cursor references the same character +in the edit buffer as the starting cursor. +.LP +.IP " 2." 4 +If the starting cursor is after the marked cursor, then the locations +of the starting cursor and the marked cursor in the edit +buffer shall be logically swapped. +.LP +.IP " 3." 4 +If the starting line is empty or the starting cursor is at or before +the first non- <blank> non- <newline> of the +starting line, and the marked cursor line is empty or the marked cursor +references the first character of the marked cursor line, +the text region shall consist of all lines containing characters from +the starting cursor to the line before the marked cursor +line, inclusive, and any text copied to a buffer shall be in line +mode. +.LP +.IP " 4." 4 +Otherwise, if the marked cursor line is empty or the marked cursor +references a character at or before the first non- +<blank> non- <newline> of the marked cursor line, the region of text +shall be from the starting cursor to the last non- +<newline> of the line before the marked cursor line, inclusive, and +any text copied to a buffer shall be in character +mode. +.LP +.IP " 5." 4 +Otherwise, the region of text shall be from the starting cursor (inclusive), +to the marked cursor (exclusive), and any text +copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line referenced by the mark. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the character referenced by the mark is displayed. +.SS Return to Previous Section +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB[[ +\fP +.fi +.RE +.sp +.LP +Move the cursor backward through the edit buffer to the first character +of the previous section boundary, \fIcount\fP +times. +.LP +If used as a motion command: +.IP " 1." 4 +If the starting cursor was at the first character of the starting +line or the starting line was empty, and the first character +of the boundary was the first character of the boundary line, the +text region shall consist of the current line up to and including +the line where the \fIcount\fPth next boundary starts, and any text +copied to a buffer shall be in line mode. +.LP +.IP " 2." 4 +If the boundary was the last line of the edit buffer or the last non- +<newline> of the last line of the edit buffer, the +text region shall consist of the last character in the edit buffer +up to and including the starting character, and any text saved +to a buffer shall be in character mode. +.LP +.IP " 3." 4 +Otherwise, the text region shall consist of the starting character +up to but not including the first character in the +\fIcount\fPth next boundary, and any text copied to a buffer shall +be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line where the \fIcount\fPth next boundary +in the edit buffer starts. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the first character of the \fIcount\fPth next boundary is +displayed, or column position 1 if the line is empty. +.SS Move to Next Section +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB]] +\fP +.fi +.RE +.sp +.LP +Move the cursor forward through the edit buffer to the first character +of the next section boundary, \fIcount\fP times. +.LP +If used as a motion command: +.IP " 1." 4 +If the starting cursor was at the first character of the starting +line or the starting line was empty, and the first character +of the boundary was the first character of the boundary line, the +text region shall consist of the current line up to and including +the line where the \fIcount\fPth previous boundary starts, and any +text copied to a buffer shall be in line mode. +.LP +.IP " 2." 4 +If the boundary was the first line of the edit buffer, the text region +shall consist of the first character in the edit buffer +up to but not including the starting character, and any text copied +to a buffer shall be in character mode. +.LP +.IP " 3." 4 +Otherwise, the text region shall consist of the first character in +the \fIcount\fPth previous section boundary up to but not +including the starting character, and any text copied to a buffer +shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line where the \fIcount\fPth previous +boundary in the edit buffer starts. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the first character of the \fIcount\fPth previous +boundary is displayed, or column position 1 if the line is empty. +.SS Move to First Non-<blank> Position on Current Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB^ +\fP +.fi +.RE +.sp +If used as a motion command: +.IP " 1." 4 +If the line has no non- <blank> non- <newline>s, or if the cursor +is at the first non- <blank> non- +<newline> of the line, it shall be an error. +.LP +.IP " 2." 4 +If the cursor is before the first non- <blank> non- <newline> of the +line, the text region shall be comprised of the +current character, up to, but not including, the first non- <blank> +non- <newline> of the line. +.LP +.IP " 3." 4 +If the cursor is after the first non- <blank> non- <newline> of the +line, the text region shall be from the +character before the starting cursor up to and including the first +non- <blank> non- <newline> of the line. +.LP +.IP " 4." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Current and Line Above +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB_ +\fP +.fi +.RE +.sp +.LP +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +If \fIcount\fP is less than 2, the text region shall be the current +line. +.LP +.IP " 2." 4 +Otherwise, the text region shall include the starting line and the +next \fIcount\fP -1 lines. +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to current line + \fIcount\fP -1. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Move Back to Beginning of Sentence +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB( +\fP +.fi +.RE +.sp +.LP +Move backward to the beginning of a sentence. This command shall be +equivalent to the \fB[[\fP command, with the exception that +sentence boundaries shall be used instead of section boundaries. +.SS Move Forward to Beginning of Sentence +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB) +\fP +.fi +.RE +.sp +.LP +Move forward to the beginning of a sentence. This command shall be +equivalent to the \fB]]\fP command, with the exception that +sentence boundaries shall be used instead of section boundaries. +.SS Move Back to Preceding Paragraph +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB{ +\fP +.fi +.RE +.sp +.LP +Move back to the beginning of the preceding paragraph. This command +shall be equivalent to the \fB[[\fP command, with the +exception that paragraph boundaries shall be used instead of section +boundaries. +.SS Move Forward to Next Paragraph +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB} +\fP +.fi +.RE +.sp +.LP +Move forward to the beginning of the next paragraph. This command +shall be equivalent to the \fB]]\fP command, with the +exception that paragraph boundaries shall be used instead of section +boundaries. +.SS Move to Specific Column Position +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB| +\fP +.fi +.RE +.sp +.LP +For the purposes of this command, lines that are too long for the +current display and that have been folded shall be treated as +having a single, 1-based, number of columns. +.LP +If there are less than \fIcount\fP columns in which characters from +the current line are displayed on the screen, \fIcount\fP +shall be adjusted to be the last column in which any portion of the +line is displayed on the screen. +.LP +If used as a motion command: +.IP " 1." 4 +If the line is empty, or the cursor character is the same as the character +on the \fIcount\fPth column of the line, it shall be +an error. +.LP +.IP " 2." 4 +If the cursor is before the \fIcount\fPth column of the line, the +text region shall be comprised of the current character, up +to but not including the character on the \fIcount\fPth column of +the line. +.LP +.IP " 3." 4 +If the cursor is after the \fIcount\fPth column of the line, the text +region shall be from the character before the starting +cursor up to and including the character on the \fIcount\fPth column +of the line. +.LP +.IP " 4." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the character that is displayed in the \fIcount\fP column +of the line is displayed. +.SS Reverse Find Character +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB, +\fP +.fi +.RE +.sp +.LP +If the last \fBF\fP, \fBf\fP, \fBT\fP, or \fBt\fP command was \fBF\fP, +\fBf\fP, \fBT\fP, or \fBt\fP, this command shall +be equivalent to an \fBf\fP, \fBF\fP, \fBt\fP, or \fBT\fP command, +respectively, with the specified \fIcount\fP and the same +search character. +.LP +If there was no previous \fBF\fP, \fBf\fP, \fBT\fP, or \fBt\fP command, +it shall be an error. +.SS Repeat +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB. +\fP +.fi +.RE +.sp +.LP +Repeat the last \fB!\fP, \fB<\fP, \fB>\fP, \fBA\fP, \fBC\fP, \fBD\fP, +\fBI\fP, \fBJ\fP, \fBO\fP, \fBP\fP, +\fBR\fP, \fBS\fP, \fBX\fP, \fBY\fP, \fBa\fP, \fBc\fP, \fBd\fP, \fBi\fP, +\fBo\fP, \fBp\fP, \fBr\fP, \fBs\fP, \fBx\fP, +\fBy\fP, or \fB~\fP command. It shall be an error if none of these +commands have been executed. Commands (other than +commands that enter text input mode) executed as a result of map expansions, +shall not change the value of the last repeatable +command. +.LP +Repeated commands with associated motion commands shall repeat the +motion command as well; however, any specified \fIcount\fP +shall replace the \fIcount\fP(s) that were originally specified to +the repeated command or its associated motion command. +.LP +If the motion component of the repeated command is \fBf\fP, \fBF\fP, +\fBt\fP, or \fBT\fP, the repeated command shall not set +the remembered search character for the \fB;\fP and \fB,\fP commands. +.LP +If the repeated command is \fBp\fP or \fBP\fP, and the buffer associated +with that command was a numeric buffer named with a +number less than 9, the buffer associated with the repeated command +shall be set to be the buffer named by the name of the previous +buffer logically incremented by 1. +.LP +If the repeated character is a text input command, the input text +associated with that command is repeated literally: +.IP " *" 3 +Input characters are neither macro or abbreviation-expanded. +.LP +.IP " *" 3 +Input characters are not interpreted in any special way with the exception +that <newline>, <carriage-return>, and +<control>-T behave as described in Input Mode Commands in vi . +.LP +.LP +\fICurrent line\fP: Set as described for the repeated command. +.LP +\fICurrent column\fP: Set as described for the repeated command. +.SS Find Regular Expression +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB/ +\fP +.fi +.RE +.sp +.LP +If the input line contains no non- <newline>s, it shall be equivalent +to a line containing only the last regular +expression encountered. The enhanced regular expressions supported +by \fIvi\fP are described in \fIRegular Expressions in ex\fP . +.LP +Otherwise, the line shall be interpreted as one or more regular expressions, +optionally followed by an address offset or a +\fIvi\fP \fBz\fP command. +.LP +If the regular expression is not the last regular expression on the +line, or if a line offset or \fBz\fP command is specified, +the regular expression shall be terminated by an unescaped \fB'/'\fP +character, which shall not be used as part of the regular +expression. If the regular expression is not the first regular expression +on the line, it shall be preceded by zero or more +<blank>s, a semicolon, zero or more <blank>s, and a leading \fB'/'\fP +character, which shall not be interpreted as +part of the regular expression. It shall be an error to precede any +regular expression with any characters other than these. +.LP +Each search shall begin from the character after the first character +of the last match (or, if it is the first search, after the +cursor). If the \fBwrapscan\fP edit option is set, the search shall +continue to the character before the starting cursor +character; otherwise, to the end of the edit buffer. It shall be an +error if any search fails to find a match, and an informational +message to this effect shall be displayed. +.LP +An optional address offset (see \fIAddressing in ex\fP ) can be specified +after the last +regular expression by including a trailing \fB'/'\fP character after +the regular expression and specifying the address offset. +This offset will be from the line containing the match for the last +regular expression specified. It shall be an error if the line +offset would indicate a line address less than 1 or greater than the +last line in the edit buffer. An address offset of zero shall +be supported. It shall be an error to follow the address offset with +any other characters than <blank>s. +.LP +If not used as a motion command, an optional \fBz\fP command (see +Redraw Window ) can be +specified after the last regular expression by including a trailing +\fB'/'\fP character after the regular expression, zero or +more <blank>s, a \fB'z'\fP, zero or more <blank>s, an optional new +\fBwindow\fP edit option value, zero or more +<blank>s, and a location character. The effect shall be as if the +\fBz\fP command was executed after the \fB/\fP command. +It shall be an error to follow the \fBz\fP command with any other +characters than <blank>s. +.LP +The remembered search direction shall be set to forward. +.LP +If used as a motion command: +.IP " 1." 4 +It shall be an error if the last match references the same character +in the edit buffer as the starting cursor. +.LP +.IP " 2." 4 +If any address offset is specified, the last match shall be adjusted +by the specified offset as described previously. +.LP +.IP " 3." 4 +If the starting cursor is after the last match, then the locations +of the starting cursor and the last match in the edit buffer +shall be logically swapped. +.LP +.IP " 4." 4 +If any address offset is specified, the text region shall consist +of all lines containing characters from the starting cursor to +the last match line, inclusive, and any text copied to a buffer shall +be in line mode. +.LP +.IP " 5." 4 +Otherwise, if the starting line is empty or the starting cursor is +at or before the first non- <blank> non- +<newline> of the starting line, and the last match line is empty or +the last match starts at the first character of the last +match line, the text region shall consist of all lines containing +characters from the starting cursor to the line before the last +match line, inclusive, and any text copied to a buffer shall be in +line mode. +.LP +.IP " 6." 4 +Otherwise, if the last match line is empty or the last match begins +at a character at or before the first non- <blank> +non- <newline> of the last match line, the region of text shall be +from the current cursor to the last non- <newline> +of the line before the last match line, inclusive, and any text copied +to a buffer shall be in character mode. +.LP +.IP " 7." 4 +Otherwise, the region of text shall be from the current cursor (inclusive), +to the first character of the last match +(exclusive), and any text copied to a buffer shall be in character +mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: If a match is found, set to the last matched line +plus the address offset, if any; otherwise, +unchanged. +.LP +\fICurrent column\fP: Set to the last column on which any portion +of the first character in the last matched string is +displayed, if a match is found; otherwise, unchanged. +.SS Move to First Character in Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB0 \fP (zero) +.fi +.RE +.sp +.LP +Move to the first character on the current line. The character \fB'0'\fP +shall not be interpreted as a command if it is +immediately preceded by a digit. +.LP +If used as a motion command: +.IP " 1." 4 +If the cursor character is the first character in the line, it shall +be an error. +.LP +.IP " 2." 4 +The text region shall be from the character before the cursor character +up to and including the first character in the line. +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: The last column in which any portion of the +first character in the line is displayed, or if the line is +empty, unchanged. +.SS Execute an ex Command +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB: +\fP +.fi +.RE +.sp +.LP +Execute one or more \fIex\fP commands. +.LP +If any portion of the screen other than the last line of the screen +was overwritten by any \fIex\fP command (except \fBshell\fP), \fIvi\fP +shall display a message indicating that it is waiting +for an input from the user, and shall then read a character. This +action may also be taken for other, unspecified reasons. +.LP +If the next character entered is a \fB':'\fP, another \fIex\fP command +shall be accepted +and executed. Any other character shall cause the screen to be refreshed +and \fIvi\fP shall return to command mode. +.LP +\fICurrent line\fP: As specified for the \fIex\fP command. +.LP +\fICurrent column\fP: As specified for the \fIex\fP command. +.SS Repeat Find +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB; +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the last \fBF\fP, \fBf\fP, \fBT\fP, +or \fBt\fP command, with the specified \fIcount\fP, +and with the same search character used for the last \fBF\fP, \fBf\fP, +\fBT\fP, or \fBt\fP command. If there was no previous +\fBF\fP, \fBf\fP, \fBT\fP, or \fBt\fP command, it shall be an error. +.SS Shift Left +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB<\fP \fImotion\fP +.fi +.RE +.sp +.LP +If the motion command is the \fB<\fP command repeated: +.IP " 1." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " 2." 4 +The text region shall be from the current line, up to and including +the next \fIcount\fP -1 lines. +.LP +.LP +Shift any line in the text region specified by the \fIcount\fP and +motion command one shiftwidth (see the \fIex\fP \fBshiftwidth\fP option) +toward the start of the line, as described by the \fIex\fP \fB<\fP +command. The unshifted lines shall be copied to the unnamed buffer +in line +mode. +.LP +\fICurrent line\fP: If the motion was from the current cursor position +toward the end of the edit buffer, unchanged. Otherwise, +set to the first line in the edit buffer that is part of the text +region specified by the motion command. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Shift Right +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB>\fP \fImotion\fP +.fi +.RE +.sp +.LP +If the motion command is the \fB>\fP command repeated: +.IP " 1." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " 2." 4 +The text region shall be from the current line, up to and including +the next \fIcount\fP -1 lines. +.LP +.LP +Shift any line with characters in the text region specified by the +\fIcount\fP and motion command one shiftwidth (see the \fIex\fP \fBshiftwidth\fP +option) away from the start of the line, as described by the \fIex\fP +\fB>\fP command. The unshifted lines shall be copied into the unnamed +buffer in line +mode. +.LP +\fICurrent line\fP: If the motion was from the current cursor position +toward the end of the edit buffer, unchanged. Otherwise, +set to the first line in the edit buffer that is part of the text +region specified by the motion command. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Scan Backwards for Regular Expression +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB? +\fP +.fi +.RE +.sp +.LP +Scan backwards; the \fB?\fP command shall be equivalent to the \fB/\fP +command (see Find Regular +Expression ) with the following exceptions: +.IP " 1." 4 +The input prompt shall be a \fB'?'\fP . +.LP +.IP " 2." 4 +Each search shall begin from the character before the first character +of the last match (or, if it is the first search, the +character before the cursor character). +.LP +.IP " 3." 4 +The search direction shall be from the cursor toward the beginning +of the edit buffer, and the \fBwrapscan\fP edit option shall +affect whether the search wraps to the end of the edit buffer and +continues. +.LP +.IP " 4." 4 +The remembered search direction shall be set to backward. +.LP +.SS Execute +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB@\fP\fIbuffer\fP +.fi +.RE +.sp +.LP +If the \fIbuffer\fP is specified as \fB@\fP, the last buffer executed +shall be used. If no previous buffer has been executed, +it shall be an error. +.LP +Behave as if the contents of the named buffer were entered as standard +input. After each line of a line-mode buffer, and all but +the last line of a character mode buffer, behave as if a <newline> +were entered as standard input. +.LP +If an error occurs during this process, an error message shall be +written, and no more characters resulting from the execution +of this command shall be processed. +.LP +If a \fIcount\fP is specified, behave as if that count were entered +as user input before the characters from the \fB@\fP +buffer were entered. +.LP +\fICurrent line\fP: As specified for the individual commands. +.LP +\fICurrent column\fP: As specified for the individual commands. +.SS Reverse Case +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fB~ +\fP +.fi +.RE +.sp +.LP +Reverse the case of the current character and the next \fIcount\fP +-1 characters, such that lowercase characters that have +uppercase counterparts shall be changed to uppercase characters, and +uppercase characters that have lowercase counterparts shall be +changed to lowercase characters, as prescribed by the current locale. +No other characters shall be affected by this command. +.LP +If there are less than \fIcount\fP -1 characters after the cursor +in the edit buffer, \fIcount\fP shall be adjusted to the +number of characters after the cursor in the edit buffer minus 1. +.LP +For the purposes of this command, the next character after the last +non- <newline> on the line shall be the next character +in the edit buffer. +.LP +\fICurrent line\fP: Set to the line including the ( \fIcount\fP-1)th +character after the cursor. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the ( \fIcount\fP-1)th character after the cursor is +displayed. +.SS Append +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBa +\fP +.fi +.RE +.sp +.LP +Enter text input mode after the current cursor position. No characters +already in the edit buffer shall be affected by this +command. A \fIcount\fP shall cause the input text to be appended \fIcount\fP +-1 more times to the end of the input. +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Append at End-of-Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBA +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB$\fP \fB[\fP \fIcount\fP \fB]\fP \fBa +\fP +.fi +.RE +.LP +(see Append ). +.SS Move Backward to Preceding Word +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBb +\fP +.fi +.RE +.sp +.LP +With the exception that words are used as the delimiter instead of +bigwords, this command shall be equivalent to the \fBB\fP +command. +.SS Move Backward to Preceding Bigword +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBB +\fP +.fi +.RE +.sp +.LP +If the edit buffer is empty or the cursor is on the first character +of the edit buffer, it shall be an error. If less than +\fIcount\fP bigwords begin between the cursor and the start of the +edit buffer, \fIcount\fP shall be adjusted to the number of +bigword beginnings between the cursor and the start of the edit buffer. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the first character of the \fIcount\fPth +previous bigword beginning up to but not including the +cursor character. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line containing the \fIcurrent column\fP. +.LP +\fICurrent column\fP: Set to the last column upon which any part of +the first character of the \fIcount\fPth previous bigword +is displayed. +.SS Change +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBc\fP \fImotion\fP +.fi +.RE +.sp +.LP +If the motion command is the \fBc\fP command repeated: +.IP " 1." 4 +The buffer text shall be in line mode. +.LP +.IP " 2." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " 3." 4 +The text region shall be from the current line up to and including +the next \fIcount\fP -1 lines. +.LP +.LP +Otherwise, the buffer text mode and text region shall be as specified +by the motion command. +.LP +The replaced text shall be copied into \fIbuffer\fP, if specified, +and into the unnamed buffer. If the text to be replaced +contains characters from more than a single line, or the buffer text +is in line mode, the replaced text shall be copied into the +numeric buffers as well. +.LP +If the buffer text is in line mode: +.IP " 1." 4 +Any lines that contain characters in the region shall be deleted, +and the editor shall enter text input mode at the beginning of +a new line which shall replace the first line deleted. +.LP +.IP " 2." 4 +If the \fBautoindent\fP edit option is set, \fBautoindent\fP characters +equal to the \fBautoindent\fP characters on the first +line deleted shall be inserted as if entered by the user. +.LP +.LP +Otherwise, if characters from more than one line are in the region +of text: +.IP " 1." 4 +The text shall be deleted. +.LP +.IP " 2." 4 +Any text remaining in the last line in the text region shall be appended +to the first line in the region, and the last line in +the region shall be deleted. +.LP +.IP " 3." 4 +The editor shall enter text input mode after the last character not +deleted from the first line in the text region, if any; +otherwise, on the first column of the first line in the region. +.LP +.LP +Otherwise: +.IP " 1." 4 +If the glyph for \fB'$'\fP is smaller than the region, the end of +the region shall be marked with a \fB'$'\fP . +.LP +.IP " 2." 4 +The editor shall enter text input mode, overwriting the region of +text. +.LP +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Change to End-of-Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBC +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBc$ +\fP +.fi +.RE +.LP +See the \fBc\fP command. +.SS Delete +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBd\fP \fImotion\fP +.fi +.RE +.sp +.LP +If the motion command is the \fBd\fP command repeated: +.IP " 1." 4 +The buffer text shall be in line mode. +.LP +.IP " 2." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " 3." 4 +The text region shall be from the current line up to and including +the next \fIcount\fP -1 lines. +.LP +.LP +Otherwise, the buffer text mode and text region shall be as specified +by the motion command. +.LP +If in open mode, and the current line is deleted, and the line remains +on the display, an \fB'@'\fP character shall be +displayed as the first glyph of that line. +.LP +Delete the region of text into \fIbuffer\fP, if specified, and into +the unnamed buffer. If the text to be deleted contains +characters from more than a single line, or the buffer text is in +line mode, the deleted text shall be copied into the numeric +buffers, as well. +.LP +\fICurrent line\fP: Set to the first text region line that appears +in the edit buffer, unless that line has been deleted, in +which case it shall be set to the last line in the edit buffer, or +line 1 if the edit buffer is empty. +.LP +\fICurrent column\fP: +.IP " 1." 4 +If the line is empty, set to column position 1. +.LP +.IP " 2." 4 +Otherwise, if the buffer text is in line mode or the motion was from +the cursor toward the end of the edit buffer: +.RS +.IP " a." 4 +If a character from the current line is displayed in the current column, +set to the last column that displays any portion of +that character. +.LP +.IP " b." 4 +Otherwise, set to the last column in which any portion of any character +in the line is displayed. +.LP +.RE +.LP +.IP " 3." 4 +Otherwise, if a character is displayed in the column that began the +text region, set to the last column that displays any +portion of that character. +.LP +.IP " 4." 4 +Otherwise, set to the last column in which any portion of any character +in the line is displayed. +.LP +.SS Delete to End-of-Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB]\fP \fBD +\fP +.fi +.RE +.sp +.LP +Delete the text from the current position to the end of the current +line; equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB]\fP \fBd$ +\fP +.fi +.RE +.SS Move to End-of-Word +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBe +\fP +.fi +.RE +.sp +.LP +With the exception that words are used instead of bigwords as the +delimiter, this command shall be equivalent to the \fBE\fP +command. +.SS Move to End-of-Bigword +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBE +\fP +.fi +.RE +.sp +.LP +If the edit buffer is empty it shall be an error. If less than \fIcount\fP +bigwords end between the cursor and the end of the +edit buffer, \fIcount\fP shall be adjusted to the number of bigword +endings between the cursor and the end of the edit buffer. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the last character of the \fIcount\fPth +next bigword up to and including the cursor +character. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to the line containing the current column. +.LP +\fICurrent column\fP: Set to the last column upon which any part of +the last character of the \fIcount\fPth next bigword is +displayed. +.SS Find Character in Current Line (Forward) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBf\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if \fIcount\fP occurrences of the character do +not occur after the cursor in the line. +.LP +If used as a motion command: +.IP " 1." 4 +The text range shall be from the cursor character up to and including +the \fIcount\fPth occurrence of the specified character +after the cursor. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the \fIcount\fPth occurrence of the specified character +after the cursor appears in the line. +.SS Find Character in Current Line (Reverse) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBF\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if \fIcount\fP occurrences of the character do +not occur before the cursor in the line. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the \fIcount\fPth occurrence of the +specified character before the cursor, up to, but not +including the cursor character. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the \fIcount\fPth occurrence of the specified character +before the cursor appears in the line. +.SS Move to Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBG +\fP +.fi +.RE +.sp +.LP +If \fIcount\fP is not specified, it shall default to the last line +of the edit buffer. If \fIcount\fP is greater than the last +line of the edit buffer, it shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the cursor line up to and including +the specified line. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Set to \fIcount\fP if \fIcount\fP is specified; +otherwise, the last line. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Move to Top of Screen +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBH +\fP +.fi +.RE +.sp +.LP +If the beginning of the line \fIcount\fP greater than the first line +of which any portion appears on the display does not +exist, it shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +If in open mode, the text region shall be the current line. +.LP +.IP " 2." 4 +Otherwise, the text region shall be from the starting line up to and +including (the first line of the display + \fIcount\fP +-1). +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +If in open mode, this command shall set the current column to non- +<blank> and do nothing else. +.LP +Otherwise, it shall set the current line and current column as follows. +.LP +\fICurrent line\fP: Set to (the first line of the display + \fIcount\fP +-1). +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Insert Before Cursor +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBi +\fP +.fi +.RE +.sp +.LP +Enter text input mode before the current cursor position. No characters +already in the edit buffer shall be affected by this +command. A \fIcount\fP shall cause the input text to be appended \fIcount\fP +-1 more times to the end of the input. +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Insert at Beginning of Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBI +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command ^[ \fIcount\fP] +\fBi\fP. +.SS Join +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBJ +\fP +.fi +.RE +.sp +.LP +If the current line is the last line in the edit buffer, it shall +be an error. +.LP +This command shall be equivalent to the \fIex\fP \fBjoin\fP command +with no addresses, and +an \fIex\fP command \fIcount\fP value of 1 if \fIcount\fP was not +specified or if a +\fIcount\fP of 1 was specified, and an \fIex\fP command \fIcount\fP +value of \fIcount\fP -1 +for any other value of \fIcount\fP, except that the current line and +column shall be set as follows. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: The last column in which any portion of the +character following the last character in the initial line is +displayed, or the last non- <newline> in the line if no characters +were appended. +.SS Move to Bottom of Screen +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBL +\fP +.fi +.RE +.sp +.LP +If the beginning of the line \fIcount\fP less than the last line of +which any portion appears on the display does not exist, it +shall be an error. +.LP +If used as a motion command: +.IP " 1." 4 +If in open mode, the text region shall be the current line. +.LP +.IP " 2." 4 +Otherwise, the text region shall include all lines from the starting +cursor line to (the last line of the display -( +\fIcount\fP -1)). +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.IP " 1." 4 +If in open mode, this command shall set the current column to non- +<blank> and do nothing else. +.LP +.IP " 2." 4 +Otherwise, it shall set the current line and current column as follows. +.LP +.LP +\fICurrent line\fP: Set to (the last line of the display -( \fIcount\fP +-1)). +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Mark Position +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBm\fP \fIletter\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIex\fP \fBmark\fP command +with the specified +character as an argument. +.SS Move to Middle of Screen +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBM +\fP +.fi +.RE +.sp +.LP +The middle line of the display shall be calculated as follows: +.sp +.RS +.nf + +\fB(the top line of the display) + (((number of lines displayed) +1) /2) -1 +\fP +.fi +.RE +.LP +If used as a motion command: +.IP " 1." 4 +If in open mode, the text region shall be the current line. +.LP +.IP " 2." 4 +Otherwise, the text region shall include all lines from the starting +cursor line up to and including the middle line of the +display. +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in line mode. +.LP +.LP +If not used as a motion command: +.LP +If in open mode, this command shall set the current column to non- +<blank> and do nothing else. +.LP +Otherwise, it shall set the current line and current column as follows. +.LP +\fICurrent line\fP: Set to the middle line of the display. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Repeat Regular Expression Find (Forward) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBn +\fP +.fi +.RE +.sp +.LP +If the remembered search direction was forward, the \fBn\fP command +shall be equivalent to the \fIvi\fP \fB/\fP command with +no characters entered by the user. Otherwise, it shall be equivalent +to the \fIvi\fP \fB?\fP command with no characters entered +by the user. +.LP +If the \fBn\fP command is used as a motion command for the \fB!\fP +command, the editor shall not enter text input mode on the +last line on the screen, and shall behave as if the user entered a +single \fB'!'\fP character as the text input. +.SS Repeat Regular Expression Find (Reverse) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBN +\fP +.fi +.RE +.sp +.LP +Scan for the next match of the last pattern given to \fB/\fP or \fB?\fP, +but in the reverse direction; this is the reverse of +\fBn\fP. +.LP +If the remembered search direction was forward, the \fBN\fP command +shall be equivalent to the \fIvi\fP \fB?\fP command with +no characters entered by the user. Otherwise, it shall be equivalent +to the \fIvi\fP \fB/\fP command with no characters entered +by the user. If the \fBN\fP command is used as a motion command for +the \fB!\fP command, the editor shall not enter text input +mode on the last line on the screen, and shall behave as if the user +entered a single \fB!\fP character as the text input. +.SS Insert Empty Line Below +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBo +\fP +.fi +.RE +.sp +.LP +Enter text input mode in a new line appended after the current line. +A \fIcount\fP shall cause the input text to be appended +\fIcount\fP -1 more times to the end of the already added text, each +time starting on a new, appended line. +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Insert Empty Line Above +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBO +\fP +.fi +.RE +.sp +.LP +Enter text input mode in a new line inserted before the current line. +A \fIcount\fP shall cause the input text to be appended +\fIcount\fP -1 more times to the end of the already added text, each +time starting on a new, appended line. +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Put from Buffer Following +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB]\fP \fBp +\fP +.fi +.RE +.sp +.LP +If no \fIbuffer\fP is specified, the unnamed buffer shall be used. +.LP +If the buffer text is in line mode, the text shall be appended below +the current line, and each line of the buffer shall become +a new line in the edit buffer. A \fIcount\fP shall cause the buffer +text to be appended \fIcount\fP -1 more times to the end of +the already added text, each time starting on a new, appended line. +.LP +If the buffer text is in character mode, the text shall be appended +into the current line after the cursor, and each line of the +buffer other than the first and last shall become a new line in the +edit buffer. A \fIcount\fP shall cause the buffer text to be +appended \fIcount\fP -1 more times to the end of the already added +text, each time starting after the last added character. +.LP +\fICurrent line\fP: If the buffer text is in line mode, set the line +to line +1; otherwise, unchanged. +.LP +\fICurrent column\fP: If the buffer text is in line mode: +.IP " 1." 4 +If there is a non- <blank> in the first line of the buffer, set to +the last column on which any portion of the first non- +<blank> in the line is displayed. +.LP +.IP " 2." 4 +If there is no non- <blank> in the first line of the buffer, set to +the last column on which any portion of the last non- +<newline> in the first line of the buffer is displayed. +.LP +.LP +If the buffer text is in character mode: +.IP " 1." 4 +If the text in the buffer is from more than a single line, then set +to the last column on which any portion of the first +character from the buffer is displayed. +.LP +.IP " 2." 4 +Otherwise, if the buffer is the unnamed buffer, set to the last column +on which any portion of the last character from the +buffer is displayed. +.LP +.IP " 3." 4 +Otherwise, set to the first column on which any portion of the first +character from the buffer is displayed. +.LP +.SS Put from Buffer Before +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB]\fP \fBP +\fP +.fi +.RE +.sp +.LP +If no \fIbuffer\fP is specified, the unnamed buffer shall be used. +.LP +If the buffer text is in line mode, the text shall be inserted above +the current line, and each line of the buffer shall become +a new line in the edit buffer. A \fIcount\fP shall cause the buffer +text to be appended \fIcount\fP -1 more times to the end of +the already added text, each time starting on a new, appended line. +.LP +If the buffer text is in character mode, the text shall be inserted +into the current line before the cursor, and each line of +the buffer other than the first and last shall become a new line in +the edit buffer. A \fIcount\fP shall cause the buffer text to +be appended \fIcount\fP -1 more times to the end of the already added +text, each time starting after the last added character. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: If the buffer text is in line mode: +.IP " 1." 4 +If there is a non- <blank> in the first line of the buffer, set to +the last column on which any portion of that character +is displayed. +.LP +.IP " 2." 4 +If there is no non- <blank> in the first line of the buffer, set to +the last column on which any portion of the last non- +<newline> in the first line of the buffer is displayed. +.LP +.LP +If the buffer text is in character mode: +.IP " 1." 4 +If the buffer is the unnamed buffer, set to the last column on which +any portion of the last character from the buffer is +displayed. +.LP +.IP " 2." 4 +Otherwise, set to the first column on which any portion of the first +character from the buffer is displayed. +.LP +.SS Enter ex Mode +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBQ +\fP +.fi +.RE +.sp +.LP +Leave visual or open mode and enter \fIex\fP command mode. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.SS Replace Character +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBr\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +Replace the \fIcount\fP characters at and after the cursor with the +specified character. If there are less than \fIcount\fP +non- <newline>s at and after the cursor on the line, it shall be an +error. +.LP +If character is <control>-V, any next character other than the <newline> +shall be stripped of any special meaning +and used as a literal character. +.LP +If character is <ESC>, no replacement shall be made and the current +line and current column shall be unchanged. +.LP +If character is <carriage-return> or <newline>, \fIcount\fP new lines +shall be appended to the current line. All +but the last of these lines shall be empty. \fIcount\fP characters +at and after the cursor shall be discarded, and any remaining +characters after the cursor in the current line shall be moved to +the last of the new lines. If the \fBautoindent\fP edit option +is set, they shall be preceded by the same number of \fBautoindent\fP +characters found on the line from which the command was +executed. +.LP +\fICurrent line\fP: Unchanged unless the replacement character is +a <carriage-return> or <newline>, in which case +it shall be set to line + \fIcount\fP. +.LP +\fICurrent column\fP: Set to the last column position on which a portion +of the last replaced character is displayed, or if the +replacement character caused new lines to be created, set to non- +<blank>. +.SS Replace Characters +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBR +\fP +.fi +.RE +.sp +.LP +Enter text input mode at the current cursor position possibly replacing +text on the current line. A \fIcount\fP shall cause the +input text to be appended \fIcount\fP -1 more times to the end of +the input. +.LP +\fICurrent line/column\fP: As specified for the text input commands +(see Input Mode Commands in +vi ). +.SS Substitute Character +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBs +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBc<space> +\fP +.fi +.RE +.SS Substitute Lines +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBS +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBc_ +\fP +.fi +.RE +.SS Move Cursor to Before Character (Forward) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBt\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if \fIcount\fP occurrences of the character do +not occur after the cursor in the line. +.LP +If used as a motion command: +.IP " 1." 4 +The text region shall be from the cursor up to but not including the +\fIcount\fPth occurrence of the specified character after +the cursor. +.LP +.IP " 2." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the character before the \fIcount\fPth occurrence of the +specified character after the cursor appears in the line. +.SS Move Cursor to After Character (Reverse) +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBT\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +It shall be an error if \fIcount\fP occurrences of the character do +not occur before the cursor in the line. +.LP +If used as a motion command: +.IP " 1." 4 +If the character before the cursor is the specified character, it +shall be an error. +.LP +.IP " 2." 4 +The text region shall be from the character before the cursor up to +but not including the \fIcount\fPth occurrence of the +specified character before the cursor. +.LP +.IP " 3." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the last column in which any portion +of the character after the \fIcount\fPth occurrence of the +specified character before the cursor appears in the line. +.SS Undo +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBu +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIex\fP \fBundo\fP command +except that the current +line and current column shall be set as follows: +.LP +\fICurrent line\fP: Set to the first line added or changed if any; +otherwise, move to the line preceding any deleted text if +one exists; otherwise, move to line 1. +.LP +\fICurrent column\fP: If undoing an \fIex\fP command, set to the first +non- +<blank>. +.LP +Otherwise, if undoing a text input command: +.IP " 1." 4 +If the command was a \fBC\fP, \fBc\fP, \fBO\fP, \fBo\fP, \fBR\fP, +\fBS\fP, or \fBs\fP command, the current column shall +be set to the value it held when the text input command was entered. +.LP +.IP " 2." 4 +Otherwise, set to the last column in which any portion of the first +character after the deleted text is displayed, or, if no +non- <newline>s follow the text deleted from this line, set to the +last column in which any portion of the last non- +<newline> in the line is displayed, or 1 if the line is empty. +.LP +.LP +Otherwise, if a single line was modified (that is, not added or deleted) +by the \fBu\fP command: +.IP " 1." 4 +If text was added or changed, set to the last column in which any +portion of the first character added or changed is +displayed. +.LP +.IP " 2." 4 +If text was deleted, set to the last column in which any portion of +the first character after the deleted text is displayed, or, +if no non- <newline>s follow the deleted text, set to the last column +in which any portion of the last non- <newline> +in the line is displayed, or 1 if the line is empty. +.LP +.LP +Otherwise, set to non- <blank>. +.SS Undo Current Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBU +\fP +.fi +.RE +.sp +.LP +Restore the current line to its state immediately before the most +recent time that it became the current line. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to the first column in the line in which +any portion of the first character in the line is +displayed. +.SS Move to Beginning of Word +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBw +\fP +.fi +.RE +.sp +.LP +With the exception that words are used as the delimiter instead of +bigwords, this command shall be equivalent to the \fBW\fP +command. +.SS Move to Beginning of Bigword +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBW +\fP +.fi +.RE +.sp +.LP +If the edit buffer is empty, it shall be an error. If there are less +than \fIcount\fP bigwords between the cursor and the end +of the edit buffer, \fIcount\fP shall be adjusted to move the cursor +to the last bigword in the edit buffer. +.LP +If used as a motion command: +.IP " 1." 4 +If the associated command is \fBc\fP, \fIcount\fP is 1, and the cursor +is on a <blank>, the region of text shall be the +current character and no further action shall be taken. +.LP +.IP " 2." 4 +If there are less than \fIcount\fP bigwords between the cursor and +the end of the edit buffer, then the command shall succeed, +and the region of text shall include the last character of the edit +buffer. +.LP +.IP " 3." 4 +If there are <blank>s or an end-of-line that precede the \fIcount\fPth +bigword, and the associated command is \fBc\fP, +the region of text shall be up to and including the last character +before the preceding <blank>s or end-of-line. +.LP +.IP " 4." 4 +If there are <blank>s or an end-of-line that precede the bigword, +and the associated command is \fBd\fP or \fBy\fP, the +region of text shall be up to and including the last <blank> before +the start of the bigword or end-of-line. +.LP +.IP " 5." 4 +Any text copied to a buffer shall be in character mode. +.LP +.LP +If not used as a motion command: +.IP " 1." 4 +If the cursor is on the last character of the edit buffer, it shall +be an error. +.LP +.LP +\fICurrent line\fP: Set to the line containing the current column. +.LP +\fICurrent column\fP: Set to the last column in which any part of +the first character of the \fIcount\fPth next bigword is +displayed. +.SS Delete Character at Cursor +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBx +\fP +.fi +.RE +.sp +.LP +Delete the \fIcount\fP characters at and after the current character +into \fIbuffer\fP, if specified, and into the unnamed +buffer. +.LP +If the line is empty, it shall be an error. If there are less than +\fIcount\fP non- <newline>s at and after the cursor on +the current line, \fIcount\fP shall be adjusted to the number of non- +<newline>s at and after the cursor. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: If the line is empty, set to column position +1. Otherwise, if there were \fIcount\fP or less non- +<newline>s at and after the cursor on the current line, set to the +last column that displays any part of the last non- +<newline> of the line. Otherwise, unchanged. +.SS Delete Character Before Cursor +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBX +\fP +.fi +.RE +.sp +.LP +Delete the \fIcount\fP characters before the current character into +\fIbuffer\fP, if specified, and into the unnamed +buffer. +.LP +If there are no characters before the current character on the current +line, it shall be an error. If there are less than +\fIcount\fP previous characters on the current line, \fIcount\fP shall +be adjusted to the number of previous characters on the +line. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to (current column - the width of the deleted +characters). +.SS Yank +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBy\fP \fImotion\fP +.fi +.RE +.sp +.LP +Copy (yank) the region of text into \fIbuffer\fP, if specified, and +into the unnamed buffer. +.LP +If the motion command is the \fBy\fP command repeated: +.IP " 1." 4 +The buffer shall be in line mode. +.LP +.IP " 2." 4 +If there are less than \fIcount\fP -1 lines after the current line +in the edit buffer, it shall be an error. +.LP +.IP " 3." 4 +The text region shall be from the current line up to and including +the next \fIcount\fP -1 lines. +.LP +.LP +Otherwise, the buffer text mode and text region shall be as specified +by the motion command. +.LP +\fICurrent line\fP: If the motion was from the current cursor position +toward the end of the edit buffer, unchanged. Otherwise, +set to the first line in the edit buffer that is part of the text +region specified by the motion command. +.LP +\fICurrent column\fP: +.IP " 1." 4 +If the motion was from the current cursor position toward the end +of the edit buffer, unchanged. +.LP +.IP " 2." 4 +Otherwise, if the current line is empty, set to column position 1. +.LP +.IP " 3." 4 +Otherwise, set to the last column that displays any part of the first +character in the file that is part of the text region +specified by the motion command. +.LP +.SS Yank Current Line +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBY +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIvi\fP command: +.sp +.RS +.nf + +\fB[\fP\fIbuffer\fP\fB][\fP\fIcount\fP\fB]\fP \fBy_ +\fP +.fi +.RE +.SS Redraw Window +.LP +If in open mode, the \fBz\fP command shall have the Synopsis: +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIcount\fP\fB]\fP \fBz +\fP +.fi +.RE +.sp +.LP +If \fIcount\fP is not specified, it shall default to the \fBwindow\fP +edit option -1. The \fBz\fP command shall be equivalent +to the \fIex\fP \fBz\fP command, with a type character of \fB=\fP +and a \fIcount\fP of +\fIcount\fP -2, except that the current line and current column shall +be set as follows, and the \fBwindow\fP edit option shall +not be affected. If the calculation for the \fIcount\fP argument would +result in a negative number, the \fIcount\fP argument to +the \fIex\fP \fBz\fP command shall be zero. A blank line shall be +written after the last line +is written. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.LP +If not in open mode, the \fBz\fP command shall have the following +Synopsis: +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB[\fP\fIline\fP\fB]\fP \fBz\fP \fB[\fP\fIcount\fP\fB]\fP \fIcharacter\fP +.fi +.RE +.sp +.LP +If \fIline\fP is not specified, it shall default to the current line. +If \fIline\fP is specified, but is greater than the +number of lines in the edit buffer, it shall default to the number +of lines in the edit buffer. +.LP +If \fIcount\fP is specified, the value of the \fBwindow\fP edit option +shall be set to \fIcount\fP (as described in the \fIex\fP \fBwindow\fP +command), and the screen shall be redrawn. +.LP +\fIline\fP shall be placed as specified by the following characters: +.TP 7 +<newline>,\ <carriage-return> +.sp +Place the beginning of the line on the first line of the display. +.TP 7 +\fB\&.\fP +Place the beginning of the line in the center of the display. The +middle line of the display shall be calculated as described +for the \fBM\fP command. +.TP 7 +\fB-\fP +Place an unspecified portion of the line on the last line of the display. +.TP 7 +\fB+\fP +If \fIline\fP was specified, equivalent to the <newline> case. If +\fIline\fP was not specified, display a screen where +the first line of the display shall be (current last line) +1. If +there are no lines after the last line in the display, it shall +be an error. +.TP 7 +\fB^\fP +If \fIline\fP was specified, display a screen where the last line +of the display shall contain an unspecified portion of the +first line of a display that had an unspecified portion of the specified +line on the last line of the display. If this calculation +results in a line before the beginning of the edit buffer, display +the first screen of the edit buffer. +.LP +Otherwise, display a screen where the last line of the display shall +contain an unspecified portion of (current first line -1). +If this calculation results in a line before the beginning of the +edit buffer, it shall be an error. +.sp +.LP +\fICurrent line\fP: If \fIline\fP and the \fB'^'\fP character were +specified: +.IP " 1." 4 +If the first screen was displayed as a result of the command attempting +to display lines before the beginning of the edit +buffer: if the first screen was already displayed, unchanged; otherwise, +set to (current first line -1). +.LP +.IP " 2." 4 +Otherwise, set to the last line of the display. +.LP +.LP +If \fIline\fP and the \fB'+'\fP character were specified, set to the +first line of the display. +.LP +Otherwise, if \fIline\fP was specified, set to \fIline\fP. +.LP +Otherwise, unchanged. +.LP +\fICurrent column\fP: Set to non- <blank>. +.SS Exit +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBZZ +\fP +.fi +.RE +.sp +.LP +This command shall be equivalent to the \fIex\fP \fBxit\fP command +with no addresses, +trailing \fB!\fP, or filename (see the \fIex\fP \fBxit\fP command). +.SS Input Mode Commands in vi +.LP +In text input mode, the current line shall consist of zero or more +of the following categories, plus the terminating +<newline>: +.IP " 1." 4 +Characters preceding the text input entry point +.LP +Characters in this category shall not be modified during text input +mode. +.LP +.IP " 2." 4 +\fBautoindent\fP characters +.LP +\fBautoindent\fP characters shall be automatically inserted into each +line that is created in text input mode, either as a +result of entering a <newline> or <carriage-return> while in text +input mode, or as an effect of the command itself; +for example, \fBO\fP or \fBo\fP (see the \fIex\fP \fBautoindent\fP +command), as if entered +by the user. +.LP +It shall be possible to erase \fBautoindent\fP characters with the +<control>-D command; it is unspecified whether they +can be erased by <control>-H, <control>-U, and <control>-W characters. +Erasing any \fBautoindent\fP character +turns the glyph into erase-columns and deletes the character from +the edit buffer, but does not change its representation on the +screen. +.LP +.IP " 3." 4 +Text input characters +.LP +Text input characters are the characters entered by the user. Erasing +any text input character turns the glyph into +erase-columns and deletes the character from the edit buffer, but +does not change its representation on the screen. +.LP +Each text input character entered by the user (that does not have +a special meaning) shall be treated as follows: +.RS +.IP " a." 4 +The text input character shall be appended to the last character in +the edit buffer from the first, second, or third +categories. +.LP +.IP " b." 4 +If there are no erase-columns on the screen, the text input command +was the \fBR\fP command, and characters in the fifth +category from the original line follow the cursor, the next such character +shall be deleted from the edit buffer. If the +\fBslowopen\fP edit option is not set, the corresponding glyph on +the screen shall become erase-columns. +.LP +.IP " c." 4 +If there are erase-columns on the screen, as many columns as they +occupy, or as are necessary, shall be overwritten to display +the text input character. (If only part of a multi-column glyph is +overwritten, the remainder shall be left on the screen, and +continue to be treated as erase-columns; it is unspecified whether +the remainder of the glyph is modified in any way.) +.LP +.IP " d." 4 +If additional display line columns are needed to display the text +input character: +.RS +.IP " 1." 4 +If the \fBslowopen\fP edit option is set, the text input characters +shall be displayed on subsequent display line columns, +overwriting any characters displayed in those columns. +.LP +.IP " 2." 4 +Otherwise, any characters currently displayed on or after the column +on the display line where the text input character is to be +displayed shall be pushed ahead the number of display line columns +necessary to display the rest of the text input character. +.LP +.RE +.LP +.RE +.LP +.IP " 4." 4 +Erase-columns +.LP +Erase-columns are not logically part of the edit buffer, appearing +only on the screen, and may be overwritten on the screen by +subsequent text input characters. When text input mode ends, all erase-columns +shall no longer appear on the screen. +.LP +Erase-columns are initially the region of text specified by the \fBc\fP +command (see Change ); +however, erasing \fBautoindent\fP or text input characters causes +the glyphs of the erased characters to be treated as +erase-columns. +.LP +.IP " 5." 4 +Characters following the text region for the \fBc\fP command, or the +text input entry point for all other commands +.LP +Characters in this category shall not be modified during text input +mode, except as specified in category 3.b. for the \fBR\fP +text input command, or as <blank>s deleted when a <newline> or <carriage-return> +is entered. +.LP +.LP +It is unspecified whether it is an error to attempt to erase past +the beginning of a line that was created by the entry of a +<newline> or <carriage-return> during text input mode. If it is not +an error, the editor shall behave as if the erasing +character was entered immediately after the last text input character +entered on the previous line, and all of the non- +<newline>s on the current line shall be treated as erase-columns. +.LP +When text input mode is entered, or after a text input mode character +is entered (except as specified for the special characters +below), the cursor shall be positioned as follows: +.IP " 1." 4 +On the first column that displays any part of the first erase-column, +if one exists +.LP +.IP " 2." 4 +Otherwise, if the \fBslowopen\fP edit option is set, on the first +display line column after the last character in the first, +second, or third categories, if one exists +.LP +.IP " 3." 4 +Otherwise, the first column that displays any part of the first character +in the fifth category, if one exists +.LP +.IP " 4." 4 +Otherwise, the display line column after the last character in the +first, second, or third categories, if one exists +.LP +.IP " 5." 4 +Otherwise, on column position 1 +.LP +.LP +The characters that are updated on the screen during text input mode +are unspecified, other than that the last text input +character shall always be updated, and, if the \fBslowopen\fP edit +option is not set, the current cursor character shall always be +updated. +.LP +The following specifications are for command characters entered during +text input mode. +.SS NUL +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fBNUL +\fP +.fi +.RE +.sp +.LP +If the first character of the text input is a NUL, the most recently +input text shall be input as if entered by the user, and +then text input mode shall be exited. The text shall be input literally; +that is, characters are neither macro or abbreviation +expanded, nor are any characters interpreted in any special manner. +It is unspecified whether implementations shall support more +than 256 bytes of remembered input text. +.SS <control>-D +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-D +\fP +.fi +.RE +.sp +.LP +The <control>-D character shall have no special meaning when in text +input mode for a line-oriented command (see Command Descriptions in +vi ). +.LP +This command need not be supported on block-mode terminals. +.LP +If the cursor does not follow an \fBautoindent\fP character, or an +\fBautoindent\fP character and a \fB'0'\fP or +\fB'^'\fP character: +.IP " 1." 4 +If the cursor is in column position 1, the <control>-D character shall +be discarded and no further action taken. +.LP +.IP " 2." 4 +Otherwise, the <control>-D character shall have no special meaning. +.LP +.LP +If the last input character was a \fB'0'\fP, the cursor shall be +moved to column position 1. +.LP +Otherwise, if the last input character was a \fB'^'\fP, the cursor +shall be moved to column position 1. In addition, the +\fBautoindent\fP level for the next input line shall be derived from +the same line from which the \fBautoindent\fP level for the +current input line was derived. +.LP +Otherwise, the cursor shall be moved back to the column after the +previous shiftwidth (see the \fIex\fP \fBshiftwidth\fP command) boundary. +.LP +All of the glyphs on columns between the starting cursor position +and (inclusively) the ending cursor position shall become +erase-columns as described in Input Mode Commands in vi . +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to 1 if the <control>-D was preceded by +a \fB'^'\fP or \fB'0'\fP ; otherwise, set to +(column -1) -((column -2) % \fBshiftwidth\fP). +.SS <control>-H +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-H +\fP +.fi +.RE +.sp +.LP +If in text input mode for a line-oriented command, and there are no +characters to erase, text input mode shall be terminated, no +further action shall be done for this command, and the current line +and column shall be unchanged. +.LP +If there are characters other than \fBautoindent\fP characters that +have been input on the current line before the cursor, the +cursor shall move back one character. +.LP +Otherwise, if there are \fBautoindent\fP characters on the current +line before the cursor, it is implementation-defined whether +the <control>-H command is an error or if the cursor moves back one +\fBautoindent\fP character. +.LP +Otherwise, if the cursor is in column position 1 and there are previous +lines that have been input, it is implementation-defined +whether the <control>-H command is an error or if it is equivalent +to entering <control>-H after the last input +character on the previous input line. +.LP +Otherwise, it shall be an error. +.LP +All of the glyphs on columns between the starting cursor position +and (inclusively) the ending cursor position shall become +erase-columns as described in Input Mode Commands in vi . +.LP +The current erase character (see \fIstty\fP) shall cause an equivalent +action to the +<control>-H command, unless the previously inserted character was +a backslash, in which case it shall be as if the literal +current erase character had been inserted instead of the backslash. +.LP +\fICurrent line\fP: Unchanged, unless previously input lines are erased, +in which case it shall be set to line -1. +.LP +\fICurrent column\fP: Set to the first column that displays any portion +of the character backed up over. +.SS <newline> +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<newline> +.sp + +<carriage-return> +.sp + +<control>-J +.sp + +<control>-M +\fP +.fi +.RE +.sp +.LP +If input was part of a line-oriented command, text input mode shall +be terminated and the command shall continue execution with +the input provided. +.LP +Otherwise, terminate the current line. If there are no characters +other than \fBautoindent\fP characters on the line, all +characters on the line shall be discarded. Otherwise, it is unspecified +whether the \fBautoindent\fP characters in the line are +modified by entering these characters. +.LP +Continue text input mode on a new line appended after the current +line. If the \fBslowopen\fP edit option is set, the lines on +the screen below the current line shall not be pushed down, but the +first of them shall be cleared and shall appear to be +overwritten. Otherwise, the lines of the screen below the current +line shall be pushed down. +.LP +If the \fBautoindent\fP edit option is set, an appropriate number +of \fBautoindent\fP characters shall be added as a prefix to +the line as described by the \fIex\fP \fBautoindent\fP edit option. +.LP +All columns after the cursor that are erase-columns (as described +in Input Mode Commands in vi ) +shall be discarded. +.LP +If the \fBautoindent\fP edit option is set, all <blank>s immediately +following the cursor shall be discarded. +.LP +All remaining characters after the cursor shall be transferred to +the new line, positioned after any \fBautoindent\fP +characters. +.LP +\fICurrent line\fP: Set to current line +1. +.LP +\fICurrent column\fP: Set to the first column that displays any portion +of the first character after the \fBautoindent\fP +characters on the new line, if any, or the first column position after +the last \fBautoindent\fP character, if any, or column +position 1. +.SS <control>-T +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-T +\fP +.fi +.RE +.sp +.LP +The <control>-T character shall have no special meaning when in text +input mode for a line-oriented command (see Command Descriptions in +vi ). +.LP +This command need not be supported on block-mode terminals. +.LP +Behave as if the user entered the minimum number of <blank>s necessary +to move the cursor forward to the column position +after the next \fBshiftwidth\fP (see the \fIex\fP \fBshiftwidth\fP +command) boundary. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Set to \fIcolumn\fP + \fBshiftwidth\fP - ((column +-1) % \fBshiftwidth\fP). +.SS <control>-U +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-U +\fP +.fi +.RE +.sp +.LP +If there are characters other than \fBautoindent\fP characters that +have been input on the current line before the cursor, the +cursor shall move to the first character input after the \fBautoindent\fP +characters. +.LP +Otherwise, if there are \fBautoindent\fP characters on the current +line before the cursor, it is implementation-defined whether +the <control>-U command is an error or if the cursor moves to the +first column position on the line. +.LP +Otherwise, if the cursor is in column position 1 and there are previous +lines that have been input, it is implementation-defined +whether the <control>-U command is an error or if it is equivalent +to entering <control>-U after the last input +character on the previous input line. +.LP +Otherwise, it shall be an error. +.LP +All of the glyphs on columns between the starting cursor position +and (inclusively) the ending cursor position shall become +erase-columns as described in Input Mode Commands in vi . +.LP +The current \fIkill\fP character (see \fIstty\fP) shall cause an equivalent +action to the +<control>-U command, unless the previously inserted character was +a backslash, in which case it shall be as if the literal +current \fIkill\fP character had been inserted instead of the backslash. +.LP +\fICurrent line\fP: Unchanged, unless previously input lines are erased, +in which case it shall be set to line -1. +.LP +\fICurrent column\fP: Set to the first column that displays any portion +of the last character backed up over. +.SS <control>-V +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-V +.sp + +<control>-Q +\fP +.fi +.RE +.sp +.LP +Allow the entry of any subsequent character, other than <control>-J +or the <newline>, as a literal character, +removing any special meaning that it may have to the editor in text +input mode. If a <control>-V or <control>-Q is +entered before a <control>-J or <newline>, the <control>-V or <control>-Q +character shall be discarded, and +the <control>-J or <newline> shall behave as described in the <newline> +command character during input mode. +.LP +For purposes of the display only, the editor shall behave as if a +\fB'^'\fP character was entered, and the cursor shall be +positioned as if overwriting the \fB'^'\fP character. When a subsequent +character is entered, the editor shall behave as if that +character was entered instead of the original <control>-V or <control>-Q +character. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: Unchanged. +.SS <control>-W +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<control>-W +\fP +.fi +.RE +.sp +.LP +If there are characters other than \fBautoindent\fP characters that +have been input on the current line before the cursor, the +cursor shall move back over the last word preceding the cursor (including +any <blank>s between the end of the last word and +the current cursor); the cursor shall not move to before the first +character after the end of any \fBautoindent\fP characters. +.LP +Otherwise, if there are \fBautoindent\fP characters on the current +line before the cursor, it is implementation-defined whether +the <control>-W command is an error or if the cursor moves to the +first column position on the line. +.LP +Otherwise, if the cursor is in column position 1 and there are previous +lines that have been input, it is implementation-defined +whether the <control>-W command is an error or if it is equivalent +to entering <control>-W after the last input +character on the previous input line. +.LP +Otherwise, it shall be an error. +.LP +All of the glyphs on columns between the starting cursor position +and (inclusively) the ending cursor position shall become +erase-columns as described in Input Mode Commands in vi . +.LP +\fICurrent line\fP: Unchanged, unless previously input lines are erased, +in which case it shall be set to line -1. +.LP +\fICurrent column\fP: Set to the first column that displays any portion +of the last character backed up over. +.SS <ESC> +.TP 7 +\fISynopsis\fP: +.sp +.RS +.nf + +\fB<ESC> +\fP +.fi +.RE +.sp +.LP +If input was part of a line-oriented command: +.IP " 1." 4 +If \fIinterrupt\fP was entered, text input mode shall be terminated +and the editor shall return to command mode. The terminal +shall be alerted. +.LP +.IP " 2." 4 +If <ESC> was entered, text input mode shall be terminated and the +command shall continue execution with the input +provided. +.LP +.LP +Otherwise, terminate text input mode and return to command mode. +.LP +Any \fBautoindent\fP characters entered on newly created lines that +have no other non- <newline>s shall be deleted. +.LP +Any leading \fBautoindent\fP and <blank>s on newly created lines shall +be rewritten to be the minimum number of +<blank>s possible. +.LP +The screen shall be redisplayed as necessary to match the contents +of the edit buffer. +.LP +\fICurrent line\fP: Unchanged. +.LP +\fICurrent column\fP: +.IP " 1." 4 +If there are text input characters on the current line, the column +shall be set to the last column where any portion of the last +text input character is displayed. +.LP +.IP " 2." 4 +Otherwise, if a character is displayed in the current column, unchanged. +.LP +.IP " 3." 4 +Otherwise, set to column position 1. +.LP +.SH EXIT STATUS +.LP +The following exit values shall be returned: +.TP 7 +\ 0 +Successful completion. +.TP 7 +>0 +An error occurred. +.sp +.SH CONSEQUENCES OF ERRORS +.LP +When any error is encountered and the standard input is not a terminal +device file, \fIvi\fP shall not write the file or return +to command or text input mode, and shall terminate with a non-zero +exit status. +.LP +Otherwise, when an unrecoverable error is encountered it shall be +equivalent to a SIGHUP asynchronous event. +.LP +Otherwise, when an error is encountered, the editor shall behave as +specified in Command +Descriptions in vi . +.LP +\fIThe following sections are informative.\fP +.SH APPLICATION USAGE +.LP +None. +.SH EXAMPLES +.LP +None. +.SH RATIONALE +.LP +See the RATIONALE for \fIex\fP for more information on \fIvi\fP. Major +portions of the \fIvi\fP utility +specification point to \fIex\fP to avoid inadvertent divergence. While +\fIex\fP and \fIvi\fP have historically been implemented as a single +utility, this is not required by +IEEE\ Std\ 1003.1-2001. +.LP +It is recognized that portions of \fIvi\fP would be difficult, if +not impossible, to implement satisfactorily on a block-mode +terminal, or a terminal without any form of cursor addressing, thus +it is not a mandatory requirement that such features should +work on all terminals. It is the intention, however, that a \fIvi\fP +implementation should provide the full set of capabilities on +all terminals capable of supporting them. +.LP +Historically, \fIvi\fP exited immediately if the standard input was +not a terminal. IEEE\ Std\ 1003.1-2001 permits, but +does not require, this behavior. An end-of-file condition is not equivalent +to an end-of-file character. A common end-of-file +character, <control>-D, is historically a \fIvi\fP command. +.LP +The text in the STDOUT section reflects the usage of the verb \fIdisplay\fP +in this section; some implementations of \fIvi\fP +use standard output to write to the terminal, but IEEE\ Std\ 1003.1-2001 +does not require that to be the case. +.LP +Historically, implementations reverted to open mode if the terminal +was incapable of supporting full visual mode. +IEEE\ Std\ 1003.1-2001 requires this behavior. Historically, the open +mode of \fIvi\fP behaved roughly equivalently to the +visual mode, with the exception that only a single line from the edit +buffer (one "buffer line") was kept current at any time. +This line was normally displayed on the next-to-last line of a terminal +with cursor addressing (and the last line performed its +normal visual functions for line-oriented commands and messages). +In addition, some few commands behaved differently in open mode +than in visual mode. IEEE\ Std\ 1003.1-2001 requires conformance to +historical practice. +.LP +Historically, \fIex\fP and \fIvi\fP implementations have expected +text to proceed in the +usual European/Latin order of left to right, top to bottom. There +is no requirement in IEEE\ Std\ 1003.1-2001 that this be +the case. The specification was deliberately written using words like +"before", "after", "first", and "last" in order to +permit implementations to support the natural text order of the language. +.LP +Historically, lines past the end of the edit buffer were marked with +single tilde ( \fB'~'\fP ) characters; that is, if +the one-based display was 20 lines in length, and the last line of +the file was on line one, then lines 2-20 would contain only a +single \fB'~'\fP character. +.LP +Historically, the \fIvi\fP editor attempted to display only complete +lines at the bottom of the screen (it did display partial +lines at the top of the screen). If a line was too long to fit in +its entirety at the bottom of the screen, the screen lines where +the line would have been displayed were displayed as single \fB'@'\fP +characters, instead of displaying part of the line. +IEEE\ Std\ 1003.1-2001 permits, but does not require, this behavior. +Implementations are encouraged to attempt always to +display a complete line at the bottom of the screen when doing scrolling +or screen positioning by buffer lines. +.LP +Historically, lines marked with \fB'@'\fP were also used to minimize +output to dumb terminals over slow lines; that is, +changes local to the cursor were updated, but changes to lines on +the screen that were not close to the cursor were simply marked +with an \fB'@'\fP sign instead of being updated to match the current +text. IEEE\ Std\ 1003.1-2001 permits, but does not +require this feature because it is used ever less frequently as terminals +become smarter and connections are faster. +.SS Initialization in ex and vi +.LP +Historically, \fIvi\fP always had a line in the edit buffer, even +if the edit buffer was "empty". For example: +.IP " 1." 4 +The \fIex\fP command \fB=\fP executed from visual mode wrote "1" when +the buffer was +empty. +.LP +.IP " 2." 4 +Writes from visual mode of an empty edit buffer wrote files of a single +character (a <newline>), while writes from \fIex\fP mode of an empty +edit buffer wrote empty files. +.LP +.IP " 3." 4 +Put and read commands into an empty edit buffer left an empty line +at the top of the edit buffer. +.LP +.LP +For consistency, IEEE\ Std\ 1003.1-2001 does not permit any of these +behaviors. +.LP +Historically, \fIvi\fP did not always return the terminal to its original +modes; for example, ICRNL was modified if it was not +originally set. IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.SS Command Descriptions in vi +.LP +Motion commands are among the most complicated aspects of \fIvi\fP +to describe. With some exceptions, the text region and +buffer type effect of a motion command on a \fIvi\fP command are described +on a case-by-case basis. The descriptions of text +regions in IEEE\ Std\ 1003.1-2001 are not intended to imply direction; +that is, an inclusive region from line \fIn\fP to +line \fIn\fP+5 is identical to a region from line \fIn\fP+5 to line +\fIn\fP. This is of more than academic interest-movements to +marks can be in either direction, and, if the \fBwrapscan\fP option +is set, so can movements to search points. Historically, lines +are always stored into buffers in text order; that is, from the start +of the edit buffer to the end. IEEE\ Std\ 1003.1-2001 +requires conformance to historical practice. +.LP +Historically, command counts were applied to any associated motion, +and were multiplicative to any supplied motion count. For +example, \fB2cw\fP is the same as \fBc2w\fP, and \fB2c3w\fP is the +same as \fBc6w\fP. IEEE\ Std\ 1003.1-2001 requires +this behavior. Historically, \fIvi\fP commands that used bigwords, +words, paragraphs, and sentences as objects treated groups of +empty lines, or lines that contained only <blank>s, inconsistently. +Some commands treated them as a single entity, while +others treated each line separately. For example, the \fBw\fP, \fBW\fP, +and \fBB\fP commands treated groups of empty lines as +individual words; that is, the command would move the cursor to each +new empty line. The \fBe\fP and \fBE\fP commands treated +groups of empty lines as a single word; that is, the first use would +move past the group of lines. The \fBb\fP command would just +beep at the user, or if done from the start of the line as a motion +command, fail in unexpected ways. If the lines contained only +(or ended with) <blank>s, the \fBw\fP and \fBW\fP commands would just +beep at the user, the \fBE\fP and \fBe\fP commands +would treat the group as a single word, and the \fBB\fP and \fBb\fP +commands would treat the lines as individual words. For +consistency and simplicity of specification, IEEE\ Std\ 1003.1-2001 +requires that all \fIvi\fP commands treat groups of +empty or blank lines as a single entity, and that movement through +lines ending with <blank>s be consistent with other +movements. +.LP +Historically, \fIvi\fP documentation indicated that any number of +double quotes were skipped after punctuation marks at +sentence boundaries; however, implementations only skipped single +quotes. IEEE\ Std\ 1003.1-2001 requires both to be +skipped. +.LP +Historically, the first and last characters in the edit buffer were +word boundaries. This historical practice is required by +IEEE\ Std\ 1003.1-2001. +.LP +Historically, \fIvi\fP attempted to update the minimum number of columns +on the screen possible, which could lead to misleading +information being displayed. IEEE\ Std\ 1003.1-2001 makes no requirements +other than that the current character being +entered is displayed correctly, leaving all other decisions in this +area up to the implementation. +.LP +Historically, lines were arbitrarily folded between columns of any +characters that required multiple column positions on the +screen, with the exception of tabs, which terminated at the right-hand +margin. IEEE\ Std\ 1003.1-2001 permits the former +and requires the latter. Implementations that do not arbitrarily break +lines between columns of characters that occupy multiple +column positions should not permit the cursor to rest on a column +that does not contain any part of a character. +.LP +The historical \fIvi\fP had a problem in that all movements were by +buffer lines, not by display or screen lines. This is often +the right thing to do; for example, single line movements, such as +\fBj\fP or \fBk\fP, should work on buffer lines. Commands like +\fBdj\fP, or \fBj.\fP, where \fB.\fP is a change command, only make +sense for buffer lines. It is not, however, the right thing +to do for screen motion or scrolling commands like <control>-D, <control>-F, +and \fBH\fP. If the window is fairly +small, using buffer lines in these cases can result in completely +random motion; for example, \fB1\fP <control>-D can result +in a completely changed screen, without any overlap. This is clearly +not what the user wanted. The problem is even worse in the +case of the \fBH\fP, \fBL\fP, and \fBM\fP commands-as they position +the cursor at the first non- <blank> of the line, they +may all refer to the same location in large lines, and will result +in no movement at all. +.LP +In addition, if the line is larger than the screen, using buffer lines +can make it impossible to display parts of the line-there +are not any commands that do not display the beginning of the line +in historical \fIvi\fP, and if both the beginning and end of +the line cannot be on the screen at the same time, the user suffers. +Finally, the page and half-page scrolling commands +historically moved to the first non- <blank> in the new line. If the +line is approximately the same size as the screen, this +is inadequate because the cursor before and after a <control>-D command +will refer to the same location on the screen. +.LP +Implementations of \fIex\fP and \fIvi\fP exist that do not have these +problems because the +relevant commands ( <control>-B, <control>-D, <control>-F, <control>-U, +<control>-Y, +<control>-E, \fBH\fP, \fBL\fP, and \fBM)\fP operate on display (screen) +lines, not (edit) buffer lines. +.LP +IEEE\ Std\ 1003.1-2001 does not permit this behavior by default because +the standard developers believed that users +would find it too confusing. However, historical practice has been +relaxed. For example, \fIex\fP and \fIvi\fP historically attempted, +albeit sometimes unsuccessfully, to never put part of a +line on the last lines of a screen; for example, if a line would not +fit in its entirety, no part of the line was displayed, and +the screen lines corresponding to the line contained single \fB'@'\fP +characters. This behavior is permitted, but not required +by IEEE\ Std\ 1003.1-2001, so that it is possible for implementations +to support long lines in small screens more +reasonably without changing the commands to be oriented to the display +(instead of oriented to the buffer). +IEEE\ Std\ 1003.1-2001 also permits implementations to refuse to edit +any edit buffer containing a line that will not fit +on the screen in its entirety. +.LP +The display area (for example, the value of the \fBwindow\fP edit +option) has historically been "grown", or expanded, to +display new text when local movements are done in displays where the +number of lines displayed is less than the maximum possible. +Expansion has historically been the first choice, when the target +line is less than the maximum possible expansion value away. +Scrolling has historically been the next choice, done when the target +line is less than half a display away, and otherwise, the +screen was redrawn. There were exceptions, however, in that \fIex\fP +commands generally always +caused the screen to be redrawn. IEEE\ Std\ 1003.1-2001 does not specify +a standard behavior because there may be external +issues, such as connection speed, the number of characters necessary +to redraw as opposed to scroll, or terminal capabilities that +implementations will have to accommodate. +.LP +The current line in IEEE\ Std\ 1003.1-2001 maps one-to-one to a buffer +line in the file. The current column does not. +There are two different column values that are described by IEEE\ Std\ 1003.1-2001. +The first is the current column value +as set by many of the \fIvi\fP commands. This value is remembered +for the lifetime of the editor. The second column value is the +actual position on the screen where the cursor rests. The two are +not always the same. For example, when the cursor is backed by a +multi-column character, the actual cursor position on the screen has +historically been the last column of the character in command +mode, and the first column of the character in input mode. +.LP +Commands that set the current line, but that do not set the current +cursor value (for example, \fBj\fP and \fBk\fP) attempt to +get as close as possible to the remembered column position, so that +the cursor tends to restrict itself to a vertical column as the +user moves around in the edit buffer. IEEE\ Std\ 1003.1-2001 requires +conformance to historical practice, requiring that +the display location of the cursor on the display line be adjusted +from the current column value as necessary to support this +historical behavior. +.LP +Historically, only a single line (and for some terminals, a single +line minus 1 column) of characters could be entered by the +user for the line-oriented commands; that is, \fB:\fP, \fB!\fP, \fB/\fP, +or \fB?\fP. IEEE\ Std\ 1003.1-2001 permits, +but does not require, this limitation. +.LP +Historically, "soft" errors in \fIvi\fP caused the terminal to be +alerted, but no error message was displayed. As a general +rule, no error message was displayed for errors in command execution +in \fIvi\fP, when the error resulted from the user attempting +an invalid or impossible action, or when a searched-for object was +not found. Examples of soft errors included \fBh\fP at the left +margin, <control>-B or \fB[[\fP at the beginning of the file, \fB2G\fP +at the end of the file, and so on. In addition, +errors such as \fB%\fP, \fB]]\fP, \fB}\fP, \fB)\fP, \fBN\fP, \fBn\fP, +\fBf\fP, \fBF\fP, \fBt\fP, and \fBT\fP failing to +find the searched-for object were soft as well. Less consistently, +\fB/\fP and \fB?\fP displayed an error message if the pattern +was not found, \fB/\fP, \fB?\fP, \fBN\fP, and \fBn\fP displayed an +error message if no previous regular expression had been +specified, and \fB;\fP did not display an error message if no previous +\fBf\fP, \fBF\fP, \fBt\fP, or \fBT\fP command had +occurred. Also, behavior in this area might reasonably be based on +a runtime evaluation of the speed of a network connection. +Finally, some implementations have provided error messages for soft +errors in order to assist naive users, based on the value of a +verbose edit option. IEEE\ Std\ 1003.1-2001 does not list specific +errors for which an error message shall be displayed. +Implementations should conform to historical practice in the absence +of any strong reason to diverge. +.SS Page Backwards +.LP +The <control>-B and <control>-F commands historically considered it +an error to attempt to page past the beginning +or end of the file, whereas the <control>-D and <control>-U commands +simply moved to the beginning or end of the file. +For consistency, IEEE\ Std\ 1003.1-2001 requires the latter behavior +for all four commands. All four commands still +consider it an error if the current line is at the beginning ( <control>-B, +<control>-U) or end ( <control>-F, +<control>-D) of the file. Historically, the <control>-B and <control>-F +commands skip two lines in order to +include overlapping lines when a single command is entered. This makes +less sense in the presence of a \fIcount\fP, as there will +be, by definition, no overlapping lines. The actual calculation used +by historical implementations of the \fIvi\fP editor for +<control>-B was: +.sp +.RS +.nf + +\fB((current first line) - count x (window edit option)) +2 +\fP +.fi +.RE +.LP +and for <control>-F was: +.sp +.RS +.nf + +\fB((current first line) + count x (window edit option)) -2 +\fP +.fi +.RE +.LP +This calculation does not work well when intermixing commands with +and without counts; for example, \fB3\fP <control>-F +is not equivalent to entering the <control>-F command three times, +and is not reversible by entering the <control>-B +command three times. For consistency with other \fIvi\fP commands +that take counts, IEEE\ Std\ 1003.1-2001 requires a +different calculation. +.SS Scroll Forward +.LP +The 4BSD and System V implementations of \fIvi\fP differed on the +initial value used by the \fBscroll\fP command. 4BSD +used: +.sp +.RS +.nf + +\fB((window edit option) +1) /2 +\fP +.fi +.RE +.LP +while System V used the value of the \fBscroll\fP edit option. The +System V version is specified by +IEEE\ Std\ 1003.1-2001 because the standard developers believed that +it was more intuitive and permitted the user a method +of setting the scroll value initially without also setting the number +of lines that are displayed. +.SS Scroll Forward by Line +.LP +Historically, the <control>-E and <control>-Y commands considered +it an error if the last and first lines, +respectively, were already on the screen. IEEE\ Std\ 1003.1-2001 requires +conformance to historical practice. Historically, +the <control>-E and <control>-Y commands had no effect in open mode. +For simplicity and consistency of specification, +IEEE\ Std\ 1003.1-2001 requires that they behave as usual, albeit +with a single line screen. +.SS Clear and Redisplay +.LP +The historical <control>-L command refreshed the screen exactly as +it was supposed to be currently displayed, replacing +any \fB'@'\fP characters for lines that had been deleted but not updated +on the screen with refreshed \fB'@'\fP characters. +The intent of the <control>-L command is to refresh when the screen +has been accidentally overwritten; for example, by a +\fBwrite\fP command from another user, or modem noise. +.SS Redraw Screen +.LP +The historical <control>-R command redisplayed only when necessary +to update lines that had been deleted but not updated +on the screen and that were flagged with \fB'@'\fP characters. There +is no requirement that the screen be in any way refreshed +if no lines of this form are currently displayed. IEEE\ Std\ 1003.1-2001 +permits implementations to extend this command to +refresh lines on the screen flagged with \fB'@'\fP characters because +they are too long to be displayed in the current +framework; however, the current line and column need not be modified. +.SS Search for tagstring +.LP +Historically, the first non- <blank> at or after the cursor was the +first character, and all subsequent characters that +were word characters, up to the end of the line, were included. For +example, with the cursor on the leading space or on the +\fB'#'\fP character in the text \fB"#bar@"\fP, the tag was \fB"#bar"\fP +\&. On the character \fB'b'\fP it was +\fB"bar"\fP, and on the \fB'a'\fP it was \fB"ar"\fP . IEEE\ Std\ 1003.1-2001 +requires this behavior. +.SS Replace Text with Results from Shell Command +.LP +Historically, the \fB<\fP, \fB>\fP, and \fB!\fP commands considered +most cursor motions other than line-oriented +motions an error; for example, the command \fB>/foo<CR>\fP succeeded, +while the command \fB>l\fP failed, even though +the text region described by the two commands might be identical. +For consistency, all three commands only consider entire lines +and not partial lines, and the region is defined as any line that +contains a character that was specified by the motion. +.SS Move to Matching Character +.LP +Other matching characters have been left implementation-defined in +order to allow extensions such as matching \fB'<'\fP +and \fB'>'\fP for searching HTML, or \fB#ifdef\fP, \fB#else\fP, and +\fB#endif\fP for searching C source. +.SS Repeat Substitution +.LP +IEEE\ Std\ 1003.1-2001 requires that any \fBc\fP and \fBg\fP flags +specified to the previous substitute command be +ignored; however, the \fBr\fP flag may still apply, if supported by +the implementation. +.SS Return to Previous (Context or Section) +.LP +The \fB[[\fP, \fB]]\fP, \fB(\fP, \fB)\fP, \fB{\fP, and \fB}\fP commands +are all affected by "section boundaries", but in +some historical implementations not all of the commands recognize +the same section boundaries. This is a bug, not a feature, and a +unique section-boundary algorithm was not described for each command. +One special case that is preserved is that the sentence +command moves to the end of the last line of the edit buffer while +the other commands go to the beginning, in order to preserve the +traditional character cut semantics of the sentence command. Historically, +\fIvi\fP section boundaries at the beginning and end of +the edit buffer were the first non- <blank> on the first and last +lines of the edit buffer if one exists; otherwise, the last +character of the first and last lines of the edit buffer if one exists. +To increase consistency with other section locations, this +has been simplified by IEEE\ Std\ 1003.1-2001 to the first character +of the first and last lines of the edit buffer, or the +first and the last lines of the edit buffer if they are empty. +.LP +Sentence boundaries were problematic in the historical \fIvi\fP. They +were not only the boundaries as defined for the section +and paragraph commands, but they were the first non- <blank> that +occurred after those boundaries, as well. Historically, the +\fIvi\fP section commands were documented as taking an optional window +size as a \fIcount\fP preceding the command. This was not +implemented in historical versions, so IEEE\ Std\ 1003.1-2001 requires +that the \fIcount\fP repeat the command, for +consistency with other \fIvi\fP commands. +.SS Repeat +.LP +Historically, mapped commands other than text input commands could +not be repeated using the \fBperiod\fP command. +IEEE\ Std\ 1003.1-2001 requires conformance to historical practice. +.LP +The restrictions on the interpretation of special characters (for +example, <control>-H) in the repetition of text input +mode commands is intended to match historical practice. For example, +given the input sequence: +.sp +.RS +.nf + +\fBiab<control>-H<control>-H<control>-Hdef<escape> +\fP +.fi +.RE +.LP +the user should be informed of an error when the sequence is first +entered, but not during a command repetition. The character +<control>-T is specifically exempted from this restriction. Historical +implementations of \fIvi\fP ignored <control>-T +characters that were input in the original command during command +repetition. IEEE\ Std\ 1003.1-2001 prohibits this +behavior. +.SS Find Regular Expression +.LP +Historically, commands did not affect the line searched to or from +if the motion command was a search ( \fB/\fP, \fB?\fP, +\fBN\fP, \fBn\fP) and the final position was the start/end of the +line. There were some special cases and \fIvi\fP was not +consistent. IEEE\ Std\ 1003.1-2001 does not permit this behavior, +for consistency. Historical implementations permitted but +were unable to handle searches as motion commands that wrapped (that +is, due to the edit option \fBwrapscan\fP) to the original +location. IEEE\ Std\ 1003.1-2001 requires that this behavior be treated +as an error. +.LP +Historically, the syntax \fB"/RE/0"\fP was used to force the command +to cut text in line mode. IEEE\ Std\ 1003.1-2001 +requires conformance to historical practice. +.LP +Historically, in open mode, a \fBz\fP specified to a search command +redisplayed the current line instead of displaying the +current screen with the current line highlighted. For consistency +and simplicity of specification, IEEE\ Std\ 1003.1-2001 +does not permit this behavior. +.LP +Historically, trailing \fBz\fP commands were permitted and ignored +if entered as part of a search used as a motion command. For +consistency and simplicity of specification, IEEE\ Std\ 1003.1-2001 +does not permit this behavior. +.SS Execute an ex Command +.LP +Historically, \fIvi\fP implementations restricted the commands that +could be entered on the colon command line (for example, +\fBappend\fP and \fBchange\fP), and some other commands were known +to cause them to fail catastrophically. For consistency, +IEEE\ Std\ 1003.1-2001 does not permit these restrictions. When executing +an \fIex\fP +command by entering \fB:\fP, it is not possible to enter a <newline> +as part of the command because it is considered the end +of the command. A different approach is to enter \fIex\fP command +mode by using the \fIvi\fP +\fBQ\fP command (and later resuming visual mode with the \fIex\fP +\fBvi\fP command). In \fIex\fP command mode, the single-line limitation +does not exist. So, for example, the following +is valid: +.sp +.RS +.nf + +\fBQ +s/break here/break\\ +here/ +vi +\fP +.fi +.RE +.LP +IEEE\ Std\ 1003.1-2001 requires that, if the \fIex\fP command overwrites +any part of +the screen that would be erased by a refresh, \fIvi\fP pauses for +a character from the user. Historically, this character could be +any character; for example, a character input by the user before the +message appeared, or even a mapped character. This is probably +a bug, but implementations that have tried to be more rigorous by +requiring that the user enter a specific character, or that the +user enter a character after the message was displayed, have been +forced by user indignation back into historical behavior. +IEEE\ Std\ 1003.1-2001 requires conformance to historical practice. +.SS Shift Left (Right) +.LP +Refer to the Rationale for the \fB!\fP and \fB/\fP commands. Historically, +the \fB<\fP and \fB>\fP commands sometimes +moved the cursor to the first non- <blank> (for example if the command +was repeated or with \fB_\fP as the motion command), +and sometimes left it unchanged. IEEE\ Std\ 1003.1-2001 does not permit +this inconsistency, requiring instead that the +cursor always move to the first non- <blank>. Historically, the \fB<\fP +and \fB>\fP commands did not support buffer +arguments, although some implementations allow the specification of +an optional buffer. This behavior is neither required nor +disallowed by IEEE\ Std\ 1003.1-2001. +.SS Execute +.LP +Historically, buffers could execute other buffers, and loops, infinite +and otherwise, were possible. +IEEE\ Std\ 1003.1-2001 requires conformance to historical practice. +The * \fIbuffer\fP syntax of \fIex\fP is not required in \fIvi\fP, +because it is not historical practice and has been used in some +\fIvi\fP implementations to support additional scripting languages. +.SS Reverse Case +.LP +Historically, the \fB~\fP command ignored any associated \fIcount\fP, +and acted only on the characters in the current +line. For consistency with other \fIvi\fP commands, IEEE\ Std\ 1003.1-2001 +requires that an associated \fIcount\fP act on +the next \fIcount\fP characters, and that the command move to subsequent +lines if warranted by \fIcount\fP, to make it possible +to modify large pieces of text in a reasonably efficient manner. There +exist \fIvi\fP implementations that optionally require an +associated motion command for the \fB~\fP command. Implementations +supporting this functionality are encouraged to base it on +the \fBtildedop\fP edit option and handle the text regions and cursor +positioning identically to the \fByank\fP command. +.SS Append +.LP +Historically, \fIcount\fPs specified to the \fBA\fP, \fBa\fP, \fBI\fP, +and \fBi\fP commands repeated the input of the first +line \fIcount\fP times, and did not repeat the subsequent lines of +the input text. IEEE\ Std\ 1003.1-2001 requires that +the entire text input be repeated \fIcount\fP times. +.SS Move Backward to Preceding Word +.LP +Historically, \fIvi\fP became confused if word commands were used +as motion commands in empty files. +IEEE\ Std\ 1003.1-2001 requires that this be an error. Historical +implementations of \fIvi\fP had a large number of bugs +in the word movement commands, and they varied greatly in behavior +in the presence of empty lines, "words" made up of a single +character, and lines containing only <blank>s. For consistency and +simplicity of specification, +IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.SS Change to End-of-Line +.LP +Some historical implementations of the \fBC\fP command did not behave +as described by IEEE\ Std\ 1003.1-2001 when the +\fB$\fP key was remapped because they were implemented by pushing +the \fB$\fP key onto the input queue and reprocessing it. +IEEE\ Std\ 1003.1-2001 does not permit this behavior. Historically, +the \fBC\fP, \fBS\fP, and \fBs\fP commands did not +copy replaced text into the numeric buffers. For consistency and simplicity +of specification, IEEE\ Std\ 1003.1-2001 +requires that they behave like their respective \fBc\fP commands in +all respects. +.SS Delete +.LP +Historically, lines in open mode that were deleted were scrolled up, +and an \fB@\fP glyph written over the beginning of the +line. In the case of terminals that are incapable of the necessary +cursor motions, the editor erased the deleted line from the +screen. IEEE\ Std\ 1003.1-2001 requires conformance to historical +practice; that is, if the terminal cannot display the +\fB'@'\fP character, the line cannot remain on the screen. +.SS Delete to End-of-Line +.LP +Some historical implementations of the \fBD\fP command did not behave +as described by IEEE\ Std\ 1003.1-2001 when the +\fB$\fP key was remapped because they were implemented by pushing +the \fB$\fP key onto the input queue and reprocessing it. +IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.SS Join +.LP +An historical oddity of \fIvi\fP is that the commands \fBJ\fP, \fB1J\fP, +and \fB2J\fP are all equivalent. +IEEE\ Std\ 1003.1-2001 requires conformance to historical practice. +The \fIvi\fP \fBJ\fP command is specified in terms of +the \fIex\fP \fBjoin\fP command with an \fIex\fP command +\fIcount\fP value. The address correction for a \fIcount\fP that is +past the end of the edit buffer is necessary for historical +compatibility for both \fIex\fP and \fIvi\fP. +.SS Mark Position +.LP +Historical practice is that only lowercase letters, plus \fB'`'\fP +and \fB'"\fP, could be used to mark a cursor +position. IEEE\ Std\ 1003.1-2001 requires conformance to historical +practice, but encourages implementations to support +other characters as marks as well. +.SS Repeat Regular Expression Find (Forward and Reverse) +.LP +Historically, the \fBN\fP and \fBn\fP commands could not be used as +motion components for the \fBc\fP command. With the +exception of the \fBcN\fP command, which worked if the search crossed +a line boundary, the text region would be discarded, and the +user would not be in text input mode. For consistency and simplicity +of specification, IEEE\ Std\ 1003.1-2001 does not +permit this behavior. +.SS Insert Empty Line (Below and Above) +.LP +Historically, counts to the \fBO\fP and \fBo\fP commands were used +as the number of physical lines to open, if the terminal +was dumb and the \fBslowopen\fP option was not set. This was intended +to minimize traffic over slow connections and repainting for +dumb terminals. IEEE\ Std\ 1003.1-2001 does not permit this behavior, +requiring that a \fIcount\fP to the open command +behave as for other text input commands. This change to historical +practice was made for consistency, and because a superset of the +functionality is provided by the \fBslowopen\fP edit option. +.SS Put from Buffer (Following and Before) +.LP +Historically, \fIcount\fPs to the \fBp\fP and \fBP\fP commands were +ignored if the buffer was a line mode buffer, but were +(mostly) implemented as described in IEEE\ Std\ 1003.1-2001 if the +buffer was a character mode buffer. Because +implementations exist that do not have this limitation, and because +pasting lines multiple times is generally useful, +IEEE\ Std\ 1003.1-2001 requires that \fIcount\fP be supported for +all \fBp\fP and \fBP\fP commands. +.LP +Historical implementations of \fIvi\fP were widely known to have major +problems in the \fBp\fP and \fBP\fP commands, +particularly when unusual regions of text were copied into the edit +buffer. The standard developers viewed these as bugs, and they +are not permitted for consistency and simplicity of specification. +.LP +Historically, a \fBP\fP or \fBp\fP command (or an \fIex\fP \fBput\fP +command executed +from open or visual mode) executed in an empty file, left an empty +line as the first line of the file. For consistency and +simplicity of specification, IEEE\ Std\ 1003.1-2001 does not permit +this behavior. +.SS Replace Character +.LP +Historically, the \fBr\fP command did not correctly handle the \fIerase\fP +and \fIword erase\fP characters as arguments, nor +did it handle an associated \fIcount\fP greater than 1 with a <carriage-return> +argument, for which it replaced \fIcount\fP +characters with a single <newline>. IEEE\ Std\ 1003.1-2001 does not +permit these inconsistencies. +.LP +Historically, the \fBr\fP command permitted the <control>-V escaping +of entered characters, such as <ESC> and the +<carriage-return>; however, it required two leading <control>-V characters +instead of one. +IEEE\ Std\ 1003.1-2001 requires that this be changed for consistency +with the other text input commands of \fIvi\fP. +.LP +Historically, it is an error to enter the \fBr\fP command if there +are less than \fIcount\fP characters at or after the cursor +in the line. While a reasonable and unambiguous extension would be +to permit the \fBr\fP command on empty lines, it would require +that too large a \fIcount\fP be adjusted to match the number of characters +at or after the cursor for consistency, which is +sufficiently different from historical practice to be avoided. IEEE\ Std\ 1003.1-2001 +requires conformance to historical +practice. +.SS Replace Characters +.LP +Historically, if there were \fBautoindent\fP characters in the line +on which the \fBR\fP command was run, and +\fBautoindent\fP was set, the first <newline> would be properly indented +and no characters would be replaced by the +<newline>. Each additional <newline> would replace \fIn\fP characters, +where \fIn\fP was the number of characters +that were needed to indent the rest of the line to the proper indentation +level. This behavior is a bug and is not permitted by +IEEE\ Std\ 1003.1-2001. +.SS Undo +.LP +Historical practice for cursor positioning after undoing commands +was mixed. In most cases, when undoing commands that affected +a single line, the cursor was moved to the start of added or changed +text, or immediately after deleted text. However, if the user +had moved from the line being changed, the column was either set to +the first non- <blank>, returned to the origin of the +command, or remained unchanged. When undoing commands that affected +multiple lines or entire lines, the cursor was moved to the +first character in the first line restored. As an example of how inconsistent +this was, a search, followed by an \fBo\fP text +input command, followed by an \fBundo\fP would return the cursor to +the location where the \fBo\fP command was entered, but a +\fBcw\fP command followed by an \fBo\fP command followed by an \fBundo\fP +would return the cursor to the first non- +<blank> of the line. IEEE\ Std\ 1003.1-2001 requires the most useful +of these behaviors, and discards the least +useful, in the interest of consistency and simplicity of specification. +.SS Yank +.LP +Historically, the \fByank\fP command did not move to the end of the +motion if the motion was in the forward direction. It moved +to the end of the motion if the motion was in the backward direction, +except for the \fB_\fP command, or for the \fBG\fP and +\fB'\fP commands when the end of the motion was on the current line. +This was further complicated by the fact that for a number of +motion commands, the \fByank\fP command moved the cursor but did not +update the screen; for example, a subsequent command would +move the cursor from the end of the motion, even though the cursor +on the screen had not reflected the cursor movement for the +\fByank\fP command. IEEE\ Std\ 1003.1-2001 requires that all \fByank\fP +commands associated with backward motions move +the cursor to the end of the motion for consistency, and specifically, +to make \fB'\fP commands as motions consistent with search +patterns as motions. +.SS Yank Current Line +.LP +Some historical implementations of the \fBY\fP command did not behave +as described by IEEE\ Std\ 1003.1-2001 when the +\fB'_'\fP key was remapped because they were implemented by pushing +the \fB'_'\fP key onto the input queue and reprocessing +it. IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.SS Redraw Window +.LP +Historically, the \fBz\fP command always redrew the screen. This is +permitted but not required by +IEEE\ Std\ 1003.1-2001, because of the frequent use of the \fBz\fP +command in macros such as \fBmap n nz.\fP for screen +positioning, instead of its use to change the screen size. The standard +developers believed that expanding or scrolling the screen +offered a better interface for users. The ability to redraw the screen +is preserved if the optional new window size is specified, +and in the <control>-L and <control>-R commands. +.LP +The semantics of \fBz^\fP are confusing at best. Historical practice +is that the screen before the screen that ended with the +specified line is displayed. IEEE\ Std\ 1003.1-2001 requires conformance +to historical practice. +.LP +Historically, the \fBz\fP command would not display a partial line +at the top or bottom of the screen. If the partial line +would normally have been displayed at the bottom of the screen, the +command worked, but the partial line was replaced with +\fB'@'\fP characters. If the partial line would normally have been +displayed at the top of the screen, the command would fail. +For consistency and simplicity of specification, IEEE\ Std\ 1003.1-2001 +does not permit this behavior. +.LP +Historically, the \fBz\fP command with a line specification of 1 ignored +the command. For consistency and simplicity of +specification, IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.LP +Historically, the \fBz\fP command did not set the cursor column to +the first non- <blank> for the character if the first +screen was to be displayed, and was already displayed. For consistency +and simplicity of specification, +IEEE\ Std\ 1003.1-2001 does not permit this behavior. +.SS Input Mode Commands in vi +.LP +Historical implementations of \fIvi\fP did not permit the user to +erase more than a single line of input, or to use normal +erase characters such as \fIline erase\fP, \fIworderase\fP, and \fIerase\fP +to erase \fBautoindent\fP characters. As there +exist implementations of \fIvi\fP that do not have these limitations, +both behaviors are permitted, but only historical practice +is required. In the case of these extensions, \fIvi\fP is required +to pause at the \fBautoindent\fP and previous line +boundaries. +.LP +Historical implementations of \fIvi\fP updated only the portion of +the screen where the current cursor character was displayed. +For example, consider the \fIvi\fP input keystrokes: +.sp +.RS +.nf + +\fBiabcd<escape>0C<tab> +\fP +.fi +.RE +.LP +Historically, the <tab> would overwrite the characters \fB"abcd"\fP +when it was displayed. Other implementations +replace only the \fB'a'\fP character with the <tab>, and then push +the rest of the characters ahead of the cursor. Both +implementations have problems. The historical implementation is probably +visually nicer for the above example; however, for the +keystrokes: +.sp +.RS +.nf + +\fBiabcd<ESC>0R<tab><ESC> +\fP +.fi +.RE +.LP +the historical implementation results in the string \fB"bcd"\fP disappearing +and then magically reappearing when the +<ESC> character is entered. IEEE\ Std\ 1003.1-2001 requires the former +behavior when overwriting erase-columns-that +is, overwriting characters that are no longer logically part of the +edit buffer-and the latter behavior otherwise. +.LP +Historical implementations of \fIvi\fP discarded the <control>-D and +<control>-T characters when they were entered +at places where their command functionality was not appropriate. IEEE\ Std\ 1003.1-2001 +requires that the <control>-T +functionality always be available, and that <control>-D be treated +as any other key when not operating on \fBautoindent\fP +characters. +.SS NUL +.LP +Some historical implementations of \fIvi\fP limited the number of +characters entered using the NUL input character to 256 +bytes. IEEE\ Std\ 1003.1-2001 permits this limitation; however, implementations +are encouraged to remove this limit. +.SS <control>-D +.LP +See also Rationale for the input mode command <newline>. The hidden +assumptions in the <control>-D command (and in +the \fIvi\fP \fBautoindent\fP specification in general) is that <space>s +take up a single column on the screen and that +<tab>s are comprised of an integral number of <space>s. +.SS <newline> +.LP +Implementations are permitted to rewrite \fBautoindent\fP characters +in the line when <newline>, <carriage-return>, +<control>-D, and <control>-T are entered, or when the \fBshift\fP +commands are used, because historical +implementations have both done so and found it necessary to do so. +For example, a <control>-D when the cursor is preceded by +a single <tab>, with \fBtabstop\fP set to 8, and \fBshiftwidth\fP +set to 3, will result in the <tab> being replaced +by several <space>s. +.SS <control>-T +.LP +See also the Rationale for the input mode command <newline>. Historically, +<control>-T only worked if no non- +<blank>s had yet been input in the current input line. In addition, +the characters inserted by <control>-T were treated +as \fBautoindent\fP characters, and could not be erased using normal +user erase characters. Because implementations exist that do +not have these limitations, and as moving to a column boundary is +generally useful, IEEE\ Std\ 1003.1-2001 requires that +both limitations be removed. +.SS <control>-V +.LP +Historically, \fIvi\fP used \fB^V\fP, regardless of the value of the +literal-next character of the terminal. +IEEE\ Std\ 1003.1-2001 requires conformance to historical practice. +.LP +The uses described for <control>-V can also be accomplished with <control>-Q, +which is useful on terminals that use +<control>-V for the down-arrow function. However, most historical +implementations use <control>-Q for the +\fItermios\fP START character, so the editor will generally not receive +the <control>-Q unless \fBstty ixon\fP mode is set +to off. (In addition, some historical implementations of \fIvi\fP +explicitly set \fBixon\fP mode to on, so it was difficult for +the user to set it to off.) Any of the command characters described +in IEEE\ Std\ 1003.1-2001 can be made ineffective by +their selection as \fItermios\fP control characters, using the \fIstty\fP +utility or other +methods described in the System Interfaces volume of IEEE\ Std\ 1003.1-2001. +.SS <ESC> +.LP +Historically, SIGINT alerted the terminal when used to end input mode. +This behavior is permitted, but not required, by +IEEE\ Std\ 1003.1-2001. +.SH FUTURE DIRECTIONS +.LP +None. +.SH SEE ALSO +.LP +\fIed\fP, \fIex\fP, \fIstty\fP +.SH COPYRIGHT +Portions of this text are reprinted and reproduced in electronic form +from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology +-- Portable Operating System Interface (POSIX), The Open Group Base +Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of +Electrical and Electronics Engineers, Inc and The Open Group. In the +event of any discrepancy between this version and the original IEEE and +The Open Group Standard, the original IEEE and The Open Group Standard +is the referee document. The original Standard can be obtained online at +http://www.opengroup.org/unix/online.html . |