*options.txt*	For Vim version 7.0.  Last change: 2006 May 04


		  VIM REFERENCE MANUAL	  by Bram Moolenaar


Options							*options*

1. Setting options			|set-option|
2. Automatically setting options	|auto-setting|
3. Options summary			|option-summary|

For an overview of options see help.txt |option-list|.

Vim has a number of internal variables and switches which can be set to
achieve special effects.  These options come in three forms:
	boolean		can only be on or off		*boolean* *toggle*
	number		has a numeric value
	string		has a string value

==============================================================================
1. Setting options					*set-option* *E764*

							*:se* *:set*
:se[t]			Show all options that differ from their default value.

:se[t] all		Show all but terminal options.

:se[t] termcap		Show all terminal options.  Note that in the GUI the
			key codes are not shown, because they are generated
			internally and can't be changed.  Changing the terminal
			codes in the GUI is not useful either...

								*E518* *E519*
:se[t] {option}?	Show value of {option}.

:se[t] {option}		Toggle option: set, switch it on.
			Number option: show value.
			String option: show value.

:se[t] no{option}	Toggle option: Reset, switch it off.

:se[t] {option}!   or
:se[t] inv{option}	Toggle option: Invert value. {not in Vi}

				*:set-default* *:set-&* *:set-&vi* *:set-&vim*
:se[t] {option}&	Reset option to its default value.  May depend on the
			current value of 'compatible'. {not in Vi}
:se[t] {option}&vi	Reset option to its Vi default value. {not in Vi}
:se[t] {option}&vim	Reset option to its Vim default value. {not in Vi}

:se[t] all&		Set all options, except terminal options, to their
			default value.  The values of 'term', 'lines' and
			'columns' are not changed. {not in Vi}

						*:set-args* *E487* *E521*
:se[t] {option}={value}		or
:se[t] {option}:{value}
			Set string or number option to {value}.
			For numeric options the value can be given in decimal,
			hex (preceded with 0x) or octal (preceded with '0')
			(hex and octal are only available for machines which
			have the strtol() function).
			The old value can be inserted by typing 'wildchar' (by
			default this is a <Tab> or CTRL-E if 'compatible' is
			set).  See |cmdline-completion|.
			White space between {option} and '=' is allowed and
			will be ignored.  White space between '=' and {value}
			is not allowed.
			See |option-backslash| for using white space and
			backslashes in {value}.

:se[t] {option}+={value}				*:set+=*
			Add the {value} to a number option, or append the
			{value} to a string option.  When the option is a
			comma separated list, a comma is added, unless the
			value was empty.
			If the option is a list of flags, superfluous flags
			are removed.  When adding a flag that was already
			present the option value doesn't change.
			Also see |:set-args| above.
			{not in Vi}

:se[t] {option}^={value}				*:set^=*
			Multiply the {value} to a number option, or prepend
			the {value} to a string option.  When the option is a
			comma separated list, a comma is added, unless the
			value was empty.
			Also see |:set-args| above.
			{not in Vi}

:se[t] {option}-={value}				*:set-=*
			Subtract the {value} from a number option, or remove
			the {value} from a string option, if it is there.
			If the {value} is not found in a string option, there
			is no error or warning.  When the option is a comma
			separated list, a comma is deleted, unless the option
			becomes empty.
			When the option is a list of flags, {value} must be
			exactly as they appear in the option.  Remove flags
			one by one to avoid problems.
			Also see |:set-args| above.
			{not in Vi}

The {option} arguments to ":set" may be repeated.  For example: >
	:set ai nosi sw=3 ts=3
If you make an error in one of the arguments, an error message will be given
and the following arguments will be ignored.

							*:set-verbose*
When 'verbose' is non-zero, displaying an option value will also tell where it
was last set.  Example: >
	:verbose set shiftwidth cindent?
	  shiftwidth=4
		  Last set from modeline
	  cindent
		  Last set from /usr/local/share/vim/vim60/ftplugin/c.vim
This is only done when specific option values are requested, not for ":set
all" or ":set" without an argument.
When the option was set by hand there is no "Last set" message.  There is only
one value for all local options with the same name.  Thus the message applies
to the option name, not necessarily its value.
When the option was set while executing a function, user command or
autocommand, the script in which it was defined is reported.
Note that an option may also have been set as a side effect of setting
'compatible'.
{not available when compiled without the +eval feature}

							*:set-termcap* *E522*
For {option} the form "t_xx" may be used to set a terminal option.  This will
override the value from the termcap.  You can then use it in a mapping.  If
the "xx" part contains special characters, use the <t_xx> form: >
	:set <t_#4>=^[Ot
This can also be used to translate a special code for a normal key.  For
example, if Alt-b produces <Esc>b, use this: >
	:set <M-b>=^[b
(the ^[ is a real <Esc> here, use CTRL-V <Esc> to enter it)
The advantage over a mapping is that it works in all situations.

The t_xx options cannot be set from a |modeline| or in the |sandbox|, for
security reasons.

The listing from ":set" looks different from Vi.  Long string options are put
at the end of the list.  The number of options is quite large.  The output of
"set all" probably does not fit on the screen, causing Vim to give the
|more-prompt|.

							*option-backslash*
To include white space in a string option value it has to be preceded with a
backslash.  To include a backslash you have to use two.  Effectively this
means that the number of backslashes in an option value is halved (rounded
down).
A few examples: >
   :set tags=tags\ /usr/tags	    results in "tags /usr/tags"
   :set tags=tags\\,file	    results in "tags\,file"
   :set tags=tags\\\ file	    results in "tags\ file"

The "|" character separates a ":set" command from a following command.  To
include the "|" in the option value, use "\|" instead.  This example sets the
'titlestring' option to "hi|there": >
   :set titlestring=hi\|there
This sets the 'titlestring' option to "hi" and 'iconstring' to "there": >
   :set titlestring=hi|set iconstring=there

Similarly, the double quote character starts a comment.  To include the '"' in
the option value, use '\"' instead.  This example sets the 'titlestring'
option to 'hi "there"': >
   :set titlestring=hi\ \"there\"

For MS-DOS and WIN32 backslashes in file names are mostly not removed.  More
precise: For options that expect a file name (those where environment
variables are expanded) a backslash before a normal file name character is not
removed.  But a backslash before a special character (space, backslash, comma,
etc.) is used like explained above.
There is one special situation, when the value starts with "\\": >
   :set dir=\\machine\path	    results in "\\machine\path"
   :set dir=\\\\machine\\path	    results in "\\machine\path"
   :set dir=\\path\\file	    results in "\\path\file" (wrong!)
For the first one the start is kept, but for the second one the backslashes
are halved.  This makes sure it works both when you expect backslashes to be
halved and when you expect the backslashes to be kept.  The third gives a
result which is probably not what you want.  Avoid it.

				*add-option-flags* *remove-option-flags*
				*E539* *E550* *E551* *E552*
Some options are a list of flags.  When you want to add a flag to such an
option, without changing the existing ones, you can do it like this: >
   :set guioptions+=a
Remove a flag from an option like this: >
   :set guioptions-=a
This removes the 'a' flag from 'guioptions'.
Note that you should add or remove one flag at a time.  If 'guioptions' has
the value "ab", using "set guioptions-=ba" won't work, because the string "ba"
doesn't appear.

			   *:set_env* *expand-env* *expand-environment-var*
Environment variables in specific string options will be expanded.  If the
environment variable exists the '$' and the following environment variable
name is replaced with its value.  If it does not exist the '$' and the name
are not modified.  Any non-id character (not a letter, digit or '_') may
follow the environment variable name.  That character and what follows is
appended to the value of the environment variable.  Examples: >
   :set term=$TERM.new
   :set path=/usr/$INCLUDE,$HOME/include,.
When adding or removing a string from an option with ":set opt-=val" or ":set
opt+=val" the expansion is done before the adding or removing.


Handling of local options			*local-options*

Some of the options only apply to a window or buffer.  Each window or buffer
has its own copy of this option, thus can each have their own value.  This
allows you to set 'list' in one window but not in another.  And set
'shiftwidth' to 3 in one buffer and 4 in another.

The following explains what happens to these local options in specific
situations.  You don't really need to know all of this, since Vim mostly uses
the option values you would expect.  Unfortunately, doing what the user
expects is a bit complicated...

When splitting a window, the local options are copied to the new window.  Thus
right after the split the contents of the two windows look the same.

When editing a new buffer, its local option values must be initialized.  Since
the local options of the current buffer might be specifically for that buffer,
these are not used.  Instead, for each buffer-local option there also is a
global value, which is used for new buffers.  With ":set" both the local and
global value is changed.  With "setlocal" only the local value is changed,
thus this value is not used when editing a new buffer.

When editing a buffer that has been edited before, the last used window
options are used again.  If this buffer has been edited in this window, the
values from back then are used.  Otherwise the values from the window where
the buffer was edited last are used.

It's possible to set a local window option specifically for a type of buffer.
When you edit another buffer in the same window, you don't want to keep
using these local window options.  Therefore Vim keeps a global value of the
local window options, which is used when editing another buffer.  Each window
has its own copy of these values.  Thus these are local to the window, but
global to all buffers in the window.  With this you can do: >
	:e one
	:set list
	:e two
Now the 'list' option will also be set in "two", since with the ":set list"
command you have also set the global value. >
	:set nolist
	:e one
	:setlocal list
	:e two
Now the 'list' option is not set, because ":set nolist" resets the global
value, ":setlocal list" only changes the local value and ":e two" gets the
global value.  Note that if you do this next: >
	:e one
You will not get back the 'list' value as it was the last time you edited
"one".  The options local to a window are not remembered for each buffer.

							*:setl* *:setlocal*
:setl[ocal] ...		Like ":set" but set only the value local to the
			current buffer or window.  Not all options have a
			local value.  If the option does not have a local
			value the global value is set.
			With the "all" argument: display all local option's
			local values.
			Without argument: Display all local option's local
			values which are different from the default.
			When displaying a specific local option, show the
			local value.  For a global option the global value is
			shown (but that might change in the future).
			{not in Vi}

:setl[ocal] {option}<	Set the local value of {option} to its global value by
			copying the value.
			{not in Vi}

:se[t] {option}<	Set the local value of {option} to its global value by
			making it empty.  Only makes sense for |global-local|
			options.
			{not in Vi}

							*:setg* *:setglobal*
:setg[lobal] ...	Like ":set" but set only the global value for a local
			option without changing the local value.
			When displaying an option, the global value is shown.
			With the "all" argument: display all local option's
			global values.
			Without argument: display all local option's global
			values which are different from the default.
			{not in Vi}

For buffer-local and window-local options:
	Command		 global value	    local value ~
      :set option=value	     set		set
 :setlocal option=value	      -			set
:setglobal option=value	     set		 -
      :set option?	      -		       display
 :setlocal option?	      -		       display
:setglobal option?	    display		 -


Global options with a local value			*global-local*

Options are global when you mostly use one value for all buffers and windows.
For some global options it's useful to sometimes have a different local value.
You can set the local value with ":setlocal".  That buffer or window will then
use the local value, while other buffers and windows continue using the global
value.

For example, you have two windows, both on C source code.  They use the global
'makeprg' option.  If you do this in one of the two windows: >
	:set makeprg=gmake
then the other window will switch to the same value.  There is no need to set
the 'makeprg' option in the other C source window too.
However, if you start editing a Perl file in a new window, you want to use
another 'makeprog' for it, without changing the value used for the C source
files.  You use this command: >
	:setlocal makeprg=perlmake
You can switch back to using the global value by making the local value empty: >
	:setlocal makeprg=
This only works for a string option.  For a boolean option you need to use the
"<" flag, like this: >
	:setlocal autoread<
Note that for non-boolean options using "<" copies the global value to the
local value, it doesn't switch back to using the global value (that matters
when the global value changes later).  You can also use: >
	:set path<
This will make the local value of 'path' empty, so that the global value is
used.  Thus it does the same as: >
	:setlocal path=
Note: In the future more global options can be made global-local.  Using
":setlocal" on a global option might work differently then.


Setting the filetype

:setf[iletype] {filetype}			*:setf* *:setfiletype*
			Set the 'filetype' option to {filetype}, but only if
			not done yet in a sequence of (nested) autocommands.
			This is short for: >
				:if !did_filetype()
				:  setlocal filetype={filetype}
				:endif
<			This command is used in a filetype.vim file to avoid
			setting the 'filetype' option twice, causing different
			settings and syntax files to be loaded.
			{not in Vi}

:bro[wse] se[t]			*:set-browse* *:browse-set* *:opt* *:options*
:opt[ions]		Open a window for viewing and setting all options.
			Options are grouped by function.
			Offers short help for each option.  Hit <CR> on the
			short help to open a help window with more help for
			the option.
			Modify the value of the option and hit <CR> on the
			"set" line to set the new value.  For window and
			buffer specific options, the last accessed window is
			used to set the option value in, unless this is a help
			window, in which case the window below help window is
			used (skipping the option-window).
			{not available when compiled without the |+eval| or
			|+autocmd| features}

								*$HOME*
Using "~" is like using "$HOME", but it is only recognized at the start of an
option and after a space or comma.

On Unix systems "~user" can be used too.  It is replaced by the home directory
of user "user".  Example: >
    :set path=~mool/include,/usr/include,.

On Unix systems the form "${HOME}" can be used too.  The name between {} can
contain non-id characters then.  Note that if you want to use this for the
"gf" command, you need to add the '{' and '}' characters to 'isfname'.

NOTE: expanding environment variables and "~/" is only done with the ":set"
command, not when assigning a value to an option with ":let".


Note the maximum length of an expanded option is limited.  How much depends on
the system, mostly it is something like 256 or 1024 characters.

							*:fix* *:fixdel*
:fix[del]		Set the value of 't_kD':
				't_kb' is     't_kD' becomes	~
				  CTRL-?	CTRL-H
				not CTRL-?	CTRL-?

			(CTRL-? is 0177 octal, 0x7f hex) {not in Vi}

			If your delete key terminal code is wrong, but the
			code for backspace is alright, you can put this in
			your .vimrc: >
				:fixdel
<			This works no matter what the actual code for
			backspace is.

			If the backspace key terminal code is wrong you can
			use this: >
				:if &term == "termname"
				:  set t_kb=^V<BS>
				:  fixdel
				:endif
<			Where "^V" is CTRL-V and "<BS>" is the backspace key
			(don't type four characters!).  Replace "termname"
			with your terminal name.

			If your <Delete> key sends a strange key sequence (not
			CTRL-? or CTRL-H) you cannot use ":fixdel".  Then use: >
				:if &term == "termname"
				:  set t_kD=^V<Delete>
				:endif
<			Where "^V" is CTRL-V and "<Delete>" is the delete key
			(don't type eight characters!).  Replace "termname"
			with your terminal name.

							*Linux-backspace*
			Note about Linux: By default the backspace key
			produces CTRL-?, which is wrong.  You can fix it by
			putting this line in your rc.local: >
				echo "keycode 14 = BackSpace" | loadkeys
<
							*NetBSD-backspace*
			Note about NetBSD: If your backspace doesn't produce
			the right code, try this: >
				xmodmap -e "keycode 22 = BackSpace"
<			If this works, add this in your .Xmodmap file: >
				keysym 22 = BackSpace
<			You need to restart for this to take effect.

==============================================================================
2. Automatically setting options			*auto-setting*

Besides changing options with the ":set" command, there are three alternatives
to set options automatically for one or more files:

1. When starting Vim initializations are read from various places.  See
   |initialization|.  Most of them are performed for all editing sessions,
   and some of them depend on the directory where Vim is started.
   You can create an initialization file with |:mkvimrc|, |:mkview| and
   |:mksession|.
2. If you start editing a new file, the automatic commands are executed.
   This can be used to set options for files matching a particular pattern and
   many other things.  See |autocommand|.
3. If you start editing a new file, and the 'modeline' option is on, a
   number of lines at the beginning and end of the file are checked for
   modelines.  This is explained here.

					*modeline* *vim:* *vi:* *ex:* *E520*
There are two forms of modelines.  The first form:
	[text]{white}{vi:|vim:|ex:}[white]{options}

[text]		any text or empty
{white}		at least one blank character (<Space> or <Tab>)
{vi:|vim:|ex:}	the string "vi:", "vim:" or "ex:"
[white]		optional white space
{options}	a list of option settings, separated with white space or ':',
		where each part between ':' is the argument for a ":set"
		command

Example:
   vi:noai:sw=3 ts=6 ~

The second form (this is compatible with some versions of Vi):

	[text]{white}{vi:|vim:|ex:}[white]se[t] {options}:[text]

[text]		any text or empty
{white}		at least one blank character (<Space> or <Tab>)
{vi:|vim:|ex:}	the string "vi:", "vim:" or "ex:"
[white]		optional white space
se[t]		the string "set " or "se " (note the space)
{options}	a list of options, separated with white space, which is the
		argument for a ":set" command
:		a colon
[text]		any text or empty

Example:
   /* vim: set ai tw=75: */ ~

The white space before {vi:|vim:|ex:} is required.  This minimizes the chance
that a normal word like "lex:" is caught.  There is one exception: "vi:" and
"vim:" can also be at the start of the line (for compatibility with version
3.0).  Using "ex:" at the start of the line will be ignored (this could be
short for "example:").

							*modeline-local*
The options are set like with ":setlocal": The new value only applies to the
buffer and window that contain the file.  Although it's possible to set global
options from a modeline, this is unusual.  If you have two windows open and
the files in it set the same global option to a different value, the result
depends on which one was opened last.

When editing a file that was already loaded, only the window-local options
from the modeline are used.  Thus if you manually changed a buffer-local
option after opening the file, it won't be changed if you edit the same buffer
in another window.  But window-local options will be set.

							*modeline-version*
If the modeline is only to be used for some versions of Vim, the version
number can be specified where "vim:" is used:
	vim{vers}:	version {vers} or later
	vim<{vers}:	version before {vers}
	vim={vers}:	version {vers}
	vim>{vers}:	version after {vers}
{vers} is 600 for Vim 6.0 (hundred times the major version plus minor).
For example, to use a modeline only for Vim 6.0 and later:
	/* vim600: set foldmethod=marker: */ ~
To use a modeline for Vim before version 5.7:
	/* vim<570: set sw=4: */ ~
There can be no blanks between "vim" and the ":".


The number of lines that are checked can be set with the 'modelines' option.
If 'modeline' is off or 'modelines' is 0 no lines are checked.

Note that for the first form all of the rest of the line is used, thus a line
like:
   /* vi:ts=4: */ ~
will give an error message for the trailing "*/".  This line is OK:
   /* vi:set ts=4: */ ~

If an error is detected the rest of the line is skipped.

If you want to include a ':' in a set command precede it with a '\'.  The
backslash in front of the ':' will be removed.  Example:
   /* vi:set dir=c\:\tmp: */ ~
This sets the 'dir' option to "c:\tmp".  Only a single backslash before the
':' is removed.  Thus to include "\:" you have to specify "\\:".

No other commands than "set" are supported, for security reasons (somebody
might create a Trojan horse text file with modelines).

Hint: If you would like to do something else than setting an option, you could
define an autocommand that checks the file for a specific string.  For
example: >
	au BufReadPost * if getline(1) =~ "VAR" | call SetVar() | endif
And define a function SetVar() that does something with the line containing
"VAR".

==============================================================================
3. Options summary					*option-summary*

In the list below all the options are mentioned with their full name and with
an abbreviation if there is one.  Both forms may be used.

In this document when a boolean option is "set" that means that ":set option"
is entered.  When an option is "reset", ":set nooption" is used.

For some options there are two default values: The "Vim default", which is
used when 'compatible' is not set, and the "Vi default", which is used when
'compatible' is set.

Most options are the same in all windows and buffers.  There are a few that
are specific to how the text is presented in a window.  These can be set to a
different value in each window.  For example the 'list' option can be set in
one window and reset in another for the same text, giving both types of view
at the same time.  There are a few options that are specific to a certain
file.  These can have a different value for each file or buffer.  For example
the 'textwidth' option can be 78 for a normal text file and 0 for a C
program.

	global			one option for all buffers and windows
	local to window		each window has its own copy of this option
	local to buffer		each buffer has its own copy of this option

When creating a new window the option values from the currently active window
are used as a default value for the window-specific options.  For the
buffer-specific options this depends on the 's' and 'S' flags in the
'cpoptions' option.  If 's' is included (which is the default) the values for
buffer options are copied from the currently active buffer when a buffer is
first entered.  If 'S' is present the options are copied each time the buffer
is entered, this is almost like having global options.  If 's' and 'S' are not
present, the options are copied from the currently active buffer when the
buffer is created.

Hidden options						*hidden-options*

Not all options are supported in all versions.  This depends on the supported
features and sometimes on the system.  A remark about this is in curly braces
below.  When an option is not supported it may still be set without getting an
error, this is called a hidden option.  You can't get the value of a hidden
option though, it is not stored.

To test if option "foo" can be used with ":set" use something like this: >
	if exists('&foo')
This also returns true for a hidden option.  To test if option "foo" is really
supported use something like this: >
	if exists('+foo')
<
							*E355*
A jump table for the options with a short description can be found at |Q_op|.

					*'aleph'* *'al'* *aleph* *Aleph*
'aleph' 'al'		number	(default 128 for MS-DOS, 224 otherwise)
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	The ASCII code for the first letter of the Hebrew alphabet.  The
	routine that maps the keyboard in Hebrew mode, both in Insert mode
	(when hkmap is set) and on the command-line (when hitting CTRL-_)
	outputs the Hebrew characters in the range [aleph..aleph+26].
	aleph=128 applies to PC code, and aleph=224 applies to ISO 8859-8.
	See |rileft.txt|.

			*'allowrevins'* *'ari'* *'noallowrevins'* *'noari'*
'allowrevins' 'ari'	boolean	(default off)
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	Allow CTRL-_ in Insert and Command-line mode.  This is default off, to
	avoid that users that accidentally type CTRL-_ instead of SHIFT-_ get
	into reverse Insert mode, and don't know how to get out.  See
	'revins'.
	NOTE: This option is reset when 'compatible' is set.

			 *'altkeymap'* *'akm'* *'noaltkeymap'* *'noakm'*
'altkeymap' 'akm'	boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the |+farsi|
			feature}
	When on, the second language is Farsi.  In editing mode CTRL-_ toggles
	the keyboard map between Farsi and English, when 'allowrevins' set.

	When off, the keyboard map toggles between Hebrew and English.  This
	is useful to start the Vim in native mode i.e. English (left-to-right
	mode) and have default second language Farsi or Hebrew (right-to-left
	mode).  See |farsi.txt|.

						*'ambiwidth'* *'ambw'*
'ambiwidth' 'ambw'	string (default: "single")
			global
			{not in Vi}
			{only available when compiled with the |+multi_byte|
			feature}
	Only effective when 'encoding' is "utf-8" or another Unicode encoding.
	Tells Vim what to do with characters with East Asian Width Class
	Ambiguous (such as Euro, Registered Sign, Copyright Sign, Greek
	letters, Cyrillic letters).

	There are currently two possible values:
	"single":	Use the same width as characters in US-ASCII.  This is
			expected by most users.
	"double":	Use twice the width of ASCII characters.

	There are a number of CJK fonts for which the width of glyphs for
	those characters are solely based on how many octets they take in
	legacy/traditional CJK encodings.  In those encodings, Euro,
	Registered sign, Greek/Cyrillic letters are represented by two octets,
	therefore those fonts have "wide" glyphs for them.  This is also
	true of some line drawing characters used to make tables in text
	file.  Therefore, when a CJK font is used for GUI Vim or
	Vim is running inside a terminal (emulators) that uses a CJK font
	(or Vim is run inside an xterm invoked with "-cjkwidth" option.),
	this option should be set to "double" to match the width perceived
	by Vim with the width of glyphs in the font.  Perhaps it also has
	to be set to "double" under CJK Windows 9x/ME or Windows 2k/XP
	when the system locale is set to one of CJK locales.  See Unicode
	Standard Annex #11 (http://www.unicode.org/reports/tr11).

			*'antialias'* *'anti'* *'noantialias'* *'noanti'*
'antialias' 'anti'	boolean (default: off)
			global
			{not in Vi}
			{only available when compiled with GUI enabled
			on Mac OS X}
	This option only has an effect in the GUI version of Vim on Mac OS X
	v10.2 or later.  When on, Vim will use smooth ("antialiased") fonts,
	which can be easier to read at certain sizes on certain displays.
	Setting this option can sometimes cause problems if 'guifont' is set
	to its default (empty string).

			*'autochdir'* *'acd'* *'noautochdir'* *'noacd'*
'autochdir' 'acd'	boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the
			|+netbeans_intg| or |+sun_workshop| feature}
	When on, Vim will change the current working directory whenever you
	open a file, switch buffers, delete a buffer or open/close a window.
	It will change to the directory containing the file which was opened
	or selected.
	This option is provided for backward compatibility with the Vim
	released with Sun ONE Studio 4 Enterprise Edition.
	Note: When this option is on some plugins may not work.

				*'arabic'* *'arab'* *'noarabic'* *'noarab'*
'arabic' 'arab'		boolean (default off)
			local to window
			{not in Vi}
			{only available when compiled with the |+arabic|
			feature}
	This option can be set to start editing Arabic text.
	Setting this option will:
	- Set the 'rightleft' option, unless 'termbidi' is set.
	- Set the 'arabicshape' option, unless 'termbidi' is set.
	- Set the 'keymap' option to "arabic"; in Insert mode CTRL-^ toggles
	  between typing English and Arabic key mapping.
	- Set the 'delcombine' option
	Note that 'encoding' must be "utf-8" for working with Arabic text.

	Resetting this option will:
	- Reset the 'rightleft' option.
	- Disable the use of 'keymap' (without changing its value).
	Note that 'arabicshape' and 'delcombine' are not reset (it is a global
	option.
	Also see |arabic.txt|.

					*'arabicshape'* *'arshape'*
					*'noarabicshape'* *'noarshape'*
'arabicshape' 'arshape'	boolean (default on)
			global
			{not in Vi}
			{only available when compiled with the |+arabic|
			feature}
	When on and 'termbidi' is off, the required visual character
	corrections that need to take place for displaying the Arabic language
	take affect.  Shaping, in essence, gets enabled; the term is a broad
	one which encompasses:
	  a) the changing/morphing of characters based on their location
	     within a word (initial, medial, final and stand-alone).
	  b) the enabling of the ability to compose characters
	  c) the enabling of the required combining of some characters
	When disabled the character display reverts back to each character's
	true stand-alone form.
	Arabic is a complex language which requires other settings, for
	further details see |arabic.txt|.

			*'autoindent'* *'ai'* *'noautoindent'* *'noai'*
'autoindent' 'ai'	boolean	(default off)
			local to buffer
	Copy indent from current line when starting a new line (typing <CR>
	in Insert mode or when using the "o" or "O" command).  If you do not
	type anything on the new line except <BS> or CTRL-D and then type
	<Esc> or <CR>, the indent is deleted again.  Moving the cursor to
	another line has the same effect, unless the 'I' flag is included in
	'cpoptions'.
	When autoindent is on, formatting (with the "gq" command or when you
	reach 'textwidth' in Insert mode) uses the indentation of the first
	line.
	When 'smartindent' or 'cindent' is on the indent is changed in
	a different way.
	The 'autoindent' option is reset when the 'paste' option is set.
	{small difference from Vi: After the indent is deleted when typing
	<Esc> or <CR>, the cursor position when moving up or down is after the
	deleted indent; Vi puts the cursor somewhere in the deleted indent}.

				 *'autoread'* *'ar'* *'noautoread'* *'noar'*
'autoread' 'ar'		boolean	(default off)
			global or local to buffer |global-local|
			{not in Vi}
	When a file has been detected to have been changed outside of Vim and
	it has not been changed inside of Vim, automatically read it again.
	When the file has been deleted this is not done.  |timestamp|
	If this option has a local value, use this command to switch back to
	using the global value: >
		:set autoread<
<
				 *'autowrite'* *'aw'* *'noautowrite'* *'noaw'*
'autowrite' 'aw'	boolean	(default off)
			global
	Write the contents of the file, if it has been modified, on each
	:next, :rewind, :last, :first, :previous, :stop, :suspend, :tag, :!,
	:make, CTRL-] and CTRL-^ command; and when a :buffer, CTRL-O, CTRL-I,
	'{A-Z0-9}, or `{A-Z0-9} command takes one to another file.
	Note that for some commands the 'autowrite' option is not used, see
	'autowriteall' for that.

			 *'autowriteall'* *'awa'* *'noautowriteall'* *'noawa'*
'autowriteall' 'awa'	boolean	(default off)
			global
			{not in Vi}
	Like 'autowrite', but also used for commands ":edit", ":enew", ":quit",
	":qall", ":exit", ":xit", ":recover" and closing the Vim window.
	Setting this option also implies that Vim behaves like 'autowrite' has
	been set.

							*'background'* *'bg'*
'background' 'bg'	string	(default "dark" or "light")
			global
			{not in Vi}
	When set to "dark", Vim will try to use colors that look good on a
	dark background.  When set to "light", Vim will try to use colors that
	look good on a light background.  Any other value is illegal.
	Vim tries to set the default value according to the terminal used.
	This will not always be correct.
	Setting this option does not change the background color, it tells Vim
	what the background color looks like.  For changing the background
	color, see |:hi-normal|.

	When 'background' is set Vim will adjust the default color groups for
	the new value.  But the colors used for syntax highlighting will not
	change.
	When a color scheme is loaded (the "colors_name" variable is set)
	setting 'background' will cause the color scheme to be reloaded.  If
	the color scheme adjusts to the value of 'background' this will work.
	However, if the color scheme sets 'background' itself the effect may
	be undone.  First delete the "colors_name" variable when needed.

	When setting 'background' to the default value with: >
		:set background&
<	Vim will guess the value.  In the GUI this should work correctly,
	in other cases Vim might not be able to guess the right value.

	When starting the GUI, the default value for 'background' will be
	"light".  When the value is not set in the .gvimrc, and Vim detects
	that the background is actually quite dark, 'background' is set to
	"dark".  But this happens only AFTER the .gvimrc file has been read
	(because the window needs to be opened to find the actual background
	color).  To get around this, force the GUI window to be opened by
	putting a ":gui" command in the .gvimrc file, before where the value
	of 'background' is used (e.g., before ":syntax on").
	Normally this option would be set in the .vimrc file.  Possibly
	depending on the terminal name.  Example: >
		:if &term == "pcterm"
		:  set background=dark
		:endif
<	When this option is set, the default settings for the highlight groups
	will change.  To use other settings, place ":highlight" commands AFTER
	the setting of the 'background' option.
	This option is also used in the "$VIMRUNTIME/syntax/syntax.vim" file
	to select the colors for syntax highlighting.  After changing this
	option, you must load syntax.vim again to see the result.  This can be
	done with ":syntax on".

							*'backspace'* *'bs'*
'backspace' 'bs'	string	(default "")
			global
			{not in Vi}
	Influences the working of <BS>, <Del>, CTRL-W and CTRL-U in Insert
	mode.  This is a list of items, separated by commas.  Each item allows
	a way to backspace over something:
	value	effect	~
	indent	allow backspacing over autoindent
	eol	allow backspacing over line breaks (join lines)
	start	allow backspacing over the start of insert; CTRL-W and CTRL-U
		stop once at the start of insert.

	When the value is empty, Vi compatible backspacing is used.

	For backwards compatibility with version 5.4 and earlier:
	value	effect	~
	  0	same as ":set backspace=" (Vi compatible)
	  1	same as ":set backspace=indent,eol"
	  2	same as ":set backspace=indent,eol,start"

	See |:fixdel| if your <BS> or <Del> key does not do what you want.
	NOTE: This option is set to "" when 'compatible' is set.

				*'backup'* *'bk'* *'nobackup'* *'nobk'*
'backup' 'bk'		boolean	(default off)
			global
			{not in Vi}
	Make a backup before overwriting a file.  Leave it around after the
	file has been successfully written.  If you do not want to keep the
	backup file, but you do want a backup while the file is being
	written, reset this option and set the 'writebackup' option (this is
	the default).  If you do not want a backup file at all reset both
	options (use this if your file system is almost full).  See the
	|backup-table| for more explanations.
	When the 'backupskip' pattern matches, a backup is not made anyway.
	When 'patchmode' is set, the backup may be renamed to become the
	oldest version of a file.
	NOTE: This option is reset when 'compatible' is set.

						*'backupcopy'* *'bkc'*
'backupcopy' 'bkc'	string	(Vi default for Unix: "yes", otherwise: "auto")
			global
			{not in Vi}
	When writing a file and a backup is made, this option tells how it's
	done.  This is a comma separated list of words.

	The main values are:
	"yes"	make a copy of the file and overwrite the original one
	"no"	rename the file and write a new one
	"auto"	one of the previous, what works best

	Extra values that can be combined with the ones above are:
	"breaksymlink"	always break symlinks when writing
	"breakhardlink"	always break hardlinks when writing

	Making a copy and overwriting the original file:
	- Takes extra time to copy the file.
	+ When the file has special attributes, is a (hard/symbolic) link or
	  has a resource fork, all this is preserved.
	- When the file is a link the backup will have the name of the link,
	  not of the real file.

	Renaming the file and writing a new one:
	+ It's fast.
	- Sometimes not all attributes of the file can be copied to the new
	  file.
	- When the file is a link the new file will not be a link.

	The "auto" value is the middle way: When Vim sees that renaming file
	is possible without side effects (the attributes can be passed on and
	and the file is not a link) that is used.  When problems are expected,
	a copy will be made.

	The "breaksymlink" and "breakhardlink" values can be used in
	combination with any of "yes", "no" and "auto".  When included, they
	force Vim to always break either symbolic or hard links by doing
	exactly what the "no" option does, renaming the original file to
	become the backup and writing a new file in its place.  This can be
	useful for example in source trees where all the files are symbolic or
	hard links and any changes should stay in the local source tree, not
	be propagated back to the original source.
							*crontab*
	One situation where "no" and "auto" will cause problems: A program
	that opens a file, invokes Vim to edit that file, and then tests if
	the open file was changed (through the file descriptor) will check the
	backup file instead of the newly created file.  "crontab -e" is an
	example.

	When a copy is made, the original file is truncated and then filled
	with the new text.  This means that protection bits, owner and
	symbolic links of the original file are unmodified.  The backup file
	however, is a new file, owned by the user who edited the file.  The
	group of the backup is set to the group of the original file.  If this
	fails, the protection bits for the group are made the same as for
	others.

	When the file is renamed this is the other way around: The backup has
	the same attributes of the original file, and the newly written file
	is owned by the current user.  When the file was a (hard/symbolic)
	link, the new file will not!  That's why the "auto" value doesn't
	rename when the file is a link.  The owner and group of the newly
	written file will be set to the same ones as the original file, but
	the system may refuse to do this.  In that case the "auto" value will
	again not rename the file.

						*'backupdir'* *'bdir'*
