Vim documentation: vim_diff

main help file

*vim_diff.txt*    For Nvim.						{Nvim}


Differences between Nvim and Vim			       *vim-differences*

Throughout the help files, differences between Nvim and Vim are indicated via
the "{Nvim}" tag.  This document is a complete and centralized list of all
these differences.

1. Configuration		|nvim-configuration|
2. Defaults			|nvim-defaults|
3. New features			|nvim-features|
4. Changed features		|nvim-features-changed|
5. Missing legacy features	|nvim-features-missing|
6. Removed features		|nvim-features-removed|


1. Configuration					    *nvim-configuration*

- Use `$XDG_CONFIG_HOME/nvim/init.vim` instead of `.vimrc` for storing
- Use `$XDG_CONFIG_HOME/nvim` instead of `.vim` to store configuration files.
- Use `$XDG_DATA_HOME/nvim/shada/main.shada` instead of `.viminfo` for persistent
  session information.


2. Defaults					            *nvim-defaults*

- Syntax highlighting is enabled by default
- ":filetype plugin indent on" is enabled by default

- 'autoindent' is set by default
- 'autoread' is set by default
- 'backspace' defaults to "indent,eol,start"
- 'backupdir' defaults to .,~/.local/share/nvim/backup (|xdg|)
- 'complete' doesn't include "i"
- 'directory' defaults to ~/.local/share/nvim/swap// (|xdg|), auto-created
- 'display' defaults to "lastline"
- 'formatoptions' defaults to "tcqj"
- 'history' defaults to 10000 (the maximum)
- 'hlsearch' is set by default
- 'incsearch' is set by default
- 'langnoremap' is set by default
- 'laststatus' defaults to 2 (statusline is always shown)
- 'listchars' defaults to "tab:> ,trail:-,nbsp:+"
- 'mouse' defaults to "a"
- 'nocompatible' is always set
- 'nrformats' defaults to "bin,hex"
- 'sessionoptions' doesn't include "options"
- 'smarttab' is set by default
- 'tabpagemax' defaults to 50
- 'tags' defaults to "./tags;,tags"
- 'ttyfast' is always set
- 'undodir' defaults to ~/.local/share/nvim/undo (|xdg|), auto-created
- 'viminfo' includes "!"
- 'wildmenu' is set by default


3. New Features						       *nvim-features*


Embedded terminal emulator	|terminal-emulator|
Shared data			|shada|
XDG base directories		|xdg|
Job control			|job-control|
Remote plugins			|remote-plugin|
Python plugins			|provider-python|
Clipboard integration		|provider-clipboard|


Working intuitively and consistently is a major goal of Nvim. Examples:

- Nvim does not have `-X`, a platform-specific option "sometimes" available in
 Vim with potential surprises: Nvim
  avoids features that cannot be provided on all platforms--instead that is
  delegated to external plugins/extensions.

- Test-only globals and functions such as test_autochdir(), test_settime(),
  etc., are not exposed (because they don't exist).


External plugins run in separate processes. |remote-plugin| This improves
stability and allows those plugins to perform tasks without blocking the
editor. Even "legacy" Python and Ruby plugins which use the old Vim interfaces
(|if_py| and |if_ruby|) run out-of-process.


|bracketed-paste-mode| is built-in and enabled by default.

|META| (ALT) chords are recognized, even in the terminal. Any |<M-| mapping
will work. Some examples: <M-1>, <M-2>, <M-BS>, <M-Del>, <M-Ins>, <M-/>,
<M-\>, <M-Space>, <M-Enter>, <M-=>, <M-->, <M-?>, <M-$>, ...
META chords are case-sensitive: <M-a> and <M-A> are two different keycodes.

Some `CTRL-SHIFT-...` key chords are distinguished from `CTRL-...` variants
(even in the terminal). Specifically, the following are known to work:
  <C-Tab>, <C-S-Tab>, <C-BS>, <C-S-BS>, <C-Enter>, <C-S-Enter>

  'inccommand' shows results while typing a |:substitute| command
  'statusline' supports unlimited alignment sections
'tabline' %@[email protected]%X can call any function on mouse-click 

  |v:windowid| is always available (for use by external UIs)

  |:drop| is available on all platforms
  |:Man| is available by default, with many improvements such as completion

  |dictwatcheradd()| notifies a callback whenever a |Dict| is modified
  |execute()| works with |:redir|
  |msgpackdump()|, |msgpackparse()| provide msgpack de/serialization


Highlight groups:


4. Changed features					 *nvim-features-changed*

Nvim always builds with all features, in contrast to Vim which may have
certain features removed/added at compile-time.  This is like if Vim's "HUGE"
build was the only Vim release type (except Nvim is smaller than Vim's "HUGE"

If a Python interpreter is available on your `$PATH`, |:python| and |:python3|
are always available and may be used simultaneously in separate plugins.  The
`neovim` pip package must be installed to use Python plugins in Nvim (see

|:!| does not support "interactive" commands. Use |:terminal| instead.
(GUI Vim has a similar limitation, see ":help gui-pty" in Vim.)

|system()| does not support writing/reading "backgrounded" commands. |E5677|

Nvim may throttle (skip) messages from shell commands (|:!|, |:grep|, |:make|)
if there is too much output. No data is lost, this only affects display and
makes things faster. |:terminal| output is never throttled.

|mkdir()| behaviour changed:
1. Assuming /tmp/foo does not exist and /tmp can be written to
   mkdir('/tmp/foo/bar', 'p', 0700) will create both /tmp/foo and /tmp/foo/bar 
   with 0700 permissions. Vim mkdir will create /tmp/foo with 0755.
2. If you try to create an existing directory with `'p'` (e.g. mkdir('/',
   'p')) mkdir() will silently exit. In Vim this was an error.
3. mkdir() error messages now include strerror() text when mkdir fails.

'encoding' is always "utf-8".

|string()| and |:echo| behaviour changed:
1. No maximum recursion depth limit is applied to nested container
2. |string()| fails immediately on nested containers, not when recursion limit
   was exceeded.
2. When |:echo| encounters duplicate containers like

       let l = []
       echo [l, l]
   it does not use "[...]" (was: "[[], [...]]", now: "[[], []]"). "..." is
   only used for recursive containers.
3. |:echo| printing nested containers adds "@level" after "..." designating
   the level at which recursive container was printed: |:echo-self-refer|.
   Same thing applies to |string()| (though it uses construct like
   "[email protected]}"), but this is not reliable because |string()| continues to
   error out.
4. Stringifyed infinite and NaN values now use |str2float()| and can be evaled
5. (internal) Trying to print or stringify VAR_UNKNOWN in Vim results in 
   nothing, |E908|, in Neovim it is internal error.

|json_decode()| behaviour changed:
1. It may output |msgpack-special-dict|.
2. |msgpack-special-dict| is emitted also in case of duplicate keys, while in 
   Vim it errors out.
3. It accepts only valid JSON.  Trailing commas are not accepted.

|json_encode()| behaviour slightly changed: now |msgpack-special-dict| values 
are accepted, but |v:none| is not.

*v:none* variable is absent.  In Vim it represents “no value” in “js” strings 
like "[,]" parsed as "[v:none]" by |js_decode()|.

*js_encode()* and *js_decode()* functions are also absent.

Viminfo text files were replaced with binary (messagepack) ShaDa files.
Additional differences:

- |shada-c| has no effect.
- |shada-s| now limits size of every item and not just registers.
- When reading ShaDa files items are merged according to the timestamp.
- 'viminfo' option got renamed to 'shada'. Old option is kept as an alias for
  compatibility reasons.
- |:wviminfo| was renamed to |:wshada|, |:rviminfo| to |:rshada|.  Old
  commands are still kept.
- When writing (|:wshada| without bang or at exit) it merges much more data,
  and does this according to the timestamp.  Vim merges only marks.
- ShaDa file format was designed with forward and backward compatibility in
  mind. |shada-compatibility|
- Some errors make ShaDa code keep temporary file in-place for user to decide
  what to do with it.  Vim deletes temporary file in these cases.
- Vim keeps no timestamps at all, neither in viminfo file nor in the instance
- ShaDa file keeps search direction (|v:searchforward|), viminfo does not.


5. Missing legacy features				 *nvim-features-missing*

				     *if_lua* *if_perl* *if_mzscheme* *if_tcl*

These legacy Vim features may be implemented in the future, but they are not
planned for the current milestone.

- |if_py|: vim.bindeval() and vim.Function() are not supported
- |if_lua|
- |if_perl|
- |if_mzscheme|
- |if_tcl|


6. Removed features					 *nvim-features-removed*

These features are in Vim, but have been intentionally removed from Nvim.

			*'cp'* *'nocompatible'* *'nocp'* *'compatible'*
Nvim is always "non-compatible" with Vi.
  ":set nocompatible" is ignored
  ":set compatible" is an error

			*'ed'* *'edcompatible'* *'noed'* *'noedcompatible'*
Ed-compatible mode:
  ":set noedcompatible" is ignored
  ":set edcompatible" is an error

  ":set ttyfast" is ignored
  ":set nottyfast" is an error

Encryption support:

  *'cryptmethod'* *'cm'*


MS-DOS support:

Highlight groups:

Test functions:

Other options:
  'cpoptions' ("g", "w", "H", "*", "-", "j", and all POSIX flags were removed)
  'encoding' ("utf-8" is always used)
  'guioptions' "t" flag was removed

  *'guipty'* (Nvim uses pipes and PTYs consistently on all platforms.)

  *'imactivatefunc'* *'imaf'*

  *'imactivatekey'* *'imak'*

  *'imstatusfunc'* *'imsf'*


  *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'*

  *'shortname'* *'sn'* *'noshortname'* *'nosn'*

  *'swapsync'* *'sws'*

  *'term'* *E529* *E530* *E531*

  *'termencoding'* *'tenc'* (Vim 7.4.852 also removed this for Windows)

  *'toolbar'* *'tb'*

  *'toolbariconsize'* *'tbis'*

  *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'*

  *'ttymouse'* *'ttym'*

  *'ttyscroll'* *'tsl'*

  *'ttytype'* *'tty'*

Other commands:
  :mode (no longer accepts an argument)

Other compile-time features:
  Emacs tags support
  X11 integration (see |x11-selection|)

Nvim does not have a built-in GUI and hence the following aliases have been
removed: gvim, gex, gview, rgvim, rgview

"Easy mode" (eview, evim, nvim -y)
"(g)vimdiff" (alias for "(g)nvim -d" |diff-mode|)
"Vi mode" (nvim -v)

The ability to start nvim via the following aliases has been removed in favor
of just using their command line arguments:

  ex        nvim -e
  exim      nvim -E
  view      nvim -R
  rvim      nvim -Z
  rview     nvim -RZ

top - main help file