*options.txt*	For Vim version 7.0f.  Last change: 2006 Apr 24


		  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 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.
	Mimimum 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", 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.  The |v:lnum| variable holds the first line to be formatted,
	|v:count| the number of lines to be formatted.
	When this option is empty 'formatprg' is used.
	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
<								*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 systens, currently
		only for GTK.

	  '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 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.

	The tooltip only works for some systems.


						*'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.


						*'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.
	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:
