Problem: switching contests while a run, interactive session, or stress test was in progress left orphaned callbacks and terminal jobs alive. Running `:CP run` twice also allowed the first run's stale output to overwrite the buffer after the second run completed. Solution: replace the `io_view_running` bool in `views.lua` with a generation counter (`_run_gen`); each `run_io_view` call increments it and captures a local `gen`, and async callbacks bail out early when `gen ~= _run_gen`. Add `cancel_io_view`, `cancel_interactive` to `views.lua` and `cancel` to `stress.lua` for forceful teardown without layout restore. Call these in `setup_contest` whenever `is_new_contest` is true. |
||
|---|---|---|
| .github | ||
| after/ftplugin | ||
| doc | ||
| lua/cp | ||
| plugin | ||
| scrapers | ||
| scripts | ||
| tests | ||
| .editorconfig | ||
| .gitignore | ||
| .luarc.json | ||
| .pre-commit-config.yaml | ||
| .prettierignore | ||
| .prettierrc | ||
| .python-version | ||
| .styluaignore | ||
| cp.nvim-scm-1.rockspec | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| selene.toml | ||
| stylua.toml | ||
| uv.lock | ||
| vim.yaml | ||
cp.nvim
The definitive competitive programming environment for Neovim
Scrape problems, run tests, and debug solutions across multiple platforms with zero configuration.
https://github.com/user-attachments/assets/e81d8dfb-578f-4a79-9989-210164fc0148
Features
- Multi-platform support: AtCoder, CodeChef, Codeforces, and CSES
- Automatic problem setup: Scrape test cases and metadata in seconds
- Dual view modes: Lightweight I/O view for quick feedback, full panel for detailed analysis
- Test case management: Quickly view, edit, add, & remove test cases
- Rich test output: 256 color ANSI support for compiler errors and program output
- Language agnostic: Works with any language
- Diff viewer: Compare expected vs actual output with 3 diff modes
Installation
Install using your package manager of choice or via luarocks:
luarocks install cp.nvim
Dependencies
Quick Start
cp.nvim follows a simple principle: solve locally, submit remotely.
Basic Usage
-
Find a contest or problem
-
Set up contests locally
:CP codeforces 1848 -
Code and test
:CP run -
Navigate between problems
:CP next :CP prev :CP e1 -
Debug and edit test cases
:CP edit
:CP panel --debug
- Submit on the original website
Documentation
:help cp.nvim
See my config for the setup in the video shown above.
Motivation
I could not find a neovim-centric, efficient, dependency-free, flexible, and easily customizable competitive programming workflow that "just works"--so I made it myself. I conferenced with top competitive programmers at Carnegie Mellon Univerity and the University of Virginia and covered their (and my) pain points:
- Scraping: contests are automatically loaded asynchronously
- Test Case Management: test case editor (
:CP edit) - UI: both
runandpanellayouts cover common formats - Extensibility: snippet plugins, compilation, etc. are left to the programmer