*version4.txt*  For Vim version 7.0d.  Last change: 2004 Mar 12


		  VIM REFERENCE MANUAL    by Bram Moolenaar


This document lists the incompatible differences between Vim 3.0 and Vim 4.0.
Although 4.0 is mentioned here, this is also for version 4.1, 4.2, etc..

This file is important for everybody upgrading from Vim 3.0.  Read it
carefully to avoid unexpected problems.

'backup' option default changed			|backup-changed|
Extension for backup file changed		|backup-extension|
Structure of swap file changed			|swapfile-changed|
"-w scriptout" argument changed			|scriptout-changed|
Backspace and Delete keys			|backspace-delete|
Escape for | changed				|escape-bar|
Key codes changed				|key-codes-changed|
Terminal options changed			|termcap-changed|
'errorformat' option changed			|errorformat-changed|
'graphic' option gone				|graphic-option-gone|
'yankendofline' option gone			|ye-option-gone|
'icon' and 'title' default value changed	|icon-changed|
'highlight' option changed			|highlight-changed|
'tildeop' and 'weirdinvert' short names changed	|short-name-changed|
Use of "v", "V" and "CTRL-V" in Visual mode	|use-visual-cmds|
CTRL-B in Insert mode removed			|toggle-revins|


'backup' option default changed				*backup-changed*
-------------------------------

The default value for 'backup' used to be on.  This resulted in a backup file
being made when the original file was overwritten.

Now the default for 'backup' is off.  As soon as the writing of the file has
successfully finished, the backup file is deleted.  If you want to keep the
backup file, set 'backup' on in your vimrc.  The reason for this change is
that many people complained that leaving a backup file behind is not
Vi-compatible.						|'backup'|


Extension for backup file changed			*backup-extension*
---------------------------------

The extension for the backup file used to be ".bak".  Since other programs
also use this extension and some users make copies with this extension, it was
changed to the less obvious "~".  Another advantage is that this takes less
space, which is useful when working on a system with short file names.  For
example, on MS-DOS the backup files for "longfile.c" and "longfile.h" would
both become "longfile.bak"; now they will be "longfile.c~" and "longfile.h~".

If you prefer to use ".bak", you can set the 'backupext' option: >
	:set bex=.bak


Structure of swap file changed				*swapfile-changed*
------------------------------

The contents of the swap file were extended with several parameters.  Vim
stores the user name and other information about the edited file to make
recovery more easy and to be able to know where the swap file comes from.  The
first part of the swap file can now be understood on a machine with a
different byte order or sizeof(int).  When you try to recover a file on such a
machine, you will get an error message that this is not possible.

Because of this change, swap files cannot be exchanged between 3.0 and 4.0.
If you have a swap file from a crashed session with 3.0, use Vim 3.0 to
recover the file---don't use 4.0.			|swap-file|


"-w scriptout" argument changed				*scriptout-changed*
-------------------------------

"vim -w scriptout" used to append to the scriptout file.  Since this was
illogical, it now creates a new file.  An existing file is not overwritten
(to avoid destroying an existing file for those who rely on the appending).
[This was removed again later]					|-w|


Backspace and Delete keys				*backspace-delete*
-------------------------

In 3.0 both the delete key and the backspace key worked as a backspace in
insert mode; they deleted the character to the left of the cursor.  In 4.0 the
delete key has a new function: it deletes the character under the cursor, just
like it does on the command-line.  If the cursor is after the end of the line
and 'bs' is set, two lines are joined.			|<Del>| |i_<Del>|

In 3.0 the backspace key was always defined as CTRL-H and delete as CTRL-?.
In 4.0 the code for the backspace and delete key is obtained from termcap or
termlib, and adjusted for the "stty erase" value on Unix.  This helps people
who define the erase character according to the keyboard they are working on.
							|<BS>| |i_<BS>|

If you prefer backspace and delete in Insert mode to have the old behavior,
put this line in your vimrc:

	inoremap ^? ^H

And you may also want to add these, to fix the values for <BS> and <Del>:

	set t_kb=^H
	set t_kD=^?

(Enter ^H with CTRL-V CTRL-H and ^? with CTRL-V CTRL-? or <Del>.)

If the value for t_kb is correct, but the t_kD value is not, use the ":fixdel"
command.  It will set t_kD according to the value of t_kb.  This is useful if
you are using several different terminals.		|:fixdel|

When ^H is not recognized as <BS> or <Del>, it is used like a backspace.


Escape for | changed					*escape-bar*
--------------------

When the 'b' flag is present in 'cpoptions', the backslash cannot be used to
escape '|' in mapping and abbreviate commands, only CTRL-V can.  This is
Vi-compatible.  If you work in Vi-compatible mode and had used "\|" to include
a bar in a mapping, this needs to be replaced by "^V|".  See |:bar|.


Key codes changed					*key-codes-changed*
-----------------

The internal representation of key codes has changed dramatically.  In 3.0 a
one-byte code was used to represent a key.  This caused problems with
different characters sets that also used these codes.  In 4.0 a three-byte
code is used that cannot be confused with a character.		|key-notation|

If you have used the single-byte key codes in your vimrc for mappings, you
will have to replace them with the 4.0 codes.  Instead of using the three-byte
code directly, you should use the symbolic representation for this in <>.  See
the table below.  The table also lists the old name, as it was used in the 3.0
documentation.

The key names in <> can be used in mappings directly.  This makes it possible
to copy/paste examples or type them literally.  The <> notation has been
introduced for this |<>|.  The 'B' and '<' flags must not be present in
'cpoptions' to enable this to work |'cpoptions'|.

old name	new name	  old code	old MS-DOS code	~
				hex	dec	hex	dec	~
<ESC>		<Esc>
<TAB>		<Tab>
<LF>		<NL> <NewLine> <LineFeed>
<SPACE>		<Space>
<NUL>		<Nul>
<BELL>		<Bell>
<BS>		<BS> <BackSpace>
<INSERT>	<Insert>
<DEL>		<Del> <Delete>
<HOME>		<Home>
<END>		<End>
<PAGE_UP>	<PageUp>
<PAGE_DOWN>	<PageDown>

<C_UP>		<Up>		0x80	128	0xb0	176
<C_DOWN>	<Down>		0x81	129     0xb1	177
<C_LEFT>	<Left>		0x82	130     0xb2	178
<C_RIGHT>	<Right>		0x83	131     0xb3	179
<SC_UP>		<S-Up>		0x84	132     0xb4	180
<SC_DOWN>	<S-Down>	0x85	133     0xb5	181
<SC_LEFT>	<S-Left>	0x86	134     0xb6	182
<SC_RIGHT>	<S-Right>	0x87	135     0xb7	183

<F1>		<F1>		0x88	136     0xb8	184
<F2>		<F2>		0x89	137     0xb9	185
<F3>		<F3>		0x8a	138     0xba	186
<F4>		<F4>		0x8b	139     0xbb	187
<F5>		<F5>		0x8c	140     0xbc	188
<F6>		<F6>		0x8d	141     0xbd	189
<F7>		<F7>		0x8e	142     0xbe	190
<F8>		<F8>		0x8f	143     0xbf	191
<F9>		<F9>		0x90	144     0xc0	192
<F10>		<F10>		0x91	145     0xc1	193

<SF1>		<S-F1>		0x92	146     0xc2	194
<SF2>		<S-F2>		0x93	147     0xc3	195
<SF3>		<S-F3>		0x94	148     0xc4	196
<SF4>		<S-F4>		0x95	149     0xc5	197
<SF5>		<S-F5>		0x96	150     0xc6	198
<SF6>		<S-F6>		0x97	151     0xc7	199
<SF7>		<S-F7>		0x98	152     0xc8	200
<SF8>		<S-F8>		0x99	153     0xc9	201
<SF9>		<S-F9>		0x9a	154     0xca	202
<SF10>		<S-F10>		0x9b	155     0xcb	203

<HELP>		<Help>		0x9c	156     0xcc	204
<UNDO>		<Undo>		0x9d	157     0xcd	205

		(not used)	0x9e	158     0xce	206
		(not used)	0x9f	159     0xcf	207


Terminal options changed				*termcap-changed*
------------------------

The names of the terminal options have been changed to match the termcap names
of these options.  All terminal options now have the name t_xx, where xx is
the termcap name.  Normally these options are not used, unless you have a
termcap entry that is wrong or incomplete, or you have set the highlight
options to a different value.				|terminal-options|

Note that for some keys there is no termcap name.  Use the <> type of name
instead, which is a good idea anyway.

Note that "t_ti" has become "t_mr" (invert/reverse output) and "t_ts" has
become "t_ti" (init terminal mode).  Be careful when you use "t_ti"!

old name	new name	meaning		~
t_cdl		t_DL		delete number of lines		*t_cdl*
t_ci		t_vi		cursor invisible		*t_ci*
t_cil		t_AL		insert number of lines		*t_cil*
t_cm		t_cm		move cursor
t_cri		t_RI		cursor number of chars right	*t_cri*
t_cv		t_ve		cursor visible			*t_cv*
t_cvv		t_vs		cursor very visible		*t_cvv*
t_dl		t_dl		delete line
t_cs		t_cs		scroll region
t_ed		t_cl		clear display			*t_ed*
t_el		t_ce		clear line			*t_el*
t_il		t_al		insert line			*t_il*
		t_da		display may be retained above the screen
		t_db		display may be retained below the screen
t_ke		t_ke		put terminal out of keypad transmit mode
t_ks		t_ks		put terminal in keypad transmit mode
t_ms		t_ms		save to move cursor in highlight mode
t_se		t_se		normal mode (undo t_so)
t_so		t_so		shift out (standout) mode
t_ti		t_mr		reverse highlight
t_tb		t_md		bold mode			*t_tb*
t_tp		t_me		highlight end			*t_tp*
t_sr		t_sr		scroll reverse
t_te		t_te		out of termcap mode
t_ts		t_ti		into termcap mode		*t_ts_old*
t_vb		t_vb		visual bell
t_csc		t_CS		cursor is relative to scroll region *t_csc*

t_ku	t_ku	<Up>		arrow up
t_kd	t_kd	<Down>		arrow down
t_kr	t_kr	<Right>		arrow right
t_kl	t_kl	<Left>		arrow left
t_sku		<S-Up>		shifted arrow up		*t_sku*
t_skd		<S-Down>	shifted arrow down		*t_skd*
t_skr	t_%i	<S-Right>	shifted arrow right		*t_skr*
t_skl	t_#4	<S-Left>	shifted arrow left		*t_skl*
t_f1	t_k1	<F1>		function key 1			*t_f1*
t_f2	t_k2	<F2>		function key 2			*t_f2*
t_f3	t_k3	<F3>		function key 3			*t_f3*
t_f4	t_k4	<F4>		function key 4			*t_f4*
t_f5	t_k5	<F5>		function key 5			*t_f5*
t_f6	t_k6	<F6>		function key 6			*t_f6*
t_f7	t_k7	<F7>		function key 7			*t_f7*
t_f8	t_k8	<F8>		function key 8			*t_f8*
t_f9	t_k9	<F9>		function key 9			*t_f9*
t_f10	t_k;	<F10>		function key 10			*t_f10*
t_sf1		<S-F1>		shifted function key 1		*t_sf1*
t_sf2		<S-F2>		shifted function key 2		*t_sf2*
t_sf3		<S-F3>		shifted function key 3		*t_sf3*
t_sf4		<S-F4>		shifted function key 4		*t_sf4*
t_sf5		<S-F5>		shifted function key 5		*t_sf5*
t_sf6		<S-F6>		shifted function key 6		*t_sf6*
t_sf7		<S-F7>		shifted function key 7		*t_sf7*
t_sf8		<S-F8>		shifted function key 8		*t_sf8*
t_sf9		<S-F9>		shifted function key 9		*t_sf9*
t_sf10		<S-F10>		shifted function key 10		*t_sf10*
t_help	t_%1	<Help>		help key			*t_help*
t_undo	t_&8	<Undo>		undo key			*t_undo*


'errorformat' option changed				*errorformat-changed*
----------------------------

'errorformat' can now contain several formats, separated by commas.  The first
format that matches is used.  The default values have been adjusted to catch
the most common formats.				|errorformat|

If you have a format that contains a comma, it needs to be preceded with a
backslash.  Type two backslashes, because the ":set" command will eat one.


'graphic' option gone					*graphic-option-gone*
---------------------

The 'graphic' option was used to make the characters between <~> and 0xa0
display directly on the screen.  Now the 'isprint' option takes care of this
with many more possibilities.  The default setting is the same; you only need
to look into this if you previously set the 'graphic' option in your vimrc.
							|'isprint'|


'yankendofline' option gone				*ye-option-gone*
---------------------------

The 'yankendofline' option has been removed.  Instead you can just use
	:map Y y$


'icon' and 'title' default value changed		*icon-changed*
----------------------------------------

The 'title' option is now only set by default if the original title can be
restored.  Avoids "Thanks for flying Vim" titles.  If you want them anyway,
put ":set title" in your vimrc.				|'title'|

The default for 'icon' now depends on the possibility of restoring the
original value, just like 'title'.  If you don't like your icon titles to be
changed, add this line to your vimrc:			|'icon'|
	:set noicon


'highlight' option changed				*highlight-changed*
--------------------------

The 'i' flag now means italic highlighting, instead of invert.  The 'r' flag
is used for reverse highlighting, which is what 'i' used to be.  Normally you
won't see the difference, because italic mode is not supported on most
terminals and reverse mode is used as a fallback.	|'highlight'|

When an occasion is not present in 'highlight', use the mode from the default
value for 'highlight', instead of reverse mode.


'tildeop' and 'weirdinvert' short names changed		*short-name-changed*
-----------------------------------------------

Renamed 'to' (abbreviation for 'tildeop') to 'top'.	|'tildeop'|
Renamed 'wi' (abbreviation for 'weirdinvert') to 'wiv'.	|'weirdinvert'|

This was done because Vi uses 'wi' as the short name for 'window' and 'to' as
the short name for 'timeout'.  This means that if you try setting these
options, you won't get an error message, but the effect will be different.


Use of "v", "V" and "CTRL-V" in Visual mode		*use-visual-cmds*
-------------------------------------------

In Visual mode, "v", "V", and "CTRL-V" used to end Visual mode.  Now this
happens only if the Visual mode was in the corresponding type.  Otherwise the
type of Visual mode is changed.  Now only ESC can be used in all circumstances
to end Visual mode without doing anything.		|v_V|


CTRL-B in Insert mode removed				*toggle-revins*
-----------------------------

CTRL-B in Insert mode used to toggle the 'revins' option.  If you don't know
this and accidentally hit CTRL-B, it is very difficult to find out how to undo
it.  Since hardly anybody uses this feature, it is disabled by default.  If
you want to use it, define RIGHTLEFT in feature.h before compiling. |'revins'|

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