2023
Better UTF-16 support
9.0.1485 (Apr 24)
Add strutf16len() and utf16idx(), and add utf16 flag to byteidx(), byteidxcomp(), and charidx()
Add 'crypymethod' xchacha20v2
9.0.1481 (Apr 23)
Mostly the same as xchacha20, but more future-proof against changes in libsodium.
2022
Add 'smoothscroll'
Scroll wrapped screen lines rather than text lines with
Add 'showcmdloc', %S in 'statusline' and 'tabline'
9.0.1061 (Dec 15)
Control where 'showcmd' is displayed, or add it to the statusline or tabline.
Support kitty-keyboard-protocol keyboard protocol, add 'keyprotocol'
For the KiTTY terminal; has better handling for modifier keys.
Add WinResized event
Triggered when a window changes size.
WinScrolled works on inactive windows, has more information
Previously this only worked for the current window and didn't provide any information about what changed.
Get cursor column from another window.
Add offset and size parameters to readblob(), allow reading character devices
Before it always read the entire file.
Add 'lispoptions'
9.0.0761 (Oct 15)
Setting lispoptions=indentexpr:1 allows using 'indentexpr' when 'lisp' is enabled.
Add TextChangedT
9.0.0756 (Oct 15)
Triggered afted text changed in the terminal-window.
Add "C" in 'shortmess'
9.0.0738 (Oct 13)
Supress messages during ins-completion
Sound functions work on macOS
9.0.0694 (Oct 8)
sound_playevent() now works on macOS
Add :echowindow
9.0.0321, 9.0.0350, 9.0.0352, 9.0.0356, 9.0.0431, 9.0.0447, 9.0.0551, 9.0.0683 (Oct 7)
Display message in popup window; also add popup_findecho().
Add lastline in 'fillchars'
Set character to use for when 'display' contains fillchars or truncate.
Control scrolling behaviour when opening, closing or resizing horizontal splits.
matchaddpos() can add many matches
Previously limited to 8.
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.
Run code when a function exits.
Add 'D' flag in writefile() and mkdir()
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()
:scriptnames, but more convenient for scripts.
Add setcmdline()
9.0.0285 (Aug 27)
Set the commandline content and cursor position from a script.
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.
Bitwise shift operators.
Functions to manipulate autocmds.
Add /
in 'formatoptions'
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.
Get list of all mappings.
Add hl-CurSearch
Highlight the current search match.
Allow expressions in heredoc as `=expr`
if eval
is added:
let lines =<< trim eval END See the file `=$HOME`/.vimrc END
Support language-server-protocol (LSP) in channels.
Start logging on startup.
WinScrolled event
8.2.4713 (Apr 8)
Triggered after scrolling a window contents.
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'
"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.
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.
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'.
Manipulate highlights programmatically.
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.
List and define digraphs from functions.
Add list to 'breakindentopt'
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.
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.
"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.
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'.
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.
The FocusGained and FocusLost autocmds can work inside a terminal. See xterm-focus-event.
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
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 l
or sort(..., 'l')
.
"Fuzzy" matching.
Add InsertLeavePre
8.2.1874 (Oct 21)
Triggered before leaving insert mode.
echo value ?? 'used if value is empty'
Can be used to translate plugins.
Allow overriding the display width for characters whose width is ambiguous.
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()
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.
Event to detect SIG_USR1.
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.
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.
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
Output string to terminal with no processing; can be used to send escape codes.
Exit with a specific code, instead of always 1. v:exiting was added in 8.2.2070 (Nov 2020)
2019
Generate random numbers.
interrupt()
8.1.2341 (Nov 25)
Abort a running script.
strptime()
8.1.2326 (Nov 21)
Parse a time string
Run :terminal commands in the shell.
v:argv
8.1.2233 (Oct 29)
Get commandline arguments Vim was invoked with.
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'
More option to control completion popup menu.
popup in 'completeopt'
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.
expr->fun(args)
is a shortcut for fun(expr,
args)
to improve readability:[1, 2]->map({_, v ->
v + 1})
. See method.
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.
The #{}
notation is the same as the regular
{}
dict notation, except that the key values don't need
quoting:#{foo: "bar"}
.
Ability to play sound; see sound_playevent().
Improvements for the OptionSet event.
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}
).
Heredoc assignment:
let text =<< trim END text END
Assign metadata to text in a buffer, as an alternative to Vim's syntax highlighting. See textprop. This is still an experimental feature.
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.
Reconnect to X server after restart.
Deal with environment variables.
Change directory with scope and ability to restore.
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'.
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)
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.
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.
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 ..=
.
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.
Switch tabs, like gt and gT. Mainly useful to switch from terminal window.
*=
, /=
, %=
8.1.0902 (Feb 12)
e.g. let var *= 2
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 (______)
.
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
Functions for defining and placing signs.
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.
Popup menu for terminal.
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.
Triggered whenever an option is set.
Mainly useful to feed user input to a job.
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.
Clean whitespace; had to use substitute() before.
Add "!" to 'guioptions'
Use a Vim terminal window for :! shell commands.
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)
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 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.