A ChangeLog for Vim

By Martin Tournoij | Source | Support my work

Get notified of updates by watching the GitHub project or subscribing to the commit feed.

This doesn't list all changes, just the most useful and notable ones.
Changes from Vim 8.0 (September 2016) up to 8.2.2465 (Feb 3 2021) are listed.

Compatibility table
Ubuntu 16.04 LTSVim 7.4.1689(no package)
Ubuntu 18.04 LTSVim 8.0.1453Neovim 0.2.2
Ubuntu 20.04 LTSVim 8.1.2269Neovim 0.4.3
Ubuntu 20.10Vim 8.2.0716Neovim 0.4.4
Debian 9Vim 8.0.0197Neovim 0.1.7
Debian 10Vim 8.1.0875Neovim 0.3.4
Debian 11Vim 8.2.2367Neovim 0.4.4
Debian and Ubuntu are the most common distros with old Vim versions.


lead: in 'listchars'

8.2.2454 (Feb 3)

Highlight leading spaces when 'list' is set.

Detect focus events in terminal

8.2.2345, 8.2.2348, 8.2.2352, 8.2.2383, 8.2.2428 (Jan 30)

The FocusGained and FocusLost autocmds can work inside a terminal if the terminal supports it. See xterm-focus-event.


8.2.2366 (Jan 16)

Sleep and hide cursor.

Add charcol(), getcharpos(), setcharpos(), getcursorcharpos(), setcursorcharpos()

8.2.2324 (Jan 10)

Multibyte-aware versions of col(), getpos(), setpos(), getcurpos(), cursor().


Add charidx()

8.2.2233 (Dec 28)

Convert byte index to character index.

Add VimSuspend and VimResume

8.2.2128 (Dec 11)

Triggered on suspend/resume; only for <C-z> and not SIGSTP/SIGCONT signals.

Add <Cmd>

8.2.1978 (Nov 12)

Don't change modes in this key mapping so that insert or visual mode mappings will always work without having to use <C-u> or <C-o>. For example noremap <C-q> <Cmd>:normal! K<CR>

:sort and sort() can do locale-aware sorting

8.2.1933 (Nov 1)

:sort l or sort(..., 'l').

matchfuzzy(), matchfuzzypos()

8.2.1665, 8.2.1726, 8.2.1893, 8.2.1921 (Oct 29)

"Fuzzy" matching.

Add InsertLeavePre

8.2.1874 (Oct 21)

Triggered before leaving insert mode.

?? operator

8.2.1794 (Oct 3)

0 ?? 'hello' as a shortcut for 0 ? 'helllo' : ''.

Add gettext()

8.2.1544 (Aug 30)

Can be used to translate plugins.

Add setcellwidths(), charclass()

8.2.1535, 8.2.1536 (Aug 28)

Allow overriding the display width for characters whose width is ambiguous.

Add g<Tab>; support :tabnext #, :tabclose #, etc.

8.2.1401, 8.2.1413 (Aug 10)

g<Tab> goes back to the last accessed tab, and # in :tab* commands refer to the last accessed tab.


8.2.1347 (Aug 1)

Useful for the *func and *expr settings, e.g. let &includexpr = expand('<SID>') .. 'fun()' to use s:fun()

Add 'quickfixtextfunc'

8.2.0869, 8.2.0933, 8.2.0959, 8.2.1255 (Jul 20)

Customize text contents of quickfix window; can also be passed as an argument to to setqflist()

Add sorting to readir(), readirex()

8.2.0988 (Jun 16)

Add optional argument to readdir() and readdirex() to control sorting (no sorting, ASCII, LC_COLLATE).

Add terminalprops()

8.2.0970 (Jun 13)

List which features are supported in this terminal.

Add 'spelloptions'

8.2.0953 (Jun 10)

Only accepted value is camel to spell check CamelCase words.

Add SigUSR1 autocmd

8.2.0952 (Jun 10)

Event to detect SIG_USR1.

Add flatten()

8.2.0935 (Jun 8)

Flatten a list

Add getreginfo()

8.2.0924 (Jun 7)

Returns detailed information for a register information; can be restored by passing to setreg().

Add searchcount()

8.2.0877 (Jun 1)

Get details about current search.

Allow setting underline colour in terminal

8.2.0863 (May 31)

Can use ctermul in :highlight to set the underline colour, or guisp if 'termguicolors' is enabled. Your terminal needs to support this.

Add reduce()

8.2.0878 (Jun 1)

Reduce list to single value.

Add readirex()

8.2.0875 (Jun 1)

Like readdir(), but return a dict with attributes (i.e. stat() on Unix.

Add getmarklist()

8.2.0861 (May 31)

Get list of marks, similar to :marks

Add unsigned ot 'nrformats'

8.2.0860 (May 31)

Ignore - before numbers and always treat them as unsigned for <C-a> and <C-x> so that using it on e.g. 1985-06-18 works as expected.

Add mapset()

8.2.0807, 8.2.0812, 8.2.0815 (May 24)

Set mappings from a script, and can restore mappings.from maparg().

Call Vim functions from Lua

8.2.0775 (May 17)

Call Vim functions from Lua with'fun_name', 'arg') and vim.fun_name('arg').

IPv6 support in channels

8.2.0557, 8.2.0574 (Apr 13)

IPv6 support in channels

Add echoraw()

8.2.0258 (Feb 14)

Output string to terminal with no processing; can be used to send escape codes.

Add optional error code to :cquit

8.2.0095 (Jan 6)

Exit with a specific code, instead of always 1. v:exiting was added in 8.2.2070 (Nov 2020)


rand() and srand()

8.1.2342, 8.1.2343 (Nov 26)

Generate random numbers.


8.1.2341 (Nov 25)

Abort a running script.


8.1.2326 (Nov 21)

Parse a time string

:terminal ++shell

8.1.2251, 8.1.2255 (Nov 4)

Run :terminal commands in the shell.


8.1.2233 (Oct 29)

Get commandline arguments Vim was invoked with.

Add gM

8.1.2231 (Oct 28)

Move to middle of line.

hl-LineNrAbove, hl-LineNrBelow

8.1.2229 (Oct 27)

Highlight line numbers above and below the cursor when 'relativenumber' is set.

Add 'cursorlineopt'

8.1.2019 (Sep 9)

More control on how to display 'cursorline'.

border and align in 'completepopup'

8.1.1902, 8.1.1904 (Aug 21)

More option to control completion popup menu.

popup in 'completeopt'

8.1.1880, 8.1.1882 (Aug 18)

Show extra completion info in popup window (as an alternative to the preview window).


8.1.1838 (Aug 11)

Mark words as rare in the spellfile.

-> operator

8.1.1803, 8.1.1809, 8.1.1834, 8.1.1835, 8.1.1996 (Sep 6)

expr->fun(args) is a shortcut for fun(expr, args) to improve readability:
[1, 2]->map({_, v -> v + 1}). See method.

Popup windows

8.1.1364, 8.1.1391, 8.1.1799, 8.1.1905, 8.1.1928 (Aug 25)

Popup windows are like the completion window, but can be controlled in VimScript to a much greater degree. See popup, 'previewpopup'. This is still an experimental feature.


8.1.1769 (Jul 28)

Override 'shellslash' for completion.

#{} dict notation

8.1.1683, 8.1.1692, 8.1.1705 (Jul 16)

The #{} notation is the same as the regular {} dict notation, except that the key values don't need quoting:
#{foo: "bar"}.

Sound functions

8.1.1502, 8.1.1565 (Jun 17)

Ability to play sound; see sound_playevent().

v:option_command, v:option_oldlocal, v:option_oldglobal

8.1.1542 (Jun 15)