'backupdir' 'bdir'	string	(default for Amiga: ".,t:",
				 for MS-DOS and Win32: ".,c:/tmp,c:/temp"
				 for Unix: ".,~/tmp,~/")
			global
			{not in Vi}
	List of directories for the backup file, separated with commas.
	- The backup file will be created in the first directory in the list
	  where this is possible.
	- Empty means that no backup file will be created ('patchmode' is
	  impossible!).  Writing may fail because of this.
	- A directory "." means to put the backup file in the same directory
	  as the edited file.
	- A directory starting with "./" (or ".\" for MS-DOS et al.) means to
	  put the backup file relative to where the edited file is.  The
	  leading "." is replaced with the path name of the edited file.
	  ("." inside a directory name has no special meaning).
	- Spaces after the comma are ignored, other spaces are considered part
	  of the directory name.  To have a space at the start of a directory
	  name, precede it with a backslash.
	- To include a comma in a directory name precede it with a backslash.
	- A directory name may end in an '/'.
	- Environment variables are expanded |:set_env|.
	- Careful with '\' characters, type one before a space, type two to
	  get one in the option (see |option-backslash|), for example: >
	    :set bdir=c:\\tmp,\ dir\\,with\\,commas,\\\ dir\ with\ spaces
<	- For backwards compatibility with Vim version 3.0 a '>' at the start
	  of the option is removed.
	See also 'backup' and 'writebackup' options.
	If you want to hide your backup files on Unix, consider this value: >
		:set backupdir=./.backup,~/.backup,.,/tmp
<	You must create a ".backup" directory in each directory and in your
	home directory for this to work properly.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	directories from the list.  This avoids problems when a future version
	uses another default.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'backupext'* *'bex'* *E589*
'backupext' 'bex'	string	(default "~", for VMS: "_")
			global
			{not in Vi}
	String which is appended to a file name to make the name of the
	backup file.  The default is quite unusual, because this avoids
	accidentally overwriting existing files with a backup file.  You might
	prefer using ".bak", but make sure that you don't have files with
	".bak" that you want to keep.
	Only normal file name characters can be used, "/\*?[|<>" are illegal.

	If you like to keep a lot of backups, you could use a BufWritePre
	autocommand to change 'backupext' just before writing the file to
	include a timestamp. >
		:au BufWritePre * let &bex = '-' . strftime("%Y%b%d%X") . '~'
<	Use 'backupdir' to put the backup in a different directory.

						*'backupskip'* *'bsk'*
'backupskip' 'bsk'	string	(default: "/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*")
			global
			{not in Vi}
			{not available when compiled without the |+wildignore|
			feature}
	A list of file patterns.  When one of the patterns matches with the
	name of the file which is written, no backup file is created.  Both
	the specified file name and the full path name of the file are used.
	The pattern is used like with |:autocmd|, see |autocmd-patterns|.
	Watch out for special characters, see |option-backslash|.
	When $TMPDIR, $TMP or $TEMP is not defined, it is not used for the
	default value.  "/tmp/*" is only used for Unix.
	Note that the default also makes sure that "crontab -e" works (when a
	backup would be made by renaming the original file crontab won't see
	the newly created file).  Also see 'backupcopy' and |crontab|.

						*'balloondelay'* *'bdlay'*
'balloondelay' 'bdlay'	number	(default: 600)
			global
			{not in Vi}
			{only available when compiled with the |+balloon_eval|
			feature}
	Delay in milliseconds before a balloon may pop up.  See |balloon-eval|.

		       *'ballooneval'* *'beval'* *'noballooneval'* *'nobeval'*
'ballooneval' 'beval'	boolean	(default off)
			global
			{not in Vi}
			{only available when compiled with the |+balloon_eval|
			feature}
	Switch on the |balloon-eval| functionality.

						     *'balloonexpr'* *'bexpr'*
'balloonexpr' 'bexpr'	string	(default "")
			global or local to buffer |global-local|
			{not in Vi}
			{only available when compiled with the |+balloon_eval|
			feature}
	Expression for text to show in evaluation balloon.  It is only used
	when 'ballooneval' is on.  These variables can be used:

	v:beval_bufnr	number of the buffer in which balloon is going to show
	v:beval_winnr	number of the window
	v:beval_lnum	line number
	v:beval_col	column number (byte index)
	v:beval_text	word under or after the mouse pointer

	The evaluation of the expression must not have side effects!
	Example: >
    function! MyBalloonExpr()
	return 'Cursor is at line ' . v:beval_lnum .
		\', column ' . v:beval_col .
		\ ' of file ' .  bufname(v:beval_bufnr) .
		\ ' on word "' . v:beval_text . '"'
    endfunction
    set bexpr=MyBalloonExpr()
    set ballooneval
<
	NOTE: The balloon is displayed only if the cursor is on a text
	character.  If the result of evaluating 'balloonexpr' is not empty,
	Vim does not try to send a message to an external debugger (Netbeans
	or Sun Workshop).

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'balloonexpr' |textlock|.

	To check whether line breaks in the balloon text work use this check: >
		if has("balloon_multiline")
<	When they are supported "\n" characters will start a new line.  If the
	expression evaluates to a |List| this is equal to using each List item
	as a string and putting "\n" in between them.

				     *'binary'* *'bin'* *'nobinary'* *'nobin'*
'binary' 'bin'		boolean	(default off)
			local to buffer
			{not in Vi}
	This option should be set before editing a binary file.  You can also
	use the |-b| Vim argument.  When this option is switched on a few
	options will be changed (also when it already was on):
		'textwidth'  will be set to 0
		'wrapmargin' will be set to 0
		'modeline'   will be off
		'expandtab'  will be off
	Also, 'fileformat' and 'fileformats' options will not be used, the
	file is read and written like 'fileformat' was "unix" (a single <NL>
	separates lines).
	The 'fileencoding' and 'fileencodings' options will not be used, the
	file is read without conversion.
	NOTE: When you start editing a(nother) file while the 'bin' option is
	on, settings from autocommands may change the settings again (e.g.,
	'textwidth'), causing trouble when editing.  You might want to set
	'bin' again when the file has been loaded.
	The previous values of these options are remembered and restored when
	'bin' is switched from on to off.  Each buffer has its own set of
	saved option values.
	To edit a file with 'binary' set you can use the |++bin| argument.
	This avoids you have to do ":set bin", which would have effect for all
	files you edit.
	When writing a file the <EOL> for the last line is only written if
	there was one in the original file (normally Vim appends an <EOL> to
	the last line if there is none; this would make the file longer).  See
	the 'endofline' option.

			*'bioskey'* *'biosk'* *'nobioskey'* *'nobiosk'*
'bioskey' 'biosk'	boolean	(default on)
			global
			{not in Vi}  {only for MS-DOS}
	When on the BIOS is called to obtain a keyboard character.  This works
	better to detect CTRL-C, but only works for the console.  When using a
	terminal over a serial port reset this option.
	Also see |'conskey'|.

							*'bomb'* *'nobomb'*
'bomb'			boolean	(default off)
			local to buffer
			{not in Vi}
			{only available when compiled with the |+multi_byte|
			feature}
	When writing a file and the following conditions are met, a BOM (Byte
	Order Mark) is prepended to the file:
	- this option is on
	- the 'binary' option is off
	- 'fileencoding' is "utf-8", "ucs-2", "ucs-4" or one of the little/big
	  endian variants.
	Some applications use the BOM to recognize the encoding of the file.
	Often used for UCS-2 files on MS-Windows.  For other applications it
	causes trouble, for example: "cat file1 file2" makes the BOM of file2
	appear halfway the resulting file.
	When Vim reads a file and 'fileencodings' starts with "ucs-bom", a
	check for the presence of the BOM is done and 'bomb' set accordingly.
	Unless 'binary' is set, it is removed from the first line, so that you
	don't see it when editing.  When you don't change the options, the BOM
	will be restored when writing the file.

						*'breakat'* *'brk'*
'breakat' 'brk'		string	(default " ^I!@*-+;:,./?")
			global
			{not in Vi}
			{not available when compiled without the  |+linebreak|
			feature}
	This option lets you choose which characters might cause a line
	break if 'linebreak' is on.  Only works for ASCII and also for 8-bit
	characters when 'encoding' is an 8-bit encoding.

						*'browsedir'* *'bsdir'*
'browsedir' 'bsdir'	string	(default: "last")
			global
			{not in Vi} {only for Motif and Win32 GUI}
	Which directory to use for the file browser:
	   last		Use same directory as with last file browser.
	   buffer	Use the directory of the related buffer.
	   current	Use the current directory.
	   {path}	Use the specified directory

						*'bufhidden'* *'bh'*
'bufhidden' 'bh'	string (default: "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	This option specifies what happens when a buffer is no longer
	displayed in a window:
	  <empty>	follow the global 'hidden' option
	  hide		hide the buffer (don't unload it), also when 'hidden'
			is not set
	  unload	unload the buffer, also when 'hidden' is set or using
			|:hide|
	  delete	delete the buffer from the buffer list, also when
			'hidden' is set or using |:hide|, like using
			|:bdelete|
	  wipe		wipe out the buffer from the buffer list, also when
			'hidden' is set or using |:hide|, like using
			|:bwipeout|

	CAREFUL: when "unload", "delete" or "wipe" is used changes in a buffer
	are lost without a warning.
	This option is used together with 'buftype' and 'swapfile' to specify
	special kinds of buffers.   See |special-buffers|.

			*'buflisted'* *'bl'* *'nobuflisted'* *'nobl'* *E85*
'buflisted' 'bl'	boolean (default: on)
			local to buffer
			{not in Vi}
	When this option is set, the buffer shows up in the buffer list.  If
	it is reset it is not used for ":bnext", "ls", the Buffers menu, etc.
	This option is reset by Vim for buffers that are only used to remember
	a file name or marks.  Vim sets it when starting to edit a buffer.
	But not when moving to a buffer with ":buffer".

						*'buftype'* *'bt'* *E382*
'buftype' 'bt'		string (default: "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	The value of this option specifies the type of a buffer:
	  <empty>	normal buffer
	  nofile	buffer which is not related to a file and will not be
			written
	  nowrite	buffer which will not be written
	  acwrite	buffer which will always be written with BufWriteCmd
			autocommands. {not available when compiled without the
			|+autocmd| feature}
	  quickfix	quickfix buffer, contains list of errors |:cwindow|
			or list of locations |:lwindow|
	  help		help buffer (you are not supposed to set this
			manually)

	This option is used together with 'bufhidden' and 'swapfile' to
	specify special kinds of buffers.   See |special-buffers|.

	Be careful with changing this option, it can have many side effects!

	A "quickfix" buffer is only used for the error list and the location
	list.  This value is set by the |:cwindow| and |:lwindow| commands and
	you are not supposed to change it.

	"nofile" and "nowrite" buffers are similar:
	both:		The buffer is not to be written to disk, ":w" doesn't
			work (":w filename" does work though).
	both:		The buffer is never considered to be |'modified'|.
			There is no warning when the changes will be lost, for
			example when you quit Vim.
	both:		A swap file is only created when using too much memory
			(when 'swapfile' has been reset there is never a swap
			file).
	nofile only:	The buffer name is fixed, it is not handled like a
			file name.  It is not modified in response to a |:cd|
			command.
							*E676*
	"acwrite" implies that the buffer name is not related to a file, like
	"nofile", but it will be written.  Thus, in contrast to "nofile" and
	"nowrite", ":w" does work and a modified buffer can't be abandoned
	without saving.  For writing there must be matching |BufWriteCmd|,
	|FileWriteCmd| or |FileAppendCmd| autocommands.

						*'casemap'* *'cmp'*
'casemap' 'cmp'		string	(default: "internal,keepascii")
			global
			{not in Vi}
			{only available when compiled with the |+multi_byte|
			feature}
	Specifies details about changing the case of letters.  It may contain
	these words, separated by a comma:
	internal	Use internal case mapping functions, the current
			locale does not change the case mapping.  This only
			matters when 'encoding' is a Unicode encoding,
			"latin1" or "iso-8859-15".  When "internal" is
			omitted, the towupper() and towlower() system library
			functions are used when available.
	keepascii	For the ASCII characters (0x00 to 0x7f) use the US
			case mapping, the current locale is not effective.
			This probably only matters for Turkish.

						*'cdpath'* *'cd'* *E344* *E346*
'cdpath' 'cd'		string	(default: equivalent to $CDPATH or ",,")
			global
			{not in Vi}
			{not available when compiled without the
			|+file_in_path| feature}
	This is a list of directories which will be searched when using the
	|:cd| and |:lcd| commands, provided that the directory being searched
	for has a relative path (not starting with "/", "./" or "../").
	The 'cdpath' option's value has the same form and semantics as
	|'path'|.  Also see |file-searching|.
	The default value is taken from $CDPATH, with a "," prepended to look
	in the current directory first.
	If the default value taken from $CDPATH is not what you want, include
	a modified version of the following command in your vimrc file to
	override it: >
	  :let &cdpath = ',' . substitute(substitute($CDPATH, '[, ]', '\\\0', 'g'), ':', ',', 'g')
<	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.
	(parts of 'cdpath' can be passed to the shell to expand file names).

						*'cedit'*
'cedit'			string	(Vi default: "", Vim default: CTRL-F)
			global
			{not in Vi}
			{not available when compiled without the |+vertsplit|
			feature}
	The key used in Command-line Mode to open the command-line window.
	The default is CTRL-F when 'compatible' is off.
	Only non-printable keys are allowed.
	The key can be specified as a single character, but it is difficult to
	type.  The preferred way is to use the <> notation.  Examples: >
		:set cedit=<C-Y>
		:set cedit=<Esc>
<	|Nvi| also has this option, but it only uses the first character.
	See |cmdwin|.

				*'charconvert'* *'ccv'* *E202* *E214* *E513*
'charconvert' 'ccv'	string (default "")
			global
			{only available when compiled with the |+multi_byte|
			feature and the |+eval| feature}
			{not in Vi}
	An expression that is used for character encoding conversion.  It is
	evaluated when a file that is to be read or has been written has a
	different encoding from what is desired.
	'charconvert' is not used when the internal iconv() function is
	supported and is able to do the conversion.  Using iconv() is
	preferred, because it is much faster.
	'charconvert' is not used when reading stdin |--|, because there is no
	file to convert from.  You will have to save the text in a file first.
	The expression must return zero or an empty string for success,
	non-zero for failure.
	The possible encoding names encountered are in 'encoding'.
	Additionally, names given in 'fileencodings' and 'fileencoding' are
	used.
	Conversion between "latin1", "unicode", "ucs-2", "ucs-4" and "utf-8"
	is done internally by Vim, 'charconvert' is not used for this.
	'charconvert' is also used to convert the viminfo file, if the 'c'
	flag is present in 'viminfo'.  Also used for Unicode conversion.
	Example: >
		set charconvert=CharConvert()
		fun CharConvert()
		  system("recode "
			\ . v:charconvert_from . ".." . v:charconvert_to
			\ . " <" . v:fname_in . " >" v:fname_out)
		  return v:shell_error
		endfun
<	The related Vim variables are:
		v:charconvert_from	name of the current encoding
		v:charconvert_to	name of the desired encoding
		v:fname_in		name of the input file
		v:fname_out		name of the output file
	Note that v:fname_in and v:fname_out will never be the same.
	Note that v:charconvert_from and v:charconvert_to may be different
	from 'encoding'.  Vim internally uses UTF-8 instead of UCS-2 or UCS-4.
	Encryption is not done by Vim when using 'charconvert'.  If you want
	to encrypt the file after conversion, 'charconvert' should take care
	of this.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

				   *'cindent'* *'cin'* *'nocindent'* *'nocin'*
'cindent' 'cin'		boolean	(default off)
			local to buffer
			{not in Vi}
			{not available when compiled without the |+cindent|
			feature}
	Enables automatic C program indenting  See 'cinkeys' to set the keys
	that trigger reindenting in insert mode and 'cinoptions' to set your
	preferred indent style.
	If 'indentexpr' is not empty, it overrules 'cindent'.
	If 'lisp' is not on and both 'indentexpr' and 'equalprg' are empty,
	the "=" operator indents using this algorithm rather than calling an
	external program.
	See |C-indenting|.
	When you don't like the way 'cindent' works, try the 'smartindent'
	option or 'indentexpr'.
	This option is not used when 'paste' is set.
	NOTE: This option is reset when 'compatible' is set.

							*'cinkeys'* *'cink'*
'cinkeys' 'cink'	string	(default "0{,0},0),:,0#,!^F,o,O,e")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+cindent|
			feature}
	A list of keys that, when typed in Insert mode, cause reindenting of
	the current line.  Only used if 'cindent' is on and 'indentexpr' is
	empty.
	For the format of this option see |cinkeys-format|.
	See |C-indenting|.

						*'cinoptions'* *'cino'*
'cinoptions' 'cino'	string	(default "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+cindent|
			feature}
	The 'cinoptions' affect the way 'cindent' reindents lines in a C
	program.  See |cinoptions-values| for the values of this option, and
	|C-indenting| for info on C indenting in general.


						*'cinwords'* *'cinw'*
'cinwords' 'cinw'	string	(default "if,else,while,do,for,switch")
			local to buffer
			{not in Vi}
			{not available when compiled without both the
			|+cindent| and the |+smartindent| features}
	These keywords start an extra indent in the next line when
	'smartindent' or 'cindent' is set.  For 'cindent' this is only done at
	an appropriate place (inside {}).
	Note that 'ignorecase' isn't used for 'cinwords'.  If case doesn't
	matter, include the keyword both the uppercase and lowercase:
	"if,If,IF".

						*'clipboard'* *'cb'*
'clipboard' 'cb'	string	(default "autoselect,exclude:cons\|linux"
						  for X-windows, "" otherwise)
			global
			{not in Vi}
			{only in GUI versions or when the |+xterm_clipboard|
			feature is included}
	This option is a list of comma separated names.
	These names are recognized:

	unnamed		When included, Vim will use the clipboard register '*'
			for all yank, delete, change and put operations which
			would normally go to the unnamed register.  When a
			register is explicitly specified, it will always be
			used regardless of whether "unnamed" is in 'clipboard'
			or not.  The clipboard register can always be
			explicitly accessed using the "* notation.  Also see
			|gui-clipboard|.

	autoselect	Works like the 'a' flag in 'guioptions': If present,
			then whenever Visual mode is started, or the Visual
			area extended, Vim tries to become the owner of the
			windowing system's global selection or put the
			selected text on the clipboard used by the selection
			register "*.  See |guioptions_a| and |quotestar| for
			details.  When the GUI is active, the 'a' flag in
			'guioptions' is used, when the GUI is not active, this
			"autoselect" flag is used.
			Also applies to the modeless selection.

	autoselectml	Like "autoselect", but for the modeless selection
			only.  Compare to the 'A' flag in 'guioptions'.

	exclude:{pattern}
			Defines a pattern that is matched against the name of
			the terminal 'term'.  If there is a match, no
			connection will be made to the X server.  This is
			useful in this situation:
			- Running Vim in a console.
			- $DISPLAY is set to start applications on another
			  display.
			- You do not want to connect to the X server in the
			  console, but do want this in a terminal emulator.
			To never connect to the X server use: >
				exclude:.*
<			This has the same effect as using the |-X| argument.
			Note that when there is no connection to the X server
			the window title won't be restored and the clipboard
			cannot be accessed.
			The value of 'magic' is ignored, {pattern} is
			interpreted as if 'magic' was on.
			The rest of the option value will be used for
			{pattern}, this must be the last entry.

						*'cmdheight'* *'ch'*
'cmdheight' 'ch'	number	(default 1)
			global
			{not in Vi}
	Number of screen lines to use for the command-line.  Helps avoiding
	|hit-enter| prompts.
	The value of this option is stored with the tab page, so that each tab
	page can have a different value.

						*'cmdwinheight'* *'cwh'*
'cmdwinheight' 'cwh'	number	(default 7)
			global
			{not in Vi}
			{not available when compiled without the |+vertsplit|
			feature}
	Number of screen lines to use for the command-line window. |cmdwin|

						*'columns'* *'co'* *E594*
'columns' 'co'		number	(default 80 or terminal width)
			global
			{not in Vi}
	Number of columns of the screen.  Normally this is set by the terminal
	initialization and does not have to be set by hand.  Also see
	|posix-screen-size|.
	When Vim is running in the GUI or in a resizable window, setting this
	option will cause the window size to be changed.  When you only want
	to use the size for the GUI, put the command in your |gvimrc| file.
	When you set this option and Vim is unable to change the physical
	number of columns of the display, the display may be messed up.
	Minimum value is 12, maximum value is 10000.

					*'comments'* *'com'* *E524* *E525*
'comments' 'com'	string	(default
				"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+comments|
			feature}
	A comma separated list of strings that can start a comment line.  See
	|format-comments|.  See |option-backslash| about using backslashes to
	insert a space.

					*'commentstring'* *'cms'* *E537*
'commentstring' 'cms'	string	(default "/*%s*/")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	A template for a comment.  The "%s" in the value is replaced with the
	comment text.  Currently only used to add markers for folding, see
	|fold-marker|.

			*'compatible'* *'cp'* *'nocompatible'* *'nocp'*
'compatible' 'cp'	boolean	(default on, off when a |vimrc| or |gvimrc|
								file is found)
			global
			{not in Vi}
	This option has the effect of making Vim either more Vi-compatible, or
	make Vim behave in a more useful way.
	This is a special kind of option, because when it's set or reset,
	other options are also changed as a side effect.  CAREFUL: Setting or
	resetting this option can have a lot of unexpected effects: Mappings
	are interpreted in another way, undo behaves differently, etc.  If you
	set this option in your vimrc file, you should probably put it at the
	very start.
	By default this option is on and the Vi defaults are used for the
	options.  This default was chosen for those people who want to use Vim
	just like Vi, and don't even (want to) know about the 'compatible'
	option.
	When a |vimrc| or |gvimrc| file is found while Vim is starting up,
	this option is switched off, and all options that have not been
	modified will be set to the Vim defaults.  Effectively, this means
	that when a |vimrc| or |gvimrc| file exists, Vim will use the Vim
	defaults, otherwise it will use the Vi defaults.  (Note: This doesn't
	happen for the system-wide vimrc or gvimrc file).  Also see
	|compatible-default| and |posix-compliance|.
	You can also set this option with the "-C" argument, and reset it with
	"-N".  See |-C| and |-N|.
	Switching this option off makes the Vim defaults be used for options
	that have a different Vi and Vim default value.  See the options
	marked with a '+' below.  Other options are not modified.
	At the moment this option is set, several other options will be set
	or reset to make Vim as Vi-compatible as possible.  See the table
	below.  This can be used if you want to revert to Vi compatible
	editing.
	See also 'cpoptions'.

	option		+ set value	effect	~

	'allowrevins'	  off		no CTRL-_ command
	'backupcopy'	  Unix: "yes"	  backup file is a copy
			  others: "auto"  copy or rename backup file
	'backspace'	  ""		normal backspace
	'backup'	  off		no backup file
	'cindent'	  off		no C code indentation
	'cedit'		+ ""		no key to open the |cmdwin|
	'cpoptions'	+ (all flags)	Vi-compatible flags
	'cscopetag'	  off		don't use cscope for ":tag"
	'cscopetagorder'  0		see |cscopetagorder|
	'cscopeverbose'	  off		see |cscopeverbose|
	'digraph'	  off		no digraphs
	'esckeys'	+ off		no <Esc>-keys in Insert mode
	'expandtab'	  off		tabs not expanded to spaces
	'fileformats'	+ ""		no automatic file format detection,
			  "dos,unix"	except for DOS, Windows and OS/2
	'formatoptions'	+ "vt"		Vi compatible formatting
	'gdefault'	  off		no default 'g' flag for ":s"
	'history'	+ 0		no commandline history
	'hkmap'		  off		no Hebrew keyboard mapping
	'hkmapp'	  off		no phonetic Hebrew keyboard mapping
	'hlsearch'	  off		no highlighting of search matches
	'incsearch'	  off		no incremental searching
	'indentexpr'	  ""		no indenting by expression
	'insertmode'	  off		do not start in Insert mode
	'iskeyword'	+ "@,48-57,_"	keywords contain alphanumeric
						characters and '_'
	'joinspaces'	  on		insert 2 spaces after period
	'modeline'	+ off		no modelines
	'more'		+ off		no pauses in listings
	'revins'	  off		no reverse insert
	'ruler'		  off		no ruler
	'scrolljump'	  1		no jump scroll
	'scrolloff'	  0		no scroll offset
	'shiftround'	  off		indent not rounded to shiftwidth
	'shortmess'	+ ""		no shortening of messages
	'showcmd'	+ off		command characters not shown
	'showmode'	+ off		current mode not shown
	'smartcase'	  off		no automatic ignore case switch
	'smartindent'	  off		no smart indentation
	'smarttab'	  off		no smart tab size
	'softtabstop'	  0		tabs are always 'tabstop' positions
	'startofline'	  on		goto startofline with some commands
	'tagrelative'	+ off		tag file names are not relative
	'textauto'	+ off		no automatic textmode detection
	'textwidth'	  0		no automatic line wrap
	'tildeop'	  off		tilde is not an operator
	'ttimeout'	  off		no terminal timeout
	'whichwrap'	+ ""		left-right movements don't wrap
	'wildchar'	+ CTRL-E	only when the current value is <Tab>
					use CTRL-E for cmdline completion
	'writebackup'	  on or off	depends on +writebackup feature

						*'complete'* *'cpt'* *E535*
'complete' 'cpt'	string	(default: ".,w,b,u,t,i")
			local to buffer
			{not in Vi}
	This option specifies how keyword completion |ins-completion| works
	when CTRL-P or CTRL-N are used.  It is also used for whole-line
	completion |i_CTRL-X_CTRL-L|.  It indicates the type of completion
	and the places to scan.  It is a comma separated list of flags:
	.	scan the current buffer ('wrapscan' is ignored)
	w	scan buffers from other windows
	b	scan other loaded buffers that are in the buffer list
	u	scan the unloaded buffers that are in the buffer list
	U	scan the buffers that are not in the buffer list
	k	scan the files given with the 'dictionary' option
	kspell  use the currently active spell checking |spell|
	k{dict}	scan the file {dict}.  Several "k" flags can be given,
		patterns are valid too.  For example: >
			:set cpt=k/usr/dict/*,k~/spanish
<	s	scan the files given with the 'thesaurus' option
	s{tsr}	scan the file {tsr}.  Several "s" flags can be given, patterns
		are valid too.
	i	scan current and included files
	d	scan current and included files for defined name or macro
		|i_CTRL-X_CTRL-D|
	]	tag completion
	t	same as "]"

	Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
	not executed, this may lead to unexpected completions from some files
	(gzipped files for example).  Unloaded buffers are not scanned for
	whole-line completion.

	The default is ".,w,b,u,t,i", which means to scan:
	   1. the current buffer
	   2. buffers in other windows
	   3. other loaded buffers
	   4. unloaded buffers
	   5. tags
	   6. included files

	As you can see, CTRL-N and CTRL-P can be used to do any 'iskeyword'-
	based expansion (e.g., dictionary |i_CTRL-X_CTRL-K|, included patterns
	|i_CTRL-X_CTRL-I|, tags |i_CTRL-X_CTRL-]| and normal expansions).

						*'completefunc'* *'cfu'*
'completefunc' 'cfu'	string	(default: empty)
			local to buffer
			{not in Vi}
			{not available when compiled without the +eval
			or +insert_expand feature}
	This option specifies a function to be used for Insert mode completion
	with CTRL-X CTRL-U. |i_CTRL-X_CTRL-U|
	See |complete-functions| for an explanation of how the function is
	invoked and what it should return.


						*'completeopt'* *'cot'*
'completeopt' 'cot'	string	(default: "menu,preview")
			global
			{not available when compiled without the
			|+insert_expand| feature}
			{not in Vi}
	A comma separated list of options for Insert mode completion
	|ins-completion|.  The supported values are:

	   menu	    Use a popup menu to show the possible completions.  The
		    menu is only shown when there is more than one match and
		    sufficient colors are available.  |ins-completion-menu|

	   menuone  Use the popup menu also when there is only one match.
		    Useful when there is additional information about the
		    match, e.g., what file it comes from.

	   longest  Only insert the longest common text of the matches.  If
		    the menu is displayed you can use CTRL-L to add more
		    characters.  Whether case is ignored depends on the kind
		    of completion.  For buffer text the 'ignorecase' option is
		    used.

	   preview  Show extra information about the currently selected
		    completion in the preview window.

				*'confirm'* *'cf'* *'noconfirm'* *'nocf'*
'confirm' 'cf'		boolean (default off)
			global
			{not in Vi}
	When 'confirm' is on, certain operations that would normally
	fail because of unsaved changes to a buffer, e.g. ":q" and ":e",
	instead raise a |dialog| asking if you wish to save the current
	file(s).  You can still use a ! to unconditionally |abandon| a buffer.
	If 'confirm' is off you can still activate confirmation for one
	command only (this is most useful in mappings) with the |:confirm|
	command.
	Also see the |confirm()| function and the 'v' flag in 'guioptions'.

			*'conskey'* *'consk'* *'noconskey'* *'noconsk'*
'conskey' 'consk'	boolean	(default off)
			global
			{not in Vi}  {only for MS-DOS}
	When on direct console I/O is used to obtain a keyboard character.
	This should work in most cases.  Also see |'bioskey'|.  Together,
	three methods of console input are available:
	'conskey'   'bioskey'	    action ~
	   on	     on or off	    direct console input
	   off		on	    BIOS
	   off		off	    STDIN

			*'copyindent'* *'ci'* *'nocopyindent'* *'noci'*
'copyindent' 'ci'	boolean	(default off)
			local to buffer
			{not in Vi}
	Copy the structure of the existing lines indent when autoindenting a
	new line.  Normally the new indent is reconstructed by a series of
	tabs followed by spaces as required (unless |'expandtab'| is enabled,
	in which case only spaces are used).  Enabling this option makes the
	new line copy whatever characters were used for indenting on the
	existing line.  If the new indent is greater than on the existing
	line, the remaining space is filled in the normal manner.
	NOTE: 'copyindent' is reset when 'compatible' is set.
	Also see 'preserveindent'.

						*'cpoptions'* *'cpo'*
'cpoptions' 'cpo'	string	(Vim default: "aABceFs",
				 Vi default:  all flags)
			global
			{not in Vi}
	A sequence of single character flags.  When a character is present
	this indicates vi-compatible behavior.  This is used for things where
	not being vi-compatible is mostly or sometimes preferred.
	'cpoptions' stands for "compatible-options".
	Commas can be added for readability.
	To avoid problems with flags that are added in the future, use the
	"+=" and "-=" feature of ":set" |add-option-flags|.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.
	NOTE: This option is set to the POSIX default value at startup when
	the Vi default value would be used and the $VIM_POSIX environment
	variable exists |posix|.  This means tries to behave like the POSIX
	specification.

	    contains	behavior	~
								*cpo-a*
		a	When included, a ":read" command with a file name
			argument will set the alternate file name for the
			current window.
								*cpo-A*
		A	When included, a ":write" command with a file name
			argument will set the alternate file name for the
			current window.
								*cpo-b*
		b	"\|" in a ":map" command is recognized as the end of
			the map command.  The '\' is included in the mapping,
			the text after the '|' is interpreted as the next
			command.  Use a CTRL-V instead of a backslash to
			include the '|' in the mapping.  Applies to all
			mapping, abbreviation, menu and autocmd commands.
			See also |map_bar|.
								*cpo-B*
		B	A backslash has no special meaning in mappings,
			abbreviations and the "to" part of the menu commands.
			Remove this flag to be able to use a backslash like a
			CTRL-V.  For example, the command ":map X \<Esc>"
			results in X being mapped to:
				'B' included:	"\^["	 (^[ is a real <Esc>)
				'B' excluded:	"<Esc>"  (5 characters)
				('<' excluded in both cases)
								*cpo-c*
		c	Searching continues at the end of any match at the
			cursor position, but not further than the start of the
			next line.  When not present searching continues
			one character from the cursor position.  With 'c'
			"abababababab" only gets three matches when repeating
			"/abab", without 'c' there are five matches.
								*cpo-C*
		C	Do not concatenate sourced lines that start with a
			backslash.  See |line-continuation|.
								*cpo-d*
		d	Using "./" in the 'tags' option doesn't mean to use
			the tags file relative to the current file, but the
			tags file in the current directory.
								*cpo-D*
		D	Can't use CTRL-K to enter a digraph after Normal mode
			commands with a character argument, like |r|, |f| and
			|t|.
								*cpo-e*
		e	When executing a register with ":@r", always add a
			<CR> to the last line, also when the register is not
			linewise.  If this flag is not present, the register
			is not linewise and the last line does not end in a
			<CR>, then the last line is put on the command-line
			and can be edited before hitting <CR>.
								*cpo-E*
		E	It is an error when using "y", "d", "c", "g~", "gu" or
			"gU" on an Empty region.  The operators only work when
			at least one character is to be operate on.  Example:
			This makes "y0" fail in the first column.
								*cpo-f*
		f	When included, a ":read" command with a file name
			argument will set the file name for the current buffer,
			if the current buffer doesn't have a file name yet.
								*cpo-F*
		F	When included, a ":write" command with a file name
			argument will set the file name for the current
			buffer, if the current buffer doesn't have a file name
			yet.  Also see |cpo-P|.
								*cpo-g*
		g	Goto line 1 when using ":edit" without argument.
								*cpo-H*
		H	When using "I" on a line with only blanks, insert
			before the last blank.  Without this flag insert after
			the last blank.
								*cpo-i*
		i	When included, interrupting the reading of a file will
			leave it modified.
								*cpo-I*
		I	When moving the cursor up or down just after inserting
			indent for 'autoindent', do not delete the indent.
								*cpo-j*
		j	When joining lines, only add two spaces after a '.',
			not after '!' or '?'.  Also see 'joinspaces'.
								*cpo-J*
		J	A |sentence| has to be followed by two spaces after
			the '.', '!' or '?'.  A <Tab> is not recognized as
			white space.
								*cpo-k*
		k	Disable the recognition of raw key codes in
			mappings, abbreviations, and the "to" part of menu
			commands.  For example, if <Key> sends ^[OA (where ^[
			is <Esc>), the command ":map X ^[OA" results in X
			being mapped to:
				'k' included:	"^[OA"	 (3 characters)
				'k' excluded:	"<Key>"  (one key code)
			Also see the '<' flag below.
								*cpo-K*
		K	Don't wait for a key code to complete when it is
			halfway a mapping.  This breaks mapping <F1><F1> when
			only part of the second <F1> has been read.  It
			enables cancelling the mapping by typing <F1><Esc>.
								*cpo-l*
		l	Backslash in a [] range in a search pattern is taken
			literally, only "\]", "\^", "\-" and "\\" are special.
			See |/[]|
			   'l' included: "/[ \t]"  finds <Space>, '\' and 't'
			   'l' excluded: "/[ \t]"  finds <Space> and <Tab>
			Also see |cpo-\|.
								*cpo-L*
		L	When the 'list' option is set, 'wrapmargin',
			'textwidth', 'softtabstop' and Virtual Replace mode
			(see |gR|) count a <Tab> as two characters, instead of
			the normal behavior of a <Tab>.
								*cpo-m*
		m	When included, a showmatch will always wait half a
			second.  When not included, a showmatch will wait half
			a second or until a character is typed.  |'showmatch'|
								*cpo-M*
		M	When excluded, "%" matching will take backslashes into
			account.  Thus in "( \( )" and "\( ( \)" the outer
			parenthesis match.  When included "%" ignores
			backslashes, which is Vi compatible.
								*cpo-n*
		n	When included, the column used for 'number' will also
			be used for text of wrapped lines.
								*cpo-o*
		o	Line offset to search command is not remembered for
			next search.
								*cpo-O*
		O	Don't complain if a file is being overwritten, even
			when it didn't exist when editing it.  This is a
			protection against a file unexpectedly created by
			someone else.  Vi didn't complain about this.
								*cpo-p*
		p	Vi compatible Lisp indenting.  When not present, a
			slightly better algorithm is used.
								*cpo-P*
		P	When included, a ":write" command that appends to a
			file will set the file name for the current buffer, if
			the current buffer doesn't have a file name yet and
			the 'F' flag is also included |cpo-F|.
								*cpo-q*
		q	When joining multiple lines leave the cursor at the
			position where it would be when joining two lines.
								*cpo-r*
		r	Redo ("." command) uses "/" to repeat a search
			command, instead of the actually used search string.
								*cpo-R*
		R	Remove marks from filtered lines.  Without this flag
			marks are kept like |:keepmarks| was used.
								*cpo-s*
		s	Set buffer options when entering the buffer for the
			first time.  This is like it is in Vim version 3.0.
			And it is the default.  If not present the options are
			set when the buffer is created.
								*cpo-S*
		S	Set buffer options always when entering a buffer
			(except 'readonly', 'fileformat', 'filetype' and
			'syntax').  This is the (most) Vi compatible setting.
			The options are set to the values in the current
			buffer.  When you change an option and go to another
			buffer, the value is copied.  Effectively makes the
			buffer options global to all buffers.

			's'    'S'     copy buffer options
			no     no      when buffer created
			yes    no      when buffer first entered (default)
			 X     yes     each time when buffer entered (vi comp.)
								*cpo-t*
		t	Search pattern for the tag command is remembered for
			"n" command.  Otherwise Vim only puts the pattern in
			the history for search pattern, but doesn't change the
			last used search pattern.
								*cpo-u*
		u	Undo is Vi compatible.  See |undo-two-ways|.
								*cpo-v*
		v	Backspaced characters remain visible on the screen in
			Insert mode.  Without this flag the characters are
			erased from the screen right away.  With this flag the
			screen newly typed text overwrites backspaced
			characters.
								*cpo-w*
		w	When using "cw" on a blank character, only change one
			character and not all blanks until the start of the
			next word.
								*cpo-W*
		W	Don't overwrite a readonly file.  When omitted, ":w!"
			overwrites a readonly file, if possible.
								*cpo-x*
		x	<Esc> on the command-line executes the command-line.
			The default in Vim is to abandon the command-line,
			because <Esc> normally aborts a command.  |c_<Esc>|
								*cpo-X*
		X	When using a count with "R" the replaced text is
			deleted only once.  Also when repeating "R" with "."
			and a count.
								*cpo-y*
		y	A yank command can be redone with ".".
								*cpo-Z*
		Z	When using "w!" while the 'readonly' option is set,
			don't reset 'readonly'.
								*cpo-!*
		!	When redoing a filter command, use the last used
			external command, whatever it was.  Otherwise the last
			used -filter- command is used.
								*cpo-$*
		$	When making a change to one line, don't redisplay the
			line, but put a '$' at the end of the changed text.
			The changed text will be overwritten when you type the
			new text.  The line is redisplayed if you type any
			command that moves the cursor from the insertion
			point.
								*cpo-%*
		%	Vi-compatible matching is done for the "%" command.
			Does not recognize "#if", "#endif", etc.
			Does not recognize "/*" and "*/".
			Parens inside single and double quotes are also
			counted, causing a string that contains a paren to
			disturb the matching.  For example, in a line like
			"if (strcmp("foo(", s))" the first paren does not
			match the last one.  When this flag is not included,
			parens inside single and double quotes are treated
			specially.  When matching a paren outside of quotes,
			everything inside quotes is ignored.  When matching a
			paren inside quotes, it will find the matching one (if
			there is one).  This works very well for C programs.
			This flag is also used for other features, such as
			C-indenting.
								*cpo--*
		-	When included, a vertical movement command fails when
			it would go above the first line or below the last
			line.  Without it the cursor moves to the first or
			last line, unless it already was in that line.
			Applies to the commands "-", "k", CTRL-P, "+", "j",
			CTRL-N, CTRL-J and ":1234".
								*cpo-+*
		+	When included, a ":write file" command will reset the
			'modified' flag of the buffer, even though the buffer
			itself may still be different from its file.
								*cpo-star*
		*	Use ":*" in the same way as ":@".  When not included,
			":*" is an alias for ":'<,'>", select the Visual area.
								*cpo-<*
		<	Disable the recognition of special key codes in |<>|
			form in mappings, abbreviations, and the "to" part of
			menu commands.  For example, the command
			":map X <Tab>" results in X being mapped to:
				'<' included:	"<Tab>"  (5 characters)
				'<' excluded:	"^I"	 (^I is a real <Tab>)
			Also see the 'k' flag above.
								*cpo->*
		>	When appending to a register, put a line break before
			the appended text.

	POSIX flags.  These are not included in the Vi default value, except
	when $VIM_POSIX was set on startup. |posix|

	    contains	behavior	~
								*cpo-#*
		#	A count before "D", "o" and "O" has no effect.
								*cpo-&*
		&	When ":preserve" was used keep the swap file when
			exiting normally while this buffer is still loaded.
			This flag is tested when exiting.
								*cpo-\*
		\	Backslash in a [] range in a search pattern is taken
			literally, only "\]" is special  See |/[]|
			   '\' included: "/[ \-]"  finds <Space>, '\' and '-'
			   '\' excluded: "/[ \-]"  finds <Space> and '-'
			Also see |cpo-l|.
								*cpo-/*
		/	When "%" is used as the replacement string in a |:s|
			command, use the previous replacement string. |:s%|
								*cpo-{*
		{	The |{| and |}| commands also stop at a "{" character
			at the start of a line.
								*cpo-.*
		.	The ":chdir" and ":cd" commands fail if the current
			buffer is modified, unless ! is used.  Vim doesn't
			need this, since it remembers the full path of an
			opened file.
								*cpo-bar*
		|	The value of the $LINES and $COLUMNS environment
			variables overrule the terminal size values obtained
			with system specific functions.


						*'cscopepathcomp'* *'cspc'*
'cscopepathcomp' 'cspc'	number	(default 0)
			global
			{not available when compiled without the |+cscope|
			feature}
			{not in Vi}
	Determines how many components of the path to show in a list of tags.
	See |cscopepathcomp|.

						*'cscopeprg'* *'csprg'*
'cscopeprg' 'csprg'	string	(default "cscope")
			global
			{not available when compiled without the |+cscope|
			feature}
			{not in Vi}
	Specifies the command to execute cscope.  See |cscopeprg|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'cscopequickfix'* *'csqf'*
'cscopequickfix' 'csqf' string	(default "")
			global
			{not available when compiled without the |+cscope|
			or |+quickfix| features}
			{not in Vi}
	Specifies whether to use quickfix window to show cscope results.
	See |cscopequickfix|.

				*'cscopetag'* *'cst'* *'nocscopetag'* *'nocst'*
'cscopetag' 'cst'	boolean (default off)
			global
			{not available when compiled without the |+cscope|
			feature}
			{not in Vi}
	Use cscope for tag commands.  See |cscope-options|.
	NOTE: This option is reset when 'compatible' is set.

						*'cscopetagorder'* *'csto'*
'cscopetagorder' 'csto'	number	(default 0)
			global
			{not available when compiled without the |+cscope|
			feature}
			{not in Vi}
	Determines the order in which ":cstag" performs a search.  See
	|cscopetagorder|.
	NOTE: This option is set to 0 when 'compatible' is set.

					*'cscopeverbose'* *'csverb'*
					*'nocscopeverbose'* *'nocsverb'*
'cscopeverbose' 'csverb' boolean (default off)
			global
			{not available when compiled without the |+cscope|
			feature}
			{not in Vi}
	Give messages when adding a cscope database.  See |cscopeverbose|.
	NOTE: This option is reset when 'compatible' is set.


			*'cursorcolumn'* *'cuc'* *'nocursorcolumn'* *'nocuc'*
'cursorcolumn' 'cuc'	boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the  |+syntax|
			feature}
	Highlight the screen column of the cursor with CursorColumn
	|hl-CursorColumn|.  Useful to align text.  Will make screen redrawing
	slower.
	If you only want the highlighting in the current window you can use
	these autocommands: >
		au WinLeave * set nocursorline nocursorcolumn
		au WinEnter * set cursorline cursorcolumn
<

			*'cursorline'* *'cul'* *'nocursorline'* *'nocul'*
'cursorline' 'cul'	boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the  |+syntax|
			feature}
	Highlight the screen line of the cursor with CursorLine
	|hl-CursorLine|.  Useful to easily spot the cursor.  Will make screen
	redrawing slower.
	When Visual mode is active the highlighting isn't used to make it
	easier to see the selected text.


						*'debug'*
'debug'			string	(default "")
			global
			{not in Vi}
	These values can be used:
	msg	Error messages that would otherwise be omitted will be given
		anyway.
	throw	Error messages that would otherwise be omitted will be given
		anyway and also throw an exception and set |v:errmsg|.
	beep	A message will be given when otherwise only a beep would be
		produced.
	The values can be combined, separated by a comma.
	"msg" and "throw" are useful for debugging 'foldexpr', 'formatexpr' or
	'indentexpr'.

						*'define'* *'def'*
'define' 'def'		string	(default "^\s*#\s*define")
			global or local to buffer |global-local|
			{not in Vi}
	Pattern to be used to find a macro definition.  It is a search
	pattern, just like for the "/" command.  This option is used for the
	commands like "[i" and "[d" |include-search|.  The 'isident' option is
	used to recognize the defined name after the match:
		{match with 'define'}{non-ID chars}{defined name}{non-ID char}
	See |option-backslash| about inserting backslashes to include a space
	or backslash.
	The default value is for C programs.  For C++ this value would be
	useful, to include const type declarations: >
		^\(#\s*define\|[a-z]*\s*const\s*[a-z]*\)
<	When using the ":set" command, you need to double the backslashes!

			*'delcombine'* *'deco'* *'nodelcombine'* *'nodeco'*
'delcombine' 'deco'	boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the |+multi_byte|
			feature}
	If editing Unicode and this option is set, backspace and Normal mode
	"x" delete each combining character on its own.  When it is off (the
	default) the character along with its combining characters are
	deleted.
	Note: When 'delcombine' is set "xx" may work different from "2x"!

	This is useful for Arabic, Hebrew and many other languages where one
	may have combining characters overtop of base characters, and want
	to remove only the combining ones.

						*'dictionary'* *'dict'*
'dictionary' 'dict'	string	(default "")
			global or local to buffer |global-local|
			{not in Vi}
	List of file names, separated by commas, that are used to lookup words
	for keyword completion commands |i_CTRL-X_CTRL-K|.  Each file should
	contain a list of words.  This can be one word per line, or several
	words per line, separated by non-keyword characters (white space is
	preferred).  Maximum line length is 510 bytes.
	When this option is empty, or an entry "spell" is present, spell
	checking is enabled the currently active spelling is used. |spell|
	To include a comma in a file name precede it with a backslash.  Spaces
	after a comma are ignored, otherwise spaces are included in the file
	name.  See |option-backslash| about using backslashes.
	This has nothing to do with the |Dictionary| variable type.
	Where to find a list of words?
	- On FreeBSD, there is the file "/usr/share/dict/words".
	- In the Simtel archive, look in the "msdos/linguist" directory.
	- In "miscfiles" of the GNU collection.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	directories from the list.  This avoids problems when a future version
	uses another default.
	Backticks cannot be used in this option for security reasons.

							*'diff'* *'nodiff'*
'diff'			boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the |+diff|
			feature}
	Join the current window in the group of windows that shows differences
	between files.  See |vimdiff|.

						*'dex'* *'diffexpr'*
'diffexpr' 'dex'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+diff|
			feature}
	Expression which is evaluated to obtain an ed-style diff file from two
	versions of a file.  See |diff-diffexpr|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'dip'* *'diffopt'*
'diffopt' 'dip'		string	(default "filler")
			global
			{not in Vi}
			{not available when compiled without the |+diff|
			feature}
	Option settings for diff mode.  It can consist of the following items.
	All are optional.  Items must be separated by a comma.

		filler		Show filler lines, to keep the text
				synchronized with a window that has inserted
				lines at the same position.  Mostly useful
				when windows are side-by-side and 'scrollbind'
				is set.

		context:{n}	Use a context of {n} lines between a change
				and a fold that contains unchanged lines.
				When omitted a context of six lines is used.
				See |fold-diff|.

		icase		Ignore changes in case of text.  "a" and "A"
				are considered the same.  Adds the "-i" flag
				to the "diff" command if 'diffexpr' is empty.

		iwhite		Ignore changes in amount of white space.  Adds
				the "-b" flag to the "diff" command if
				'diffexpr' is empty.  Check the documentation
				of the "diff" command for what this does
				exactly.  It should ignore adding trailing
				white space, but not leading white space.

		horizontal	Start diff mode with horizontal splits (unless
				explicitly specified otherwise).

		vertical	Start diff mode with vertical splits (unless
				explicitly specified otherwise).

		foldcolumn:{n}	Set the 'foldcolumn' option to {n} when
				starting diff mode.  Without this 2 is used.

	Examples: >

		:set diffopt=filler,context:4
		:set diffopt=
		:set diffopt=filler,foldcolumn:3
<
				     *'digraph'* *'dg'* *'nodigraph'* *'nodg'*
'digraph' 'dg'		boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the |+digraphs|
			feature}
	Enable the entering of digraphs in Insert mode with {char1} <BS>
	{char2}.  See |digraphs|.
	NOTE: This option is reset when 'compatible' is set.

						*'directory'* *'dir'*
'directory' 'dir'	string	(default for Amiga: ".,t:",
				 for MS-DOS and Win32: ".,c:\tmp,c:\temp"
				 for Unix: ".,~/tmp,/var/tmp,/tmp")
			global
	List of directory names for the swap file, separated with commas.
	- The swap file will be created in the first directory where this is
	  possible.
	- Empty means that no swap file will be used (recovery is
	  impossible!).
	- A directory "." means to put the swap file in the same directory as
	  the edited file.  On Unix, a dot is prepended to the file name, so
	  it doesn't show in a directory listing.  On MS-Windows the "hidden"
	  attribute is set and a dot prepended if possible.
	- A directory starting with "./" (or ".\" for MS-DOS et al.) means to
	  put the swap file relative to where the edited file is.  The leading
	  "." is replaced with the path name of the edited file.
	- For Unix and Win32, if a directory ends in two path separators "//"
	  or "\\", the swap file name will be built from the complete path to
	  the file with all path separators substituted to percent '%' signs.
	  This will ensure file name uniqueness in the preserve directory.
	- Spaces after the comma are ignored, other spaces are considered part
	  of the directory name.  To have a space at the start of a directory
	  name, precede it with a backslash.
	- To include a comma in a directory name precede it with a backslash.
	- A directory name may end in an ':' or '/'.
	- Environment variables are expanded |:set_env|.
	- Careful with '\' characters, type one before a space, type two to
	  get one in the option (see |option-backslash|), for example: >
	    :set dir=c:\\tmp,\ dir\\,with\\,commas,\\\ dir\ with\ spaces
<	- For backwards compatibility with Vim version 3.0 a '>' at the start
	  of the option is removed.
	Using "." first in the list is recommended.  This means that editing
	the same file twice will result in a warning.  Using "/tmp" on Unix is
	discouraged: When the system crashes you lose the swap file.
	"/var/tmp" is often not cleared when rebooting, thus is a better
	choice than "/tmp".  But it can contain a lot of files, your swap
	files get lost in the crowd.  That is why a "tmp" directory in your
	home directory is tried first.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	directories from the list.  This avoids problems when a future version
	uses another default.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.
	{Vi: directory to put temp file in, defaults to "/tmp"}

					*'display'* *'dy'*
'display' 'dy'		string	(default "")
			global
			{not in Vi}
	Change the way text is displayed.  This is comma separated list of
	flags:
	lastline	When included, as much as possible of the last line
			in a window will be displayed.  When not included, a
			last line that doesn't fit is replaced with "@" lines.
	uhex		Show unprintable characters hexadecimal as <xx>
			instead of using ^C and ~C.

						*'eadirection'* *'ead'*
'eadirection' 'ead'	string	(default "both")
			global
			{not in Vi}
			{not available when compiled without the +vertsplit
			feature}
	Tells when the 'equalalways' option applies:
		ver	vertically, width of windows is not affected
		hor	horizontally, height of windows is not affected
		both	width and height of windows is affected

			   *'ed'* *'edcompatible'* *'noed'* *'noedcompatible'*
'edcompatible' 'ed'	boolean	(default off)
			global
	Makes the 'g' and 'c' flags of the ":substitute" command to be
	toggled each time the flag is given.  See |complex-change|.  See
	also 'gdefault' option.
	Switching this option on is discouraged!

					*'encoding'* *'enc'* *E543*
'encoding' 'enc'	string (default: "latin1" or value from $LANG)
			global
			{only available when compiled with the |+multi_byte|
			feature}
			{not in Vi}
	Sets the character encoding used inside Vim.  It applies to text in
	the buffers, registers, Strings in expressions, text stored in the
	viminfo file, etc.  It sets the kind of characters which Vim can work
	with.  See |encoding-names| for the possible values.

	NOTE: Changing this option will not change the encoding of the
	existing text in Vim.  It may cause non-ASCII text to become invalid.
	It should normally be kept at its default value, or set when Vim
	starts up.  See |multibyte|.

	NOTE: For GTK+ 2 it is highly recommended to set 'encoding' to
	"utf-8".  Although care has been taken to allow different values of
	'encoding', "utf-8" is the natural choice for the environment and
	avoids unnecessary conversion overhead.  "utf-8" has not been made
	the default to prevent different behavior of the GUI and terminal
	versions, and to avoid changing the encoding of newly created files
	without your knowledge (in case 'fileencodings' is empty).

	The character encoding of files can be different from 'encoding'.
	This is specified with 'fileencoding'.  The conversion is done with
	iconv() or as specified with 'charconvert'.

	Normally 'encoding' will be equal to your current locale.  This will
	be the default if Vim recognizes your environment settings.  If
	'encoding' is not set to the current locale, 'termencoding' must be
	set to convert typed and displayed text.  See |encoding-table|.

	When you set this option, it fires the |EncodingChanged| autocommand
	event so that you can set up fonts if necessary.

	When the option is set, the value is converted to lowercase.  Thus
	you can set it with uppercase values too.  Underscores are translated
	to '-' signs.
	When the encoding is recognized, it is changed to the standard name.
	For example "Latin-1" becomes "latin1", "ISO_88592" becomes
	"iso-8859-2" and "utf8" becomes "utf-8".

	Note: "latin1" is also used when the encoding could not be detected.
	This only works when editing files in the same encoding!  When the
	actual character set is not latin1, make sure 'fileencoding' and
	'fileencodings' are empty.  When conversion is needed, switch to using
	utf-8.

	When "unicode", "ucs-2" or "ucs-4" is used, Vim internally uses utf-8.
	You don't notice this while editing, but it does matter for the
	|viminfo-file|.  And Vim expects the terminal to use utf-8 too.  Thus
	setting 'encoding' to one of these values instead of utf-8 only has
	effect for encoding used for files when 'fileencoding' is empty.

	When 'encoding' is set to a Unicode encoding, and 'fileencodings' was
	not set yet, the default for 'fileencodings' is changed.

			*'endofline'* *'eol'* *'noendofline'* *'noeol'*
'endofline' 'eol'	boolean	(default on)
			local to buffer
			{not in Vi}
	When writing a file and this option is off and the 'binary' option
	is on, no <EOL> will be written for the last line in the file.  This
	option is automatically set when starting to edit a new file, unless
	the file does not have an <EOL> for the last line in the file, in
	which case it is reset.  Normally you don't have to set or reset this
	option.  When 'binary' is off the value is not used when writing the
	file.  When 'binary' is on it is used to remember the presence of a
	<EOL> for the last line in the file, so that when you write the file
	the situation from the original file can be kept.  But you can change
	it if you want to.

			     *'equalalways'* *'ea'* *'noequalalways'* *'noea'*
'equalalways' 'ea'	boolean	(default on)
			global
			{not in Vi}
	When on, all the windows are automatically made the same size after
	splitting or closing a window.  This also happens the moment the
	option is switched on.  When off, splitting a window will reduce the
	size of the current window and leave the other windows the same.  When
	closing a window the extra lines are given to the window next to it
	(depending on 'splitbelow' and 'splitright').
	When mixing vertically and horizontally split windows, a minimal size
	is computed and some windows may be larger if there is room.  The
	'eadirection' option tells in which direction the size is affected.
	Changing the height of a window can be avoided by setting
	'winfixheight'.

						*'equalprg'* *'ep'*
'equalprg' 'ep'		string	(default "")
			global or local to buffer |global-local|
			{not in Vi}
	External program to use for "=" command.  When this option is empty
	the internal formatting functions are used ('lisp', 'cindent' or
	'indentexpr').
	Environment variables are expanded |:set_env|.  See |option-backslash|
	about including spaces and backslashes.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

			*'errorbells'* *'eb'* *'noerrorbells'* *'noeb'*
'errorbells' 'eb'	boolean	(default off)
			global
	Ring the bell (beep or screen flash) for error messages.  This only
	makes a difference for error messages, the bell will be used always
	for a lot of errors without a message (e.g., hitting <Esc> in Normal
	mode).  See 'visualbell' on how to make the bell behave like a beep,
	screen flash or do nothing.

						*'errorfile'* *'ef'*
'errorfile' 'ef'	string	(Amiga default: "AztecC.Err",
					others: "errors.err")
			global
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	Name of the errorfile for the QuickFix mode (see |:cf|).
	When the "-q" command-line argument is used, 'errorfile' is set to the
	following argument.  See |-q|.
	NOT used for the ":make" command.  See 'makeef' for that.
	Environment variables are expanded |:set_env|.
	See |option-backslash| about including spaces and backslashes.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'errorformat'* *'efm'*
'errorformat' 'efm'	string	(default is very long)
			global or local to buffer |global-local|
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	Scanf-like description of the format for the lines in the error file
	(see |errorformat|).

				     *'esckeys'* *'ek'* *'noesckeys'* *'noek'*
'esckeys' 'ek'		boolean	(Vim default: on, Vi default: off)
			global
			{not in Vi}
	Function keys that start with an <Esc> are recognized in Insert
	mode.  When this option is off, the cursor and function keys cannot be
	used in Insert mode if they start with an <Esc>.  The advantage of
	this is that the single <Esc> is recognized immediately, instead of
	after one second.  Instead of resetting this option, you might want to
	try changing the values for 'timeoutlen' and 'ttimeoutlen'.  Note that
	when 'esckeys' is off, you can still map anything, but the cursor keys
	won't work by default.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'eventignore'* *'ei'*
'eventignore' 'ei'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+autocmd|
			feature}
	A list of autocommand event names, which are to be ignored.
	When set to "all" or when "all" is one of the items, all autocommand
	events are ignored, autocommands will not be executed.
	Otherwise this is a comma separated list of event names.  Example: >
	    :set ei=WinEnter,WinLeave
<
				 *'expandtab'* *'et'* *'noexpandtab'* *'noet'*
'expandtab' 'et'	boolean	(default off)
			local to buffer
			{not in Vi}
	In Insert mode: Use the appropriate number of spaces to insert a
	<Tab>.  Spaces are used in indents with the '>' and '<' commands and
	when 'autoindent' is on.  To insert a real tab when 'expandtab' is
	on, use CTRL-V<Tab>.  See also |:retab| and |ins-expandtab|.
	NOTE: This option is reset when 'compatible' is set.

					*'exrc'* *'ex'* *'noexrc'* *'noex'*
'exrc' 'ex'		boolean (default off)
			global
			{not in Vi}
	Enables the reading of .vimrc, .exrc and .gvimrc in the current
	directory.  If you switch this option on you should also consider
	setting the 'secure' option (see |initialization|).  Using a local
	.exrc, .vimrc or .gvimrc is a potential security leak, use with care!
	also see |.vimrc| and |gui-init|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

				*'fileencoding'* *'fenc'* *E213*
'fileencoding' 'fenc'	string (default: "")
			local to buffer
			{only available when compiled with the |+multi_byte|
			feature}
			{not in Vi}
	Sets the character encoding for the file of this buffer.
	When 'fileencoding' is different from 'encoding', conversion will be
	done when reading and writing the file.
	When 'fileencoding' is empty, the same value as 'encoding' will be
	used (no conversion when reading or writing a file).
		WARNING: Conversion can cause loss of information!  When
		'encoding' is "utf-8" conversion is most likely done in a way
		that the reverse conversion results in the same text.  When
		'encoding' is not "utf-8" some characters may be lost!
	See 'encoding' for the possible values.  Additionally, values may be
	specified that can be handled by the converter, see
	|mbyte-conversion|.
	When reading a file 'fileencoding' will be set from 'fileencodings'.
	To read a file in a certain encoding it won't work by setting
	'fileencoding', use the |++enc| argument.
	For a new file the global value of 'fileencoding' is used.
	Prepending "8bit-" and "2byte-" has no meaning here, they are ignored.
	When the option is set, the value is converted to lowercase.  Thus
	you can set it with uppercase values too.  '_' characters are
	replaced with '-'.  If a name is recognized from the list for
	'encoding', it is replaced by the standard name.  For example
	"ISO8859-2" becomes "iso-8859-2".
	When this option is set, after starting to edit a file, the 'modified'
	option is set, because the file would be different when written.
	If you do this in a modeline, you might want to set 'nomodified' to
	avoid this.
	This option can not be changed when 'modifiable' is off.

							*'fe'*
	NOTE: Before version 6.0 this option specified the encoding for the
	whole of Vim, this was a mistake.  Now use 'encoding' instead.  The
	old short name was 'fe', which is no longer used.

					*'fileencodings'* *'fencs'*
'fileencodings' 'fencs'	string (default: "ucs-bom",
				    "ucs-bom,utf-8,default,latin1" when
				    'encoding' is set to a Unicode value)
			global
			{only available when compiled with the |+multi_byte|
			feature}
			{not in Vi}
	This is a list of character encodings considered when starting to edit
	an existing file.  When a file is read, Vim tries to use the first
	mentioned character encoding.  If an error is detected, the next one
	in the list is tried.  When an encoding is found that works,
	'fileencoding' is set to it.  If all fail, 'fileencoding' is set to
	an empty string, which means the value of 'encoding' is used.
		WARNING: Conversion can cause loss of information!  When
		'encoding' is "utf-8" (or one of the other Unicode variants)
		conversion is most likely done in a way that the reverse
		conversion results in the same text.  When 'encoding' is not
		"utf-8" some non-ASCII characters may be lost!  You can use
		the |++bad| argument to specify what is done with characters
		that can't be converted.
	For an empty file or a file with only ASCII characters most encodings
	will work and the first entry of 'fileencodings' will be used (except
	"ucs-bom", which requires the BOM to be present).  If you prefer
	another encoding use an BufReadPost autocommand event to test if your
	preferred encoding is to be used.  Example: >
		au BufReadPost * if search('\S', 'w') == 0 |
			\ set fenc=iso-2022-jp | endif
<	This sets 'fileencoding' to "iso-2022-jp" if the file does not contain
	non-blank characters.
	When the |++enc| argument is used then the value of 'fileencodings' is
	not used.
	Note that 'fileencodings' is not used for a new file, the global value
	of 'fileencoding' is used instead.  You can set it with: >
		:setglobal fenc=iso-8859-2
<	This means that a non-existing file may get a different encoding than
	an empty file.
	The special value "ucs-bom" can be used to check for a Unicode BOM
	(Byte Order Mark) at the start of the file.  It must not be preceded
	by "utf-8" or another Unicode encoding for this to work properly.
	An entry for an 8-bit encoding (e.g., "latin1") should be the last,
	because Vim cannot detect an error, thus the encoding is always
	accepted.
	The special value "default" can be used for the encoding from the
	environment.  This is the default value for 'encoding'.  It is useful
	when 'encoding' is set to "utf-8" and your environment uses a
	non-latin1 encoding, such as Russian.
	When 'encoding' is "utf-8" and a file contains an illegal byte
	sequence it won't be recognized as UTF-8.  You can use the |8g8|
	command to find the illegal byte sequence.
	WRONG VALUES:			WHAT'S WRONG:
		latin1,utf-8		"latin1" will always be used
		utf-8,ucs-bom,latin1	BOM won't be recognized in an utf-8
					file
		cp1250,latin1		"cp1250" will always be used
	If 'fileencodings' is empty, 'fileencoding' is not modified.
	See 'fileencoding' for the possible values.
	Setting this option does not have an effect until the next time a file
	is read.

					*'fileformat'* *'ff'*
'fileformat' 'ff'	string (MS-DOS, MS-Windows, OS/2 default: "dos",
				Unix default: "unix",
				Macintosh default: "mac")
			local to buffer
			{not in Vi}
	This gives the <EOL> of the current buffer, which is used for
	reading/writing the buffer from/to a file:
	    dos	    <CR> <NL>
	    unix    <NL>
	    mac	    <CR>
	When "dos" is used, CTRL-Z at the end of a file is ignored.
	See |file-formats| and |file-read|.
	For the character encoding of the file see 'fileencoding'.
	When 'binary' is set, the value of 'fileformat' is ignored, file I/O
	works like it was set to "unix'.
	This option is set automatically when starting to edit a file and
	'fileformats' is not empty and 'binary' is off.
	When this option is set, after starting to edit a file, the 'modified'
	option is set, because the file would be different when written.
	This option can not be changed when 'modifiable' is off.
	For backwards compatibility: When this option is set to "dos",
	'textmode' is set, otherwise 'textmode' is reset.

					*'fileformats'* *'ffs'*
'fileformats' 'ffs'	string (default:
				Vim+Vi	MS-DOS, MS-Windows OS/2: "dos,unix",
				Vim	Unix: "unix,dos",
				Vim	Mac: "mac,unix,dos",
				Vi	Cygwin: "unix,dos",
				Vi	others: "")
			global
			{not in Vi}
	This gives the end-of-line (<EOL>) formats that will be tried when
	starting to edit a new buffer and when reading a file into an existing
	buffer:
	- When empty, the format defined with 'fileformat' will be used
	  always.  It is not set automatically.
	- When set to one name, that format will be used whenever a new buffer
	  is opened.  'fileformat' is set accordingly for that buffer.  The
	  'fileformats' name will be used when a file is read into an existing
	  buffer, no matter what 'fileformat' for that buffer is set to.
	- When more than one name is present, separated by commas, automatic
	  <EOL> detection will be done when reading a file.  When starting to
	  edit a file, a check is done for the <EOL>:
	  1. If all lines end in <CR><NL>, and 'fileformats' includes "dos",
	     'fileformat' is set to "dos".
	  2. If a <NL> is found and 'fileformats' includes "unix", 'fileformat'
	     is set to "unix".  Note that when a <NL> is found without a
	     preceding <CR>, "unix" is preferred over "dos".
	  3. If 'fileformats' includes "mac", 'fileformat' is set to "mac".
	     This means that "mac" is only chosen when "unix" is not present,
	     or when no <NL> is found in the file, and when "dos" is not
	     present, or no <CR><NL> is present in the file.
	     Also if "unix" was first chosen, but the first <CR> is before
	     the first <NL> and there appears to be more <CR>'s than <NL>'s in
	     the file, then 'fileformat' is set to "mac".
	  4. If 'fileformat' is still not set, the first name from
	     'fileformats' is used.
	  When reading a file into an existing buffer, the same is done, but
	  this happens like 'fileformat' has been set appropriately for that
	  file only, the option is not changed.
	When 'binary' is set, the value of 'fileformats' is not used.

	For systems with a Dos-like <EOL> (<CR><NL>), when reading files that
	are ":source"ed and for vimrc files, automatic <EOL> detection may be
	done:
	- When 'fileformats' is empty, there is no automatic detection.  Dos
	  format will be used.
	- When 'fileformats' is set to one or more names, automatic detection
	  is done.  This is based on the first <NL> in the file: If there is a
	  <CR> in front of it, Dos format is used, otherwise Unix format is
	  used.
	Also see |file-formats|.
	For backwards compatibility: When this option is set to an empty
	string or one format (no comma is included), 'textauto' is reset,
	otherwise 'textauto' is set.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

					*'filetype'* *'ft'*
'filetype' 'ft'		string (default: "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+autocmd|
			feature}
	When this option is set, the FileType autocommand event is triggered.
	All autocommands that match with the value of this option will be
	executed.  Thus the value of 'filetype' is used in place of the file
	name.
	Otherwise this option does not always reflect the current file type.
	This option is normally set when the file type is detected.  To enable
	this use the ":filetype on" command. |:filetype|
	Setting this option to a different value is most useful in a modeline,
	for a file for which the file type is not automatically recognized.
	Example, for in an IDL file:
		/* vim: set filetype=idl : */ ~
	|FileType| |filetypes|
	When a dot appears in the value then this separates two filetype
	names.  Example:
		/* vim: set filetype=c.doxygen : */ ~
	This will use the "c" filetype first, then the "doxygen" filetype.
	This works both for filetype plugins and for syntax files.  More than
	one dot may appear.
	Do not confuse this option with 'osfiletype', which is for the file
	type that is actually stored with the file.
	This option is not copied to another buffer, independent of the 's' or
	'S' flag in 'cpoptions'.
	Only normal file name characters can be used, "/\*?[|<>" are illegal.

						*'fillchars'* *'fcs'*
'fillchars' 'fcs'	string	(default "vert:|,fold:-")
			global
			{not in Vi}
			{not available when compiled without the |+windows|
			and |+folding| features}
	Characters to fill the statuslines and vertical separators.
	It is a comma separated list of items:

	  item		default		Used for ~
	  stl:c		' ' or '^'	statusline of the current window
	  stlnc:c	' ' or '-'	statusline of the non-current windows
	  vert:c	'|'		vertical separators |:vsplit|
	  fold:c	'-'		filling 'foldtext'
	  diff:c	'-'		deleted lines of the 'diff' option

	Any one that is omitted will fall back to the default.  For "stl" and
	"stlnc" the space will be used when there is highlighting, '^' or '-'
	otherwise.

	Example: >
	    :set fillchars=stl:^,stlnc:-,vert:\|,fold:-,diff:-
<	This is similar to the default, except that these characters will also
	be used when there is highlighting.

	for "stl" and "stlnc" only single-byte values are supported.

	The highlighting used for these items:
	  item		highlight group ~
	  stl:c		StatusLine		|hl-StatusLine|
	  stlnc:c	StatusLineNC		|hl-StatusLineNC|
	  vert:c	VertSplit		|hl-VertSplit|
	  fold:c	Folded			|hl-Folded|
	  diff:c	DiffDelete		|hl-DiffDelete|

					*'fkmap'* *'fk'* *'nofkmap'* *'nofk'*
'fkmap' 'fk'		boolean (default off)			*E198*
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	When on, the keyboard is mapped for the Farsi character set.
	Normally you would set 'allowrevins' and use CTRL-_ in insert mode to
	toggle this option |i_CTRL-_|.  See |farsi.txt|.

						*'foldclose'* *'fcl'*
'foldclose' 'fcl'	string (default "")
			global
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	When set to "all", a fold is closed when the cursor isn't in it and
	its level is higher than 'foldlevel'.  Useful if you want folds to
	automatically close when moving out of them.

						*'foldcolumn'* *'fdc'*
'foldcolumn' 'fdc'	number (default 0)
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	When non-zero, a column with the specified width is shown at the side
	of the window which indicates open and closed folds.  The maximum
	value is 12.
	See |folding|.

			*'foldenable'* *'fen'* *'nofoldenable'* *'nofen'*
'foldenable' 'fen'	boolean (default on)
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	When off, all folds are open.  This option can be used to quickly
	switch between showing all text unfolded and viewing the text with
	folds (including manually opened or closed folds).  It can be toggled
	with the |zi| command.  The 'foldcolumn' will remain blank when
	'foldenable' is off.
	This option is set by commands that create a new fold or close a fold.
	See |folding|.

						*'foldexpr'* *'fde'*
'foldexpr' 'fde'	string (default: "0")
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			or |+eval| feature}
	The expression used for when 'foldmethod' is "expr".  It is evaluated
	for each line to obtain its fold level.  See |fold-expr|.

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'foldexpr' |textlock|.

						*'foldignore'* *'fdi'*
'foldignore' 'fdi'	string (default: "#")
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Used only when 'foldmethod' is "indent".  Lines starting with
	characters in 'foldignore' will get their fold level from surrounding
	lines.  White space is skipped before checking for this character.
	The default "#" works well for C programs.  See |fold-indent|.

						*'foldlevel'* *'fdl'*
'foldlevel' 'fdl'	number (default: 0)
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Sets the fold level: Folds with a higher level will be closed.
	Setting this option to zero will close all folds.  Higher numbers will
	close fewer folds.
	This option is set by commands like |zm|, |zM| and |zR|.
	See |fold-foldlevel|.

						*'foldlevelstart'* *'fdls'*
'foldlevelstart' 'fdls'	number (default: -1)
			global
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Sets 'foldlevel' when starting to edit another buffer in a window.
	Useful to always start editing with all folds closed (value zero),
	some folds closed (one) or no folds closed (99).
	This is done before reading any modeline, thus a setting in a modeline
	overrules this option.  Starting to edit a file for |diff-mode| also
	ignores this option and closes all folds.
	It is also done before BufReadPre autocommands, to allow an autocmd to
	overrule the 'foldlevel' value for specific files.
	When the value is negative, it is not used.

						*'foldmarker'* *'fmr'* *E536*
'foldmarker' 'fmr'	string (default: "{{{,}}}")
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	The start and end marker used when 'foldmethod' is "marker".  There
	must be one comma, which separates the start and end marker.  The
	marker is a literal string (a regular expression would be too slow).
	See |fold-marker|.

						*'foldmethod'* *'fdm'*
'foldmethod' 'fdm'	string (default: "manual")
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	The kind of folding used for the current window.  Possible values:
	|fold-manual|	manual	    Folds are created manually.
	|fold-indent|	indent	    Lines with equal indent form a fold.
	|fold-expr|	expr	    'foldexpr' gives the fold level of a line.
	|fold-marker|	marker	    Markers are used to specify folds.
	|fold-syntax|	syntax	    Syntax highlighting items specify folds.
	|fold-diff|	diff	    Fold text that is not changed.

						*'foldminlines'* *'fml'*
'foldminlines' 'fml'	number (default: 1)
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Sets the minimum number of screen lines for a fold to be displayed
	closed.  Also for manually closed folds.
	Note that this only has an effect of what is displayed.  After using
	"zc" to close a fold, which is displayed open because it's smaller
	than 'foldminlines', a following "zc" may close a containing fold.

						*'foldnestmax'* *'fdn'*
'foldnestmax' 'fdn'	number (default: 20)
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Sets the maximum nesting of folds for the "indent" and "syntax"
	methods.  This avoids that too many folds will be created.  Using more
	than 20 doesn't work, because the internal limit is 20.

						*'foldopen'* *'fdo'*
'foldopen' 'fdo'	string (default: "block,hor,mark,percent,quickfix,
							     search,tag,undo")
			global
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	Specifies for which type of commands folds will be opened, if the
	command moves the cursor into a closed fold.  It is a comma separated
	list of items.
		item		commands ~
		all		any
		block		"(", "{", "[[", "[{", etc.
		hor		horizontal movements: "l", "w", "fx", etc.
		insert		any command in Insert mode
		jump		far jumps: "G", "gg", etc.
		mark		jumping to a mark: "'m", CTRL-O, etc.
		percent		"%"
		quickfix	":cn", ":crew", ":make", etc.
		search		search for a pattern: "/", "n", "*", "gd", etc.
				(not for a search pattern in a ":" command)
				Also for |[s| and |]s|.
		tag		jumping to a tag: ":ta", CTRL-T, etc.
		undo		undo or redo: "u" and CTRL-R
	When the command is part of a mapping this option is not used.  Add
	the |zv| command to the mapping to get the same effect.
	When a movement command is used for an operator (e.g., "dl" or "y%")
	this option is not used.  This means the operator will include the
	whole closed fold.
	Note that vertical movements are not here, because it would make it
	very difficult to move onto a closed fold.
	In insert mode the folds containing the cursor will always be open
	when text is inserted.
	To close folds you can re-apply 'foldlevel' with the |zx| command or
	set the 'foldclose' option to "all".

						*'foldtext'* *'fdt'*
'foldtext' 'fdt'	string (default: "foldtext()")
			local to window
			{not in Vi}
			{not available when compiled without the |+folding|
			feature}
	An expression which is used to specify the text displayed for a closed
	fold.  See |fold-foldtext|.

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'foldtext' |textlock|.

					*'formatoptions'* *'fo'*
'formatoptions' 'fo'	string (Vim default: "tcq", Vi default: "vt")
			local to buffer
			{not in Vi}
	This is a sequence of letters which describes how automatic
	formatting is to be done.  See |fo-table|.  When the 'paste' option is
	on, no formatting is done (like 'formatoptions' is empty).  Commas can
	be inserted for readability.
	To avoid problems with flags that are added in the future, use the
	"+=" and "-=" feature of ":set" |add-option-flags|.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

					*'formatlistpat'* *'flp'*
'formatlistpat' 'flp'	string (default: "^\s*\d\+[\]:.)}\t ]\s*")
			local to buffer
			{not in Vi}
	A pattern that is used to recognize a list header.  This is used for
	the "n" flag in 'formatoptions'.
	The pattern must match exactly the text that will be the indent for
	the line below it.  You can use |/\ze| to mark the end of the match
	while still checking more characters.  There must be a character
	following the pattern, when it matches the whole line it is handled
	like there is no match.
	The default recognizes a number, followed by an optional punctuation
	character and white space.

						*'formatprg'* *'fp'*
'formatprg' 'fp'	string (default "")
			global
			{not in Vi}
	The name of an external program that will be used to format the lines
	selected with the |gq| operator.  The program must take the input on
	stdin and produce the output on stdout.  The Unix program "fmt" is
	such a program.
	If the 'formatexpr' option is not empty it will be used instead.
	Otherwise, if 'formatprg' option is an empty string, the internal
	format function will be used |C-indenting|.
	Environment variables are expanded |:set_env|.  See |option-backslash|
	about including spaces and backslashes.
	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

						*'formatexpr'* *'fex'*
'formatexpr' 'fex'	string (default "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+eval|
			feature}
	Expression which is evaluated to format a range of lines for the |gq|
	operator.  When this option is empty 'formatprg' is used.

	The |v:lnum|  variable holds the first line to be formatted.
	The |v:count| variable holds the number of lines to be formatted.
	The |v:char|  variable holds the character that is going to be
		      inserted.  This can be empty.  Don't insert it yet!

	Example: >
		:set formatexpr=mylang#Format()
<	This will invoke the mylang#Format() function in the
	autoload/mylang.vim file in 'runtimepath'. |autoload|

	The expression is also evaluated when 'textwidth' is set and adding
	text beyond that limit.  This happens under the same conditions as
	when internal formatting is used.  Make sure the cursor is kept in the
	same spot relative to the text then!  The |mode()| function will
	return "i" or "R" in this situation.  When the function returns
	non-zero Vim will fall back to using the internal format mechanism.

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

						*'fsync'* *'fs'*
'fsync' 'fs'		boolean	(default on)
			global
			{not in Vi}
	When on, the library function fsync() will be called after writing a
	file.  This will flush a file to disk, ensuring that it is safely
	written even on filesystems which do metadata-only journaling.  This
	will force the harddrive to spin up on Linux systems running in laptop
	mode, so it may be undesirable in some situations.  Be warned that
	turning this off increases the chances of data loss after a crash.  On
	systems without an fsync() implementation, this variable is always
	off.
	Also see 'swapsync' for controlling fsync() on swap files.

				   *'gdefault'* *'gd'* *'nogdefault'* *'nogd'*
'gdefault' 'gd'		boolean	(default off)
			global
			{not in Vi}
	When on, the ":substitute" flag 'g' is default on.  This means that
	all matches in a line are substituted instead of one.  When a 'g' flag
	is given to a ":substitute" command, this will toggle the substitution
	of all or one match.  See |complex-change|.

		command		'gdefault' on	'gdefault' off	~
		:s///		  subst. all	  subst. one
		:s///g		  subst. one	  subst. all
		:s///gg		  subst. all	  subst. one

	NOTE: This option is reset when 'compatible' is set.

						*'grepformat'* *'gfm'*
'grepformat' 'gfm'	string	(default "%f:%l%m,%f  %l%m")
			global
			{not in Vi}
	Format to recognize for the ":grep" command output.
	This is a scanf-like string that uses the same format as the
	'errorformat' option: see |errorformat|.

						*'grepprg'* *'gp'*
'grepprg' 'gp'		string	(default "grep -n ",
					Unix: "grep -n $* /dev/null",
					Win32: "findstr /n" or "grep -n",
						      VMS: "SEARCH/NUMBERS ")
			global or local to buffer |global-local|
			{not in Vi}
	Program to use for the |:grep| command.  This option may contain '%'
	and '#' characters, which are expanded like when used in a command-
	line.  The placeholder "$*" is allowed to specify where the arguments
	will be included.  Environment variables are expanded |:set_env|.  See
	|option-backslash| about including spaces and backslashes.
	When your "grep" accepts the "-H" argument, use this to make ":grep"
	also work well with a single file: >
		:set grepprg=grep\ -nH
<	Special value: When 'grepprg' is set to "internal" the |:grep| command
	works like |:vimgrep|, |:lgrep| like |:lvimgrep|, |:grepadd| like
	|:vimgrepadd| and |:lgrepadd| like |:lvimgrepadd|.
	See also the section |:make_makeprg|, since most of the comments there
	apply equally to 'grepprg'.
	For Win32, the default is "findstr /n" if "findstr.exe" can be found,
	otherwise it's "grep -n".
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

			*'guicursor'* *'gcr'* *E545* *E546* *E548* *E549*
'guicursor' 'gcr'	string	(default "n-v-c:block-Cursor/lCursor,
					ve:ver35-Cursor,
					o:hor50-Cursor,
					i-ci:ver25-Cursor/lCursor,
					r-cr:hor20-Cursor/lCursor,
					sm:block-Cursor
					-blinkwait175-blinkoff150-blinkon175",
				for MS-DOS and Win32 console:
					"n-v-c:block,o:hor50,i-ci:hor15,
					r-cr:hor30,sm:block")
			global
			{not in Vi}
			{only available when compiled with GUI enabled, and
			for MS-DOS and Win32 console}
	This option tells Vim what the cursor should look like in different
	modes.  It fully works in the GUI.  In an MSDOS or Win32 console, only
	the height of the cursor can be changed.  This can be done by
	specifying a block cursor, or a percentage for a vertical or
	horizontal cursor.
	For a console the 't_SI' and 't_EI' escape sequences are used.

	The option is a comma separated list of parts.  Each part consist of a
	mode-list and an argument-list:
		mode-list:argument-list,mode-list:argument-list,..
	The mode-list is a dash separated list of these modes:
		n	Normal mode
		v	Visual mode
		ve	Visual mode with 'selection' "exclusive" (same as 'v',
			if not specified)
		o	Operator-pending mode
		i	Insert mode
		r	Replace mode
		c	Command-line Normal (append) mode
		ci	Command-line Insert mode
		cr	Command-line Replace mode
		sm	showmatch in Insert mode
		a	all modes
	The argument-list is a dash separated list of these arguments:
		hor{N}	horizontal bar, {N} percent of the character height
		ver{N}	vertical bar, {N} percent of the character width
		block	block cursor, fills the whole character
			[only one of the above three should be present]
		blinkwait{N}				*cursor-blinking*
		blinkon{N}
		blinkoff{N}
			blink times for cursor: blinkwait is the delay before
			the cursor starts blinking, blinkon is the time that
			the cursor is shown and blinkoff is the time that the
			cursor is not shown.  The times are in msec.  When one
			of the numbers is zero, there is no blinking.  The
			default is: "blinkwait700-blinkon400-blinkoff250".
			These numbers are used for a missing entry.  This
			means that blinking is enabled by default.  To switch
			blinking off you can use "blinkon0".  The cursor only
			blinks when Vim is waiting for input, not while
			executing a command.
			To make the cursor blink in an xterm, see
			|xterm-blink|.
		{group-name}
			a highlight group name, that sets the color and font
			for the cursor
		{group-name}/{group-name}
			Two highlight group names, the first is used when
			no language mappings are used, the other when they
			are. |language-mapping|

	Examples of parts:
	   n-c-v:block-nCursor	in Normal, Command-line and Visual mode, use a
				block cursor with colors from the "nCursor"
				highlight group
	   i-ci:ver30-iCursor-blinkwait300-blinkon200-blinkoff150
				In Insert and Command-line Insert mode, use a
				30% vertical bar cursor with colors from the
				"iCursor" highlight group.  Blink a bit
				faster.

	The 'a' mode is different.  It will set the given argument-list for
	all modes.  It does not reset anything to defaults.  This can be used
	to do a common setting for all modes.  For example, to switch off
	blinking: "a:blinkon0"

	Examples of cursor highlighting: >
	    :highlight Cursor gui=reverse guifg=NONE guibg=NONE
	    :highlight Cursor gui=NONE guifg=bg guibg=fg
<
					*'guifont'* *'gfn'*
						   *E235* *E596* *E610* *E611*
'guifont' 'gfn'		string	(default "")
			global
			{not in Vi}
			{only available when compiled with GUI enabled}
	This is a list of fonts which will be used for the GUI version of Vim.
	In its simplest form the value is just one font name.  When
	the font cannot be found you will get an error message.  To try other
	font names a list can be specified, font names separated with commas.
	The first valid font is used.

	On systems where 'guifontset' is supported (X11) and 'guifontset' is
	not empty, then 'guifont' is not used.

	Spaces after a comma are ignored.  To include a comma in a font name
	precede it with a backslash.  Setting an option requires an extra
	backslash before a space and a backslash.  See also
	|option-backslash|.  For example: >
	    :set guifont=Screen15,\ 7x13,font\\,with\\,commas
<	will make Vim try to use the font "Screen15" first, and if it fails it
	will try to use "7x13" and then "font,with,commas" instead.

	If none of the fonts can be loaded, Vim will keep the current setting.
	If an empty font list is given, Vim will try using other resource
	settings (for X, it will use the Vim.font resource), and finally it
	will try some builtin default which should always be there ("7x13" in
	the case of X).  The font names given should be "normal" fonts.  Vim
	will try to find the related bold and italic fonts.

	For Win32, GTK, Mac OS and Photon: >
	    :set guifont=*
<	will bring up a font requester, where you can pick the font you want.

	The font name depends on the GUI used.  See |setting-guifont| for a
	way to set 'guifont' for various systems.

	For the GTK+ 2 GUI the font name looks like this: >
	    :set guifont=Andale\ Mono\ 11
<	That's all.  XLFDs are no longer accepted.

	For Mac OSX you can use something like this: >
	    :set guifont=Monaco:h10
<	Also see 'macatsui', it can help fix display problems.
								*E236*
	Note that the fonts must be mono-spaced (all characters have the same
	width).  An exception is GTK 2: all fonts are accepted, but
	mono-spaced fonts look best.

	To preview a font on X11, you might be able to use the "xfontsel"
	program.  The "xlsfonts" program gives a list of all available fonts.

	For the Win32 GUI					*E244* *E245*
	- takes these options in the font name:
		hXX - height is XX (points, can be floating-point)
		wXX - width is XX (points, can be floating-point)
		b   - bold
		i   - italic
		u   - underline
		s   - strikeout
		cXX - character set XX.  Valid charsets are: ANSI, ARABIC,
		      BALTIC, CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK,
		      HANGEUL, HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS,
		      SYMBOL, THAI, TURKISH, VIETNAMESE ANSI and BALTIC.
		      Normally you would use "cDEFAULT".

	  Use a ':' to separate the options.
	- A '_' can be used in the place of a space, so you don't need to use
	  backslashes to escape the spaces.
	- Examples: >
	    :set guifont=courier_new:h12:w5:b:cRUSSIAN
	    :set guifont=Andale_Mono:h7.5:w4.5
<	See also |font-sizes|.

					*'guifontset'* *'gfs'*
					*E250* *E252* *E234* *E597* *E598*
'guifontset' 'gfs'	string	(default "")
			global
			{not in Vi}
			{only available when compiled with GUI enabled and
			with the |+xfontset| feature}
			{not available in the GTK+ 2 GUI}
	When not empty, specifies two (or more) fonts to be used.  The first
	one for normal English, the second one for your special language.  See
	|xfontset|.
	Setting this option also means that all font names will be handled as
	a fontset name.  Also the ones used for the "font" argument of the
	|:highlight| command.
	The fonts must match with the current locale.  If fonts for the
	character sets that the current locale uses are not included, setting
	'guifontset' will fail.
	Note the difference between 'guifont' and 'guifontset': In 'guifont'
	the comma-separated names are alternative names, one of which will be
	used.  In 'guifontset' the whole string is one fontset name,
	including the commas.  It is not possible to specify alternative
	fontset names.
	This example works on many X11 systems: >
		:set guifontset=-*-*-medium-r-normal--16-*-*-*-c-*-*-*
<
				*'guifontwide'* *'gfw'* *E231* *E533* *E534*
'guifontwide' 'gfw'	string	(default "")
			global
			{not in Vi}
			{only available when compiled with GUI enabled}
	When not empty, specifies a comma-separated list of fonts to be used
	for double-width characters.  The first font that can be loaded is
	used.
	Note: The size of these fonts must be exactly twice as wide as the one
	specified with 'guifont' and the same height.

	All GUI versions but GTK+ 2:

	'guifontwide' is only used when 'encoding' is set to "utf-8" and
	'guifontset' is empty or invalid.
	When 'guifont' is set and a valid font is found in it and
	'guifontwide' is empty Vim will attempt to find a matching
	double-width font and set 'guifontwide' to it.

	GTK+ 2 GUI only:			*guifontwide_gtk2*

	If set and valid, 'guifontwide' is always used for double width
	characters, even if 'encoding' is not set to "utf-8".
	Vim does not attempt to find an appropriate value for 'guifontwide'
	automatically.  If 'guifontwide' is empty Pango/Xft will choose the
	font for characters not available in 'guifont'.  Thus you do not need
	to set 'guifontwide' at all unless you want to override the choice
	made by Pango/Xft.

						*'guiheadroom'* *'ghr'*
'guiheadroom' 'ghr'	number	(default 50)
			global
			{not in Vi} {only for GTK and X11 GUI}
	The number of pixels subtracted from the screen height when fitting
	the GUI window on the screen.  Set this before the GUI is started,
	e.g., in your |gvimrc| file.  When zero, the whole screen height will
	be used by the window.  When positive, the specified number of pixel
	lines will be left for window decorations and other items on the
	screen.  Set it to a negative value to allow windows taller than the
	screen.

						*'guioptions'* *'go'*
'guioptions' 'go'	string	(default "gmrLtT"   (MS-Windows),
					 "agimrLtT" (GTK, Motif and Athena))
			global
			{not in Vi}
			{only available when compiled with GUI enabled}
	This option only has an effect in the GUI version of Vim.  It is a
	sequence of letters which describes what components and options of the
	GUI should be used.
	To avoid problems with flags that are added in the future, use the
	"+=" and "-=" feature of ":set" |add-option-flags|.

	Valid letters are as follows:
							*guioptions_a*
	  'a'	Autoselect:  If present, then whenever VISUAL mode is started,
		or the Visual area extended, Vim tries to become the owner of
		the windowing system's global selection.  This means that the
		Visually highlighted text is available for pasting into other
		applications as well as into Vim itself.  When the Visual mode
		ends, possibly due to an operation on the text, or when an
		application wants to paste the selection, the highlighted text
		is automatically yanked into the "* selection register.
		Thus the selection is still available for pasting into other
		applications after the VISUAL mode has ended.
		    If not present, then Vim won't become the owner of the
		windowing system's global selection unless explicitly told to
		by a yank or delete operation for the "* register.
		The same applies to the modeless selection.

	  'A'	Autoselect for the modeless selection.  Like 'a', but only
		applies to the modeless selection.

		    'guioptions'   autoselect Visual  autoselect modeless ~
			 ""		 -			 -
			 "a"		yes			yes
			 "A"		 -			yes
			 "aA"		yes			yes

	  'c'	Use console dialogs instead of popup dialogs for simple
		choices.

	  'e'	Add tab pages when indicated with 'showtabline'.
		'guitablabel' can be used to change the text in the labels.
		When 'e' is missing a non-GUI tab pages line may be used.
		The GUI tabs are only supported on some systems, currently
		GTK, Motif and MS-Windows.

	  'f'	Foreground: Don't use fork() to detach the GUI from the shell
		where it was started.  Use this for programs that wait for the
		editor to finish (e.g., an e-mail program).  Alternatively you
		can use "gvim -f" or ":gui -f" to start the GUI in the
		foreground.  |gui-fork|
		Note: Set this option in the vimrc file.  The forking may have
		happened already when the |gvimrc| file is read.

	  'i'	Use a Vim icon.  For GTK with KDE it is used in the left-upper
		corner of the window.  It's black&white on non-GTK, because of
		limitations of X11.  For a color icon, see |X11-icon|.

	  'm'	Menu bar is present.
	  'M'	The system menu "$VIMRUNTIME/menu.vim" is not sourced.  Note
		that this flag must be added in the .vimrc file, before
		switching on syntax or filetype recognition (when the |gvimrc|
		file is sourced the system menu has already been loaded; the
		":syntax on" and ":filetype on" commands load the menu too).
	  'g'	Grey menu items: Make menu items that are not active grey.  If
		'g' is not included inactive menu items are not shown at all.
		Exception: Athena will always use grey menu items.

	  't'	Include tearoff menu items.  Currently only works for Win32,
		GTK+, and Motif 1.2 GUI.
	  'T'	Include Toolbar.  Currently only in Win32, GTK+, Motif, Photon
		and Athena GUIs.

	  'r'	Right-hand scrollbar is always present.
	  'R'	Right-hand scrollbar is present when there is a vertically
		split window.
	  'l'	Left-hand scrollbar is always present.
	  'L'	Left-hand scrollbar is present when there is a vertically
		split window.
	  'b'	Bottom (horizontal) scrollbar is present.  Its size depends on
		the longest visible line, or on the cursor line if the 'h'
		flag is included. |gui-horiz-scroll|
	  'h'	Limit horizontal scrollbar size to the length of the cursor
		line.  Reduces computations. |gui-horiz-scroll|

	And yes, you may even have scrollbars on the left AND the right if
	you really want to :-).  See |gui-scrollbars| for more information.

	  'v'	Use a vertical button layout for dialogs.  When not included,
		a horizontal layout is preferred, but when it doesn't fit a
		vertical layout is used anyway.
	  'p'	Use Pointer callbacks for X11 GUI.  This is required for some
		window managers.  If the cursor is not blinking or hollow at
		the right moment, try adding this flag.  This must be done
		before starting the GUI.  Set it in your |gvimrc|.  Adding or
		removing it after the GUI has started has no effect.
	  'F'	Add a footer.  Only for Motif.  See |gui-footer|.

						*'guipty'* *'noguipty'*
'guipty'		boolean	(default on)
			global
			{not in Vi}
			{only available when compiled with GUI enabled}
	Only in the GUI: If on, an attempt is made to open a pseudo-tty for
	I/O to/from shell commands.  See |gui-pty|.

						*'guitablabel'* *'gtl'*
'guitablabel' 'gtl'	string	(default empty)
			global
			{not in Vi}
			{only available when compiled with GUI enabled and
			with the +windows feature}
	When nonempty describes the text to use in a label of the GUI tab
	pages line.  When empty and when the result is empty Vim will use a
	default label.  See |setting-guitablabel| for more info.

	The format of this option is like that of 'statusline'.
	'guitabtooltip' is used for the tooltip, see below.

	Only used when the GUI tab pages line is displayed.  'e' must be
	present in 'guioptions'.  For the non-GUI tab pages line 'tabline' is
	used.

						*'guitabtooltip'* *'gtt'*
'guitabtooltip' 'gtt'	string	(default empty)
			global
			{not in Vi}
			{only available when compiled with GUI enabled and
			with the +windows feature}
	When nonempty describes the text to use in a tooltip for the GUI tab
	pages line.  When empty Vim will use a default tooltip.
	This option is otherwise just like 'guitablabel' above.


						*'helpfile'* *'hf'*
'helpfile' 'hf'		string	(default (MSDOS)  "$VIMRUNTIME\doc\help.txt"
					 (others) "$VIMRUNTIME/doc/help.txt")
			global
			{not in Vi}
	Name of the main help file.  All distributed help files should be
	placed together in one directory.  Additionally, all "doc" directories
	in 'runtimepath' will be used.
	Environment variables are expanded |:set_env|.  For example:
	"$VIMRUNTIME/doc/help.txt".  If $VIMRUNTIME is not set, $VIM is also
	tried.  Also see |$VIMRUNTIME| and |option-backslash| about including
	spaces and backslashes.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'helpheight'* *'hh'*
'helpheight' 'hh'	number	(default 20)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	Minimal initial height of the help window when it is opened with the
	":help" command.  The initial height of the help window is half of the
	current window, or (when the 'ea' option is on) the same as other
	windows.  When the height is less than 'helpheight', the height is
	set to 'helpheight'.  Set to zero to disable.

						*'helplang'* *'hlg'*
'helplang' 'hlg'	string	(default: messages language or empty)
			global
			{only available when compiled with the |+multi_lang|
			feature}
			{not in Vi}
	Comma separated list of languages.  Vim will use the first language
	for which the desired help can be found.  The English help will always
	be used as a last resort.  You can add "en" to prefer English over
	another language, but that will only find tags that exist in that
	language and not in the English help.
	Example: >
		:set helplang=de,it
<	This will first search German, then Italian and finally English help
	files.
	When using |CTRL-]| and ":help!" in a non-English help file Vim will
	try to find the tag in the current language before using this option.
	See |help-translated|.

				     *'hidden'* *'hid'* *'nohidden'* *'nohid'*
'hidden' 'hid'		boolean	(default off)
			global
			{not in Vi}
	When off a buffer is unloaded when it is |abandon|ed.  When on a
	buffer becomes hidden when it is |abandon|ed.  If the buffer is still
	displayed in another window, it does not become hidden, of course.
	The commands that move through the buffer list sometimes make a buffer
	hidden although the 'hidden' option is off: When the buffer is
	modified, 'autowrite' is off or writing is not possible, and the '!'
	flag was used.  See also |windows.txt|.
	To only make one buffer hidden use the 'bufhidden' option.
	This option is set for one command with ":hide {command}" |:hide|.
	WARNING: It's easy to forget that you have changes in hidden buffers.
	Think twice when using ":q!" or ":qa!".

						*'highlight'* *'hl'*
'highlight' 'hl'	string	(default (as a single string):
				     "8:SpecialKey,@:NonText,d:Directory,
				     e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,
				     M:ModeMsg,n:LineNr,r:Question,
				     s:StatusLine,S:StatusLineNC,c:VertSplit,
				     t:Title,v:Visual,w:WarningMsg,W:WildMenu,
				     f:Folded,F:FoldColumn,A:DiffAdd,
				     C:DiffChange,D:DiffDelete,T:DiffText,
				     >:SignColumn,B:SpellBad,P:SpellCap,
				     R:SpellRare,L:SpellLocal,
				     +:Pmenu,=:PmenuSel,
				     x:PmenuSbar,X:PmenuThumb")
			global
			{not in Vi}
	This option can be used to set highlighting mode for various
	occasions.  It is a comma separated list of character pairs.  The
	first character in a pair gives the occasion, the second the mode to
	use for that occasion.  The occasions are:
	|hl-SpecialKey|	 8  Meta and special keys listed with ":map"
	|hl-NonText|	 @  '~' and '@' at the end of the window and
			    characters from 'showbreak'
	|hl-Directory|	 d  directories in CTRL-D listing and other special
			    things in listings
	|hl-ErrorMsg|	 e  error messages
			 h  (obsolete, ignored)
	|hl-IncSearch|	 i  'incsearch' highlighting
	|hl-Search|	 l  last search pattern highlighting (see 'hlsearch')
	|hl-MoreMsg|	 m  |more-prompt|
	|hl-ModeMsg|	 M  Mode (e.g., "-- INSERT --")
	|hl-LineNr|	 n  line number for ":number" and ":#" commands
	|hl-Question|	 r  |hit-enter| prompt and yes/no questions
	|hl-StatusLine|	 s  status line of current window |status-line|
	|hl-StatusLineNC| S  status lines of not-current windows
	|hl-Title|	 t  Titles for output from ":set all", ":autocmd" etc.
	|hl-VertSplit|	 c  column used to separate vertically split windows
	|hl-Visual|	 v  Visual mode
	|hl-VisualNOS|	 V  Visual mode when Vim does is "Not Owning the
			    Selection" Only X11 Gui's |gui-x11| and
			    |xterm-clipboard|.
	|hl-WarningMsg|	 w  warning messages
	|hl-WildMenu|	 W  wildcard matches displayed for 'wildmenu'
	|hl-Folded|	 f  line used for closed folds
	|hl-FoldColumn|	 F  'foldcolumn'
	|hl-DiffAdd|	 A  added line in diff mode
	|hl-DiffChange|	 C  changed line in diff mode
	|hl-DiffDelete|	 D  deleted line in diff mode
	|hl-DiffText|	 T  inserted text in diff mode
	|hl-SignColumn|	 >  column used for |signs|
	|hl-SpellBad|	 B  misspelled word |spell|
	|hl-SpellCap|	 P  word that should start with capital|spell|
	|hl-SpellRare|	 R  rare word |spell|
	|hl-SpellLocal|	 L  word from other region |spell|
	|hl-Pmenu|       +  popup menu normal line
	|hl-PmenuSel|    =  popup menu normal line
	|hl-PmenuSbar|   x  popup menu scrollbar
	|hl-PmenuThumb|  X  popup menu scrollbar thumb

	The display modes are:
		r	reverse		(termcap entry "mr" and "me")
		i	italic		(termcap entry "ZH" and "ZR")
		b	bold		(termcap entry "md" and "me")
		s	standout	(termcap entry "so" and "se")
		u	underline	(termcap entry "us" and "ue")
		c	undercurl	(termcap entry "Cs" and "Ce")
		n	no highlighting
		-	no highlighting
		:	use a highlight group
	The default is used for occasions that are not included.
	If you want to change what the display modes do, see |dos-colors|
	for an example.
	When using the ':' display mode, this must be followed by the name of
	a highlight group.  A highlight group can be used to define any type
	of highlighting, including using color.  See |:highlight| on how to
	define one.  The default uses a different group for each occasion.
	See |highlight-default| for the default highlight groups.

				 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'	boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the
			|+extra_search| feature}
	When there is a previous search pattern, highlight all its matches.
	The type of highlighting used can be set with the 'l' occasion in the
	'highlight' option.  This uses the "Search" highlight group by
	default.  Note that only the matching text is highlighted, any offsets
	are not applied.
	See also: 'incsearch' and |:match|.
	When you get bored looking at the highlighted matches, you can turn it
	off with |:nohlsearch|.  As soon as you use a search command, the
	highlighting comes back.
	When the search pattern can match an end-of-line, Vim will try to
	highlight all of the matched text.  However, this depends on where the
	search starts.  This will be the first line in the window or the first
	line below a closed fold.  A match in a previous line which is not
	drawn may not continue in a newly drawn line.
	NOTE: This option is reset when 'compatible' is set.

						*'history'* *'hi'*
'history' 'hi'		number	(Vim default: 20, Vi default: 0)
			global
			{not in Vi}
	A history of ":" commands, and a history of previous search patterns
	are remembered.  This option decides how many entries may be stored in
	each of these histories (see |cmdline-editing|).
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

					 *'hkmap'* *'hk'* *'nohkmap'* *'nohk'*
'hkmap' 'hk'		boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	When on, the keyboard is mapped for the Hebrew character set.
	Normally you would set 'allowrevins' and use CTRL-_ in insert mode to
	toggle this option.  See |rileft.txt|.
	NOTE: This option is reset when 'compatible' is set.

				 *'hkmapp'* *'hkp'* *'nohkmapp'* *'nohkp'*
'hkmapp' 'hkp'		boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	When on, phonetic keyboard mapping is used.  'hkmap' must also be on.
	This is useful if you have a non-Hebrew keyboard.
	See |rileft.txt|.
	NOTE: This option is reset when 'compatible' is set.

						*'icon'* *'noicon'*
'icon'			boolean	(default off, on when title can be restored)
			global
			{not in Vi}
			{not available when compiled without the |+title|
			feature}
	When on, the icon text of the window will be set to the value of
	'iconstring' (if it is not empty), or to the name of the file
	currently being edited.  Only the last part of the name is used.
	Overridden by the 'iconstring' option.
	Only works if the terminal supports setting window icons (currently
	only X11 GUI and terminals with a non-empty 't_IS' option - these are
	Unix xterm and iris-ansi by default, where 't_IS' is taken from the
	builtin termcap).
	When Vim was compiled with HAVE_X11 defined, the original icon will be
	restored if possible |X11|.  See |X11-icon| for changing the icon on
	X11.

						*'iconstring'*
'iconstring'		string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+title|
			feature}
	When this option is not empty, it will be used for the icon text of
	the window.  This happens only when the 'icon' option is on.
	Only works if the terminal supports setting window icon text
	(currently only X11 GUI and terminals with a non-empty 't_IS' option).
	Does not work for MS Windows.
	When Vim was compiled with HAVE_X11 defined, the original icon will be
	restored if possible |X11|.
	When this option contains printf-style '%' items, they will be
	expanded according to the rules used for 'statusline'.  See
	'titlestring' for example settings.
	{not available when compiled without the |+statusline| feature}

			*'ignorecase'* *'ic'* *'noignorecase'* *'noic'*
'ignorecase' 'ic'	boolean	(default off)
			global
	Ignore case in search patterns.  Also used when searching in the tags
	file.
	Also see 'smartcase'.
	Can be overruled by using "\c" or "\C" in the pattern, see
	|/ignorecase|.

						*'imactivatekey'* *'imak'*
'imactivatekey' 'imak'	string (default "")
			global
			{not in Vi}
			{only available when compiled with |+xim| and
			|+GUI_GTK|}
	Specifies the key that your Input Method in X-Windows uses for
	activation.  When this is specified correctly, vim can fully control
	IM with 'imcmdline', 'iminsert' and 'imsearch'.
	You can't use this option to change the activation key, the option
	tells Vim what the key is.
	Format:
		[MODIFIER_FLAG-]KEY_STRING

	These characters can be used for MODIFIER_FLAG (case is ignored):
		S	    Shift key
		L	    Lock key
		C	    Control key
		1	    Mod1 key
		2	    Mod2 key
		3	    Mod3 key
		4	    Mod4 key
		5	    Mod5 key
	Combinations are allowed, for example "S-C-space" or "SC-space" are
	both shift+ctrl+space.
	See <X11/keysymdef.h> and XStringToKeysym for KEY_STRING.

	Example: >
		:set imactivatekey=S-space
<	"S-space" means shift+space.  This is the activation key for kinput2 +
	canna (Japanese), and ami (Korean).

				*'imcmdline'* *'imc'* *'noimcmdline'* *'noimc'*
'imcmdline' 'imc'	boolean (default off)
			global
			{not in Vi}
			{only available when compiled with the |+xim|
			|+multi_byte_ime| or |global-ime| feature}
	When set the Input Method is always on when starting to edit a command
	line, unless entering a search pattern (see 'imsearch' for that).
	Setting this option is useful when your input method allows entering
	English characters directly, e.g., when it's used to type accented
	characters with dead keys.

				*'imdisable'* *'imd'* *'nodisable'* *'noimd'*
'imdisable' 'imd'	boolean (default off, on for some systems (SGI))
			global
			{not in Vi}
			{only available when compiled with the |+xim|
			|+multi_byte_ime| or |global-ime| feature}
	When set the Input Method is never used.  This is useful to disable
	the IM when it doesn't work properly.
	Currently this option is on by default for SGI/IRIX machines.  This
	may change in later releases.

						*'iminsert'* *'imi'*
'iminsert' 'imi'	number (default 0, 2 when an input method is supported)
			local to buffer
			{not in Vi}
	Specifies whether :lmap or an Input Method (IM) is to be used in
	Insert mode.  Valid values:
		0	:lmap is off and IM is off
		1	:lmap is ON and IM is off
		2	:lmap is off and IM is ON
	2 is available only when compiled with the |+multi_byte_ime|, |+xim|
	or |global-ime|.
	To always reset the option to zero when leaving Insert mode with <Esc>
	this can be used: >
		:inoremap <ESC> <ESC>:set iminsert=0<CR>
<	This makes :lmap and IM turn off automatically when leaving Insert
	mode.
	Note that this option changes when using CTRL-^ in Insert mode
	|i_CTRL-^|.
	The value is set to 1 when setting 'keymap' to a valid keymap name.
	It is also used for the argument of commands like "r" and "f".
	The value 0 may not work correctly with Athena and Motif with some XIM
	methods.  Use 'imdisable' to disable XIM then.

						*'imsearch'* *'ims'*
'imsearch' 'ims'	number (default 0, 2 when an input method is supported)
			local to buffer
			{not in Vi}
	Specifies whether :lmap or an Input Method (IM) is to be used when
	entering a search pattern.  Valid values:
		-1	the value of 'iminsert' is used, makes it look like
			'iminsert' is also used when typing a search pattern
		0	:lmap is off and IM is off
		1	:lmap is ON and IM is off
		2	:lmap is off and IM is ON
	Note that this option changes when using CTRL-^ in Command-line mode
	|c_CTRL-^|.
	The value is set to 1 when it is not -1 and setting the 'keymap'
	option to a valid keymap name.
	The value 0 may not work correctly with Athena and Motif with some XIM
	methods.  Use 'imdisable' to disable XIM then.

						*'include'* *'inc'*
'include' 'inc'		string	(default "^\s*#\s*include")
			global or local to buffer |global-local|
			{not in Vi}
			{not available when compiled without the
			|+find_in_path| feature}
	Pattern to be used to find an include command.  It is a search
	pattern, just like for the "/" command (See |pattern|).  The default
	value is for C programs.  This option is used for the commands "[i",
	"]I", "[d", etc.
	Normally the 'isfname' option is used to recognize the file name that
	comes after the matched pattern.  But if "\zs" appears in the pattern
	then the text matched from "\zs" to the end, or until "\ze" if it
	appears, is used as the file name.  Use this to include characters
	that are not in 'isfname', such as a space.  You can then use
	'includeexpr' to process the matched text.
	See |option-backslash| about including spaces and backslashes.

						*'includeexpr'* *'inex'*
'includeexpr' 'inex'	string	(default "")
			local to buffer
			{not in Vi}
			{not available when compiled without the
			|+find_in_path| or |+eval| feature}
	Expression to be used to transform the string found with the 'include'
	option to a file name.  Mostly useful to change "." to "/" for Java: >
		:set includeexpr=substitute(v:fname,'\\.','/','g')
<	The "v:fname" variable will be set to the file name that was detected.

	Also used for the |gf| command if an unmodified file name can't be
	found.  Allows doing "gf" on the name after an 'include' statement.
	Also used for |<cfile>|.

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'includeexpr' |textlock|.

				 *'incsearch'* *'is'* *'noincsearch'* *'nois'*
'incsearch' 'is'	boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the
			|+extra_search| feature}
	While typing a search command, show where the pattern, as it was typed
	so far, matches.  The matched string is highlighted.  If the pattern
	is invalid or not found, nothing is shown.  The screen will be updated
	often, this is only useful on fast terminals.
	Note that the match will be shown, but the cursor will return to its
	original position when no match is found and when pressing <Esc>.  You
	still need to finish the search command with <Enter> to move the
	cursor to the match.
	The highlighting can be set with the 'i' flag in 'highlight'.
	See also: 'hlsearch'.
	CTRL-L can be used to add one character from after the current match
	to the command line.
	CTRL-R CTRL-W can be used to add the word at the end of the current
	match, excluding the characters that were already typed.
	NOTE: This option is reset when 'compatible' is set.

						*'indentexpr'* *'inde'*
'indentexpr' 'inde'	string	(default "")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+cindent|
			or |+eval| features}
	Expression which is evaluated to obtain the proper indent for a line.
	It is used when a new line is created, for the |=| operator and
	in Insert mode as specified with the 'indentkeys' option.
	When this option is not empty, it overrules the 'cindent' and
	'smartindent' indenting.
	When 'paste' is set this option is not used for indenting.
	The expression is evaluated with |v:lnum| set to the line number for
	which the indent is to be computed.  The cursor is also in this line
	when the expression is evaluated (but it may be moved around).
	The expression must return the number of spaces worth of indent.  It
	can return "-1" to keep the current indent (this means 'autoindent' is
	used for the indent).
	Functions useful for computing the indent are |indent()|, |cindent()|
	and |lispindent()|.
	The evaluation of the expression must not have side effects!  It must
	not change the text, jump to another window, etc.  Afterwards the
	cursor position is always restored, thus the cursor may be moved.
	Normally this option would be set to call a function: >
		:set indentexpr=GetMyIndent()
<	Error messages will be suppressed, unless the 'debug' option contains
	"msg".
	See |indent-expression|.
	NOTE: This option is made empty when 'compatible' is set.

	The expression may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'indentexpr' |textlock|.


						*'indentkeys'* *'indk'*
'indentkeys' 'indk'	string	(default "0{,0},:,0#,!^F,o,O,e")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+cindent|
			feature}
	A list of keys that, when typed in Insert mode, cause reindenting of
	the current line.  Only happens if 'indentexpr' isn't empty.
	The format is identical to 'cinkeys', see |indentkeys-format|.
	See |C-indenting| and |indent-expression|.

			*'infercase'* *'inf'* *'noinfercase'* *'noinf'*
'infercase' 'inf'	boolean	(default off)
			local to buffer
			{not in Vi}
	When doing keyword completion in insert mode |ins-completion|, and
	'ignorecase' is also on, the case of the match is adjusted.  If the
	typed text contains a lowercase letter where the match has an upper
	case letter, the completed part is made lowercase.  If the typed text
	has no lowercase letters and the match has a lowercase letter where
	the typed text has an uppercase letter, and there is a letter before
	it, the completed part is made uppercase.

			*'insertmode'* *'im'* *'noinsertmode'* *'noim'*
'insertmode' 'im'	boolean	(default off)
			global
			{not in Vi}
	Makes Vim work in a way that Insert mode is the default mode.  Useful
	if you want to use Vim as a modeless editor.  Used for |evim|.
	These Insert mode commands will be useful:
	- Use the cursor keys to move around.
	- Use CTRL-O to execute one Normal mode command |i_CTRL-O|).  When
	  this is a mapping, it is executed as if 'insertmode' was off.
	  Normal mode remains active until the mapping is finished.
	- Use CTRL-L to execute a number of Normal mode commands, then use
	  <Esc> to get back to Insert mode.  Note that CTRL-L moves the cursor
	  left, like <Esc> does when 'insertmode' isn't set.  |i_CTRL-L|

	These items change when 'insertmode' is set:
	- when starting to edit of a file, Vim goes to Insert mode.
	- <Esc> in Insert mode is a no-op and beeps.
	- <Esc> in Normal mode makes Vim go to Insert mode.
	- CTRL-L in Insert mode is a command, it is not inserted.
	- CTRL-Z in Insert mode suspends Vim, see |CTRL-Z|.	*i_CTRL-Z*
	However, when <Esc> is used inside a mapping, it behaves like
	'insertmode' was not set.  This was done to be able to use the same
	mappings with 'insertmode' set or not set.
	When executing commands with |:normal| 'insertmode' is not used.

	NOTE: This option is reset when 'compatible' is set.

						*'isfname'* *'isf'*
'isfname' 'isf'		string	(default for MS-DOS, Win32 and OS/2:
			     "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="
			    for AMIGA: "@,48-57,/,.,-,_,+,,,$,:"
			    for VMS: "@,48-57,/,.,-,_,+,,,#,$,%,<,>,[,],:,;,~"
			    for OS/390: "@,240-249,/,.,-,_,+,,,#,$,%,~,="
			    otherwise: "@,48-57,/,.,-,_,+,,,#,$,%,~,=")
			global
			{not in Vi}
	The characters specified by this option are included in file names and
	path names.  Filenames are used for commands like "gf", "[i" and in
	the tags file.  It is also used for "\f" in a |pattern|.
	Multi-byte characters 256 and above are always included, only the
	characters up to 255 are specified with this option.
	For UTF-8 the characters 0xa0 to 0xff are included as well.

	Note that on systems using a backslash as path separator, Vim tries to
	do its best to make it work as you would expect.  That is a bit
	tricky, since Vi originally used the backslash to escape special
	characters.  Vim will not remove a backslash in front of a normal file
	name character on these systems, but it will on Unix and alikes.  The
	'&' and '^' are not included by default, because these are special for
	cmd.exe.

	The format of this option is a list of parts, separated with commas.
	Each part can be a single character number or a range.  A range is two
	character numbers with '-' in between.  A character number can be a
	decimal number between 0 and 255 or the ASCII character itself (does
	not work for digits).  Example:
		"_,-,128-140,#-43"	(include '_' and '-' and the range
					128 to 140 and '#' to 43)
	If a part starts with '^', the following character number or range
	will be excluded from the option.  The option is interpreted from left
	to right.  Put the excluded character after the range where it is
	included.  To include '^' itself use it as the last character of the
	option or the end of a range.  Example:
		"^a-z,#,^"	(exclude 'a' to 'z', include '#' and '^')
	If the character is '@', all characters where isalpha() returns TRUE
	are included.  Normally these are the characters a to z and A to Z,
	plus accented characters.  To include '@' itself use "@-@".  Examples:
		"@,^a-z"	All alphabetic characters, excluding lower
				case letters.
		"a-z,A-Z,@-@"	All letters plus the '@' character.
	A comma can be included by using it where a character number is
	expected.  Example:
		"48-57,,,_"	Digits, comma and underscore.
	A comma can be excluded by prepending a '^'.  Example:
		" -~,^,,9"	All characters from space to '~', excluding
				comma, plus <Tab>.
	See |option-backslash| about including spaces and backslashes.

						*'isident'* *'isi'*
'isident' 'isi'		string	(default for MS-DOS, Win32 and OS/2:
					   "@,48-57,_,128-167,224-235"
				otherwise: "@,48-57,_,192-255")
			global
			{not in Vi}
	The characters given by this option are included in identifiers.
	Identifiers are used in recognizing environment variables and after a
	match of the 'define' option.  It is also used for "\i" in a
	|pattern|.  See 'isfname' for a description of the format of this
	option.
	Careful: If you change this option, it might break expanding
	environment variables.  E.g., when '/' is included and Vim tries to
	expand "$HOME/.viminfo".  Maybe you should change 'iskeyword' instead.

						*'iskeyword'* *'isk'*
'iskeyword' 'isk'	string (Vim default for MS-DOS and Win32:
					    "@,48-57,_,128-167,224-235"
				   otherwise:  "@,48-57,_,192-255"
				Vi default: "@,48-57,_")
			local to buffer
			{not in Vi}
	Keywords are used in searching and recognizing with many commands:
	"w", "*", "[i", etc.  It is also used for "\k" in a |pattern|.  See
	'isfname' for a description of the format of this option.  For C
	programs you could use "a-z,A-Z,48-57,_,.,-,>".
	For a help file it is set to all non-blank printable characters except
	'*', '"' and '|' (so that CTRL-] on a command finds the help for that
	command).
	When the 'lisp' option is on the '-' character is always included.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'isprint'* *'isp'*
'isprint' 'isp'	string	(default for MS-DOS, Win32, OS/2 and Macintosh:
				"@,~-255"; otherwise: "@,161-255")
			global
			{not in Vi}
	The characters given by this option are displayed directly on the
	screen.  It is also used for "\p" in a |pattern|.  The characters from
	space (ASCII 32) to '~' (ASCII 126) are always displayed directly,
	even when they are not included in 'isprint' or excluded.  See
	'isfname' for a description of the format of this option.

	Non-printable characters are displayed with two characters:
		  0 -  31	"^@" - "^_"
		 32 - 126	always single characters
		   127		"^?"
		128 - 159	"~@" - "~_"
		160 - 254	"| " - "|~"
		   255		"~?"
	When 'encoding' is a Unicode one, illegal bytes from 128 to 255 are
	displayed as <xx>, with the hexadecimal value of the byte.
	When 'display' contains "uhex" all unprintable characters are
	displayed as <xx>.
	The NonText highlighting will be used for unprintable characters.
	|hl-NonText|

	Multi-byte characters 256 and above are always included, only the
	characters up to 255 are specified with this option.  When a character
	is printable but it is not available in the current font, a
	replacement character will be shown.
	Unprintable and zero-width Unicode characters are displayed as <xxxx>.
	There is no option to specify these characters.

			*'joinspaces'* *'js'* *'nojoinspaces'* *'nojs'*
'joinspaces' 'js'	boolean	(default on)
			global
			{not in Vi}
	Insert two spaces after a '.', '?' and '!' with a join command.
	When 'cpoptions' includes the 'j' flag, only do this after a '.'.
	Otherwise only one space is inserted.
	NOTE: This option is set when 'compatible' is set.

							*'key'*
'key'			string	(default "")
			local to buffer
			{not in Vi}
	The key that is used for encrypting and decrypting the current buffer.
	See |encryption|.
	Careful: Do not set the key value by hand, someone might see the typed
	key.  Use the |:X| command.  But you can make 'key' empty: >
		:set key=
<	It is not possible to get the value of this option with ":set key" or
	"echo &key".  This is to avoid showing it to someone who shouldn't
	know.  It also means you cannot see it yourself once you have set it,
	be careful not to make a typing error!

					*'keymap'* *'kmp'* *E544*
'keymap' 'kmp'		string	(default "")
			local to buffer
			{not in Vi}
			{only available when compiled with the |+keymap|
			feature}
	Name of a keyboard mapping.  See |mbyte-keymap|.
	Setting this option to a valid keymap name has the side effect of
	setting 'iminsert' to one, so that the keymap becomes effective.
	'imsearch' is also set to one, unless it was -1
	Only normal file name characters can be used, "/\*?[|<>" are illegal.

					*'keymodel'* *'km'*
'keymodel' 'km'		string	(default "")
			global
			{not in Vi}
	List of comma separated words, which enable special things that keys
	can do.  These values can be used:
	   startsel	Using a shifted special key starts selection (either
			Select mode or Visual mode, depending on "key" being
			present in 'selectmode').
	   stopsel	Using a not-shifted special key stops selection.
	Special keys in this context are the cursor keys, <End>, <Home>,
	<PageUp> and <PageDown>.
	The 'keymodel' option is set by the |:behave| command.

					*'keywordprg'* *'kp'*
'keywordprg' 'kp'	string	(default "man" or "man -s",  DOS: ":help",
						OS/2: "view /", VMS: "help")
			global or local to buffer |global-local|
			{not in Vi}
	Program to use for the |K| command.  Environment variables are
	expanded |:set_env|.  ":help" may be used to access the Vim internal
	help.  (Note that previously setting the global option to the empty
	value did this, which is now deprecated.)
	When "man" is used, Vim will automatically translate a count for the
	"K" command to a section number.  Also for "man -s", in which case the
	"-s" is removed when there is no count.
	See |option-backslash| about including spaces and backslashes.
	Example: >
		:set keywordprg=man\ -s
<	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

					*'langmap'* *'lmap'* *E357* *E358*
'langmap' 'lmap'	string	(default "")
			global
			{not in Vi}
			{only available when compiled with the |+langmap|
			feature}
	This option allows switching your keyboard into a special language
	mode.  When you are typing text in Insert mode the characters are
	inserted directly.  When in command mode the 'langmap' option takes
	care of translating these special characters to the original meaning
	of the key.  This means you don't have to change the keyboard mode to
	be able to execute Normal mode commands.
	This is the opposite of the 'keymap' option, where characters are
	mapped in Insert mode.
	This only works for 8-bit characters.  The value of 'langmap' may be
	specified with multi-byte characters (e.g., UTF-8), but only the lower
	8 bits of each character will be used.

	Example (for Greek, in UTF-8):				*greek*  >
	    :set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz
<	Example (exchanges meaning of z and y for commands): >
	    :set langmap=zy,yz,ZY,YZ
<
	The 'langmap' option is a list of parts, separated with commas.  Each
	part can be in one of two forms:
	1.  A list of pairs.  Each pair is a "from" character immediately
	    followed by the "to" character.  Examples: "aA", "aAbBcC".
	2.  A list of "from" characters, a semi-colon and a list of "to"
	    characters.  Example: "abc;ABC"
	Example: "aA,fgh;FGH,cCdDeE"
	Special characters need to be preceded with a backslash.  These are
	";", ',' and backslash itself.

	This will allow you to activate vim actions without having to switch
	back and forth between the languages.  Your language characters will
	be understood as normal vim English characters (according to the
	langmap mappings) in the following cases:
	 o Normal/Visual mode (commands, buffer/register names, user mappings)
	 o Insert/Replace Mode: Register names after CTRL-R
	 o Insert/Replace Mode: Mappings
	Characters entered in Command-line mode will NOT be affected by
	this option.   Note that this option can be changed at any time
	allowing to switch between mappings for different languages/encodings.
	Use a mapping to avoid having to type it each time!

					*'langmenu'* *'lm'*
'langmenu' 'lm'		string	(default "")
			global
			{not in Vi}
			{only available when compiled with the |+menu| and
			|+multi_lang| features}
	Language to use for menu translation.  Tells which file is loaded
	from the "lang" directory in 'runtimepath': >
		"lang/menu_" . &langmenu . ".vim"
<	(without the spaces).  For example, to always use the Dutch menus, no
	matter what $LANG is set to: >
		:set langmenu=nl_NL.ISO_8859-1
<	When 'langmenu' is empty, |v:lang| is used.
	Only normal file name characters can be used, "/\*?[|<>" are illegal.
	If your $LANG is set to a non-English language but you do want to use
	the English menus: >
		:set langmenu=none
<	This option must be set before loading menus, switching on filetype
	detection or syntax highlighting.  Once the menus are defined setting
	this option has no effect.  But you could do this: >
		:source $VIMRUNTIME/delmenu.vim
		:set langmenu=de_DE.ISO_8859-1
		:source $VIMRUNTIME/menu.vim
<	Warning: This deletes all menus that you defined yourself!

					*'laststatus'* *'ls'*
'laststatus' 'ls'	number	(default 1)
			global
			{not in Vi}
	The value of this option influences when the last window will have a
	status line:
		0: never
		1: only if there are at least two windows
		2: always
	The screen looks nicer with a status line if you have several
	windows, but it takes another screen line. |status-line|

			*'lazyredraw'* *'lz'* *'nolazyredraw'* *'nolz'*
'lazyredraw' 'lz'	boolean	(default off)
			global
			{not in Vi}
	When this option is set, the screen will not be redrawn while
	executing macros, registers and other commands that have not been
	typed.  Also, updating the window title is postponed.  To force an
	update use |:redraw|.

			*'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
'linebreak' 'lbr'	boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the  |+linebreak|
			feature}
	If on Vim will wrap long lines at a character in 'breakat' rather
	than at the last character that fits on the screen.  Unlike
	'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
	it only affects the way the file is displayed, not its contents.  The
	value of 'showbreak' is used to put in front of wrapped lines.
	This option is not used when the 'wrap' option is off or 'list' is on.
	Note that <Tab> characters after an <EOL> are mostly not displayed
	with the right amount of white space.

						*'lines'* *E593*
'lines'			number	(default 24 or terminal height)
			global
	Number of lines of the Vim window.
	Normally you don't need to set this.  It is done automatically by the
	terminal initialization code.  Also see |posix-screen-size|.
	When Vim is running in the GUI or in a resizable window, setting this
	option will cause the window size to be changed.  When you only want
	to use the size for the GUI, put the command in your |gvimrc| file.
	Vim limits the number of lines to what fits on the screen.  You can
	use this command to get the tallest window possible: >
		:set lines=999
<	Minimum value is 2, maximum value is 1000.
	If you get less lines than expected, check the 'guiheadroom' option.
	When you set this option and Vim is unable to change the physical
	number of lines of the display, the display may be messed up.

						*'linespace'* *'lsp'*
'linespace' 'lsp'	number	(default 0, 1 for Win32 GUI)
			global
			{not in Vi}
			{only in the GUI}
	Number of pixel lines inserted between characters.  Useful if the font
	uses the full character cell height, making lines touch each other.
	When non-zero there is room for underlining.
	With some fonts there can be too much room between lines (to have
	space for ascents and descents).  Then it makes sense to set
	'linespace' to a negative value.  This may cause display problems
	though!

						*'lisp'* *'nolisp'*
'lisp'			boolean	(default off)
			local to buffer
			{not available when compiled without the |+lispindent|
			feature}
	Lisp mode: When <Enter> is typed in insert mode set the indent for
	the next line to Lisp standards (well, sort of).  Also happens with
	"cc" or "S".  'autoindent' must also be on for this to work.  The 'p'
	flag in 'cpoptions' changes the method of indenting: Vi compatible or
	better.  Also see 'lispwords'.
	The '-' character is included in keyword characters.  Redefines the
	"=" operator to use this same indentation algorithm rather than
	calling an external program if 'equalprg' is empty.
	This option is not used when 'paste' is set.
	{Vi: Does it a little bit differently}

						*'lispwords'* *'lw'*
'lispwords' 'lw'	string	(default is very long)
			global
			{not in Vi}
			{not available when compiled without the |+lispindent|
			feature}
	Comma separated list of words that influence the Lisp indenting.
	|'lisp'|

						*'list'* *'nolist'*
'list'			boolean	(default off)
			local to window
	List mode: Show tabs as CTRL-I, show end of line with $.  Useful to
	see the difference between tabs and spaces and for trailing blanks.
	Note that this will also affect formatting (set with 'textwidth' or
	'wrapmargin') when 'cpoptions' includes 'L'.  See 'listchars' for
	changing the way tabs are displayed.

						*'listchars'* *'lcs'*
'listchars' 'lcs'	string	(default "eol:$")
			global
			{not in Vi}
	Strings to use in 'list' mode.  It is a comma separated list of string
	settings.
	  eol:c		Character to show at the end of each line.  When
			omitted, there is no extra character at the end of the
			line.
	  tab:xy	Two characters to be used to show a Tab.  The first
			char is used once.  The second char is repeated to
			fill the space that the Tab normally occupies.
			"tab:>-" will show a Tab that takes four spaces as
			">---".  When omitted, a Tab is show as ^I.
	  trail:c	Character to show for trailing spaces.  When omitted,
			trailing spaces are blank.
	  extends:c	Character to show in the last column, when 'wrap' is
			off and the line continues beyond the right of the
			screen.
	  precedes:c	Character to show in the first column, when 'wrap'
			is off and there is text preceding the character
			visible in the first column.
	  nbsp:c	Character to show for a non-breakable space (character
			0xA0, 160).  Left blank when omitted.

	The characters ':' and ',' should not be used.  UTF-8 characters can
	be used when 'encoding' is "utf-8", otherwise only printable
	characters are allowed.  All characters must be single width.

	Examples: >
	    :set lcs=tab:>-,trail:-
	    :set lcs=tab:>-,eol:<,nbsp:%
	    :set lcs=extends:>,precedes:<
<	The "NonText" highlighting will be used for "eol", "extends" and
	"precedes".  "SpecialKey" for "nbsp", "tab" and "trail".

			*'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'*
'loadplugins' 'lpl'	boolean	(default on)
			global
			{not in Vi}
	When on the plugin scripts are loaded when starting up |load-plugins|.
	This option can be reset in your |vimrc| file to disable the loading
	of plugins.
	Note that using the "-u NONE" and "--noplugin" command line arguments
	reset this option. |-u| |--noplugin|

						*'macatsui'* *'nomacatsui'*
'macatsui'		boolean	(default on)
			global
			{only available in Mac GUI version}
	This is a workaround for when drawing doesn't work properly.  When set
	and compiled with multi-byte support ATSUI text drawing is used.  When
	not set ATSUI text drawing is not used.  Switch this option off when
	you experience drawing problems.  In a future version the problems may
	be solved and this option becomes obsolete.  Therefore use this method
	to unset it: >
		if exists('&macatsui')
		   set nomacatsui
		endif
<
						*'magic'* *'nomagic'*
'magic'			boolean	(default on)
			global
	Changes the special characters that can be used in search patterns.
	See |pattern|.
	NOTE: To avoid portability problems with using patterns, always keep
	this option at the default "on".  Only switch it off when working with
	old Vi scripts.  In any other situation write patterns that work when
	'magic' is on.  Include "\M" when you want to |/\M|.

						*'makeef'* *'mef'*
'makeef' 'mef'		string	(default: "")
			global
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	Name of the errorfile for the |:make| command (see |:make_makeprg|)
	and the |:grep| command.
	When it is empty, an internally generated temp file will be used.
	When "##" is included, it is replaced by a number to make the name
	unique.  This makes sure that the ":make" command doesn't overwrite an
	existing file.
	NOT used for the ":cf" command.  See 'errorfile' for that.
	Environment variables are expanded |:set_env|.
	See |option-backslash| about including spaces and backslashes.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'makeprg'* *'mp'*
'makeprg' 'mp'		string	(default "make", VMS: "MMS")
			global or local to buffer |global-local|
			{not in Vi}
	Program to use for the ":make" command.  See |:make_makeprg|.  This
	option may contain '%' and '#' characters, which are expanded like
	when used in a command-line.  Environment variables are expanded
	|:set_env|.  See |option-backslash| about including spaces and
	backslashes.  Note that a '|' must be escaped twice: once for ":set"
	and once for the interpretation of a command.  When you use a filter
	called "myfilter" do it like this: >
	    :set makeprg=gmake\ \\\|\ myfilter
<	The placeholder "$*" can be given (even multiple times) to specify
	where the arguments will be included, for example: >
	    :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
<	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'matchpairs'* *'mps'*
'matchpairs' 'mps'	string	(default "(:),{:},[:]")
			local to buffer
			{not in Vi}
	Characters that form pairs.  The |%| command jumps from one to the
	other.  Currently only single character pairs are allowed, and they
	must be different.  The characters must be separated by a colon.  The
	pairs must be separated by a comma.  Example for including '<' and '>'
	(HTML): >
		:set mps+=<:>

<	A more exotic example, to jump between the '=' and ';' in an
	assignment, useful for languages like C and Java: >
		:au FileType c,cpp,java set mps+==:;

<	For a more advanced way of using "%", see the matchit.vim plugin in
	the $VIMRUNTIME/macros directory. |add-local-help|

						*'matchtime'* *'mat'*
'matchtime' 'mat'	number	(default 5)
			global
			{not in Vi}{in Nvi}
	Tenths of a second to show the matching paren, when 'showmatch' is
	set.  Note that this is not in milliseconds, like other options that
	set a time.  This is to be compatible with Nvi.

						*'maxcombine'* *'mco'*
'maxcombine' 'mco'	number (default 2)
			global
			{not in Vi}
			{only available when compiled with the |+multi_byte|
			feature}
	The maximum number of combining characters supported for displaying.
	Only used when 'encoding' is "utf-8".
	The default is OK for most languages.  Hebrew may require 4.
	Maximum value is 6.
	Even when this option is set to 2 you can still edit text with more
	combining characters, you just can't see them.  Use |g8| or |ga|.
	See |mbyte-combining|.

						*'maxfuncdepth'* *'mfd'*
'maxfuncdepth' 'mfd'	number	(default 100)
			global
			{not in Vi}
	Maximum depth of function calls for user functions.  This normally
	catches endless recursion.  When using a recursive function with
	more depth, set 'maxfuncdepth' to a bigger number.  But this will use
	more memory, there is the danger of failing when memory is exhausted.
	See also |:function|.

						*'maxmapdepth'* *'mmd'* *E223*
'maxmapdepth' 'mmd'	number	(default 1000)
			global
			{not in Vi}
	Maximum number of times a mapping is done without resulting in a
	character to be used.  This normally catches endless mappings, like
	":map x y" with ":map y x".  It still does not catch ":map g wg",
	because the 'w' is used before the next mapping is done.  See also
	|key-mapping|.

						*'maxmem'* *'mm'*
'maxmem' 'mm'		number	(default between 256 to 5120 (system
				 dependent) or half the amount of memory
				 available)
			global
			{not in Vi}
	Maximum amount of memory (in Kbyte) to use for one buffer.  When this
	limit is reached allocating extra memory for a buffer will cause
	other memory to be freed.  Maximum value 2000000.  Use this to work
	without a limit.  Also see 'maxmemtot'.

						*'maxmempattern'* *'mmp'*
'maxmempattern' 'mmp'	number	(default 1000)
			global
			{not in Vi}
	Maximum amount of memory (in Kbyte) to use for pattern matching.
	Maximum value 2000000.  Use this to work without a limit.
							*E363*
	When Vim runs into the limit it gives an error message mostly behaves
	like CTRL-C was typed.
	Running into the limit often means that the pattern is very
	inefficient or too complex.  This may already happen with the pattern
	"\(.\)*" on a very long line.  ".*" works much better.
	Vim may run out of memory before hitting the 'maxmempattern' limit.

						*'maxmemtot'* *'mmt'*
'maxmemtot' 'mmt'	number	(default between 2048 and 10240 (system
				 dependent) or half the amount of memory
				 available)
			global
			{not in Vi}
	Maximum amount of memory (in Kbyte) to use for all buffers together.
	Maximum value 2000000.  Use this to work without a limit.  Also see
	'maxmem'.

						*'menuitems'* *'mis'*
'menuitems' 'mis'	number	(default 25)
			global
			{not in Vi}
			{not available when compiled without the |+menu|
			feature}
	Maximum number of items to use in a menu.  Used for menus that are
	generated from a list of items, e.g., the Buffers menu.  Changing this
	option has no direct effect, the menu must be refreshed first.

						*'mkspellmem'* *'msm'*
'mkspellmem' 'msm'	string	(default "460000,2000,500")
			global
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	Parameters for |:mkspell|.  This tunes when to start compressing the
	word tree.  Compression can be slow when there are many words, but
	it's needed to avoid running out of memory.  The amount of memory used
	per word depends very much on how similar the words are, that's why
	this tuning is complicated.

	There are three numbers, separated by commas:
		{start},{inc},{added}

	For most languages the uncompressed word tree fits in memory.  {start}
	gives the amount of memory in Kbyte that can be used before any
	compression is done.  It should be a bit smaller than the amount of
	memory that is available to Vim.

	When going over the {start} limit the {inc} number specifies the
	amount of memory in Kbyte that can be allocated before another
	compression is done.  A low number means compression is done after
	less words are added, which is slow.  A high number means more memory
	will be allocated.

	After doing compression, {added} times 1024 words can be added before
	the {inc} limit is ignored and compression is done when any extra
	amount of memory is needed.  A low number means there is a smaller
	chance of hitting the {inc} limit, less memory is used but it's
	slower.

	The languages for which these numbers are important are Italian and
	Hungarian.  The default works for when you have about 512 Mbyte.  If
	you have 1 Gbyte you could use: >
		:set mkspellmem=900000,3000,800
<	If you have less than 512 Mbyte |:mkspell| may fail for some
	languages, no matter what you set 'mkspellmem' to.

				   *'modeline'* *'ml'* *'nomodeline'* *'noml'*
'modeline' 'ml'		boolean	(Vim default: on, Vi default: off)
			local to buffer
						*'modelines'* *'mls'*
'modelines' 'mls'	number	(default 5)
			global
			{not in Vi}
	If 'modeline' is on 'modelines' gives the number of lines that is
	checked for set commands.  If 'modeline' is off or 'modelines' is zero
	no lines are checked.  See |modeline|.
	NOTE: 'modeline' is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

				*'modifiable'* *'ma'* *'nomodifiable'* *'noma'*
'modifiable' 'ma'	boolean	(default on)
			local to buffer
			{not in Vi}		*E21*
	When off the buffer contents cannot be changed.  The 'fileformat' and
	'fileencoding' options also can't be changed.
	Can be reset with the |-M| command line argument.

				*'modified'* *'mod'* *'nomodified'* *'nomod'*
'modified' 'mod'	boolean	(default off)
			local to buffer
			{not in Vi}
	When on, the buffer is considered to be modified.  This option is set
	when:
	1. A change was made to the text since it was last written.  Using the
	   |undo| command to go back to the original text will reset the
	   option.  But undoing changes that were made before writing the
	   buffer will set the option again, since the text is different from
	   when it was written.
	2. 'fileformat' or 'fileencoding' is different from its original
	   value.  The original value is set when the buffer is read or
	   written.  A ":set nomodified" command also resets the original
	   values to the current values and the 'modified' option will be
	   reset.
	When 'buftype' is "nowrite" or "nofile" this option may be set, but
	will be ignored.

						*'more'* *'nomore'*
'more'			boolean	(Vim default: on, Vi default: off)
			global
			{not in Vi}
	When on, listings pause when the whole screen is filled.  You will get
	the |more-prompt|.  When this option is off there are no pauses, the
	listing continues until finished.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'mouse'* *E538*
'mouse'			string	(default "", "a" for GUI, MS-DOS and Win32)
			global
			{not in Vi}
	Enable the use of the mouse.  Only works for certain terminals
	(xterm, MS-DOS, Win32 |win32-mouse|, QNX pterm, and Linux console
	with gpm).  For using the mouse in the GUI, see |gui-mouse|.
	The mouse can be enabled for different modes:
		n	Normal mode
		v	Visual mode
		i	Insert mode
		c	Command-line mode
		h	all previous modes when editing a help file
		a	all previous modes
		r	for |hit-enter| and |more-prompt| prompt
	Normally you would enable the mouse in all four modes with: >
		:set mouse=a
<	When the mouse is not enabled, the GUI will still use the mouse for
	modeless selection.  This doesn't move the text cursor.

	See |mouse-using|.  Also see |'clipboard'|.

	Note: When enabling the mouse in a terminal, copy/paste will use the
	"* register if there is access to an X-server.  The xterm handling of
	the mouse buttons can still be used by keeping the shift key pressed.
	Also see the 'clipboard' option.

			*'mousefocus'* *'mousef'* *'nomousefocus'* *'nomousef'*
'mousefocus' 'mousef'	boolean	(default off)
			global
			{not in Vi}
			{only works in the GUI}
	The window that the mouse pointer is on is automatically activated.
	When changing the window layout or window focus in another way, the
	mouse pointer is moved to the window with keyboard focus.  Off is the
	default because it makes using the pull down menus a little goofy, as
	a pointer transit may activate a window unintentionally.

			*'mousehide'* *'mh'* *'nomousehide'* *'nomh'*
'mousehide' 'mh'	boolean	(default on)
			global
			{not in Vi}
			{only works in the GUI}
	When on, the mouse pointer is hidden when characters are typed.
	The mouse pointer is restored when the mouse is moved.

						*'mousemodel'* *'mousem'*
'mousemodel' 'mousem'	string	(default "extend", "popup" for MS-DOS and Win32)
			global
			{not in Vi}
	Sets the model to use for the mouse.  The name mostly specifies what
	the right mouse button is used for:
	   extend	Right mouse button extends a selection.  This works
			like in an xterm.
	   popup	Right mouse button pops up a menu.  The shifted left
			mouse button extends a selection.  This works like
			with Microsoft Windows.
	   popup_setpos Like "popup", but the cursor will be moved to the
			position where the mouse was clicked, and thus the
			selected operation will act upon the clicked object.
			If clicking inside a selection, that selection will
			be acted upon, i.e. no cursor move.  This implies of
			course, that right clicking outside a selection will
			end Visual mode.
	Overview of what button does what for each model:
	mouse		    extend		popup(_setpos) ~
	left click	    place cursor	place cursor
	left drag	    start selection	start selection
	shift-left	    search word		extend selection
	right click	    extend selection	popup menu (place cursor)
	right drag	    extend selection	-
	middle click	    paste		paste

	In the "popup" model the right mouse button produces a pop-up menu.
	You need to define this first, see |popup-menu|.

	Note that you can further refine the meaning of buttons with mappings.
	See |gui-mouse-mapping|.  But mappings are NOT used for modeless
	selection (because that's handled in the GUI code directly).

	The 'mousemodel' option is set by the |:behave| command.

					*'mouseshape'* *'mouses'* *E547*
'mouseshape' 'mouses'	string	(default "i:beam,r:beam,s:updown,sd:cross,
					m:no,ml:up-arrow,v:rightup-arrow")
			global
			{not in Vi}
			{only available when compiled with the |+mouseshape|
			feature}
	This option tells Vim what the mouse pointer should look like in
	different modes.  The option is a comma separated list of parts, much
	like used for 'guicursor'.  Each part consist of a mode/location-list
	and an argument-list:
		mode-list:shape,mode-list:shape,..
	The mode-list is a dash separated list of these modes/locations:
			In a normal window: ~
		n	Normal mode
		v	Visual mode
		ve	Visual mode with 'selection' "exclusive" (same as 'v',
			if not specified)
		o	Operator-pending mode
		i	Insert mode
		r	Replace mode

			Others: ~
		c	appending to the command-line
		ci	inserting in the command-line
		cr	replacing in the command-line
		m	at the 'Hit ENTER' or 'More' prompts
		ml	idem, but cursor in the last line
		e	any mode, pointer below last window
		s	any mode, pointer on a status line
		sd	any mode, while dragging a status line
		vs	any mode, pointer on a vertical separator line
		vd	any mode, while dragging a vertical separator line
		a	everywhere

	The shape is one of the following:
	avail	name		looks like ~
	w x	arrow		Normal mouse pointer
	w x	blank		no pointer at all (use with care!)
	w x	beam		I-beam
	w x	updown		up-down sizing arrows
	w x	leftright	left-right sizing arrows
	w x	busy		The system's usual busy pointer
	w x	no		The system's usual 'no input' pointer
	  x	udsizing	indicates up-down resizing
	  x	lrsizing	indicates left-right resizing
	  x	crosshair	like a big thin +
	  x	hand1		black hand
	  x	hand2		white hand
	  x	pencil		what you write with
	  x	question	big ?
	  x	rightup-arrow	arrow pointing right-up
	w x	up-arrow	arrow pointing up
	  x	<number>	any X11 pointer number (see X11/cursorfont.h)

	The "avail" column contains a 'w' if the shape is available for Win32,
	x for X11.
	Any modes not specified or shapes not available use the normal mouse
	pointer.

	Example: >
		:set mouseshape=s:udsizing,m:no
<	will make the mouse turn to a sizing arrow over the status lines and
	indicate no input when the hit-enter prompt is displayed (since
	clicking the mouse has no effect in this state.)

						*'mousetime'* *'mouset'*
'mousetime' 'mouset'	number	(default 500)
			global
			{not in Vi}
	Only for GUI, MS-DOS, Win32 and Unix with xterm.  Defines the maximum
	time in msec between two mouse clicks for the second click to be
	recognized as a multi click.

						    *'mzquantum'* *'mzq'*
'mzquantum' 'mzq'	number	(default 100)
			global
			{not in Vi}
			{not available when compiled without the |+mzscheme|
			feature}
	The number of milliseconds between polls for MzScheme threads.
	Negative or zero value means no thread scheduling.

							*'nrformats'* *'nf'*
'nrformats' 'nf'	string	(default "octal,hex")
			local to buffer
			{not in Vi}
	This defines what bases Vim will consider for numbers when using the
	CTRL-A and CTRL-X commands for adding to and subtracting from a number
	respectively; see |CTRL-A| for more info on these commands.
	alpha	If included, single alphabetical characters will be
		incremented or decremented.  This is useful for a list with a
		letter index a), b), etc.
	octal	If included, numbers that start with a zero will be considered
		to be octal.  Example: Using CTRL-A on "007" results in "010".
	hex	If included, numbers starting with "0x" or "0X" will be
		considered to be hexadecimal.  Example: Using CTRL-X on
		"0x100" results in "0x0ff".
	Numbers which simply begin with a digit in the range 1-9 are always
	considered decimal.  This also happens for numbers that are not
	recognized as octal or hex.

				*'number'* *'nu'* *'nonumber'* *'nonu'*
'number' 'nu'		boolean	(default off)
			local to window
	Print the line number in front of each line.  When the 'n' option is
	excluded from 'cpoptions' a wrapped line will not use the column of
	line numbers (this is the default when 'compatible' isn't set).
	The 'numberwidth' option can be used to set the room used for the line
	number.
	When a long, wrapped line doesn't start with the first character, '-'
	characters are put before the number.
	See |hl-LineNr| for the highlighting used for the number.

						*'numberwidth'* *'nuw'*
'numberwidth' 'nuw'	number	(Vim default: 4  Vi default: 8)
			local to window
			{not in Vi}
			{only available when compiled with the |+linebreak|
			feature}
	Minimal number of columns to use for the line number.  Only relevant
	when the 'number' option is set or printing lines with a line number.
	Since one space is always between the number and the text, there is
	one less character for the number itself.
	The value is the minimum width.  A bigger width is used when needed to
	fit the highest line number in the buffer.  Thus with the Vim default
	of 4 there is room for a line number up to 999.  When the buffer has
	1000 lines five columns will be used.
	The minimum value is 1, the maximum value is 10.
	NOTE: 'numberwidth' is reset to 8 when 'compatible' is set.

						*'omnifunc'* *'ofu'*
'omnifunc' 'ofu'	string	(default: empty)
			local to buffer
			{not in Vi}
			{not available when compiled without the +eval
			or +insert_expand feature}
	This option specifies a function to be used for Insert mode omni
	completion with CTRL-X CTRL-O. |i_CTRL-X_CTRL-O|
	See |complete-functions| for an explanation of how the function is
	invoked and what it should return.
	This option is usually set by a filetype plugin.
	|:filetype-plugin-on|


						*'operatorfunc'* *'opfunc'*
'operatorfunc' 'opfunc'	string	(default: empty)
			global
			{not in Vi}
	This option specifies a function to be called by the |g@| operator.
	See |:map-operator| for more info and an example.

	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.


					*'osfiletype'* *'oft'* *E366*
'osfiletype' 'oft'	string (RISC-OS default: "Text",
				others default: "")
			local to buffer
			{not in Vi}
			{only available when compiled with the |+osfiletype|
			feature}
	Some operating systems store extra information about files besides
	name, datestamp and permissions.  This option contains the extra
	information, the nature of which will vary between systems.
	The value of this option is usually set when the file is loaded, and
	use to set the file type when file is written.
	It can affect the pattern matching of the automatic commands.
	|autocmd-osfiletypes|

						*'paragraphs'* *'para'*
'paragraphs' 'para'	string	(default "IPLPPPQPP LIpplpipbp")
			global
	Specifies the nroff macros that separate paragraphs.  These are pairs
	of two letters (see |object-motions|).

						*'paste'* *'nopaste'*
'paste'			boolean	(default off)
			global
			{not in Vi}
	Put Vim in Paste mode.  This is useful if you want to cut or copy
	some text from one window and paste it in Vim.  This will avoid
	unexpected effects.
	Setting this option is useful when using Vim in a terminal, where Vim
	cannot distinguish between typed text and pasted text.  In the GUI, Vim
	knows about pasting and will mostly do the right thing without 'paste'
	being set.  The same is true for a terminal where Vim handles the
	mouse clicks itself.
	This option is reset when starting the GUI.  Thus if you set it in
	your .vimrc it will work in a terminal, but not in the GUI.  Setting
	'paste' in the GUI has side effects: e.g., the Paste toolbar button
	will no longer work in Insert mode, because it uses a mapping.
	When the 'paste' option is switched on (also when it was already on):
		- mapping in Insert mode and Command-line mode is disabled
		- abbreviations are disabled
		- 'textwidth' is set to 0
		- 'wrapmargin' is set to 0
		- 'autoindent' is reset
		- 'smartindent' is reset
		- 'softtabstop' is set to 0
		- 'revins' is reset
		- 'ruler' is reset
		- 'showmatch' is reset
		- 'formatoptions' is used like it is empty
	These options keep their value, but their effect is disabled:
		- 'lisp'
		- 'indentexpr'
		- 'cindent'
	NOTE: When you start editing another file while the 'paste' option is
	on, settings from the modelines or autocommands may change the
	settings again, causing trouble when pasting text.  You might want to
	set the 'paste' option again.
	When the 'paste' option is reset the mentioned options are restored to
	the value before the moment 'paste' was switched from off to on.
	Resetting 'paste' before ever setting it does not have any effect.
	Since mapping doesn't work while 'paste' is active, you need to use
	the 'pastetoggle' option to toggle the 'paste' option with some key.

						*'pastetoggle'* *'pt'*
'pastetoggle' 'pt'	string	(default "")
			global
			{not in Vi}
	When non-empty, specifies the key sequence that toggles the 'paste'
	option.  This is like specifying a mapping: >
	    :map {keys} :set invpaste<CR>
<	Where {keys} is the value of 'pastetoggle'.
	The difference is that it will work even when 'paste' is set.
	'pastetoggle' works in Insert mode and Normal mode, but not in
	Command-line mode.
	Mappings are checked first, thus overrule 'pastetoggle'.  However,
	when 'paste' is on mappings are ignored in Insert mode, thus you can do
	this: >
	    :map <F10> :set paste<CR>
	    :map <F11> :set nopaste<CR>
	    :imap <F10> <C-O>:set paste<CR>
	    :imap <F11> <nop>
	    :set pastetoggle=<F11>
<	This will make <F10> start paste mode and <F11> stop paste mode.
	Note that typing <F10> in paste mode inserts "<F10>", since in paste
	mode everything is inserted literally, except the 'pastetoggle' key
	sequence.

						*'pex'* *'patchexpr'*
'patchexpr' 'pex'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+diff|
			feature}
	Expression which is evaluated to apply a patch to a file and generate
	the resulting new version of the file.  See |diff-patchexpr|.

						*'patchmode'* *'pm'* *E206*
'patchmode' 'pm'	string	(default "")
			global
			{not in Vi}
	When non-empty the oldest version of a file is kept.  This can be used
	to keep the original version of a file if you are changing files in a
	source distribution.  Only the first time that a file is written a
	copy of the original file will be kept.  The name of the copy is the
	name of the original file with the string in the 'patchmode' option
	appended.  This option should start with a dot.  Use a string like
	".org".  'backupdir' must not be empty for this to work (Detail: The
	backup file is renamed to the patchmode file after the new file has
	been successfully written, that's why it must be possible to write a
	backup file).  If there was no file to be backed up, an empty file is
	created.
	When the 'backupskip' pattern matches, a patchmode file is not made.
	Using 'patchmode' for compressed files appends the extension at the
	end (e.g., "file.gz.orig"), thus the resulting name isn't always
	recognized as a compressed file.
	Only normal file name characters can be used, "/\*?[|<>" are illegal.

					*'path'* *'pa'* *E343* *E345* *E347*
'path' 'pa'		string	(default on Unix: ".,/usr/include,,"
				   on OS/2:	  ".,/emx/include,,"
				   other systems: ".,,")
			global or local to buffer |global-local|
			{not in Vi}
	This is a list of directories which will be searched when using the
	|gf|, [f, ]f, ^Wf, |:find| and other commands, provided that the file
	being searched for has a relative path (not starting with '/').  The
	directories in the 'path' option may be relative or absolute.
	- Use commas to separate directory names: >
		:set path=.,/usr/local/include,/usr/include
<	- Spaces can also be used to separate directory names (for backwards
	  compatibility with version 3.0).  To have a space in a directory
	  name, precede it with an extra backslash, and escape the space: >
		:set path=.,/dir/with\\\ space
<	- To include a comma in a directory name precede it with an extra
	  backslash: >
		:set path=.,/dir/with\\,comma
<	- To search relative to the directory of the current file, use: >
		:set path=.
<	- To search in the current directory use an empty string between two
	  commas: >
		:set path=,,
<	- A directory name may end in a ':' or '/'.
	- Environment variables are expanded |:set_env|.
	- When using |netrw.vim| URLs can be used.  For example, adding
	  "http://www.vim.org" will make ":find index.html" work.
	- Search upwards and downwards in a directory tree:
	  1) "*" matches a sequence of characters, e.g.: >
		:set path=/usr/include/*
<	     means all subdirectories in /usr/include (but not /usr/include
	     itself). >
		:set path=/usr/*c
<	     matches /usr/doc and /usr/src.
	  2) "**" matches a subtree, up to 100 directories deep.  Example: >
		:set path=/home/user_x/src/**
<	     means search in the whole subtree under "/home/usr_x/src".
	  3) If the path ends with a ';', this path is the startpoint
	     for upward search.
	  See |file-searching| for more info and exact syntax.
	  {not available when compiled without the |+path_extra| feature}
	- Careful with '\' characters, type two to get one in the option: >
		:set path=.,c:\\include
<	  Or just use '/' instead: >
		:set path=.,c:/include
<	Don't forget "." or files won't even be found in the same directory as
	the file!
	The maximum length is limited.  How much depends on the system, mostly
	it is something like 256 or 1024 characters.
	You can check if all the include files are found, using the value of
	'path', see |:checkpath|.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	directories from the list.  This avoids problems when a future version
	uses another default.  To remove the current directory use: >
		:set path-=
<	To add the current directory use: >
		:set path+=
<	To use an environment variable, you probably need to replace the
	separator.  Here is an example to append $INCL, in which directory
	names are separated with a semi-colon: >
		:let &path = &path . "," . substitute($INCL, ';', ',', 'g')
<	Replace the ';' with a ':' or whatever separator is used.  Note that
	this doesn't work when $INCL contains a comma or white space.

			*'preserveindent'* *'pi'* *'nopreserveindent'* *'nopi'*
'preserveindent' 'pi'	boolean	(default off)
			local to buffer
			{not in Vi}
	When changing the indent of the current line, preserve as much of the
	indent structure as possible.  Normally the indent is replaced by a
	series of tabs followed by spaces as required (unless |'expandtab'| is
	enabled, in which case only spaces are used).  Enabling this option
	means the indent will preserve as many existing characters as possible
	for indenting, and only add additional tabs or spaces as required.
	NOTE: When using ">>" multiple times the resulting indent is a mix of
	tabs and spaces.  You might not like this.
	NOTE: 'preserveindent' is reset when 'compatible' is set.
	Also see 'copyindent'.
	Use |:retab| to clean up white space.

					*'previewheight'* *'pvh'*
'previewheight' 'pvh'	number (default 12)
			global
			{not in Vi}
			{not available when compiled without the |+windows| or
			|+quickfix| feature}
	Default height for a preview window.  Used for |:ptag| and associated
	commands.  Used for |CTRL-W_}| when no count is given.

					*'previewwindow'* *'nopreviewwindow'*
					*'pvw'* *'nopvw'* *E590*
'previewwindow' 'pvw'	boolean (default off)
			local to window
			{not in Vi}
			{not available when compiled without the |+windows| or
			|+quickfix| feature}
	Identifies the preview window.  Only one window can have this option
	set.  It's normally not set directly, but by using one of the commands
	|:ptag|, |:pedit|, etc.

						*'printdevice'* *'pdev'*
'printdevice' 'pdev'	string	(default empty)
			global
			{not in Vi}
			{only available when compiled with the |+printer|
			feature}
	The name of the printer to be used for |:hardcopy|.
	See |pdev-option|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'printencoding'* *'penc'*
'printencoding' 'penc'	String	(default empty, except for some systems)
			global
			{not in Vi}
			{only available when compiled with the |+printer|
			and |+postscript| features}
	Sets the character encoding used when printing.
	See |penc-option|.

						*'printexpr'* *'pexpr'*
'printexpr' 'pexpr'	String	(default: see below)
			global
			{not in Vi}
			{only available when compiled with the |+printer|
			and |+postscript| features}
	Expression used to print the PostScript produced with |:hardcopy|.
	See |pexpr-option|.

						*'printfont'* *'pfn'*
'printfont' 'pfn'	string	(default "courier")
			global
			{not in Vi}
			{only available when compiled with the |+printer|
			feature}
	The name of the font that will be used for |:hardcopy|.
	See |pfn-option|.

						*'printheader'* *'pheader'*
'printheader' 'pheader'  string  (default "%<%f%h%m%=Page %N")
			global
			{not in Vi}
			{only available when compiled with the |+printer|
			feature}
	The format of the header produced in |:hardcopy| output.
	See |pheader-option|.

						*'printmbcharset'* *'pmbcs'*
'printmbcharset' 'pmbcs'  string (default "")
			global
			{not in Vi}
			{only available when compiled with the |+printer|,
			|+postscript| and |+multi_byte| features}
	The CJK character set to be used for CJK output from |:hardcopy|.
	See |pmbcs-option|.

						*'printmbfont'* *'pmbfn'*
'printmbfont' 'pmbfn'	string (default "")
			global
			{not in Vi}
			{only available when compiled with the |+printer|,
			|+postscript| and |+multi_byte| features}
	List of font names to be used for CJK output from |:hardcopy|.
	See |pmbfn-option|.

						*'printoptions'* *'popt'*
'printoptions' 'popt' string (default "")
			global
			{not in Vi}
			{only available when compiled with |+printer| feature}
	List of items that control the format of the output of |:hardcopy|.
	See |popt-option|.

						*'prompt'* *'noprompt'*
'prompt'		boolean	(default on)
			global
	When on a ":" prompt is used in Ex mode.

						*'pumheight'* *'ph'*
'pumheight' 'ph'	number	(default 0)
			global
			{not available when compiled without the
			|+insert_expand| feature}
			{not in Vi}
	Determines the maximum number of items to show in the popup menu for
	Insert mode completion.  When zero as much space as available is used.
	|ins-completion-menu|.


						*'quoteescape'* *'qe'*
'quoteescape' 'qe'	string	(default "\")
			local to buffer
			{not in Vi}
	The characters that are used to escape quotes in a string.  Used for
	objects like a', a" and a` |a'|.
	When one of the characters in this option is found inside a string,
	the following character will be skipped.  The default value makes the
	text "foo\"bar\\" considered to be one string.

				   *'readonly'* *'ro'* *'noreadonly'* *'noro'*
'readonly' 'ro'		boolean	(default off)
			local to buffer
	If on, writes fail unless you use a '!'.  Protects you from
	accidentally overwriting a file.  Default on when Vim is started
	in read-only mode ("vim -R") or when the executable is called "view".
	When using ":w!" the 'readonly' option is reset for the current
	buffer, unless the 'Z' flag is in 'cpoptions'.
	{not in Vi:}  When using the ":view" command the 'readonly' option is
	set for the newly edited buffer.

						*'remap'* *'noremap'*
'remap'			boolean	(default on)
			global
	Allows for mappings to work recursively.  If you do not want this for
	a single entry, use the :noremap[!] command.
	NOTE: To avoid portability problems with Vim scripts, always keep
	this option at the default "on".  Only switch it off when working with
	old Vi scripts.

						*'report'*
'report'		number	(default 2)
			global
	Threshold for reporting number of lines changed.  When the number of
	changed lines is more than 'report' a message will be given for most
	":" commands.  If you want it always, set 'report' to 0.
	For the ":substitute" command the number of substitutions is used
	instead of the number of lines.

			 *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'*
'restorescreen' 'rs'	boolean	(default on)
			global
			{not in Vi}  {only in Windows 95/NT console version}
	When set, the screen contents is restored when exiting Vim.  This also
	happens when executing external commands.

	For non-Windows Vim: You can set or reset the 't_ti' and 't_te'
	options in your .vimrc.  To disable restoring:
		set t_ti= t_te=
	To enable restoring (for an xterm):
		set t_ti=^[7^[[r^[[?47h t_te=^[[?47l^[8
	(Where ^[ is an <Esc>, type CTRL-V <Esc> to insert it)

				*'revins'* *'ri'* *'norevins'* *'nori'*
'revins' 'ri'		boolean	(default off)
			global
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	Inserting characters in Insert mode will work backwards.  See "typing
	backwards" |ins-reverse|.  This option can be toggled with the CTRL-_
	command in Insert mode, when 'allowrevins' is set.
	NOTE: This option is reset when 'compatible' or 'paste' is set.

				 *'rightleft'* *'rl'* *'norightleft'* *'norl'*
'rightleft' 'rl'	boolean	(default off)
			local to window
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	When on, display orientation becomes right-to-left, i.e., characters
	that are stored in the file appear from the right to the left.
	Using this option, it is possible to edit files for languages that
	are written from the right to the left such as Hebrew and Arabic.
	This option is per window, so it is possible to edit mixed files
	simultaneously, or to view the same file in both ways (this is
	useful whenever you have a mixed text file with both right-to-left
	and left-to-right strings so that both sets are displayed properly
	in different windows).  Also see |rileft.txt|.

			*'rightleftcmd'* *'rlc'* *'norightleftcmd'* *'norlc'*
'rightleftcmd' 'rlc'	string	(default "search")
			local to window
			{not in Vi}
			{only available when compiled with the |+rightleft|
			feature}
	Each word in this option enables the command line editing to work in
	right-to-left mode for a group of commands:

		search		"/" and "?" commands

	This is useful for languages such as Hebrew, Arabic and Farsi.
	The 'rightleft' option must be set for 'rightleftcmd' to take effect.

					 *'ruler'* *'ru'* *'noruler'* *'noru'*
'ruler' 'ru'		boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the
			|+cmdline_info| feature}
	Show the line and column number of the cursor position, separated by a
	comma.  When there is room, the relative position of the displayed
	text in the file is shown on the far right:
		Top	first line is visible
		Bot	last line is visible
		All	first and last line are visible
		45%	relative position in the file
	If 'rulerformat' is set, it will determine the contents of the ruler.
	Each window has its own ruler.  If a window has a status line, the
	ruler is shown there.  Otherwise it is shown in the last line of the
	screen.  If the statusline is given by 'statusline' (i.e. not empty),
	this option takes precedence over 'ruler' and 'rulerformat'
	If the number of characters displayed is different from the number of
	bytes in the text (e.g., for a TAB or a multi-byte character), both
	the text column (byte number) and the screen column are shown,
	separated with a dash.
	For an empty line "0-1" is shown.
	For an empty buffer the line number will also be zero: "0,0-1".
	This option is reset when the 'paste' option is set.
	If you don't want to see the ruler all the time but want to know where
	you are, use "g CTRL-G" |g_CTRL-G|.
	NOTE: This option is reset when 'compatible' is set.

						*'rulerformat'* *'ruf'*
'rulerformat' 'ruf'	string	(default empty)
			global
			{not in Vi}
			{not available when compiled without the |+statusline|
			feature}
	When this option is not empty, it determines the content of the ruler
	string, as displayed for the 'ruler' option.
	The format of this option is like that of 'statusline'.
	The default ruler width is 17 characters.  To make the ruler 15
	characters wide, put "%15(" at the start and "%)" at the end.
	Example: >
		:set rulerformat=%15(%c%V\ %p%%%)
<
				*'runtimepath'* *'rtp'* *vimfiles*
'runtimepath' 'rtp'	string	(default:
					Unix: "$HOME/.vim,
						$VIM/vimfiles,
						$VIMRUNTIME,
						$VIM/vimfiles/after,
						$HOME/.vim/after"
					Amiga: "home:vimfiles,
						$VIM/vimfiles,
						$VIMRUNTIME,
						$VIM/vimfiles/after,
						home:vimfiles/after"
					PC, OS/2: "$HOME/vimfiles,
						$VIM/vimfiles,
						$VIMRUNTIME,
						$VIM/vimfiles/after,
						$HOME/vimfiles/after"
					Macintosh: "$VIM:vimfiles,
						$VIMRUNTIME,
						$VIM:vimfiles:after"
					RISC-OS: "Choices:vimfiles,
						$VIMRUNTIME,
						Choices:vimfiles/after"
					VMS: "sys$login:vimfiles,
						$VIM/vimfiles,
						$VIMRUNTIME,
						$VIM/vimfiles/after,
						sys$login:vimfiles/after")
			global
			{not in Vi}
	This is a list of directories which will be searched for runtime
	files:
	  filetype.vim	filetypes by file name |new-filetype|
	  scripts.vim	filetypes by file contents |new-filetype-scripts|
	  autoload/	automatically loaded scripts |autoload-functions|
	  colors/	color scheme files |:colorscheme|
	  compiler/	compiler files |:compiler|
	  doc/		documentation |write-local-help|
	  ftplugin/	filetype plugins |write-filetype-plugin|
	  indent/	indent scripts |indent-expression|
	  keymap/	key mapping files |mbyte-keymap|
	  lang/		menu translations |:menutrans|
	  menu.vim	GUI menus |menu.vim|
	  plugin/	plugin scripts |write-plugin|
	  print/	files for printing |postscript-print-encoding|
	  spell/	spell checking files |spell|
	  syntax/	syntax files |mysyntaxfile|
	  tutor/	files for vimtutor |tutor|

	And any other file searched for with the |:runtime| command.

	The defaults for most systems are setup to search five locations:
	1. In your home directory, for your personal preferences.
	2. In a system-wide Vim directory, for preferences from the system
	   administrator.
	3. In $VIMRUNTIME, for files distributed with Vim.
							*after-directory*
	4. In the "after" directory in the system-wide Vim directory.  This is
	   for the system administrator to overrule or add to the distributed
	   defaults (rarely needed)
	5. In the "after" directory in your home directory.  This is for
	   personal preferences to overrule or add to the distributed defaults
	   or system-wide settings (rarely needed).

	Note that, unlike 'path', no wildcards like "**" are allowed.  Normal
	wildcards are allowed, but can significantly slow down searching for
	runtime files.  For speed, use as few items as possible and avoid
	wildcards.
	See |:runtime|.
	Example: >
		:set runtimepath=~/vimruntime,/mygroup/vim,$VIMRUNTIME
<	This will use the directory "~/vimruntime" first (containing your
	personal Vim runtime files), then "/mygroup/vim" (shared between a
	group of people) and finally "$VIMRUNTIME" (the distributed runtime
	files).
	You probably should always include $VIMRUNTIME somewhere, to use the
	distributed runtime files.  You can put a directory before $VIMRUNTIME
	to find files which replace a distributed runtime files.  You can put
	a directory after $VIMRUNTIME to find files which add to distributed
	runtime files.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'scroll'* *'scr'*
'scroll' 'scr'		number	(default: half the window height)
			local to window
	Number of lines to scroll with CTRL-U and CTRL-D commands.  Will be
	set to half the number of lines in the window when the window size
	changes.  If you give a count to the CTRL-U or CTRL-D command it will
	be used as the new value for 'scroll'.  Reset to half the window
	height with ":set scroll=0".   {Vi is a bit different: 'scroll' gives
	the number of screen lines instead of file lines, makes a difference
	when lines wrap}

			*'scrollbind'* *'scb'* *'noscrollbind'* *'noscb'*
'scrollbind' 'scb'	boolean  (default off)
			local to window
			{not in Vi}
			{not available when compiled without the |+scrollbind|
			feature}
	See also |scroll-binding|.  When this option is set, the current
	window scrolls as other scrollbind windows (windows that also have
	this option set) scroll.  This option is useful for viewing the
	differences between two versions of a file, see 'diff'.
	See |'scrollopt'| for options that determine how this option should be
	interpreted.
	This option is mostly reset when splitting a window to edit another
	file.  This means that ":split | edit file" results in two windows
	with scroll-binding, but ":split file" does not.

						*'scrolljump'* *'sj'*
'scrolljump' 'sj'	number	(default 1)
			global
			{not in Vi}
	Minimal number of lines to scroll when the cursor gets off the
	screen (e.g., with "j").  Not used for scroll commands (e.g., CTRL-E,
	CTRL-D).  Useful if your terminal scrolls very slowly.
	When set to a negative number from -1 to -100 this is used as the
	percentage of the window height.  Thus -50 scrolls half the window
	height.
	NOTE: This option is set to 1 when 'compatible' is set.

						*'scrolloff'* *'so'*
'scrolloff' 'so'	number	(default 0)
			global
			{not in Vi}
	Minimal number of screen lines to keep above and below the cursor.
	This will make some context visible around where you are working.  If
	you set it to a very large value (999) the cursor line will always be
	in the middle of the window (except at the start or end of the file or
	when long lines wrap).
	For scrolling horizontally see 'sidescrolloff'.
	NOTE: This option is set to 0 when 'compatible' is set.

						*'scrollopt'* *'sbo'*
'scrollopt' 'sbo'	string	(default "ver,jump")
			global
			{not available when compiled without the |+scrollbind|
			feature}
			{not in Vi}
	This is a comma-separated list of words that specifies how
	'scrollbind' windows should behave.  'sbo' stands for ScrollBind
	Options.
	The following words are available:
	    ver		Bind vertical scrolling for 'scrollbind' windows
	    hor		Bind horizontal scrolling for 'scrollbind' windows
	    jump	Applies to the offset between two windows for vertical
			scrolling.  This offset is the difference in the first
			displayed line of the bound windows.  When moving
			around in a window, another 'scrollbind' window may
			reach a position before the start or after the end of
			the buffer.  The offset is not changed though, when
			moving back the 'scrollbind' window will try to scroll
			to the desired position when possible.
			When now making that window the current one, two
			things can be done with the relative offset:
			1. When "jump" is not included, the relative offset is
			   adjusted for the scroll position in the new current
			   window.  When going back to the other window, the
			   the new relative offset will be used.
			2. When "jump" is included, the other windows are
			   scrolled to keep the same relative offset.  When
			   going back to the other window, it still uses the
			   same relative offset.
	Also see |scroll-binding|.
	When 'diff' mode is active there always is vertical scroll binding,
	even when "ver" isn't there.

						*'sections'* *'sect'*
'sections' 'sect'	string	(default "SHNHH HUnhsh")
			global
	Specifies the nroff macros that separate sections.  These are pairs of
	two letters (See |object-motions|).  The default makes a section start
	at the nroff macros ".SH", ".NH", ".H", ".HU", ".nh" and ".sh".

						*'secure'* *'nosecure'* *E523*
'secure'		boolean	(default off)
			global
			{not in Vi}
	When on, ":autocmd", shell and write commands are not allowed in
	".vimrc" and ".exrc" in the current directory and map commands are
	displayed.  Switch it off only if you know that you will not run into
	problems, or when the 'exrc' option is off.  On Unix this option is
	only used if the ".vimrc" or ".exrc" is not owned by you.  This can be
	dangerous if the systems allows users to do a "chown".  You better set
	'secure' at the end of your ~/.vimrc then.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'selection'* *'sel'*
'selection' 'sel'	string	(default "inclusive")
			global
			{not in Vi}
	This option defines the behavior of the selection.  It is only used
	in Visual and Select mode.
	Possible values:
	   value	past line     inclusive ~
	   old		   no		yes
	   inclusive	   yes		yes
	   exclusive	   yes		no
	"past line" means that the cursor is allowed to be positioned one
	character past the line.
	"inclusive" means that the last character of the selection is included
	in an operation.  For example, when "x" is used to delete the
	selection.
	Note that when "exclusive" is used and selecting from the end
	backwards, you cannot include the last character of a line, when
	starting in Normal mode and 'virtualedit' empty.

	The 'selection' option is set by the |:behave| command.

						*'selectmode'* *'slm'*
'selectmode' 'slm'	string	(default "")
			global
			{not in Vi}
	This is a comma separated list of words, which specifies when to start
	Select mode instead of Visual mode, when a selection is started.
	Possible values:
	   mouse	when using the mouse
	   key		when using shifted special keys
	   cmd		when using "v", "V" or CTRL-V
	See |Select-mode|.
	The 'selectmode' option is set by the |:behave| command.

						*'sessionoptions'* *'ssop'*
'sessionoptions' 'ssop'	string	(default: "blank,buffers,curdir,folds,
					       help,options,tabpages,winsize")
			global
			{not in Vi}
			{not available when compiled without the +mksession
			feature}
	Changes the effect of the |:mksession| command.  It is a comma
	separated list of words.  Each word enables saving and restoring
	something:
	   word		save and restore ~
	   blank	empty windows
	   buffers	hidden and unloaded buffers, not just those in windows
	   curdir	the current directory
	   folds	manually created folds, opened/closed folds and local
			fold options
	   globals	global variables that start with an uppercase letter
			and contain at least one lowercase letter.  Only
			String and Number types are stored.
	   help		the help window
	   localoptions	options and mappings local to a window or buffer (not
			global values for local options)
	   options	all options and mappings (also global values for local
			options)
	   resize	size of the Vim window: 'lines' and 'columns'
	   sesdir	the directory in which the session file is located
			will become the current directory (useful with
			projects accessed over a network from different
			systems)
	   slash	backslashes in file names replaced with forward
			slashes
	   tabpages	all tab pages; without this only the current tab page
			is restored, so that you can make a session for each
			tab page separately
	   unix		with Unix end-of-line format (single <NL>), even when
			on Windows or DOS
	   winpos	position of the whole Vim window
	   winsize	window sizes

	Don't include both "curdir" and "sesdir".
	There is no option to include tab pages yet, only the current tab page
	is stored in the session. |tab-page|
	When "curdir" nor "sesdir" is included, file names are stored with
	absolute paths.
	"slash" and "unix" are useful on Windows when sharing session files
	with Unix.  The Unix version of Vim cannot source dos format scripts,
	but the Windows version of Vim can source unix format scripts.

						*'shell'* *'sh'* *E91*
'shell' 'sh'		string	(default $SHELL or "sh",
					MS-DOS and Win32: "command.com" or
					"cmd.exe", OS/2: "cmd")
			global
	Name of the shell to use for ! and :! commands.  When changing the
	value also check these options: 'shelltype', 'shellpipe', 'shellslash'
	'shellredir', 'shellquote', 'shellxquote' and 'shellcmdflag'.
	It is allowed to give an argument to the command, e.g.  "csh -f".
	See |option-backslash| about including spaces and backslashes.
	Environment variables are expanded |:set_env|.
	If the name of the shell contains a space, you might need to enclose
	it in quotes.  Example: >
		:set shell=\"c:\program\ files\unix\sh.exe\"\ -f
<	Note the backslash before each quote (to avoid starting a comment) and
	each space (to avoid ending the option value).  Also note that the
	"-f" is not inside the quotes, because it is not part of the command
	name.  And Vim automagically recognizes the backslashes that are path
	separators.
	For Dos 32 bits (DJGPP), you can set the $DJSYSFLAGS environment
	variable to change the way external commands are executed.  See the
	libc.inf file of DJGPP.
	Under MS-Windows, when the executable ends in ".com" it must be
	included.  Thus setting the shell to "command.com" or "4dos.com"
	works, but "command" and "4dos" do not work for all commands (e.g.,
	filtering).
	For unknown reasons, when using "4dos.com" the current directory is
	changed to "C:\".  To avoid this set 'shell' like this: >
		:set shell=command.com\ /c\ 4dos
<	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'shellcmdflag'* *'shcf'*
'shellcmdflag' 'shcf'	string	(default: "-c", MS-DOS and Win32, when 'shell'
					does not contain "sh" somewhere: "/c")
			global
			{not in Vi}
	Flag passed to the shell to execute "!" and ":!" commands; e.g.,
	"bash.exe -c ls" or "command.com /c dir".  For the MS-DOS-like
	systems, the default is set according to the value of 'shell', to
	reduce the need to set this option by the user.  It's not used for
	OS/2 (EMX figures this out itself).  See |option-backslash| about
	including spaces and backslashes.  See |dos-shell|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'shellpipe'* *'sp'*
'shellpipe' 'sp'	string	(default ">", "| tee", "|& tee" or "2>&1| tee")
			global
			{not in Vi}
			{not available when compiled without the |+quickfix|
			feature}
	String to be used to put the output of the ":make" command in the
	error file.  See also |:make_makeprg|.  See |option-backslash| about
	including spaces and backslashes.
	The name of the temporary file can be represented by "%s" if necessary
	(the file name is appended automatically if no %s appears in the value
	of this option).
	For the Amiga and MS-DOS the default is ">".  The output is directly
	saved in a file and not echoed to the screen.
	For Unix the default it "| tee".  The stdout of the compiler is saved
	in a file and echoed to the screen.  If the 'shell' option is "csh" or
	"tcsh" after initializations, the default becomes "|& tee".  If the
	'shell' option is "sh", "ksh", "zsh" or "bash" the default becomes
	"2>&1| tee".  This means that stderr is also included.
	The initialization of this option is done after reading the ".vimrc"
	and the other initializations, so that when the 'shell' option is set
	there, the 'shellpipe' option changes automatically, unless it was
	explicitly set before.
	When 'shellpipe' is set to an empty string, no redirection of the
	":make" output will be done.  This is useful if you use a 'makeprg'
	that writes to 'makeef' by itself.  If you want no piping, but do
	want to include the 'makeef', set 'shellpipe' to a single space.
	Don't forget to precede the space with a backslash: ":set sp=\ ".
	In the future pipes may be used for filtering and this option will
	become obsolete (at least for Unix).
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'shellquote'* *'shq'*
'shellquote' 'shq'	string	(default: ""; MS-DOS and Win32, when 'shell'
					contains "sh" somewhere: "\"")
			global
			{not in Vi}
	Quoting character(s), put around the command passed to the shell, for
	the "!" and ":!" commands.  The redirection is kept outside of the
	quoting.  See 'shellxquote' to include the redirection.  It's
	probably not useful to set both options.
	This is an empty string by default.  Only known to be useful for
	third-party shells on MS-DOS-like systems, such as the MKS Korn Shell
	or bash, where it should be "\"".  The default is adjusted according
	the value of 'shell', to reduce the need to set this option by the
	user.  See |dos-shell|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'shellredir'* *'srr'*
'shellredir' 'srr'	string	(default ">", ">&" or ">%s 2>&1")
			global
			{not in Vi}
	String to be used to put the output of a filter command in a temporary
	file.  See also |:!|.  See |option-backslash| about including spaces
	and backslashes.
	The name of the temporary file can be represented by "%s" if necessary
	(the file name is appended automatically if no %s appears in the value
	of this option).
	The default is ">".  For Unix, if the 'shell' option is "csh", "tcsh"
	or "zsh" during initializations, the default becomes ">&".  If the
	'shell' option is "sh", "ksh" or "bash" the default becomes
	">%s 2>&1".  This means that stderr is also included.
	For Win32, the Unix checks are done and additionally "cmd" is checked
	for, which makes the default ">%s 2>&1".  Also, the same names with
	".exe" appended are checked for.
	The initialization of this option is done after reading the ".vimrc"
	and the other initializations, so that when the 'shell' option is set
	there, the 'shellredir' option changes automatically unless it was
	explicitly set before.
	In the future pipes may be used for filtering and this option will
	become obsolete (at least for Unix).
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

			*'shellslash'* *'ssl'* *'noshellslash'* *'nossl'*
'shellslash' 'ssl'	boolean	(default off)
			global
			{not in Vi} {only for MSDOS, MS-Windows and OS/2}
	When set, a forward slash is used when expanding file names.  This is
	useful when a Unix-like shell is used instead of command.com or
	cmd.exe.  Backward slashes can still be typed, but they are changed to
	forward slashes by Vim.
	Note that setting or resetting this option has no effect for some
	existing file names, thus this option needs to be set before opening
	any file for best results.  This might change in the future.
	'shellslash' only works when a backslash can be used as a path
	separator.  To test if this is so use: >
		if exists('+shellslash')
<
			*'shelltemp'* *'stmp'* *'noshelltemp'* *'nostmp'*
'shelltemp' 'stmp'	boolean	(Vi default off, Vim default on)
			global
			{not in Vi}
	When on, use temp files for shell commands.  When off use a pipe.
	When using a pipe is not possible temp files are used anyway.
	Currently a pipe is only supported on Unix.  You can check it with: >
		:if has("filterpipe")
<	The advantage of using a pipe is that nobody can read the temp file
	and the 'shell' command does not need to support redirection.
	The advantage of using a temp file is that the file type and encoding
	can be detected.
	The |FilterReadPre|, |FilterReadPost| and |FilterWritePre|,
	|FilterWritePost| autocommands event are not triggered when
	'shelltemp' is off.

						*'shelltype'* *'st'*
'shelltype' 'st'	number	(default 0)
			global
			{not in Vi} {only for the Amiga}
	On the Amiga this option influences the way how the commands work
	which use a shell.
	0 and 1: always use the shell
	2 and 3: use the shell only to filter lines
	4 and 5: use shell only for ':sh' command
	When not using the shell, the command is executed directly.

	0 and 2: use "shell 'shellcmdflag' cmd" to start external commands
	1 and 3: use "shell cmd" to start external commands

						*'shellxquote'* *'sxq'*
'shellxquote' 'sxq'	string	(default: "";
					for Win32, when 'shell' contains "sh"
					somewhere: "\""
					for Unix, when using system(): "\"")
			global
			{not in Vi}
	Quoting character(s), put around the command passed to the shell, for
	the "!" and ":!" commands.  Includes the redirection.  See
	'shellquote' to exclude the redirection.  It's probably not useful
	to set both options.
	This is an empty string by default.  Known to be useful for
	third-party shells when using the Win32 version, such as the MKS Korn
	Shell or bash, where it should be "\"".  The default is adjusted
	according the value of 'shell', to reduce the need to set this option
	by the user.  See |dos-shell|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

			*'shiftround'* *'sr'* *'noshiftround'* *'nosr'*
'shiftround' 'sr'	boolean	(default off)
			global
			{not in Vi}
	Round indent to multiple of 'shiftwidth'.  Applies to > and <
	commands.  CTRL-T and CTRL-D in Insert mode always round the indent to
	a multiple of 'shiftwidth' (this is Vi compatible).
	NOTE: This option is reset when 'compatible' is set.

						*'shiftwidth'* *'sw'*
'shiftwidth' 'sw'	number	(default 8)
			local to buffer
	Number of spaces to use for each step of (auto)indent.  Used for
	|'cindent'|, |>>|, |<<|, etc.

						*'shortmess'* *'shm'*
'shortmess' 'shm'	string	(Vim default "filnxtToO", Vi default: "",
							POSIX default: "A")
			global
			{not in Vi}
	This option helps to avoid all the |hit-enter| prompts caused by file
	messages, for example  with CTRL-G, and to avoid some other messages.
	It is a list of flags:
	 flag	meaning when present	~
	  f	use "(3 of 5)" instead of "(file 3 of 5)"
	  i	use "[noeol]" instead of "[Incomplete last line]"
	  l	use "999L, 888C" instead of "999 lines, 888 characters"
	  m	use "[+]" instead of "[Modified]"
	  n	use "[New]" instead of "[New File]"
	  r	use "[RO]" instead of "[readonly]"
	  w	use "[w]" instead of "written" for file write message
		and "[a]" instead of "appended" for ':w >> file' command
	  x	use "[dos]" instead of "[dos format]", "[unix]" instead of
		"[unix format]" and "[mac]" instead of "[mac format]".
	  a	all of the above abbreviations

	  o	overwrite message for writing a file with subsequent message
		for reading a file (useful for ":wn" or when 'autowrite' on)
	  O	message for reading a file overwrites any previous message.
		Also for quickfix message (e.g., ":cn").
	  s	don't give "search hit BOTTOM, continuing at TOP" or "search
		hit TOP, continuing at BOTTOM" messages
	  t	truncate file message at the start if it is too long to fit
		on the command-line, "<" will appear in the left most column.
		Ignored in Ex mode.
	  T	truncate other messages in the middle if they are too long to
		fit on the command line.  "..." will appear in the middle.
		Ignored in Ex mode.
	  W	don't give "written" or "[w]" when writing a file
	  A	don't give the "ATTENTION" message when an existing swap file
		is found.
	  I	don't give the intro message when starting Vim |:intro|.

	This gives you the opportunity to avoid that a change between buffers
	requires you to hit <Enter>, but still gives as useful a message as
	possible for the space available.  To get the whole message that you
	would have got with 'shm' empty, use ":file!"
	Useful values:
	    shm=	No abbreviation of message.
	    shm=a	Abbreviation, but no loss of information.
	    shm=at	Abbreviation, and truncate message when necessary.

	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

				 *'shortname'* *'sn'* *'noshortname'* *'nosn'*
'shortname' 'sn'	boolean	(default off)
			local to buffer
			{not in Vi, not in MS-DOS versions}
	Filenames are assumed to be 8 characters plus one extension of 3
	characters.  Multiple dots in file names are not allowed.  When this
	option is on, dots in file names are replaced with underscores when
	adding an extension (".~" or ".swp").  This option is not available
	for MS-DOS, because then it would always be on.  This option is useful
	when editing files on an MS-DOS compatible filesystem, e.g., messydos
	or crossdos.  When running the Win32 GUI version under Win32s, this
	option is always on by default.

						*'showbreak'* *'sbr'* *E595*
'showbreak' 'sbr'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the  |+linebreak|
			feature}
	String to put at the start of lines that have been wrapped.  Useful
	values are "> " or "+++ ".
	Only printable single-cell characters are allowed, excluding <Tab> and
	comma (in a future version the comma might be used to separate the
	part that is shown at the end and at the start of a line).
	The characters are highlighted according to the '@' flag in
	'highlight'.
	Note that tabs after the showbreak will be displayed differently.
	If you want the 'showbreak' to appear in between line numbers, add the
	"n" flag to 'cpoptions'.

				     *'showcmd'* *'sc'* *'noshowcmd'* *'nosc'*
'showcmd' 'sc'		boolean	(Vim default: on, off for Unix, Vi default:
				 off)
			global
			{not in Vi}
			{not available when compiled without the
			|+cmdline_info| feature}
	Show (partial) command in status line.  Set this option off if your
	terminal is slow.
	In Visual mode the size of the selected area is shown:
	- When selecting characters within a line, the number of characters.
	- When selecting more than one line, the number of lines.
	- When selecting a block, the size in screen characters: linesxcolumns.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

			*'showfulltag'* *'sft'* *'noshowfulltag'* *'nosft'*
'showfulltag' 'sft'	boolean (default off)
			global
			{not in Vi}
	When completing a word in insert mode (see |ins-completion|) from the
	tags file, show both the tag name and a tidied-up form of the search
	pattern (if there is one) as possible matches.  Thus, if you have
	matched a C function, you can see a template for what arguments are
	required (coding style permitting).

				 *'showmatch'* *'sm'* *'noshowmatch'* *'nosm'*
'showmatch' 'sm'	boolean	(default off)
			global
	When a bracket is inserted, briefly jump to the matching one.  The
	jump is only done if the match can be seen on the screen.  The time to
	show the match can be set with 'matchtime'.
	A Beep is given if there is no match (no matter if the match can be
	seen or not).  This option is reset when the 'paste' option is set.
	When the 'm' flag is not included in 'cpoptions', typing a character
	will immediately move the cursor back to where it belongs.
	See the "sm" field in 'guicursor' for setting the cursor shape and
	blinking when showing the match.
	The 'matchpairs' option can be used to specify the characters to show
	matches for.  'rightleft' and 'revins' are used to look for opposite
	matches.
	Also see the matchparen plugin for highlighting the match when moving
	around |pi_paren.txt|.
	Note: Use of the short form is rated PG.

				 *'showmode'* *'smd'* *'noshowmode'* *'nosmd'*
'showmode' 'smd'	boolean	(Vim default: on, Vi default: off)
			global
	If in Insert, Replace or Visual mode put a message on the last line.
	Use the 'M' flag in 'highlight' to set the type of highlighting for
	this message.
	When |XIM| may be used the message will include "XIM".  But this
	doesn't mean XIM is really active, especially when 'imactivatekey' is
	not set.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'showtabline'* *'stal'*
'showtabline' 'stal'	number	(default 1)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	The value of this option specifies when the line with tab page labels
	will be displayed:
		0: never
		1: only if there are at least two tab pages
		2: always
	This is both for the GUI and non-GUI implementation of the tab pages
	line.
	See |tab-page| for more information about tab pages.

						*'sidescroll'* *'ss'*
'sidescroll' 'ss'	number	(default 0)
			global
			{not in Vi}
	The minimal number of columns to scroll horizontally.  Used only when
	the 'wrap' option is off and the cursor is moved off of the screen.
	When it is zero the cursor will be put in the middle of the screen.
	When using a slow terminal set it to a large number or 0.  When using
	a fast terminal use a small number or 1.  Not used for "zh" and "zl"
	commands.

						*'sidescrolloff'* *'siso'*
'sidescrolloff' 'siso'	number (default 0)
			global
			{not in Vi}
	The minimal number of screen columns to keep to the left and to the
	right of the cursor if 'nowrap' is set.  Setting this option to a
	value greater than 0 while having |'sidescroll'| also at a non-zero
	value makes some context visible in the line you are scrolling in
	horizontally (except at beginning of the line).  Setting this option
	to a large value (like 999) has the effect of keeping the cursor
	horizontally centered in the window, as long as one does not come too
	close to the beginning of the line.
	NOTE: This option is set to 0 when 'compatible' is set.

	Example: Try this together with 'sidescroll' and 'listchars' as
		 in the following example to never allow the cursor to move
		 onto the "extends" character:

		 :set nowrap sidescroll=1 listchars=extends:>,precedes:<
		 :set sidescrolloff=1


			*'smartcase'* *'scs'* *'nosmartcase'* *'noscs'*
'smartcase' 'scs'	boolean	(default off)
			global
			{not in Vi}
	Override the 'ignorecase' option if the search pattern contains upper
	case characters.  Only used when the search pattern is typed and
	'ignorecase' option is on.  Used for the commands "/", "?", "n", "N",
	":g" and ":s".  Not used for "*", "#", "gd", tag search, etc..  After
	"*" and "#" you can make 'smartcase' used by doing a "/" command,
	recalling the search pattern from history and hitting <Enter>.
	NOTE: This option is reset when 'compatible' is set.

			     *'smartindent'* *'si'* *'nosmartindent'* *'nosi'*
'smartindent' 'si'	boolean	(default off)
			local to buffer
			{not in Vi}
			{not available when compiled without the
			|+smartindent| feature}
	Do smart autoindenting when starting a new line.  Works for C-like
	programs, but can also be used for other languages.  'cindent' does
	something like this, works better in most cases, but is more strict,
	see |C-indenting|.  When 'cindent' is on, setting 'si' has no effect.
	'indentexpr' is a more advanced alternative.
	Normally 'autoindent' should also be on when using 'smartindent'.
	An indent is automatically inserted:
	- After a line ending in '{'.
	- After a line starting with a keyword from 'cinwords'.
	- Before a line starting with '}' (only with the "O" command).
	When typing '}' as the first character in a new line, that line is
	given the same indent as the matching '{'.
	When typing '#' as the first character in a new line, the indent for
	that line is removed, the '#' is put in the first column.  The indent
	is restored for the next line.  If you don't want this, use this
	mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H.
	When using the ">>" command, lines starting with '#' are not shifted
	right.
	NOTE: 'smartindent' is reset when 'compatible' is set.  When 'paste'
	is set smart indenting is disabled.

				 *'smarttab'* *'sta'* *'nosmarttab'* *'nosta'*
'smarttab' 'sta'	boolean	(default off)
			global
			{not in Vi}
	When on, a <Tab> in front of a line inserts blanks according to
	'shiftwidth'.  'tabstop' or 'softtabstop' is used in other places.  A
	<BS> will delete a 'shiftwidth' worth of space at the start of the
	line.
	When off, a <Tab> always inserts blanks according to 'tabstop' or
	'softtabstop'.  'shiftwidth' is only used for shifting text left or
	right |shift-left-right|.
	What gets inserted (a Tab or spaces) depends on the 'expandtab'
	option.  Also see |ins-expandtab|.  When 'expandtab' is not set, the
	number of spaces is minimized by using <Tab>s.
	NOTE: This option is reset when 'compatible' is set.

					*'softtabstop'* *'sts'*
'softtabstop' 'sts'	number	(default 0)
			local to buffer
			{not in Vi}
	Number of spaces that a <Tab> counts for while performing editing
	operations, like inserting a <Tab> or using <BS>.  It "feels" like
	<Tab>s are being inserted, while in fact a mix of spaces and <Tab>s is
	used.  This is useful to keep the 'ts' setting at its standard value
	of 8, while being able to edit like it is set to 'sts'.  However,
	commands like "x" still work on the actual characters.
	When 'sts' is zero, this feature is off.
	'softtabstop' is set to 0 when the 'paste' option is set.
	See also |ins-expandtab|.  When 'expandtab' is not set, the number of
	spaces is minimized by using <Tab>s.
	The 'L' flag in 'cpoptions' changes how tabs are used when 'list' is
	set.
	NOTE: This option is set to 0 when 'compatible' is set.

						*'spell'* *'nospell'*
'spell'			boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	When on spell checking will be done.  See |spell|.
	The languages are specified with 'spelllang'.

						*'spellcapcheck'* *'spc'*
'spellcapcheck' 'spc'	string	(default "[.?!]\_[\])'" \t]\+")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	Pattern to locate the end of a sentence.  The following word will be
	checked to start with a capital letter.  If not then it is highlighted
	with SpellCap |hl-SpellCap| (unless the word is also badly spelled).
	When this check is not wanted make this option empty.
	Only used when 'spell' is set.
	Be careful with special characters, see |option-backslash| about
	including spaces and backslashes.
	To set this option automatically depending on the language, see
	|set-spc-auto|.

						*'spellfile'* *'spf'*
'spellfile' 'spf'	string	(default empty)
			local to buffer
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	Name of the word list file where words are added for the |zg| and |zw|
	commands.  It must end in ".{encoding}.add".  You need to include the
	path, otherwise the file is placed in the current directory.
								*E765*
	It may also be a comma separated list of names.  A count before the
	|zg| and |zw| commands can be used to access each.  This allows using
	a personal word list file and a project word list file.
	When a word is added while this option is empty Vim will set it for
	you: Using the first directory in 'runtimepath' that is writable.  If
	there is no "spell" directory yet it will be created.  For the file
	name the first language name that appears in 'spelllang' is used,
	ignoring the region.
	The resulting ".spl" file will be used for spell checking, it does not
	have to appear in 'spelllang'.
	Normally one file is used for all regions, but you can add the region
	name if you want to.  However, it will then only be used when
	'spellfile' is set to it, for entries in 'spelllang' only files
	without region name will be found.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'spelllang'* *'spl'*
'spelllang' 'spl'	string	(default "en")
			local to buffer
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	A comma separated list of word list names.  When the 'spell' option is
	on spellchecking will be done for these languages.  Example: >
		set spelllang=en_us,nl,medical
<	This means US English, Dutch and medical words are recognized.  Words
	that are not recognized will be highlighted.
	The word list name must not include a comma or dot.  Using a dash is
	recommended to separate the two letter language name from a
	specification.  Thus "en-rare" is used for rare English words.
	A region name must come last and have the form "_xx", where "xx" is
	the two-letter, lower case region name.  You can use more than one
	region by listing them: "en_us,en_ca" supports both US and Canadian
	English, but not words specific for Australia, New Zealand or Great
	Britain.
							*E757*
	As a special case the name of a .spl file can be given as-is.  The
	first "_xx" in the name is removed and used as the region name
	(_xx is an underscore, two letters and followed by a non-letter).
	This is mainly for testing purposes.  You must make sure the correct
	encoding is used, Vim doesn't check it.
	When 'encoding' is set the word lists are reloaded.  Thus it's a good
	idea to set 'spelllang' after setting 'encoding' to avoid loading the
	files twice.
	How the related spell files are found is explained here: |spell-load|.

	If the |spellfile.vim| plugin is active and you use a language name
	for which Vim cannot find the .spl file in 'runtimepath' the plugin
	will ask you if you want to download the file.

	After this option has been set successfully, Vim will source the files
	"spell/LANG.vim" in 'runtimepath'.  "LANG" is the value of 'spelllang'
	up to the first comma, dot or underscore.
	Also see |set-spc-auto|.


						*'spellsuggest'* *'sps'*
'spellsuggest' 'sps'	string	(default "best")
			global
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	Methods used for spelling suggestions.  Both for the |z=| command and
	the |spellsuggest()| function.  This is a comma-separated list of
	items:

	best		Internal method that works best for English.  Finds
			changes like "fast" and uses a bit of sound-a-like
			scoring to improve the ordering.

	double		Internal method that uses two methods and mixes the
			results.  The first method is "fast", the other method
			computes how much the suggestion sounds like the bad
			word.  That only works when the language specifies
			sound folding.  Can be slow and doesn't always give
			better results.

	fast		Internal method that only checks for simple changes:
			character inserts/deletes/swaps.  Works well for
			simple typing mistakes.

	{number}	The maximum number of suggestions listed for |z=|.
			Not used for |spellsuggest()|.  The number of
			suggestions is never more than the value of 'lines'
			minus two.

	file:{filename} Read file {filename}, which must have two columns,
			separated by a slash.  The first column contains the
			bad word, the second column the suggested good word.
			Example:
				theribal/terrible ~
			Use this for common mistakes that do not appear at the
			top of the suggestion list with the internal methods.
			Lines without a slash are ignored, use this for
			comments.
			The file is used for all languages.

	expr:{expr}	Evaluate expression {expr}.  Use a function to avoid
			trouble with spaces.  |v:val| holds the badly spelled
			word.  The expression must evaluate to a List of
			Lists, each with a suggestion and a score.
			Example:
				[['the', 33], ['that', 44]]
			Set 'verbose' and use |z=| to see the scores that the
			internal methods use.  A lower score is better.
			This may invoke |spellsuggest()| if you temporarily
			set 'spellsuggest' to exclude the "expr:" part.
			Errors are silently ignored, unless you set the
			'verbose' option to a non-zero value.

	Only one of "best", "double" or "fast" may be used.  The others may
	appear several times in any order.  Example: >
		:set sps=file:~/.vim/sugg,best,expr:MySuggest()
<
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.


			*'splitbelow'* *'sb'* *'nosplitbelow'* *'nosb'*
'splitbelow' 'sb'	boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	When on, splitting a window will put the new window below the current
	one. |:split|

			*'splitright'* *'spr'* *'nosplitright'* *'nospr'*
'splitright' 'spr'	boolean	(default off)
			global
			{not in Vi}
			{not available when compiled without the +vertsplit
			feature}
	When on, splitting a window will put the new window right of the
	current one. |:vsplit|

			   *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol'	boolean	(default on)
			global
			{not in Vi}
	When "on" the commands listed below move the cursor to the first
	non-blank of the line.  When off the cursor is kept in the same column
	(if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
	CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
	with a linewise operator, with "%" with a count and to buffer changing
	commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
	only has a line number, e.g., ":25" or ":+".
	In case of buffer changing commands the cursor is placed at the column
	where it was the last time the buffer was edited.
	NOTE: This option is set when 'compatible' is set.

			   *'statusline'* *'stl'* *E540* *E541* *E542*
'statusline' 'stl'	string	(default empty)
			global or local to window |global-local|
			{not in Vi}
			{not available when compiled without the |+statusline|
			feature}
	When nonempty, this option determines the content of the status line.
	Also see |status-line|.

	The option consists of printf style '%' items interspersed with
	normal text.  Each status line item is of the form:
	  %-0{minwid}.{maxwid}{item}
	All fields except the {item} is optional.  A single percent sign can
	be given as "%%".  Up to 80 items can be specified.

	When the option starts with "%!" then it is used as an expression,
	evaluated and the result is used as the option value.  Example: >
		:set statusline=%!MyStatusLine()
<	The result can contain %{} items that will be evaluated too.

	When there is error while evaluating the option then it will be made
	empty to avoid further errors.  Otherwise screen updating would loop.

	Note that the only effect of 'ruler' when this option is set (and
	'laststatus' is 2) is controlling the output of |CTRL-G|.

	field	    meaning ~
	-	    Left justify the item.  The default is right justified
		    when minwid is larger than the length of the item.
	0	    Leading zeroes in numeric items.  Overridden by '-'.
	minwid	    Minimum width of the item, padding as set by '-' & '0'.
		    Value must be 50 or less.
	maxwid	    Maximum width of the item.  Truncation occurs with a '<'
		    on the left for text items.  Numeric items will be
		    shifted down to maxwid-2 digits followed by '>'number
		    where number is the amount of missing digits, much like
		    an exponential notation.
	item	    A one letter code as described below.

	Following is a description of the possible statusline items.  The
	second character in "item" is the type:
		N for number
		S for string
		F for flags as described below
		- not applicable

	item  meaning ~
	f S   Path to the file in the buffer, relative to current directory.
	F S   Full path to the file in the buffer.
	t S   File name (tail) of file in the buffer.
	m F   Modified flag, text is " [+]"; " [-]" if 'modifiable' is off.
	M F   Modified flag, text is ",+" or ",-".
	r F   Readonly flag, text is " [RO]".
	R F   Readonly flag, text is ",RO".
	h F   Help buffer flag, text is " [help]".
	H F   Help buffer flag, text is ",HLP".
	w F   Preview window flag, text is " [Preview]".
	W F   Preview window flag, text is ",PRV".
	y F   Type of file in the buffer, e.g., " [vim]".  See 'filetype'.
	Y F   Type of file in the buffer, e.g., ",VIM".  See 'filetype'.
	      {not available when compiled without |+autocmd| feature}
	k S   Value of "b:keymap_name" or 'keymap' when |:lmap| mappings are
	      being used: "<keymap>"
	n N   Buffer number.
	b N   Value of byte under cursor.
	B N   As above, in hexadecimal.
	o N   Byte number in file of byte under cursor, first byte is 1.
	      Mnemonic: Offset from start of file (with one added)
	      {not available when compiled without |+byte_offset| feature}
	O N   As above, in hexadecimal.
	N N   Printer page number.  (Only works in the 'printheader' option.)
	l N   Line number.
	L N   Number of lines in buffer.
	c N   Column number.
	v N   Virtual column number.
	V N   Virtual column number as -{num}.  Not displayed if equal to 'c'.
	p N   Percentage through file in lines as in |CTRL-G|.
	P S   Percentage through file of displayed window.  This is like the
	      percentage described for 'ruler'.  Always 3 in length.
	a S   Argument list status as in default title.  ({current} of {max})
	      Empty if the argument file count is zero or one.
	{ NF  Evaluate expression between '%{' and '}' and substitute result.
	      Note that there is no '%' before the closing '}'.
	( -   Start of item group.  Can be used for setting the width and
	      alignment of a section.  Must be followed by %) somewhere.
	) -   End of item group.  No width fields allowed.
	T N   For 'tabline': start of tab page N label.  Use %T after the last
	      label.  This information is used for mouse clicks.
	X N   For 'tabline': start of close tab N label.  Use %X after the
	      label, e.g.: %3Xclose%X.  Use %999X for a "close current tab"
	      mark.  This information is used for mouse clicks.
	< -   Where to truncate line if too long.  Default is at the start.
	      No width fields allowed.
	= -   Separation point between left and right aligned items.
	      No width fields allowed.
	# -   Set highlight group.  The name must follow and then a # again.
	      Thus use %#HLname# for highlight group HLname.  The same
	      highlighting is used, also for the statusline of non-current
	      windows.
	* -   Set highlight group to User{N}, where {N} is taken from the
	      minwid field, e.g. %1*.  Restore normal highlight with %* or %0*.
	      The difference between User{N} and StatusLine  will be applied
	      to StatusLineNC for the statusline of non-current windows.
	      The number N must be between 1 and 9.  See |hl-User1..9|

	Display of flags are controlled by the following heuristic:
	If a flag text starts with comma it is assumed that it wants to
	separate itself from anything but preceding plaintext.  If it starts
	with a space it is assumed that it wants to separate itself from
	anything but other flags.  That is: A leading comma is removed if the
	preceding character stems from plaintext.  A leading space is removed
	if the preceding character stems from another active flag.  This will
	make a nice display when flags are used like in the examples below.

	When all items in a group becomes an empty string (i.e. flags that are
	not set) and a minwid is not set for the group, the whole group will
	become empty.  This will make a group like the following disappear
	completely from the statusline when none of the flags are set. >
		:set statusline=...%(\ [%M%R%H]%)...
<
	Beware that an expression is evaluated each and every time the status
	line is displayed.  The current buffer and current window will be set
	temporarily to that of the window (and buffer) whose statusline is
	currently being drawn.  The expression will evaluate in this context.
	The variable "actual_curbuf" is set to the 'bufnr()' number of the
	real current buffer.

	The 'statusline' option may be evaluated in the |sandbox|, see
	|sandbox-option|.

	It is not allowed to change text or jump to another window while
	evaluating 'statusline' |textlock|.

	If the statusline is not updated when you want it (e.g., after setting
	a variable that's used in an expression), you can force an update by
	setting an option without changing its value.  Example: >
		:let &ro = &ro

<	A result of all digits is regarded a number for display purposes.
	Otherwise the result is taken as flag text and applied to the rules
	described above.

	Watch out for errors in expressions.  They may render Vim unusable!
	If you are stuck, hold down ':' or 'Q' to get a prompt, then quit and
	edit your .vimrc or whatever with "vim -u NONE" to get it right.

	Examples:
	Emulate standard status line with 'ruler' set >
	  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
<	Similar, but add ASCII value of char under the cursor (like "ga") >
	  :set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
<	Display byte count and byte value, modified flag in red. >
	  :set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
	  :hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red
<	Display a ,GZ flag if a compressed file is loaded >
	  :set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h...
<	In the |:autocmd|'s: >
	  :let b:gzflag = 1
<	And: >
	  :unlet b:gzflag
<	And define this function: >
	  :function VarExists(var, val)
	  :    if exists(a:var) | return a:val | else | return '' | endif
	  :endfunction
<
						*'suffixes'* *'su'*
'suffixes' 'su'		string	(default ".bak,~,.o,.h,.info,.swp,.obj")
			global
			{not in Vi}
	Files with these suffixes get a lower priority when multiple files
	match a wildcard.  See |suffixes|.  Commas can be used to separate the
	suffixes.  Spaces after the comma are ignored.  A dot is also seen as
	the start of a suffix.  To avoid a dot or comma being recognized as a
	separator, precede it with a backslash (see |option-backslash| about
	including spaces and backslashes).
	See 'wildignore' for completely ignoring files.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	suffixes from the list.  This avoids problems when a future version
	uses another default.

						*'suffixesadd'* *'sua'*
'suffixesadd' 'sua'	string	(default "")
			local to buffer
			{not in Vi}
			{not available when compiled without the
			|+file_in_path| feature}
	Comma separated list of suffixes, which are used when searching for a
	file for the "gf", "[I", etc. commands.  Example: >
		:set suffixesadd=.java
<
				*'swapfile'* *'swf'* *'noswapfile'* *'noswf'*
'swapfile' 'swf'	boolean (default on)
			local to buffer
			{not in Vi}
	Use a swapfile for the buffer.  This option can be reset when a
	swapfile is not wanted for a specific buffer.  For example, with
	confidential information that even root must not be able to access.
	Careful: All text will be in memory:
		- Don't use this for big files.
		- Recovery will be impossible!
	A swapfile will only be present when |'updatecount'| is non-zero and
	'swapfile' is set.
	When 'swapfile' is reset, the swap file for the current buffer is
	immediately deleted.  When 'swapfile' is set, and 'updatecount' is
	non-zero, a swap file is immediately created.
	Also see |swap-file| and |'swapsync'|.

	This option is used together with 'bufhidden' and 'buftype' to
	specify special kinds of buffers.   See |special-buffers|.

						*'swapsync'* *'sws'*
'swapsync' 'sws'	string	(default "fsync")
			global
			{not in Vi}
	When this option is not empty a swap file is synced to disk after
	writing to it.  This takes some time, especially on busy unix systems.
	When this option is empty parts of the swap file may be in memory and
	not written to disk.  When the system crashes you may lose more work.
	On Unix the system does a sync now and then without Vim asking for it,
	so the disadvantage of setting this option off is small.  On some
	systems the swap file will not be written at all.  For a unix system
	setting it to "sync" will use the sync() call instead of the default
	fsync(), which may work better on some systems.
	The 'fsync' option is used for the actual file.

						*'switchbuf'* *'swb'*
'switchbuf' 'swb'	string	(default "")
			global
			{not in Vi}
	This option controls the behavior when switching between buffers.
	Possible values (comma separated list):
	   useopen	If included, jump to the first open window that
			contains the specified buffer (if there is one).
			Otherwise: Do not examine other windows.
			This setting is checked with |quickfix| commands, when
			jumping to errors (":cc", ":cn", "cp", etc.).  It is
			also used in all buffer related split commands, for
			example ":sbuffer", ":sbnext", or ":sbrewind".
	   usetab	Like "useopen", but also consider windows in other tab
			pages.
	   split	If included, split the current window before loading
			a buffer.  Otherwise: do not split, use current window.
			Supported in |quickfix| commands that display errors.

						*'synmaxcol'* *'smc'*
'synmaxcol' 'smc'	number	(default 3000)
			local to buffer
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	Maximum column in which to search for syntax items.  In long lines the
	text after this column is not highlighted and following lines may not
	be highlighted correctly, because the syntax state is cleared.
	This helps to avoid very slow redrawing for an XML file that is one
	long line.
	Set to zero to remove the limit.

						*'syntax'* *'syn'*
'syntax' 'syn'		string	(default empty)
			local to buffer
			{not in Vi}
			{not available when compiled without the |+syntax|
			feature}
	When this option is set, the syntax with this name is loaded, unless
	syntax highlighting has been switched off with ":syntax off".
	Otherwise this option does not always reflect the current syntax (the
	b:current_syntax variable does).
	This option is most useful in a modeline, for a file which syntax is
	not automatically recognized.  Example, in an IDL file:
		/* vim: set syntax=idl : */ ~
	When a dot appears in the value then this separates two filetype
	names.  Example:
		/* vim: set syntax=c.doxygen : */ ~
	This will use the "c" syntax first, then the "doxygen" syntax.
	Note that the second one must be prepared to be loaded as an addition,
	otherwise it will be skipped.  More than one dot may appear.
	To switch off syntax highlighting for the current file, use: >
		:set syntax=OFF
<	To switch syntax highlighting on according to the current value of the
	'filetype' option: >
		:set syntax=ON
<	What actually happens when setting the 'syntax' option is that the
	Syntax autocommand event is triggered with the value as argument.
	This option is not copied to another buffer, independent of the 's' or
	'S' flag in 'cpoptions'.
	Only normal file name characters can be used, "/\*?[|<>" are illegal.

						*'tabline'* *'tal'*
'tabline' 'tal'		string	(default empty)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	When nonempty, this option determines the content of the tab pages
	line at the top of the Vim window.  When empty Vim will use a default
	tab pages line.  See |setting-tabline| for more info.

	The tab pages line only appears as specified with the 'showtabline'
	option and only when there is no GUI tab line.  When 'e' is in
	'guioptions' and the GUI supports a tab line 'guitablabel' is used
	instead.

	The value is evaluated like with 'statusline'.  You can use
	|tabpagenr()|, |tabpagewinnr()| and |tabpagebuflist()| to figure out
	the text to be displayed.  Use "%1T" for the first label, "%2T" for
	the second one, etc.  Use "%X" items for closing labels.

	Keep in mind that only one of the tab pages is the current one, others
	are invisible and you can't jump to their windows.


						*'tabpagemax'* *'tpm'*
'tabpagemax' 'tpm'	number	(default 10)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	Maximum number of tab pages to be opened by the |-p| command line
	argument or the ":tab all" command. |tabpage|


						*'tabstop'* *'ts'*
'tabstop' 'ts'		number	(default 8)
			local to buffer
	Number of spaces that a <Tab> in the file counts for.  Also see
	|:retab| command, and 'softtabstop' option.

	Note: Setting 'tabstop' to any other value than 8 can make your file
	appear wrong in many places (e.g., when printing it).

	There are four main ways to use tabs in Vim:
	1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
	   (or 3 or whatever you prefer) and use 'noexpandtab'.  Then Vim
	   will use a mix of tabs and spaces, but typing Tab and BS will
	   behave like a tab appears every 4 (or 3) characters.
	2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
	   'expandtab'.  This way you will always insert spaces.  The
	   formatting will never be messed up when 'tabstop' is changed.
	3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
	   |modeline| to set these values when editing the file again.  Only
	   works when using Vim to edit the file.
	4. Always set 'tabstop' and 'shiftwidth' to the same value, and
	   'noexpandtab'.  This should then work (for initial indents only)
	   for any tabstop setting that people use.  It might be nice to have
	   tabs after the first non-blank inserted as spaces if you do this
	   though.  Otherwise aligned comments will be wrong when 'tabstop' is
	   changed.

			*'tagbsearch'* *'tbs'* *'notagbsearch'* *'notbs'*
'tagbsearch' 'tbs'	boolean	(default on)
			global
			{not in Vi}
	When searching for a tag (e.g., for the |:ta| command), Vim can either
	use a binary search or a linear search in a tags file.  Binary
	searching makes searching for a tag a LOT faster, but a linear search
	will find more tags if the tags file wasn't properly sorted.
	Vim normally assumes that your tags files are sorted, or indicate that
	they are not sorted.  Only when this is not the case does the
	'tagbsearch' option need to be switched off.

	When 'tagbsearch' is on, binary searching is first used in the tags
	files.  In certain situations, Vim will do a linear search instead for
	certain files, or retry all files with a linear search.  When
	'tagbsearch' is off, only a linear search is done.

	Linear searching is done anyway, for one file, when Vim finds a line
	at the start of the file indicating that it's not sorted: >
   !_TAG_FILE_SORTED	0	/some command/
<	[The whitespace before and after the '0' must be a single <Tab>]

	When a binary search was done and no match was found in any of the
	files listed in 'tags', and 'ignorecase' is set or a pattern is used
	instead of a normal tag name, a retry is done with a linear search.
	Tags in unsorted tags files, and matches with different case will only
	be found in the retry.

	If a tag file indicates that it is case-fold sorted, the second,
	linear search can be avoided for the 'ignorecase' case.  Use a value
	of '2' in the "!_TAG_FILE_SORTED" line for this.  A tag file can be
	case-fold sorted with the -f switch to "sort" in most unices, as in
	the command: "sort -f -o tags tags".  For "Exuberant ctags" version
	5.3 or higher the -f or --fold-case-sort switch can be used for this
	as well.  Note that case must be folded to uppercase for this to work.

	When 'tagbsearch' is off, tags searching is slower when a full match
	exists, but faster when no full match exists.  Tags in unsorted tags
	files may only be found with 'tagbsearch' off.
	When the tags file is not sorted, or sorted in a wrong way (not on
	ASCII byte value), 'tagbsearch' should be off, or the line given above
	must be included in the tags file.
	This option doesn't affect commands that find all matching tags (e.g.,
	command-line completion and ":help").
	{Vi: always uses binary search in some versions}

						*'taglength'* *'tl'*
'taglength' 'tl'	number	(default 0)
			global
	If non-zero, tags are significant up to this number of characters.

			*'tagrelative'* *'tr'* *'notagrelative'* *'notr'*
'tagrelative' 'tr'	boolean	(Vim default: on, Vi default: off)
			global
			{not in Vi}
	If on and using a tags file in another directory, file names in that
	tags file are relative to the directory where the tags file is.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'tags'* *'tag'* *E433*
'tags' 'tag'		string	(default "./tags,tags", when compiled with
				|+emacs_tags|: "./tags,./TAGS,tags,TAGS")
			global or local to buffer |global-local|
	Filenames for the tag command, separated by spaces or commas.  To
	include a space or comma in a file name, precede it with a backslash
	(see |option-backslash| about including spaces and backslashes).
	When a file name starts with "./", the '.' is replaced with the path
	of the current file.  But only when the 'd' flag is not included in
	'cpoptions'.  Environment variables are expanded |:set_env|.  Also see
	|tags-option|.
	"*", "**" and other wildcards can be used to search for tags files in
	a directory tree.  See |file-searching|.  {not available when compiled
	without the |+path_extra| feature}
	The |tagfiles()| function can be used to get a list of the file names
	actually used.
	If Vim was compiled with the |+emacs_tags| feature, Emacs-style tag
	files are also supported.  They are automatically recognized.  The
	default value becomes "./tags,./TAGS,tags,TAGS", unless case
	differences are ignored (MS-Windows).  |emacs-tags|
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	file names from the list.  This avoids problems when a future version
	uses another default.
	{Vi: default is "tags /usr/lib/tags"}

				*'tagstack'* *'tgst'* *'notagstack'* *'notgst'*
'tagstack' 'tgst'	boolean	(default on)
			global
			{not in all versions of Vi}
	When on, the |tagstack| is used normally.  When off, a ":tag" or
	":tselect" command with an argument will not push the tag onto the
	tagstack.  A following ":tag" without an argument, a ":pop" command or
	any other command that uses the tagstack will use the unmodified
	tagstack, but does change the pointer to the active entry.
	Resetting this option is useful when using a ":tag" command in a
	mapping which should not change the tagstack.

						*'term'* *E529* *E530* *E531*
'term'			string	(default is $TERM, if that fails:
				      in the GUI: "builtin_gui"
					on Amiga: "amiga"
					 on BeOS: "beos-ansi"
					  on Mac: "mac-ansi"
					 on MiNT: "vt52"
				       on MS-DOS: "pcterm"
					 on OS/2: "os2ansi"
					 on Unix: "ansi"
					  on VMS: "ansi"
				       on Win 32: "win32")
			global
	Name of the terminal.  Used for choosing the terminal control
	characters.  Environment variables are expanded |:set_env|.
	For example: >
		:set term=$TERM
<	See |termcap|.

						*'termbidi'* *'tbidi'*
						*'notermbidi'* *'notbidi'*
'termbidi' 'tbidi'	boolean (default off, on for "mlterm")
			global
			{not in Vi}
			{only available when compiled with the |+arabic|
			feature}
	The terminal is in charge of Bi-directionality of text (as specified
	by Unicode).  The terminal is also expected to do the required shaping
	that some languages (such as Arabic) require.
	Setting this option implies that 'rightleft' will not be set when
	'arabic' is set and the value of 'arabicshape' will be ignored.
	Note that setting 'termbidi' has the immediate effect that
	'arabicshape' is ignored, but 'rightleft' isn't changed automatically.
	This option is reset when the GUI is started.
	For further details see |arabic.txt|.

					*'termencoding'* *'tenc'*
'termencoding' 'tenc'	string	(default ""; with GTK+ 2 GUI: "utf-8"; with
						    Macintosh GUI: "macroman")
			global
			{only available when compiled with the |+multi_byte|
			feature}
			{not in Vi}
	Encoding used for the terminal.  This specifies what character
	encoding the keyboard produces and the display will understand.  For
	the GUI it only applies to the keyboard ('encoding' is used for the
	display).
	In the Win32 console version the default value is the console codepage
	when it differs from the ANSI codepage.
								*E617*
	Note: This does not apply to the GTK+ 2 GUI.  After the GUI has been
	successfully initialized, 'termencoding' is forcibly set to "utf-8".
	Any attempts to set a different value will be rejected, and an error
	message is shown.
	For the Win32 GUI 'termencoding' is not used for typed characters,
	because the Win32 system always passes Unicode characters.
	When empty, the same encoding is used as for the 'encoding' option.
	This is the normal value.
	Not all combinations for 'termencoding' and 'encoding' are valid.  See
	|encoding-table|.
	The value for this option must be supported by internal conversions or
	iconv().  When this is not possible no conversion will be done and you
	will probably experience problems with non-ASCII characters.
	Example: You are working with the locale set to euc-jp (Japanese) and
	want to edit a UTF-8 file: >
		:let &termencoding = &encoding
		:set encoding=utf-8
<	You need to do this when your system has no locale support for UTF-8.

						*'terse'* *'noterse'*
'terse'			boolean	(default off)
			global
	When set: Add 's' flag to 'shortmess' option (this makes the message
	for a search that hits the start or end of the file not being
	displayed).  When reset: Remove 's' flag from 'shortmess' option.  {Vi
	shortens a lot of messages}

				   *'textauto'* *'ta'* *'notextauto'* *'nota'*
'textauto' 'ta'		boolean	(Vim default: on, Vi default: off)
			global
			{not in Vi}
	This option is obsolete.  Use 'fileformats'.
	For backwards compatibility, when 'textauto' is set, 'fileformats' is
	set to the default value for the current system.  When 'textauto' is
	reset, 'fileformats' is made empty.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

				   *'textmode'* *'tx'* *'notextmode'* *'notx'*
'textmode' 'tx'		boolean	(MS-DOS, Win32 and OS/2: default on,
				 others: default off)
			local to buffer
			{not in Vi}
	This option is obsolete.  Use 'fileformat'.
	For backwards compatibility, when 'textmode' is set, 'fileformat' is
	set to "dos".  When 'textmode' is reset, 'fileformat' is set to
	"unix".

						*'textwidth'* *'tw'*
'textwidth' 'tw'	number	(default 0)
			local to buffer
			{not in Vi}
	Maximum width of text that is being inserted.  A longer line will be
	broken after white space to get this width.  A zero value disables
	this.  'textwidth' is set to 0 when the 'paste' option is set.  When
	'textwidth' is zero, 'wrapmargin' may be used.  See also
	'formatoptions' and |ins-textwidth|.
	When 'formatexpr' is set it will be used to break the line.
	NOTE: This option is set to 0 when 'compatible' is set.

						*'thesaurus'* *'tsr'*
'thesaurus' 'tsr'	string	(default "")
			global or local to buffer |global-local|
			{not in Vi}
	List of file names, separated by commas, that are used to lookup words
	for thesaurus completion commands |i_CTRL-X_CTRL-T|.  Each line in
	the file should contain words with similar meaning, separated by
	non-keyword characters (white space is preferred).  Maximum line
	length is 510 bytes.
	To obtain a file to be used here, check out the wordlist FAQ at
	http://www.hyphenologist.co.uk .
	To include a comma in a file name precede it with a backslash.  Spaces
	after a comma are ignored, otherwise spaces are included in the file
	name.  See |option-backslash| about using backslashes.
	The use of |:set+=| and |:set-=| is preferred when adding or removing
	directories from the list.  This avoids problems when a future version
	uses another default.
	Backticks cannot be used in this option for security reasons.

			     *'tildeop'* *'top'* *'notildeop'* *'notop'*
'tildeop' 'top'		boolean	(default off)
			global
			{not in Vi}
	When on: The tilde command "~" behaves like an operator.
	NOTE: This option is reset when 'compatible' is set.

				*'timeout'* *'to'* *'notimeout'* *'noto'*
'timeout' 'to'		boolean (default on)
			global
						*'ttimeout'* *'nottimeout'*
'ttimeout'		boolean (default off)
			global
			{not in Vi}
	These two options together determine the behavior when part of a
	mapped key sequence or keyboard code has been received:

	'timeout'    'ttimeout'		action	~
	   off		off		do not time out
	   on		on or off	time out on :mappings and key codes
	   off		on		time out on key codes

	If both options are off, Vim will wait until either the complete
	mapping or key sequence has been received, or it is clear that there
	is no mapping or key sequence for the received characters.  For
	example: if you have mapped "vl" and Vim has received 'v', the next
	character is needed to see if the 'v' is followed by an 'l'.
	When one of the options is on, Vim will wait for about 1 second for
	the next character to arrive.  After that the already received
	characters are interpreted as single characters.  The waiting time can
	be changed with the 'timeoutlen' option.
	On slow terminals or very busy systems timing out may cause
	malfunctioning cursor keys.  If both options are off, Vim waits
	forever after an entered <Esc> if there are key codes that start
	with <Esc>.  You will have to type <Esc> twice.  If you do not have
	problems with key codes, but would like to have :mapped key
	sequences not timing out in 1 second, set the 'ttimeout' option and
	reset the 'timeout' option.

	NOTE: 'ttimeout' is reset when 'compatible' is set.

						*'timeoutlen'* *'tm'*
'timeoutlen' 'tm'	number	(default 1000)
			global
			{not in all versions of Vi}
						*'ttimeoutlen'* *'ttm'*
'ttimeoutlen' 'ttm'	number	(default -1)
			global
			{not in Vi}
	The time in milliseconds that is waited for a key code or mapped key
	sequence to complete.  Also used for CTRL-\ CTRL-N and CTRL-\ CTRL-G
	when part of a command has been typed.
	Normally only 'timeoutlen' is used and 'ttimeoutlen' is -1.  When a
	different timeout value for key codes is desired set 'ttimeoutlen' to
	a non-negative number.

		ttimeoutlen	mapping delay	   key code delay	~
		   < 0		'timeoutlen'	   'timeoutlen'
		  >= 0		'timeoutlen'	   'ttimeoutlen'

	The timeout only happens when the 'timeout' and 'ttimeout' options
	tell so.  A useful setting would be >
		:set timeout timeoutlen=3000 ttimeoutlen=100
<	(time out on mapping after three seconds, time out on key codes after
	a tenth of a second).

						*'title'* *'notitle'*
'title'			boolean	(default off, on when title can be restored)
			global
			{not in Vi}
			{not available when compiled without the |+title|
			feature}
	When on, the title of the window will be set to the value of
	'titlestring' (if it is not empty), or to:
		filename [+=-] (path) - VIM
	Where:
		filename	the name of the file being edited
		-		indicates the file cannot be modified, 'ma' off
		+		indicates the file was modified
		=		indicates the file is read-only
		=+		indicates the file is read-only and modified
		(path)		is the path of the file being edited
		- VIM		the server name |v:servername| or "VIM"
	Only works if the terminal supports setting window titles
	(currently Amiga console, Win32 console, all GUI versions and
	terminals with a non- empty 't_ts' option - these are Unix xterm and
	iris-ansi by default, where 't_ts' is taken from the builtin termcap).
								*X11*
	When Vim was compiled with HAVE_X11 defined, the original title will
	be restored if possible.  The output of ":version" will include "+X11"
	when HAVE_X11 was defined, otherwise it will be "-X11".  This also
	works for the icon name |'icon'|.
	But: When Vim was started with the |-X| argument, restoring the title
	will not work (except in the GUI).
	If the title cannot be restored, it is set to the value of 'titleold'.
	You might want to restore the title outside of Vim then.
	When using an xterm from a remote machine you can use this command:
	    rsh machine_name xterm -display $DISPLAY &
	then the WINDOWID environment variable should be inherited and the
	title of the window should change back to what it should be after
	exiting Vim.

								*'titlelen'*
'titlelen'		number	(default 85)
			global
			{not in Vi}
			{not available when compiled without the |+title|
			feature}
	Gives the percentage of 'columns' to use for the length of the window
	title.  When the title is longer, only the end of the path name is
	shown.  A '<' character before the path name is used to indicate this.
	Using a percentage makes this adapt to the width of the window.  But
	it won't work perfectly, because the actual number of characters
	available also depends on the font used and other things in the title
	bar.  When 'titlelen' is zero the full path is used.  Otherwise,
	values from 1 to 30000 percent can be used.
	'titlelen' is also used for the 'titlestring' option.

						*'titleold'*
'titleold'		string	(default "Thanks for flying Vim")
			global
			{not in Vi}
			{only available when compiled with the |+title|
			feature}
	This option will be used for the window title when exiting Vim if the
	original title cannot be restored.  Only happens if 'title' is on or
	'titlestring' is not empty.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.
						*'titlestring'*
'titlestring'		string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+title|
			feature}
	When this option is not empty, it will be used for the title of the
	window.  This happens only when the 'title' option is on.
	Only works if the terminal supports setting window titles (currently
	Amiga console, Win32 console, all GUI versions and terminals with a
	non-empty 't_ts' option).
	When Vim was compiled with HAVE_X11 defined, the original title will
	be restored if possible |X11|.
	When this option contains printf-style '%' items, they will be
	expanded according to the rules used for 'statusline'.
	Example: >
    :auto BufEnter * let &titlestring = hostname() . "/" . expand("%:p")
    :set title titlestring=%<%F%=%l/%L-%P titlelen=70
<	The value of 'titlelen' is used to align items in the middle or right
	of the available space.
	Some people prefer to have the file name first: >
    :set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)
<	Note the use of "%{ }" and an expression to get the path of the file,
	without the file name.  The "%( %)" constructs are used to add a
	separating space only when needed.
	NOTE: Use of special characters in 'titlestring' may cause the display
	to be garbled (e.g., when it contains a CR or NL character).
	{not available when compiled without the |+statusline| feature}

				*'toolbar'* *'tb'*
'toolbar' 'tb'		string	(default "icons,tooltips")
			global
			{only for |+GUI_GTK|, |+GUI_Athena|, |+GUI_Motif| and
			|+GUI_Photon|}
	The contents of this option controls various toolbar settings.  The
	possible values are:
		icons		Toolbar buttons are shown with icons.
		text		Toolbar buttons shown with text.
		horiz		Icon and text of a toolbar button are
				horizontally arranged.  {only in GTK+ 2 GUI}
		tooltips	Tooltips are active for toolbar buttons.
	Tooltips refer to the popup help text which appears after the mouse
	cursor is placed over a toolbar button for a brief moment.

	If you want the toolbar to be shown with icons as well as text, do the
	following: >
		:set tb=icons,text
<	Motif and Athena cannot display icons and text at the same time.  They
	will show icons if both are requested.

	If none of the strings specified in 'toolbar' are valid or if
	'toolbar' is empty, this option is ignored.  If you want to disable
	the toolbar, you need to set the 'guioptions' option.  For example: >
		:set guioptions-=T
<	Also see |gui-toolbar|.

						*'toolbariconsize'* *'tbis'*
'toolbariconsize' 'tbis'	string	(default "small")
				global
				{not in Vi}
				{only in the GTK+ 2 GUI}
	Controls the size of toolbar icons.  The possible values are:
		tiny		Use tiny toolbar icons.
		small		Use small toolbar icons (default).
		medium		Use medium-sized toolbar icons.
		large		Use large toolbar icons.
	The exact dimensions in pixels of the various icon sizes depend on
	the current theme.  Common dimensions are large=32x32, medium=24x24,
	small=20x20 and tiny=16x16.

	If 'toolbariconsize' is empty, the global default size as determined
	by user preferences or the current theme is used.

			     *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'*
'ttybuiltin' 'tbi'	boolean	(default on)
			global
			{not in Vi}
	When on, the builtin termcaps are searched before the external ones.
	When off the builtin termcaps are searched after the external ones.
	When this option is changed, you should set the 'term' option next for
	the change to take effect, for example: >
		:set notbi term=$TERM
<	See also |termcap|.
	Rationale: The default for this option is "on", because the builtin
	termcap entries are generally better (many systems contain faulty
	xterm entries...).

				     *'ttyfast'* *'tf'* *'nottyfast'* *'notf'*
'ttyfast' 'tf'		boolean	(default off, on when 'term' is xterm, hpterm,
					sun-cmd, screen, rxvt, dtterm or
					iris-ansi; also on when running Vim in
					a DOS console)
			global
			{not in Vi}
	Indicates a fast terminal connection.  More characters will be sent to
	the screen for redrawing, instead of using insert/delete line
	commands.  Improves smoothness of redrawing when there are multiple
	windows and the terminal does not support a scrolling region.
	Also enables the extra writing of characters at the end of each screen
	line for lines that wrap.  This helps when using copy/paste with the
	mouse in an xterm and other terminals.

						*'ttymouse'* *'ttym'*
'ttymouse' 'ttym'	string	(default depends on 'term')
			global
			{not in Vi}
			{only in Unix and VMS, doesn't work in the GUI; not
			available when compiled without |+mouse|}
	Name of the terminal type for which mouse codes are to be recognized.
	Currently these three strings are valid:
							*xterm-mouse*
	   xterm	xterm-like mouse handling.  The mouse generates
			"<Esc>[Mscr", where "scr" is three bytes:
				"s"  = button state
				"c"  = column plus 33
				"r"  = row plus 33
			This only works up to 223 columns!  See "dec" for a
			solution.
	   xterm2	Works like "xterm", but with the xterm reporting the
			mouse position while the mouse is dragged.  This works
			much faster and more precise.  Your xterm must at
			least at patchlevel 88 / XFree 3.3.3 for this to
			work.  See below for how Vim detects this
			automatically.
							*netterm-mouse*
	   netterm	NetTerm mouse handling.  The mouse generates
			"<Esc>}r,c<CR>", where "r,c" are two decimal numbers
			for the row and column.
							*dec-mouse*
	   dec		DEC terminal mouse handling.  The mouse generates a
			rather complex sequence, starting with "<Esc>[".
			This is also available for an Xterm, if it was
			configured with "--enable-dec-locator".
							*jsbterm-mouse*
	   jsbterm	JSB term mouse handling.
							*pterm-mouse*
	   pterm	QNX pterm mouse handling.

	The mouse handling must be enabled at compile time |+mouse_xterm|
	|+mouse_dec| |+mouse_netterm|.
	Only "xterm"(2) is really recognized.  NetTerm mouse codes are always
	recognized, if enabled at compile time.  DEC terminal mouse codes
	are recognized if enabled at compile time, and 'ttymouse' is not
	"xterm" (because the xterm and dec mouse codes conflict).
	This option is automatically set to "xterm", when the 'term' option is
	set to a name that starts with "xterm", and 'ttymouse' is not "xterm"
	or "xterm2" already.  The main use of this option is to set it to
	"xterm", when the terminal name doesn't start with "xterm", but it can
	handle xterm mouse codes.
	The "xterm2" value will be set if the xterm version is reported to be
	95 of higher.  This only works when compiled with the |+termresponse|
	feature and if |t_RV| is set to the escape sequence to request the
	xterm version number.  Otherwise "xterm2" must be set explicitly.
	If you do not want 'ttymouse' to be set to "xterm2" automatically, set
	t_RV to an empty string: >
		:set t_RV=
<
						*'ttyscroll'* *'tsl'*
'ttyscroll' 'tsl'	number	(default 999)
			global
	Maximum number of lines to scroll the screen.  If there are more lines
	to scroll the window is redrawn.  For terminals where scrolling is
	very slow and redrawing is not slow this can be set to a small number,
	e.g., 3, to speed up displaying.

						*'ttytype'* *'tty'*
'ttytype' 'tty'		string	(default from $TERM)
			global
	Alias for 'term', see above.

						*'undolevels'* *'ul'*
'undolevels' 'ul'	number	(default 100, 1000 for Unix, VMS,
						Win32 and OS/2)
			global
			{not in Vi}
	Maximum number of changes that can be undone.  Since undo information
	is kept in memory, higher numbers will cause more memory to be used
	(nevertheless, a single change can use an unlimited amount of memory).
	Set to 0 for Vi compatibility: One level of undo and "u" undoes
	itself: >
		set ul=0
<	But you can also get Vi compatibility by including the 'u' flag in
	'cpoptions', and still be able to use CTRL-R to repeat undo.
	Set to a negative number for no undo at all: >
		set ul=-1
<	This helps when you run out of memory for a single change.
	Also see |undo-two-ways|.

						*'updatecount'* *'uc'*
'updatecount' 'uc'	number	(default: 200)
			global
			{not in Vi}
	After typing this many characters the swap file will be written to
	disk.  When zero, no swap file will be created at all (see chapter on
	recovery |crash-recovery|).  'updatecount' is set to zero by starting
	Vim with the "-n" option, see |startup|.  When editing in readonly
	mode this option will be initialized to 10000.
	The swapfile can be disabled per buffer with |'swapfile'|.
	When 'updatecount' is set from zero to non-zero, swap files are
	created for all buffers that have 'swapfile' set.  When 'updatecount'
	is set to zero, existing swap files are not deleted.
	Also see |'swapsync'|.
	This option has no meaning in buffers where |'buftype'| is "nofile"
	or "nowrite".

						*'updatetime'* *'ut'*
'updatetime' 'ut'	number	(default 4000)
			global
			{not in Vi}
	If this many milliseconds nothing is typed the swap file will be
	written to disk (see |crash-recovery|).  Also used for the
	|CursorHold| autocommand event.

						*'verbose'* *'vbs'*
'verbose' 'vbs'		number	(default 0)
			global
			{not in Vi, although some versions have a boolean
			verbose option}
	When bigger than zero, Vim will give messages about what it is doing.
	Currently, these messages are given:
	>= 1	When the viminfo file is read or written.
	>= 2	When a file is ":source"'ed.
	>= 5	Every searched tags file and include file.
	>= 8	Files for which a group of autocommands is executed.
	>= 9	Every executed autocommand.
	>= 12	Every executed function.
	>= 13	When an exception is thrown, caught, finished, or discarded.
	>= 14	Anything pending in a ":finally" clause.
	>= 15	Every executed Ex command (truncated at 200 characters).

	This option can also be set with the "-V" argument.  See |-V|.
	This option is also set by the |:verbose| command.

	When the 'verbosefile' option is set then the verbose messages are not
	displayed.

						*'verbosefile'* *'vfile'*
'verbosefile' 'vfile'	string	(default empty)
			global
			{not in Vi}
	When not empty all messages are written in a file with this name.
	When the file exists messages are appended.
	Writing to the file ends when Vim exits or when 'verbosefile' is made
	empty.
	Setting 'verbosefile' to a new value is like making it empty first.
	The difference with |:redir| is that verbose messages are not
	displayed when 'verbosefile' is set.

						*'viewdir'* *'vdir'*
'viewdir' 'vdir'	string	(default for Amiga, MS-DOS, OS/2 and Win32:
							 "$VIM/vimfiles/view",
				 for Unix: "~/.vim/view",
				 for Macintosh: "$VIM:vimfiles:view"
				 for VMS: "sys$login:vimfiles/view"
				 for RiscOS: "Choices:vimfiles/view")
			global
			{not in Vi}
			{not available when compiled without the +mksession
			feature}
	Name of the directory where to store files for |:mkview|.
	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

						*'viewoptions'* *'vop'*
'viewoptions' 'vop'	string	(default: "folds,options,cursor")
			global
			{not in Vi}
			{not available when compiled without the +mksession
			feature}
	Changes the effect of the |:mkview| command.  It is a comma separated
	list of words.  Each word enables saving and restoring something:
	   word		save and restore ~
	   cursor	cursor position in file and in window
	   folds	manually created folds, opened/closed folds and local
			fold options
	   options	options and mappings local to a window or buffer (not
			global values for local options)
	   slash	backslashes in file names replaced with forward
			slashes
	   unix		with Unix end-of-line format (single <NL>), even when
			on Windows or DOS

	"slash" and "unix" are useful on Windows when sharing view files
	with Unix.  The Unix version of Vim cannot source dos format scripts,
	but the Windows version of Vim can source unix format scripts.

				*'viminfo'* *'vi'* *E526* *E527* *E528*
'viminfo' 'vi'		string	(Vi default: "", Vim default for MS-DOS,
				   Windows and OS/2: '20,<50,s10,h,rA:,rB:,
				   for Amiga: '20,<50,s10,h,rdf0:,rdf1:,rdf2:
				   for others: '20,<50,s10,h)
			global
			{not in Vi}
			{not available when compiled without the  |+viminfo|
			feature}
	When non-empty, the viminfo file is read upon startup and written
	when exiting Vim (see |viminfo-file|).  The string should be a comma
	separated list of parameters, each consisting of a single character
	identifying the particular parameter, followed by a number or string
	which specifies the value of that parameter.  If a particular
	character is left out, then the default value is used for that
	parameter.  The following is a list of the identifying characters and
	the effect of their value.
	CHAR	VALUE	~
	!	When included, save and restore global variables that start
		with an uppercase letter, and don't contain a lowercase
		letter.  Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
		and "_K_L_M" are not.  Only String and Number types are
		stored.
	"	Maximum number of lines saved for each register.  Old name of
		the '<' item, with the disadvantage that you need to put a
		backslash before the ", otherwise it will be recognized as the
		start of a comment!
	%	When included, save and restore the buffer list.  If Vim is
		started with a file name argument, the buffer list is not
		restored.  If Vim is started without a file name argument, the
		buffer list is restored from the viminfo file.  Buffers
		without a file name and buffers for help files are not written
		to the viminfo file.
		When followed by a number, the number specifies the maximum
		number of buffers that are stored.  Without a number all
		buffers are stored.
	'	Maximum number of previously edited files for which the marks
		are remembered.  This parameter must always be included when
		'viminfo' is non-empty.
		Including this item also means that the |jumplist| and the
		|changelist| are stored in the viminfo file.
	/	Maximum number of items in the search pattern history to be
		saved.  If non-zero, then the previous search and substitute
		patterns are also saved.  When not included, the value of
		'history' is used.
	:	Maximum number of items in the command-line history to be
		saved.  When not included, the value of 'history' is used.
	<	Maximum number of lines saved for each register.  If zero then
		registers are not saved.  When not included, all lines are
		saved.  '"' is the old name for this item.
		Also see the 's' item below: limit specified in Kbyte.
	@	Maximum number of items in the input-line history to be
		saved.  When not included, the value of 'history' is used.
	c	When included, convert the text in the viminfo file from the
		'encoding' used when writing the file to the current
		'encoding'.  See |viminfo-encoding|.
	f	Whether file marks need to be stored.  If zero, file marks ('0
		to '9, 'A to 'Z) are not stored.  When not present or when
		non-zero, they are all stored.  '0 is used for the current
		cursor position (when exiting or when doing ":wviminfo").
	h	Disable the effect of 'hlsearch' when loading the viminfo
		file.  When not included, it depends on whether ":nohlsearch"
		has been used since the last search command.
	n	Name of the viminfo file.  The name must immediately follow
		the 'n'.  Must be the last one!  If the "-i" argument was
		given when starting Vim, that file name overrides the one
		given here with 'viminfo'.  Environment variables are expanded
		when opening the file, not when setting the option.
	r	Removable media.  The argument is a string (up to the next
		',').  This parameter can be given several times.  Each
		specifies the start of a path for which no marks will be
		stored.  This is to avoid removable media.  For MS-DOS you
		could use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:".  You can
		also use it for temp files, e.g., for Unix: "r/tmp".  Case is
		ignored.  Maximum length of each 'r' argument is 50
		characters.
	s	Maximum size of an item in Kbyte.  If zero then registers are
		not saved.  Currently only applies to registers.  The default
		"s10" will exclude registers with more than 10 Kbyte of text.
		Also see the '<' item above: line count limit.

	Example: >
	    :set viminfo='50,<1000,s100,:0,n~/vim/viminfo
<
	'50		Marks will be remembered for the last 50 files you
			edited.
	<1000		Contents of registers (up to 1000 lines each) will be
			remembered.
	s100		Registers with more than 100 Kbyte text are skipped.
	:0		Command-line history will not be saved.
	n~/vim/viminfo	The name of the file to use is "~/vim/viminfo".
	no /		Since '/' is not specified, the default will be used,
			that is, save all of the search history, and also the
			previous search and substitute patterns.
	no %		The buffer list will not be saved nor read back.
	no h		'hlsearch' highlighting will be restored.

	When setting 'viminfo' from an empty value you can use |:rviminfo| to
	load the contents of the file, this is not done automatically.

	This option cannot be set from a |modeline| or in the |sandbox|, for
	security reasons.

					    *'virtualedit'* *'ve'*
'virtualedit' 've'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the
			|+virtualedit| feature}
	A comma separated list of these words:
	    block	Allow virtual editing in Visual block mode.
	    insert	Allow virtual editing in Insert mode.
	    all		Allow virtual editing in all modes.
	    onemore	Allow the cursor to move just past the end of the line

	Virtual editing means that the cursor can be positioned where there is
	no actual character.  This can be halfway into a Tab or beyond the end
	of the line.  Useful for selecting a rectangle in Visual mode and
	editing a table.
	"onemore" is not the same, it will only allow moving the cursor just
	after the last character of the line.  This makes some commands more
	consistent.  Previously the cursor was always past the end of the line
	if the line was empty.  But it is far from Vi compatible.  It may also
	break some plugins or Vim scripts.  For example because |l| can move
	the cursor after the last character.  Use with care!
	Using the |$| command will move to the last character in the line, not
	past it.  This may actually move the cursor to the left!
	It doesn't make sense to combine "all" with "onemore", but you will
	not get a warning for it.

			*'visualbell'* *'vb'* *'novisualbell'* *'novb'* *beep*
'visualbell' 'vb'	boolean	(default off)
			global
			{not in Vi}
	Use visual bell instead of beeping.  The terminal code to display the
	visual bell is given with 't_vb'.  When no beep or flash is wanted,
	use ":set vb t_vb=".
	Note: When the GUI starts, 't_vb' is reset to its default value.  You
	might want to set it again in your |gvimrc|.
	In the GUI, 't_vb' defaults to "<Esc>|f", which inverts the display
	for 20 msec.  If you want to use a different time, use "<Esc>|40f",
	where 40 is the time in msec.
	Does not work on the Amiga, you always get a screen flash.
	Also see 'errorbells'.

						*'warn'* *'nowarn'*
'warn'			boolean	(default on)
			global
	Give a warning message when a shell command is used while the buffer
	has been changed.

		     *'weirdinvert'* *'wiv'* *'noweirdinvert'* *'nowiv'*
'weirdinvert' 'wiv'	boolean	(default off)
			global
			{not in Vi}
	This option has the same effect as the 't_xs' terminal option.
	It is provided for backwards compatibility with version 4.x.
	Setting 'weirdinvert' has the effect of making 't_xs' non-empty, and
	vice versa.  Has no effect when the GUI is running.

						*'whichwrap'* *'ww'*
'whichwrap' 'ww'	string	(Vim default: "b,s", Vi default: "")
			global
			{not in Vi}
	Allow specified keys that move the cursor left/right to move to the
	previous/next line when the cursor is on the first/last character in
	the line.  Concatenate characters to allow this for these keys:
		char   key	  mode	~
		 b    <BS>	 Normal and Visual
		 s    <Space>	 Normal and Visual
		 h    "h"	 Normal and Visual (not recommended)
		 l    "l"	 Normal and Visual (not recommended)
		 <    <Left>	 Normal and Visual
		 >    <Right>	 Normal and Visual
		 ~    "~"	 Normal
		 [    <Left>	 Insert and Replace
		 ]    <Right>	 Insert and Replace
	For example: >
		:set ww=<,>,[,]
<	allows wrap only when cursor keys are used.
	When the movement keys are used in combination with a delete or change
	operator, the <EOL> also counts for a character.  This makes "3h"
	different from "3dh" when the cursor crosses the end of a line.  This
	is also true for "x" and "X", because they do the same as "dl" and
	"dh".  If you use this, you may also want to use the mapping
	":map <BS> X" to make backspace delete the character in front of the
	cursor.
	When 'l' is included and it is used after an operator at the end of a
	line then it will not move to the next line.  This makes "dl", "cl",
	"yl" etc. work normally.
	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'wildchar'* *'wc'*
'wildchar' 'wc'		number	(Vim default: <Tab>, Vi default: CTRL-E)
			global
			{not in Vi}
	Character you have to type to start wildcard expansion in the
	command-line, as specified with 'wildmode'.
	The character is not recognized when used inside a macro.  See
	'wildcharm' for that.
	Although 'wc' is a number option, you can set it to a special key: >
		:set wc=<Esc>
<	NOTE: This option is set to the Vi default value when 'compatible' is
	set and to the Vim default value when 'compatible' is reset.

						*'wildcharm'* *'wcm'*
'wildcharm' 'wcm'	number	(default: none (0))
			global
			{not in Vi}
	'wildcharm' works exactly like 'wildchar', except that it is
	recognized when used inside a macro.  You can find "spare" command-line
	keys suitable for this option by looking at |ex-edit-index|.  Normally
	you'll never actually type 'wildcharm', just use it in mappings that
	automatically invoke completion mode, e.g.: >
		:set wcm=<C-Z>
		:cmap ss so $vim/sessions/*.vim<C-Z>
<	Then after typing :ss you can use CTRL-P & CTRL-N.

						*'wildignore'* *'wig'*
'wildignore' 'wig'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+wildignore|
			feature}
	A list of file patterns.  A file that matches with one of these
	patterns is ignored when completing file or directory names.
	The pattern is used like with |:autocmd|, see |autocmd-patterns|.
	Also see 'suffixes'.
	Example: >
		:set wildignore=*.o,*.obj
<	The use of |:set+=| and |:set-=| is preferred when adding or removing
	a pattern from the list.  This avoids problems when a future version
	uses another default.

				*'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'*
'wildmenu' 'wmnu'	boolean	(default off)
			global
			{not in Vi}
			{not available if compiled without the |+wildmenu|
			feature}
	When 'wildmenu' is on, command-line completion operates in an enhanced
	mode.  On pressing 'wildchar' (usually <Tab>) to invoke completion,
	the possible matches are shown just above the command line, with the
	first match highlighted (overwriting the status line, if there is
	one).  Keys that show the previous/next match, such as <Tab> or
	CTRL-P/CTRL-N, cause the highlight to move to the appropriate match.
	When 'wildmode' is used, "wildmenu" mode is used where "full" is
	specified.  "longest" and "list" do not start "wildmenu" mode.
	If there are more matches than can fit in the line, a ">" is shown on
	the right and/or a "<" is shown on the left.  The status line scrolls
	as needed.
	The "wildmenu" mode is abandoned when a key is hit that is not used
	for selecting a completion.
	While the "wildmenu" is active the following keys have special
	meanings:

	<Left> <Right>	- select previous/next match (like CTRL-P/CTRL-N)
	<Down>		- in filename/menu name completion: move into a
			  subdirectory or submenu.
	<CR>		- in menu completion, when the cursor is just after a
			  dot: move into a submenu.
	<Up>		- in filename/menu name completion: move up into
			  parent directory or parent menu.

	This makes the menus accessible from the console |console-menus|.

	If you prefer the <Left> and <Right> keys to move the cursor instead
	of selecting a different match, use this: >
		:cnoremap <Left> <Space><BS><Left>
		:cnoremap <Right> <Space><BS><Right>
<
	The "WildMenu" highlighting is used for displaying the current match
	|hl-WildMenu|.

						*'wildmode'* *'wim'*
'wildmode' 'wim'	string	(Vim default: "full")
			global
			{not in Vi}
	Completion mode that is used for the character specified with
	'wildchar'.  It is a comma separated list of up to four parts.  Each
	part specifies what to do for each consecutive use of 'wildchar.  The
	first part specifies the behavior for the first use of 'wildchar',
	The second part for the second use, etc.
	These are the possible values for each part:
	""		Complete only the first match.
	"full"		Complete the next full match.  After the last match,
			the original string is used and then the first match
			again.
	"longest"	Complete till longest common string.  If this doesn't
			result in a longer string, use the next part.
	"longest:full"	Like "longest", but also start 'wildmenu' if it is
			enabled.
	"list"		When more than one match, list all matches.
	"list:full"	When more than one match, list all matches and
			complete first match.
	"list:longest"	When more than one match, list all matches and
			complete till longest common string.
	When there is only a single match, it is fully completed in all cases.

	Examples: >
		:set wildmode=full
<	Complete first full match, next match, etc.  (the default) >
		:set wildmode=longest,full
<	Complete longest common string, then each full match >
		:set wildmode=list:full
<	List all matches and complete each full match >
		:set wildmode=list,full
<	List all matches without completing, then each full match >
		:set wildmode=longest,list
<	Complete longest common string, then list alternatives.

						*'wildoptions'* *'wop'*
'wildoptions' 'wop'	string	(default "")
			global
			{not in Vi}
			{not available when compiled without the |+wildignore|
			feature}
	A list of words that change how command line completion is done.
	Currently only one word is allowed:
	  tagfile	When using CTRL-D to list matching tags, the kind of
			tag and the file of the tag is listed.	Only one match
			is displayed per line.  Often used tag kinds are:
				d	#define
				f	function
	Also see |cmdline-completion|.

						*'winaltkeys'* *'wak'*
'winaltkeys' 'wak'	string	(default "menu")
			global
			{not in Vi}
			{only used in Win32, Motif, GTK and Photon GUI}
	Some GUI versions allow the access to menu entries by using the ALT
	key in combination with a character that appears underlined in the
	menu.  This conflicts with the use of the ALT key for mappings and
	entering special characters.  This option tells what to do:
	  no	Don't use ALT keys for menus.  ALT key combinations can be
		mapped, but there is no automatic handling.  This can then be
		done with the |:simalt| command.
	  yes	ALT key handling is done by the windowing system.  ALT key
		combinations cannot be mapped.
	  menu	Using ALT in combination with a character that is a menu
		shortcut key, will be handled by the windowing system.  Other
		keys can be mapped.
	If the menu is disabled by excluding 'm' from 'guioptions', the ALT
	key is never used for the menu.
	This option is not used for <F10>; on Win32 and with GTK <F10> will
	select the menu, unless it has been mapped.

						*'window'* *'wi'*
'window' 'wi'		number  (default screen height - 1)
			global
	Window height.  Do not confuse this with the height of the Vim window,
	use 'lines' for that.
	Used for |CTRL-F| and |CTRL-B| when there is only one window and the
	value is smaller than 'lines' minus one.  The screen will scroll
	'window' minus two lines, with a minimum of one.
	When 'window' is equal to 'lines' minus one CTRL-F and CTRL-B scroll
	in a much smarter way, taking care of wrapping lines.
	When resizing the Vim window, the value is smaller than 1 or more than
	or equal to 'lines' it will be set to 'lines' minus 1.
	{Vi also uses the option to specify the number of displayed lines}

						*'winheight'* *'wh'* *E591*
'winheight' 'wh'	number	(default 1)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	Minimal number of lines for the current window.  This is not a hard
	minimum, Vim will use fewer lines if there is not enough room.  If the
	current window is smaller, its size is increased, at the cost of the
	height of other windows.  Set it to 999 to make the current window
	always fill the screen (although this has the drawback that ":all"
	will create only two windows).  Set it to a small number for normal
	editing.
	Minimum value is 1.
	The height is not adjusted after one of the commands to change the
	height of the current window.
	'winheight' applies to the current window.  Use 'winminheight' to set
	the minimal height for other windows.

			*'winfixheight'* *'wfh'* *'nowinfixheight'* *'nowfh'*
'winfixheight' 'wfh'	boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	Keep the window height when windows are opened or closed and
	'equalalways' is set.  Set by default for the |preview-window| and
	|quickfix-window|.
	The height may be changed anyway when running out of room.

			*'winfixwidth'* *'wfw'* *'nowinfixwidth'* *'nowfw'*
'winfixwidth' 'wfw'	boolean	(default off)
			local to window
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	Keep the window width when windows are opened or closed and
	'equalalways' is set.
	The width may be changed anyway when running out of room.

						*'winminheight'* *'wmh'*
'winminheight' 'wmh'	number	(default 1)
			global
			{not in Vi}
			{not available when compiled without the +windows
			feature}
	The minimal height of a window, when it's not the current window.
	This is a hard minimum, windows will never become smaller.
	When set to zero, windows may be "squashed" to zero lines (i.e. just a
	status bar) if necessary.  They will return to at least one line when
	they become active (since the cursor has to have somewhere to go.)
	Use 'winheight' to set the minimal height of the current window.
	This option is only checked when making a window smaller.  Don't use a
	large number, it will cause errors when opening more than a few
	windows.  A value of 0 to 3 is reasonable.

						*'winminwidth'* *'wmw'*
'winminwidth' 'wmw'	number	(default 1)
			global
			{not in Vi}
			{not available when compiled without the +vertsplit
			feature}
	The minimal width of a window, when it's not the current window.
	This is a hard minimum, windows will never become smaller.
	When set to zero, windows may be "squashed" to zero columns (i.e. just
	a vertical separator) if necessary.  They will return to at least one
	line when they become active (since the cursor has to have somewhere
	to go.)
	Use 'winwidth' to set the minimal width of the current window.
	This option is only checked when making a window smaller.  Don't use a
	large number, it will cause errors when opening more than a few
	windows.  A value of 0 to 12 is reasonable.

						*'winwidth'* *'wiw'* *E592*
'winwidth' 'wiw'	number	(default 20)
			global
			{not in Vi}
			{not available when compiled without the +vertsplit
			feature}
	Minimal number of columns for the current window.  This is not a hard
	minimum, Vim will use fewer columns if there is not enough room.  If
	the current window is smaller, its size is increased, at the cost of
	the width of other windows.  Set it to 999 to make the current window
	always fill the screen.  Set it to a small number for normal editing.
	The width is not adjusted after one of the commands to change the
	width of the current window.
	'winwidth' applies to the current window.  Use 'winminwidth' to set
	the minimal width for other windows.

						*'wrap'* *'nowrap'*
'wrap'			boolean	(default on)
			local to window
			{not in Vi}
	This option changes how text is displayed.  It doesn't change the text
	in the buffer, see 'textwidth' for that.
	When on, lines longer than the width of the window will wrap and
	displaying continues on the next line.  When off lines will not wrap
	and only part of long lines will be displayed.  When the cursor is
	moved to a part that is not shown, the screen will scroll
	horizontally.
	The line will be broken in the middle of a word if necessary.  See
	'linebreak' to get the break at a word boundary.
	To make scrolling horizontally a bit more useful, try this: >
		:set sidescroll=5
		:set listchars+=precedes:<,extends:>
<	See 'sidescroll', 'listchars' and |wrap-off|.

						*'wrapmargin'* *'wm'*
'wrapmargin' 'wm'	number	(default 0)
			local to buffer
	Number of characters from the right window border where wrapping
	starts.  When typing text beyond this limit, an <EOL> will be inserted
	and inserting continues on the next line.
	Options that add a margin, such as 'number' and 'foldcolumn', cause
	the text width to be further reduced.  This is Vi compatible.
	When 'textwidth' is non-zero, this option is not used.
	See also 'formatoptions' and |ins-textwidth|.  {Vi: works differently
	and less usefully}

				   *'wrapscan'* *'ws'* *'nowrapscan'* *'nows'*
'wrapscan' 'ws'		boolean	(default on)			*E384* *E385*
			global
	Searches wrap around the end of the file.  Also applies to |]s| and
	|[s|, searching for spelling mistakes.

						   *'write'* *'nowrite'*
'write'			boolean	(default on)
			global
			{not in Vi}
	Allows writing files.  When not set, writing a file is not allowed.
	Can be used for a view-only mode, where modifications to the text are
	still allowed.  Can be reset with the |-m| or |-M| command line
	argument.  Filtering text is still possible, even though this requires
	writing a temporary file.

				   *'writeany'* *'wa'* *'nowriteany'* *'nowa'*
'writeany' 'wa'		boolean	(default off)
			global
	Allows writing to any file with no need for "!" override.

			     *'writebackup'* *'wb'* *'nowritebackup'* *'nowb'*
'writebackup' 'wb'	boolean	(default on with |+writebackup| feature, off
					otherwise)
			global
			{not in Vi}
	Make a backup before overwriting a file.  The backup is removed after
	the file was successfully written, unless the 'backup' option is
	also on.  Reset this option if your file system is almost full.  See
	|backup-table| for another explanation.
	When the 'backupskip' pattern matches, a backup is not made anyway.
	NOTE: This option is set to the default value when 'compatible' is
	set.

						*'writedelay'* *'wd'*
'writedelay' 'wd'	number	(default 0)
			global
			{not in Vi}
	The number of microseconds to wait for each character sent to the
	screen.  When non-zero, characters are sent to the terminal one by
	one.  For MS-DOS pcterm this does not work.  For debugging purposes.

 vim:tw=78:ts=8:ft=help:norl:
