{"id":49327421,"url":"https://github.com/anthonyamaro15/nevi","last_synced_at":"2026-06-30T02:01:15.471Z","repository":{"id":334813547,"uuid":"1135340409","full_name":"anthonyamaro15/nevi","owner":"anthonyamaro15","description":"Fast terminal editor inspired by Neovim and Zed, written in Rust","archived":false,"fork":false,"pushed_at":"2026-06-24T02:00:55.000Z","size":3593,"stargazers_count":19,"open_issues_count":5,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-24T02:06:47.302Z","etag":null,"topics":["cli","editor","lsp","neovim","rust","terminal","text-editor","tree-sitter","vim"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anthonyamaro15.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-16T00:54:40.000Z","updated_at":"2026-06-24T00:31:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/anthonyamaro15/nevi","commit_stats":null,"previous_names":["anthonyamaro15/nevi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/anthonyamaro15/nevi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthonyamaro15%2Fnevi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthonyamaro15%2Fnevi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthonyamaro15%2Fnevi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthonyamaro15%2Fnevi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anthonyamaro15","download_url":"https://codeload.github.com/anthonyamaro15/nevi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthonyamaro15%2Fnevi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34949234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","editor","lsp","neovim","rust","terminal","text-editor","tree-sitter","vim"],"created_at":"2026-04-26T20:35:47.989Z","updated_at":"2026-06-30T02:01:15.462Z","avatar_url":"https://github.com/anthonyamaro15.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nevi\n\nA fast, Neovim-inspired terminal editor written in Rust.\n\n*Your vim muscle memory, without the configuration overhead.*\n\n![Nevi demo — fuzzy file finder with preview, vim motions, Harpoon quick-switch, live grep, and live theme switching](nevi-demo.gif)\n\n\u003e **Tip:** To see every keybinding available in Nevi, run `:Keymaps` (or press `\u003cSpace\u003efk`) — a searchable list with a description for each one.\n\n## Why Nevi?\n\n**The Problem:**\nI love Neovim and Zed. Zed is an amazing editor - fast, modern, and beautiful. But it doesn't have all the vim keybinds I use daily, which stopped me from fully migrating to it. Neovim is powerful but can become slow with plugins. Helix uses Kakoune-style keybindings which require relearning muscle memory.\n\n**Nevi's Goal:**\nA fast, native terminal editor where your existing vim/neovim muscle memory just works. No relearning keybindings, no plugin configuration overhead, no compromise on modern features like LSP and tree-sitter.\n\n| Editor | Vim Keybinds | Built-in Features | Notes |\n|--------|--------------|-------------------|-------|\n| Neovim | Full | Via plugins | Powerful but plugin-dependent |\n| Zed | Partial | Yes | Fast but vim mode incomplete |\n| Helix | Kakoune-style | Yes | Different keybind philosophy |\n| **Nevi** | In Progress | Yes | Aiming for full vim compatibility |\n\n\u003e **Note:** Nevi is under active development. Most common vim keybindings are implemented, with more being added regularly. See [Keybindings](#keybindings) for current status.\n\n## Features\n\n\u003e **Note:** Currently macOS only. Linux and Windows support planned.\n\n- **Vim/neovim keybindings** - Most common keybinds implemented, more being added regularly\n- **Built-in LSP** - rust-analyzer, typescript-language-server, pyright, and more\n- **Tree-sitter syntax highlighting** - Fast, accurate highlighting for Rust, TypeScript, JavaScript, Python, CSS, JSON, TOML, HTML, Markdown\n- **Theme selection** - Multiple built-in colorschemes with easy switching\n- **Fuzzy file finder** - Telescope-style file and content search\n- **Keybinding cheatsheet** - Searchable `:Keymaps` picker (`\u003cSpace\u003efk`) listing every binding with a description\n- **GitHub Copilot integration** - AI-powered completions\n- **File explorer** - Built-in tree view\n- **Git signs** - Gutter indicators for added/modified/deleted lines\n- **Harpoon-style quick file switching** - Pin and jump to frequently used files\n- **Markdown preview** - Open a fast, terminal-native rendered reader with `:MarkdownPreview`\n- **External formatter support** - Biome, Prettier, and other formatters\n- **Split windows** - Vertical and horizontal splits\n- **Configurable via TOML** - Simple, readable configuration\n\n## Installation\n\n### Homebrew\n\n```bash\nbrew install anthonyamaro15/nevi/nevi\n```\n\nOr tap first:\n\n```bash\nbrew tap anthonyamaro15/nevi\nbrew install nevi\n```\n\n### Requirements\n\nNevi is currently macOS-only.\n\nRequired for Homebrew install:\n\n- Homebrew. Build dependencies such as Rust are installed by the formula when\n  needed.\n\nRequired to build from source:\n\n- Rust toolchain with `cargo`\n- Git, if cloning the repository with `git clone`\n- Xcode Command Line Tools if your Rust setup prompts for native build tools\n\nRequired at runtime after any install method:\n\n- A terminal emulator\n\nVerify an installed binary with:\n\n```bash\nnevi --version\n```\n\nNot required:\n\n- `ripgrep`, `grep`, `fd`, `fzf`, or the `tree-sitter` CLI. Nevi's file finder,\n  live grep, fuzzy matching, and syntax highlighting are built into the binary.\n\nOptional tools unlock optional features:\n\n| Feature | Optional tool | Install hint |\n|---------|---------------|--------------|\n| `:LazyGit` / `\u003cSpace\u003egg` | `lazygit` | `brew install lazygit` |\n| Rust LSP | `rust-analyzer` | `rustup component add rust-analyzer` |\n| TypeScript / JavaScript LSP | `typescript-language-server` and `typescript` | `npm install -g typescript typescript-language-server` |\n| CSS / JSON / HTML LSP | `vscode-langservers-extracted` | `npm install -g vscode-langservers-extracted` |\n| TOML LSP | `taplo` | `cargo install taplo-cli --locked` |\n| Python LSP | `pyright` | `npm install -g pyright` |\n| Markdown LSP | `marksman` | Optional and disabled by default |\n| External formatters | Whatever formatter you configure | Examples: `biome`, `prettier`, `black`, `gofmt` |\n| Git signs / `:GitChanges` | A Git repository | No external `git` CLI required |\n| GitHub Copilot completions | GitHub account and network access | No local Copilot binary required |\n\nIf an optional tool is missing, the rest of Nevi still works. Run\n`:checkhealth` or `:Health` inside Nevi to inspect config paths, LSP settings,\nprofiling status, and common setup issues.\n\n### From Source\n\n```bash\ngit clone https://github.com/anthonyamaro15/nevi.git\ncd nevi\ncargo build --release\n./target/release/nevi\n```\n\n### Add to PATH (optional)\n\n```bash\ncp target/release/nevi ~/.local/bin/\n# or\nsudo cp target/release/nevi /usr/local/bin/\n```\n\n## Quick Start\n\n```bash\n# Open current directory\nnevi .\n\n# Open a file\nnevi src/main.rs\n\n# Open multiple files\nnevi file1.rs file2.rs\n```\n\n**Basic commands:**\n- `:w` - Save\n- `:q` - Quit\n- `:wq` - Save and quit\n- `:checkhealth` / `:Health` - Open editor health report\n- `:ConfigOpen` / `:config` - Open your user config file\n- `:ConfigDefaults` - View the latest built-in default config template\n- `:MarkdownPreview` - Open rendered Markdown reader for `.md` files (`j/k`, `Ctrl-d/u`, `g/G`, `q`)\n- `\u003cSpace\u003eff` - Find files\n- `\u003cSpace\u003efg` - Live grep\n- `\u003cSpace\u003egc` - Git changes picker\n- `\u003cSpace\u003ee` - File explorer\n- `\u003cSpace\u003ett` - Terminal picker\n- `\u003cSpace\u003etn` / `\u003cSpace\u003etj` / `\u003cSpace\u003etk` - New / next / previous terminal session\n- `\u003cSpace\u003etr` - Rename active terminal session\n- `\u003cSpace\u003efk` - Search keymaps (keybinding cheatsheet)\n\n## Configuration\n\nConfig location: `~/.config/nevi/config.toml`\n\nA template config file is created automatically on first run. Here's an example:\n\n```toml\n[editor]\ntab_width = 2\nformat_on_save = true\nrelative_numbers = true\nscroll_off = 8\n\n[theme]\ncolorscheme = \"onedark\"\n\n[terminal]\npopup_width_ratio = 0.9\npopup_height_ratio = 0.9\n\n[lsp]\nenabled = true\n\n[copilot]\nenabled = true\n```\n\nRun `:ConfigOpen` (or `:config`) to open your user config file from inside\nNevi. Run `:ConfigDefaults` to view the latest built-in default config template\nwithout changing your existing config. Existing config files stay user-owned;\nNevi does not rewrite them when new defaults are added.\n\nSee the generated config file at `~/.config/nevi/config.toml` for all available\noptions with documentation.\n\n## Custom Themes\n\nNevi comes with 15+ built-in themes. You can also create your own custom themes.\n\n### Built-in Themes\n\nSelect a theme with `:theme \u003cname\u003e` or `\u003cSpace\u003eft` to open the theme picker.\n\nAvailable themes: `onedark`, `dracula`, `gruvbox`, `nord`, `tokyonight`, `catppuccin-mocha`, `rose-pine`, `solarized-dark`, `kanagawa`, `monokai`, `everforest`, `github-dark`, `ayu-dark`, `palenight`, `nightfox`\n\n### Creating Custom Themes\n\n1. **Location:** Place `.toml` files in `~/.config/nevi/themes/`\n2. **Template:** A commented template is auto-generated at `~/.config/nevi/themes/_template.toml`\n3. **Naming:** The filename becomes the theme name (e.g., `mytheme.toml` → `:theme mytheme`)\n\nCopy the template to get started:\n\n```bash\ncp ~/.config/nevi/themes/_template.toml ~/.config/nevi/themes/mytheme.toml\n```\n\n### Theme Structure\n\n```toml\n# Define reusable colors\n[palette]\nred = \"#e06c75\"\nblue = \"#61afef\"\nbg = \"#282c34\"\n\n# Syntax highlighting (can reference palette or use hex)\n[syntax]\nkeyword = { fg = \"purple\" }\nstring = { fg = \"green\" }\ncomment = { fg = \"gray\", italic = true }\n\n# UI elements\n[ui]\nbackground = \"bg\"\nforeground = \"#abb2bf\"\ncursor_line = \"#2c313c\"\n\n[ui.statusline]\nmode_normal = \"blue\"\nmode_insert = \"green\"\n\n# And more: [ui.completion], [ui.finder], [diagnostic], [git]\n```\n\nSee `~/.config/nevi/themes/_template.toml` for the complete reference with all available options.\n\n## Keybindings\n\nNevi aims for full vim/neovim keybind compatibility. Most common keybindings are already implemented.\n\n\u003e **Full reference:** See [KEYBINDINGS.md](KEYBINDINGS.md) for the complete keybind documentation with examples and tips.\n\n### Movement\n`h/j/k/l`, `w/b/e/W/B/E`, `0/^/$`, `+/-`, `gg/G`, `{/}`, `(`/`)`, `f/F/t/T`, `;/,`, `%`, `H/M/L`, `gj/gk/g0/g$/g^`\n\n### Editing\n`d/c/y` + motions, `dd/cc/yy`, `p/P/gp/gP`, `x/X`, `r`, `J/gJ`, `==/={motion}`, `.`, `u/Ctrl+r`\n\n### Text Objects\n`iw/aw`, `iW/aW`, `i\"/a\"`, `i'/a'`, `i(/a(`, `i{/a{`, `i[/a[`, `i\u003c/a\u003c`, `ip/ap`, `is/as`, `it/at`\n\n### Search\n`/`, `?`, `n/N`, `*/#`, `gn/gN`\n\n### LSP\n`gd` (definition), `gD` (declaration), `gI` (implementation), `gf` (file under cursor), `gx` (URL under cursor), `gr` (references), `K` (hover), `gl` (diagnostic), `]d/[d` (next/prev diagnostic)\n\n### Surround\n`ds{char}` (delete), `cs{old}{new}` (change), `ys{motion}{char}` (add)\n\n### Comment\n`gcc` (line), `gc{motion}` (motion)\n\n### Leader (`\u003cSpace\u003e`)\nPress `\u003cSpace\u003e` by itself to show available leader continuations. Set `[keymap] show_leader_popup = false` to disable that popup.\n\n| Key | Action |\n|-----|--------|\n| `ff` | Find files |\n| `fg` | Live grep |\n| `sw` | Search word under cursor |\n| `fb` | Find buffers |\n| `ft` | Theme picker |\n| `fk` | Search keymaps |\n| `tt` | Terminal picker |\n| `e` | File explorer |\n| `ca` | Code actions |\n| `rn` | Rename symbol |\n| `d` | Search diagnostics |\n| `D` | Line diagnostic |\n| `w` | Save file |\n| `q` | Quit |\n| `gg` | Open lazygit |\n| `gc` | Git changes picker |\n| `m` | Add to harpoon |\n| `h` | Harpoon menu |\n| `1-4` | Jump to harpoon slot |\n\n### Window Management\n`Ctrl+w v` (vsplit), `Ctrl+w s` (hsplit), `Ctrl+w q` (close), `Ctrl+w h/j/k/l` or `Ctrl+h/j/k/l` (navigate), `Ctrl+w w/W` (next/previous), `Ctrl+w =` (equalize), `Ctrl+w r/R` (rotate), `Ctrl+w x` (exchange)\n\n### And More\nVisual mode (`v/V/Ctrl+v`), macros (`q{a-z}/@{a-z}`), marks (`m{a-z}/'`), read-only/expression registers (`\"%`, `\":`, `\"#`, `\".`, `\"=`), insert helpers (`Ctrl+t/Ctrl+d/Ctrl+a/Ctrl+r/Ctrl+o`), replace mode (`R`)\n\n\u003e **Missing a keybind?** Check [KEYBINDINGS.md](KEYBINDINGS.md) for the full list of what's implemented. If you don't see the one you want, take a look at the [keybind roadmap](KEYBINDS_ROADMAP.md) to see if it's already planned — and if it's not, [open an issue](https://github.com/anthonyamaro15/nevi/issues) to request it (PRs welcome too).\n\n## Language Support\n\n### LSP Servers\n\n| Language | Server | Status |\n|----------|--------|--------|\n| Rust | rust-analyzer | Supported |\n| TypeScript/JavaScript | typescript-language-server | Supported |\n| Python | pyright | Supported |\n| CSS/SCSS | vscode-css-language-server | Supported |\n| JSON | vscode-json-language-server | Supported |\n| TOML | taplo | Supported |\n| HTML | vscode-html-language-server | Supported |\n| Markdown | marksman | Optional, disabled by default |\n\nLSP servers are auto-detected when installed. See [`~/.config/nevi/config.toml`](#configuration) for LSP configuration options.\n\nIf a server is missing, Nevi shows an install hint in the LSP status/error\nmessage. You can also run `:checkhealth` to review the active LSP configuration.\n\n\u003e **Missing a language?** Open a [GitHub issue](https://github.com/anthonyamaro15/nevi/issues) and we'll work on adding support!\n\n### External Formatters\n\nConfigure formatters in `~/.config/nevi/languages.toml`:\n\n```toml\n[typescript]\nformatter = { command = \"biome\", args = [\"format\", \"--stdin-file-path\", \"{file}\"] }\n```\n\nFormatters are external commands. Nevi only runs a formatter if you configure\none; otherwise it falls back to LSP formatting when available.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit issues and pull requests.\n\n- [Report a bug](https://github.com/anthonyamaro15/nevi/issues)\n- [Request a feature](https://github.com/anthonyamaro15/nevi/issues)\n\n### Performance Profiling\n\nProfiling is opt-in and disabled by default. To capture hot-path timings while\nusing Nevi locally:\n\n```bash\nNEVI_PROFILE=1 cargo run --release -- path/to/file\n```\n\nNevi writes raw timing events and a summary to `/tmp/nevi_profile.log`. The\nsummary includes count, retained sample count, total, average, p50, p95, and max\nmicroseconds for metrics such as key handling, syntax updates, full renders, and\nterminal-only renders.\n\nRun `:checkhealth` (or `:Health`) inside Nevi to see config paths, config\ndiscoverability commands, LSP settings, profiling status, and any profile\nsummary from `/tmp/nevi_profile.log`. Profile summaries are written when a\nprofiled Nevi session exits.\n\n## License\n\nMIT License\n\n## Acknowledgments\n\nInspired by [Neovim](https://neovim.io/), [Helix](https://helix-editor.com/), and [Zed](https://zed.dev/).\n\nBuilt with:\n- [ropey](https://github.com/cessen/ropey) - Rope data structure for text\n- [tree-sitter](https://tree-sitter.github.io/tree-sitter/) - Syntax highlighting\n- [crossterm](https://github.com/crossterm-rs/crossterm) - Terminal handling\n- [nucleo](https://github.com/helix-editor/nucleo) - Fuzzy matching\n- [git2](https://github.com/rust-lang/git2-rs) - Git integration\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthonyamaro15%2Fnevi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanthonyamaro15%2Fnevi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthonyamaro15%2Fnevi/lists"}