*vim_diff.txt* For Nvim. {Nvim} NVIM REFERENCE MANUAL 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 configuration. - 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:+" - '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* MAJOR COMPONENTS ~ Embedded terminal emulator |terminal-emulator| RPC API |RPC| Shared data |shada| XDG base directories |xdg| Job control |job-control| Remote plugins |remote-plugin| Python plugins |provider-python| Clipboard integration |provider-clipboard| USER EXPERIENCE ~ 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: http://stackoverflow.com/q/14635295). 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). ARCHITECTURE ~ 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. FEATURES ~ |bracketed-paste-mode| is built-in and enabled by default. |META| (ALT) chords are recognized, even in the terminal. Any |, , , , , , , , , , , , , ... META chords are case-sensitive: and 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: , , , , , Options: 'inccommand' shows interactive results for |:substitute|-like commands 'statusline' supports unlimited alignment sections 'tabline' %@Func@foo%X can call any function on mouse-click Variables: |v:event| |v:progpath| is always absolute ("full") |v:windowid| is always available (for use by external UIs) Commands: |:CheckHealth| |:drop| is available on all platforms |:Man| is available by default, with many improvements such as completion Functions: |dictwatcheradd()| notifies a callback whenever a |Dict| is modified |dictwatcherdel()| |execute()| works with |:redir| |msgpackdump()|, |msgpackparse()| provide msgpack de/serialization Events: |DirChanged| |TabNewEntered| |TermClose| |TermOpen| |TextYankPost| Highlight groups: |hl-QuickFixLine| |hl-Substitute| |hl-TermCursor| |hl-TermCursorNC| ============================================================================== 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" build). 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 |provider-python|). |:!| 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 structures. 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 "{E724@level}"), but this is not reliable because |string()| continues to error out. 4. Stringifyed infinite and NaN values now use |str2float()| and can be evaled back. 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. |shada-merging| - '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-merging| - 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. |shada-error-handling| - Vim keeps no timestamps at all, neither in viminfo file nor in the instance itself. - 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 'ttyfast': ":set ttyfast" is ignored ":set nottyfast" is an error Encryption support: *'cryptmethod'* *'cm'* *'key'* MS-DOS support: 'bioskey' 'conskey' Highlight groups: |hl-VisualNOS| Test functions: test_alloc_fail() test_autochdir() test_disable_char_avail() test_garbagecollect_now() test_null_channel() test_null_dict() test_null_job() test_null_list() test_null_partial() test_null_string() test_settime() Other options: 'antialias' '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'* *'macatsui'* *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'* 'shelltype' *'shortname'* *'sn'* *'noshortname'* *'nosn'* *'swapsync'* *'sws'* *'term'* *E529* *E530* *E531* *'termencoding'* *'tenc'* (Vim 7.4.852 also removed this for Windows) 'textauto' 'textmode' *'toolbar'* *'tb'* *'toolbariconsize'* *'tbis'* *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'* *'ttymouse'* *'ttym'* *'ttyscroll'* *'tsl'* *'ttytype'* *'tty'* 'weirdinvert' Other commands: :Print :fixdel :helpfind :mode (no longer accepts an argument) :open :shell :smile :tearoff Other compile-time features: EBCDIC 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 ============================================================================== vim:tw=78:ts=8:noet:ft=help:norl: