VimLog

A ChangeLog for Vim

By Martin Tournoij | Source

Get notified of updates by subscribing to the RSS feed, 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 9.0.0648 (Oct 3 2022) are listed.

Compatibility table
Ubuntu 20.04 LTSVim 8.1.2269Neovim 0.4.3
Ubuntu 22.04 LTSVim 8.2.3995Neovim 0.6.1
Ubuntu 21.10Vim 9.0.0242Neovim 0.7.2
Debian 10Vim 8.1.0875Neovim 0.3.4
Debian 11Vim 8.2.2434Neovim 0.4.4
Debian and Ubuntu are the most common distros with old Vim versions.

2022

Add 'splitkeep'

9.0.0445, 9.0.0455, 9.0.0469, 9.0.0486, 9.0.0505, 9.0.0647 (Oct 3)

Control scrolling behaviour when opening, closing or resizing horizontal splits.

matchaddpos() can add many matches

9.0.0620, 9.0.0622 (Sep 29)

Previously limited to 8.

Virtual text

9.0.0067, …many…, 9.0.0534 (Sep 21)

Allow adding virtual-text to buffers.

Drop Windows XP and Vista support

9.0.0496 (Sep 18)

Add keytrans()

9.0.0449 (Sep 12)

Convert escape sequences to strings.

Add :defer

9.0.0370, 9.0.0419, 9.0.0440 (Sep 11)

Run code when a function exits.

Add 'D' flag in writefile() and mkdir()

9.0.0379, 9.0.0411 (Sep 7)

Delete the file or directory when a function exits.

Set cursor shape in Windows terminal

9.0.0347 (Sep 1)

termcap-cursor-shape works on Windows.

Add getscriptinfo()

9.0.0244, 9.0.0253, 9.0.0269, 9.0.0303 (Aug 28)

:scriptnames, but more convenient for scripts.

Add setcmdline()

9.0.0285 (Aug 27)

Set the commandline content and cursor position from a script.

Add indexof()

9.0.0196, 9.0.0202, 9.0.0204 (Aug 14)

Find value in list with a callback function.

Support double, dotted, and dashed underline

9.0.0007 (Jun 29)

Can use underdouble, underdotted, and underdashed attributes in :highlight.

Add virtcol2col()

8.2.5034 (May 27)

Get byte index from virtual column.

Add << and >> operators

8.2.5003, 8.2.5004 (May 22)

Bitwise shift operators.

Add autocmd_add(), autocmd_get(), autocmd_delete()

8.2.4981, 8.2.5011, 8.2.5030 (May 27)

Functions to manipulate autocmds.

Add / in 'formatoptions'

8.2.4907, 8.2.5008 (May 23)

Don't insert // when using o on a line with inline comment ('cindent' only).

Add getcmdcompltype(), getcmdscreenpos()

8.2.4903 (May 7)

Get type and position of current command-line completion.

Add string interpolation

8.2.4883 (May 6)

Allow expressions inside {…} when a string is prefixed with $; e.g.

$"Hello, {$USER} at {strftime('%c', localtime())}" 

Add column to 'breakindentopt

8.2.4882 (May 6)

Indent soft-wrapped lines at specific column.

Restore mappings

8.2.4861 (May 4)

mapset() accepts the dict returned from maparg() or maplist(), making it easy to save and restore mappings.

Add isabsolutepath()

8.2.4838 (Apr 28)

Check if a path is absolute.

Add maplist()

8.2.4820, 8.2.4825, 8.2.4932 (May 10)

Get list of all mappings.

Add hl-CurSearch

8.2.4724, 8.2.4805, 8.2.5047 (May 31)

Highlight the current search match.

Allow expressions in heredoc

8.2.4770, 8.2.4804 (Apr 21)

Allow expressions in heredoc as `=expr` if eval is added:

let lines =<< trim eval END
    See the file `=$HOME`/.vimrc
END

Support LSP in channels

8.2.4648, 8.2.4758, 8.2.4761, 8.2.4780 (Apr 18)

Support language-server-protocol (LSP) in channels.

Add --log

8.2.4742 (Apr 12)

Start logging on startup.

WinScrolled event

8.2.4713 (Apr 8)

Triggered after scrolling a window contents.

Add :profile stop and dump

8.2.4712 (Apr 8)

Allow stopping profiling and dumping the profile to file (previously this was only on Vim exit).

Open channel on Unix domain socket

8.2.4684 (Apr 4)

ch_open('unix:/tmp/socket')

Add "fuzzy" to 'wildoptions'

8.2.4463, 8.2.4608 (Mar 22)

"Fuzzy" completion for commandline.

DirChangedPre event

8.2.4335 (Feb 9)

Triggered before changing directory.

Add %e and %k in 'errorformat'

8.2.4329 (Feb 8)

End line and column.

Add "pum:" to 'wildoptions'

8.2.4325 (Feb 8)

Show popup menu for commandline completion.

Add "timeout" to 'spellsuggest'

8.2.4249 (Jan 29)

Limit time searching for spell suggestions; previously always 5000ms.

P in visual mode

8.2.4242 (Jan 28)

"Put" (paste) text in visual mode without yanking the deleted text to the unnamed register.

win_move_separator(), win_move_statusline()

8.2.4052 (Jan 10)

Move and resize windows.

2021

builtin.txt

8.2.3917 (Dec 27)

Split eval.txt in to builtin.txt

Remove "in development" from Vim9

8.2.3906 (Dec 26)

The "THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE" warning from Vim9 documentation is removed, marking it as stable.

Allow script-local functions in *expr options

8.2.3900 (Dec 26)

Can now use e.g. set diffexpr=s:MyDiffExpr().

Add :argdedeupe

8.2.3888 (Dec 24)

Remove duplicate entries from the argument list.

reduce(), filter(), and map() work on strings

8.2.3818, 8.2.3848 (Dec 18)

Assign lambda to options that take a function

8.2.3619, 8.2.3665, 8.2.3712, 8.2.3725, 8.2.3735, 8.2.3751 (Dec 6)

The 'operatorfunc', 'tagfunc', 'completefunc', 'omnifunc', and 'imactivatefunc' can now accept a lambda.

Add hl-CursorLineSign, hl-CursorLineFold

8.2.3664 (Nov 24)

Adjust sign highlighting for 'cursorline'.

Add hlget(), hlset()

8.2.3578, 8.2.3605 (Nov 16)

Manipulate highlights programmatically.

Add WinClosed event

8.2.3591 (Nov 13)

Triggered when closing a window.

Add v:colornames

8.2.3562 (Oct 24)

Map colour names to hex codes.

Add 'guiligatures'

8.2.3524 (Oct 16)

Support using ligatures in the GTK GUI.

Add 'thesaurusfunc'

8.2.3520 (Oct 16)

Function to use for thesaurus completion.

ModeChanged event

8.2.3430 (Sep 12)

Triggered when the mode changes.

Add multispace to 'listchars'

8.2.3424 (Sep 10)

Show two or more spaces no matter where they appear.

Add digraph_get(), digraph_getlist(), digraph_set(), digraph_setlist()

8.2.3184, 8.2.3226 (Jul 26)

List and define digraphs from functions.

Add list to 'breakindentopt'

8.2.3160, 8.2.3198 (Jul 22)

Add additional indent for lines that match a numbered or bulleted list (using the 'formatlistpat' setting).

Add \%.l, \%<.l, and \%>.l patterns

8.2.3110 (Jul 5)

Match the line the cursor is currently on; see /\%l.

Add 'cryptmethod'=xchaha20

8.2.3022 (Jun 20)

More secure encryption from libsodium.

Add zp, zP, zy

8.2.2914, 8.2.2971 (Jun 10)

zp pastes in block mode without adding trailing whitespace, zy yanks without trailing whitespace.

Add {% to 'statusline'

8.2.2854 (May 15)

{%expr%} reëvaluates the expression as a 'statusline' formatting string.

Add f flag in :vimgrep

8.2.2813 (Apr 26)

"Fuzzy" match :vimgrep results.

Add 'autoshelldir'

8.2.2675 (Mar 29)

Automatically change directory in Vim from terminal window.

Add strcharlen()

8.2.2606 (Mar 14)

Get length of string counting combining characters separately.

Loop over a string

8.2.2658 (Mar 26)

Loop over a string as `for char in "str"`; loops are by codepoint with any combining characters.

Expand 'fillchars'

8.2.2508, 8.2.2518, 8.2.2518, 8.2.2542, 8.2.2569 (Mar 4)

New values: "eob" to change change the (~) to indicate non-existing lines, "foldopen", "foldclose", and "foldsep" to change 'foldcolumn' markers. 'fillchars' can be set per-window (previously it was always global). Also allow multibyte characters in 'fillchars' and 'statusline'.

Add followwrap to 'diffopt'

8.2.2490 (Feb 10)

Don't reset 'wrap' for diff windows.

Add fullcommand()

8.2.2468 (Feb 6)

Get the full command name from abbreviated ones (e.g. :s → :substitute)

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. See xterm-focus-event.

:sleep!

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().

2020

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)

echo value ?? 'used if value is empty'

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.

expand('<SID>')

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.

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.

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

Call Vim functions from Lua

8.2.0775 (May 17)

Call Vim functions from Lua with vim.call('fun_name', 'arg') and vim.fn.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)

2019

rand() and srand()

8.1.2342, 8.1.2343 (Nov 26)

Generate random numbers.

interrupt()

8.1.2341 (Nov 25)

Abort a running script.

strptime()

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.

v:argv

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

:spellrare

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.

'completeslash'

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.

:const

8.1.1539 (Jun 15)

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

win_execute()

8.1.1418 (May 29)

execute() in the context of a specific window.

'wincolor'

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}).

:let=<<

8.1.1354 (May 19)

Heredoc assignment:

let text =<< trim END
	text
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.

listener_add()

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.

:xrestore

8.1.1307 (May 9)

Reconnect to X server after restart.

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

8.1.1305 (May 9)

Deal with environment variables.

chdir()

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.

readdir()

8.1.1120 (Apr 5)

Get contents of a directory.

:scriptversion

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)

complete_info()

8.1.1068 (Mar 29)

Get information about current completion.

rubyeval()

8.1.1056 (Mar 26)

Evaluate a Ruby expression.

CTRL-W_gt, CTRL-W_gT

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.

:redrawtabline

8.1.0706 (Jan 8)

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

2018

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)

:tlmenu

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>

cfilter-plugin

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

CTRL-R CTRL-L

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.

trim()

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

'pumwidth'

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.

2017

TextYankPost event

8.0.1394 (Dec 16)

After yanking or deleting text.

win_screenpos().

8.0.1364 (Dec 2)

Get winow position.

CmdlineEnter, CmdlineLeave

8.0.1206 (Oct 19)

When entering and leaving the commandline.

:terminal

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.