Problem: Neovim can permanently stop accepting keyboard input after a large paste, or after any sufficiently large input burst. The screen still redraws and honours window resize, but typed keys have no effect and the session must be killed. A paste that triggers the freeze is applied only partially. Root cause: `src/nvim/os/input.c` holds `input_buffer[INPUT_BUFFER_SIZE]` (16386 bytes), compacted left rather than used as a ring: - `input_get()` drains the buffer by advancing `input_read_pos`, but never rewinds the cursors when it empties (`input_read_pos == input_write_pos`). - The only rewind lives in `input_enqueue_raw()`, which `input_enqueue()` reaches only inside `while (input_space() >= 19 && ptr < end)` (19 is the maximum expansion of one `<x>` key form). So once input fills the buffer to within 19 bytes of the top and is then fully drained, the cursors are pinned near the top with `input_space() < 19`. The gate never reopens, `input_enqueue()` never rewinds, and all further input is silently dropped: `input_available()` stays 0 and the editor blocks forever in `state_enter()` → `input_get()`. Redraw and resize run on independent paths, which is why the UI looks alive while the keyboard is ignored. Solution: Rewind the read/write cursors when the buffer is empty, at the start of `input_enqueue()`. The reset moves no data in the empty case and guarantees the space gate can reopen; the non-empty case self-heals as the editor drains. Test case: A reproducer (no terminal required; drives `nvim --embed` over msgpack-RPC via `nvim_input`) floods the input buffer, lets the editor drain it, then probes with `:qa!`. It shows a sharp threshold at `INPUT_BUFFER_SIZE − 18`: | `--fill` | master | with this fix | |----------|-----------|---------------| | ≤ 16367 | quits | quits | | ≥ 16368 | **hangs** | quits | - On current `master`, the freeze reproduces at `fill=16368`; the patched build quits for every fill up to 100000. - Interactive: a ~40 kB bracketed paste into Insert mode or a `:terminal` no longer freezes.
Neovim is a project that seeks to aggressively refactor Vim in order to:
- Simplify maintenance and encourage contributions
- Split the work between multiple developers
- Enable advanced UIs without modifications to the core
- Maximize extensibility
See the Introduction wiki page and Roadmap for more information.
Features
- Modern GUIs
- API access from any language including C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java/Kotlin, JavaScript/Node.js, Julia, Lisp, Lua, Perl, Python, Racket, Ruby, Rust
- Embedded, scriptable terminal emulator
- Asynchronous job control
- Shared data (shada) among multiple editor instances
- XDG base directories support
- Compatible with most Vim plugins, including Ruby and Python plugins
See :help nvim-features for the full list, and :help news for noteworthy changes in the latest version!
Install from package
Pre-built packages for Windows, macOS, and Linux are found on the Releases page.
Managed packages are in Homebrew, Debian, Ubuntu, Fedora, Arch Linux, Void Linux, Gentoo, and more!
Install from source
See BUILD.md and supported platforms for details.
The build is CMake-based, but a Makefile is provided as a convenience. After installing the dependencies, run the following command.
make CMAKE_BUILD_TYPE=RelWithDebInfo
sudo make install
To install to a non-default location:
make CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_INSTALL_PREFIX=/full/path/
make install
CMake hints for inspecting the build:
cmake --build build --target helplists all build targets.build/CMakeCache.txt(orcmake -LAH build/) contains the resolved values of all CMake variables.build/compile_commands.jsonshows the full compiler invocations for each translation unit.
Transitioning from Vim
See :help nvim-from-vim for instructions.
Project layout
├─ cmake/ CMake utils
├─ cmake.config/ CMake defines
├─ cmake.deps/ subproject to fetch and build dependencies (optional)
├─ runtime/ plugins and docs
├─ src/nvim/ application source code (see src/nvim/README.md)
│ ├─ api/ API subsystem
│ ├─ eval/ Vimscript subsystem
│ ├─ event/ event-loop subsystem
│ ├─ generators/ code generation (pre-compilation)
│ ├─ lib/ generic data structures
│ ├─ lua/ Lua subsystem
│ ├─ msgpack_rpc/ RPC subsystem
│ ├─ os/ low-level platform code
│ └─ tui/ built-in UI
└─ test/ tests (see test/README.md)
License
Neovim contributions since b17d96 are licensed under the
Apache 2.0 license, except for contributions copied from Vim (identified by the
vim-patch token). See LICENSE.txt for details.