Improvements for the OptionSet event.


8.1.1539 (Jun 15)

Constants; same as :let v = 1 | :lockvar v


8.1.1418 (May 29)

execute() in the context of a specific window.


8.1.1391 (May 25)

Highlight group to use instead of hl-Normal for this window.

g:actual_curwin, g:statusline_winid

8.1.1372 (May 23)

Temporarily set when running expressions inside the 'statusline' (%{expr}).


8.1.1354 (May 19)

Heredoc assignment:

let text =<< trim END

Text properties

8.1.0579, 8.1.1340, 8.1.1341 (May 17)

Assign metadata to text in a buffer, as an alternative to Vim's syntax highlighting. See textprop. This is still an experimental feature.


8.1.1320, 8.1.1321, 8.1.1332 (May 14)

Add a callback that will be invoked when changed have been made to a buffer.

Default values for function arguments

8.1.1310 (May 9)

e.g. function Fun(value=10). See optional-function-argument.


8.1.1307 (May 9)

Reconnect to X server after restart.

environ(), getenv(), and setenv()

8.1.1305 (May 9)

Deal with environment variables.


8.1.1291 (May 7)

Change directory with scope and ability to restore.

:cbefore, :cafter

8.1.1275 (May 5)

Navigate to errors before/after the cursor.

Show match position when searching

8.1.1270 (May 4)

Show "3/44" when using n and "S" is not in 'shortmess'.

:cabove, :cbelow, :labove, :lbelow

8.1.1256 (May 3)

Navigate through errors relative to the cursor.

Control font weight on Windows'

8.1.1224 (Apr 28)

Use "W" in 'guifont' to control font weight on Windows. See gui-font.

Tab-local directory

8.1.1218 (Apr 27)

See :tcd. Similar to the window-local directory with :lcd.

v: prefix is required

8.1.1188 (Apr 20)

Previously e.g. count would also work. The v: prefix is mandatory when :scriptversion is 3 or higher.

Add more arguments to winnr()

8.1.1140 (Apr 8)

To find out what neighbors a window has.

CompleteChanged event

8.1.1138 (Apr 8)

After each time the Insert mode completion menu changed.

str2list() and list2str()

8.1.1122 (Apr 6)

Convert a string to a list of byte, or the reverse.


8.1.1120 (Apr 5)

Get contents of a directory.


8.1.1116 (Apr 4)

Specify VimScript compatibility level.

.. operator

8.1.1114 (Apr 4)

String concatenation operator, as . is ambiguous. 'a' .. 'b' and 'a' . 'b' are identical. Also adds ..=.

++once argument for :autocmd

8.1.1113 (Apr 4)

Run an autocommand just once, e.g. au CursorMoved * ++once :echom 'ONCE'.

Add window ID argument to matchdelete(), clearmatches(), getmatches(), setmatches()

8.1.1084 (Mar 30)


8.1.1068 (Mar 29)

Get information about current completion.


8.1.1056 (Mar 26)

Evaluate a Ruby expression.


8.1.0972 (Feb 22)

Switch tabs, like gt and gT. Mainly useful to switch from terminal window.

*=, /=, %=

8.1.0902 (Feb 12)

e.g. let var *= 2

a: variables are immutable

8.1.0888, 8.1.0897 (Feb 11)

Previously it was possible to change a: variables in some cases.

[:ident:], [:keyword:], [:fname:]

8.1.0862 (Jan 31)

Allow for a third character for "tab:" in 'listchars'

8.1.0759 (Jan 16)

Third character is set as the last one for a tab, e.g. set listchars=tab:(_) shows a tab as (______).

Blob type

8.1.0735, 8.1.0756, 8.1.0757 (Jan 15)

A blob stores binary data. Blob literals start with 0z, e.g. 0zDEADBEEF. See blob.

"p" flag in 'formatoptions'

8.1.0728 (Jan 11)

Don't break lines at single spaces that follow periods.


8.1.0706 (Jan 8)

Redraw tabline after changing 'tabline' (mainly useful for plugins).


sign_place(), sign_unplace(), etc

8.1.0614, 8.1.0658 (Dec 29)

Functions for defining and placing signs.

Allow functions and commands to redefine themselves

8.1.0515, 8.1.0573 (Dec 8)

Previously a ! always had to be added to function to overwrite a function with the same name. Now Vim is smarter and allows a function to overwrite itself. This means that using function! in your vimrc or plugin's autoload is almost never required any more.

:filter support for more commands

8.0.1651, 8.1.0165, 8.1.0495 (Oct 25)


8.1.0487 (Oct 19)

Popup menu for terminal.

Include the xdiff library

8.1.0360, 8.1.0393 (Sep 15)

Include diff library instead of relying on external tools to improve diff quality. Many new 'diffopt' settings (e.g. set diffopt+=internal,algorithm:patience would be a good setting for many).


8.1.0369 (Sep 11)

Comments in line continuations; see line-continuation-comment:

au FileType git
            "\ Go to commit.
            \  nnoremap <Leader>g :exe printf(":!cd ~/src/vim && git diff %s^\!", split(getline('.'), ' ')[1])<CR>
            "\ Delete commit.
            \| nnoremap <Leader>d :call search('^commit ', 'bc') \| :exe 'd' . (search('^commit ', 'n') - line('.'))<CR>


8.1.0311 (Aug 21)

Filter quickfix/location list

'vartabstop', 'varsofttabstop'

8.1.0105 (Jun 23)

Variable tabstop widths, e.g. set vartabstop=4,8 makes the first tab 4 spaces, and the rest 8.

OptionSet autocmd

8.1.0081, 8.1.0414 (Sep 21)

Triggered whenever an option is set.

prompt buffer

8.1.0027, 8.1.0035 (Jun 6)

Mainly useful to feed user input to a job.

Allow :unlet $ENV

8.0.1832 (May 13)

Previously there was no way to truly unset an environment variable (just set it to an empty string).


8.0.1787 (May 1)

Insert line from buffer in commandline

job_info() without argument lists all jobs

8.0.1742 (Apr 21)

mkdir('p') won't fail fail if the directory already exists

8.0.1708 (Apr 14)

Add the terminal API.

8.0.1641 (Mar 25)

See terminal-api.


8.0.1630 (Mar 22)

Clean whitespace; had to use substitute() before.

Add "!" to 'guioptions'

8.0.1609, 8.0.1616 (Mar 18)

Use a Vim terminal window for :! shell commands.

Menus in terminal

8.0.1558, 8.0.1570 (Mar 5)

Make :popup and right-click work in terminal.

24 bit colors in Windows console

8.0.1531 (Feb 22)

See 'termguicolors'.


8.0.1491 (Feb 10)

Minimum width of completion menu.

DirChanged event

8.0.1459 (Feb 3)

When directory changed (with :cd, :lcd, etc.)

CmdlineChanged event

8.0.1445 (Jan 31)

After a change was made to the text in the command line.


TextYankPost event

8.0.1394 (Dec 16)

After yanking or deleting text.


8.0.1364 (Dec 2)

Get winow position.

CmdlineEnter, CmdlineLeave

8.0.1206 (Oct 19)

When entering and leaving the commandline.


8.0.0693, 8.0.0730, 8.0.0744, 8.0.0804, 8.0.0929, 8.0.1108 (Sep 14)

Terminal buffer.

--clean, 'viminfofile'

8.0.0716 (Jul 15)

Start Vim with the default settings and without plugins.

E flag in 'cinoptions'

8.0.0431 (Mar 8)

Set indent for extern block.

'pyxversion', :pythonx

8.0.0251 (Jan 28)

Make it easier to run Python code in both Python 2 and 3, depending on what is available.