From 276241447c3699f56704d286d6e343adcf019867 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Tue, 3 Feb 2026 21:46:47 -0500 Subject: [PATCH 1/5] fix: add deprecation warning for setup() --- lua/cp/init.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lua/cp/init.lua b/lua/cp/init.lua index fac3044..0bb5582 100644 --- a/lua/cp/init.lua +++ b/lua/cp/init.lua @@ -34,4 +34,13 @@ function M.is_initialized() return initialized end +---@deprecated Use `vim.g.cp_config` instead +function M.setup(user_config) + vim.deprecate('require("cp").setup()', 'vim.g.cp_config', 'v0.1.0', 'cp.nvim', false) + + if user_config then + vim.g.cp_config = vim.tbl_deep_extend('force', vim.g.cp_config or {}, user_config) + end +end + return M From a54a06f9396213725a06aab58e023ec6d8e20f37 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Feb 2026 15:12:47 -0500 Subject: [PATCH 2/5] refactor: rename `vim.g.cp_config` to `vim.g.cp` --- doc/cp.nvim.txt | 8 ++++---- lua/cp/init.lua | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/cp.nvim.txt b/doc/cp.nvim.txt index d6d1d73..17fd18c 100644 --- a/doc/cp.nvim.txt +++ b/doc/cp.nvim.txt @@ -205,9 +205,9 @@ Debug Builds ~ ============================================================================== CONFIGURATION *cp-config* -Configuration is done via `vim.g.cp_config`. Set this before using the plugin: +Configuration is done via `vim.g.cp`. Set this before using the plugin: >lua - vim.g.cp_config = { + vim.g.cp = { languages = { cpp = { extension = 'cc', @@ -274,7 +274,7 @@ the default; per-platform overrides can tweak 'extension' or 'commands'. For example, to run CodeForces contests with Python by default: >lua - vim.g.cp_config = { + vim.g.cp = { platforms = { codeforces = { default_language = 'python', @@ -285,7 +285,7 @@ For example, to run CodeForces contests with Python by default: Any language is supported provided the proper configuration. For example, to run CSES problems with Rust using the single schema: >lua - vim.g.cp_config = { + vim.g.cp = { languages = { rust = { extension = 'rs', diff --git a/lua/cp/init.lua b/lua/cp/init.lua index 0bb5582..1837901 100644 --- a/lua/cp/init.lua +++ b/lua/cp/init.lua @@ -17,7 +17,11 @@ local function ensure_initialized() if initialized then return end - local user_config = vim.g.cp_config or {} + if vim.g.cp_config then + vim.deprecate('vim.g.cp_config', 'vim.g.cp', 'v0.7.6', 'cp.nvim', false) + vim.g.cp = vim.g.cp or vim.g.cp_config + end + local user_config = vim.g.cp or {} local config = config_module.setup(user_config) config_module.set_current_config(config) initialized = true @@ -34,12 +38,12 @@ function M.is_initialized() return initialized end ----@deprecated Use `vim.g.cp_config` instead +---@deprecated Use `vim.g.cp` instead function M.setup(user_config) - vim.deprecate('require("cp").setup()', 'vim.g.cp_config', 'v0.1.0', 'cp.nvim', false) + vim.deprecate('require("cp").setup()', 'vim.g.cp', 'v0.1.0', 'cp.nvim', false) if user_config then - vim.g.cp_config = vim.tbl_deep_extend('force', vim.g.cp_config or {}, user_config) + vim.g.cp = vim.tbl_deep_extend('force', vim.g.cp or {}, user_config) end end From d23b4e59d15018472a3eb6c397f7e74cf2a6eaa9 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Feb 2026 16:29:46 -0500 Subject: [PATCH 3/5] fix(setup): set language state before setup_code hook on first open Problem: when opening a contest for the first time (metadata not cached), the setup_code hook fired before state.set_language() was called, causing state.get_language() to return nil inside the hook. Solution: call state.set_language(lang) before the hook in the provisional-buffer branch of setup_contest(). The value is already computed at that point and is identical to what setup_problem() sets later, so the early write is idempotent. --- lua/cp/setup.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua/cp/setup.lua b/lua/cp/setup.lua index fce1a0c..e3bb38d 100644 --- a/lua/cp/setup.lua +++ b/lua/cp/setup.lua @@ -160,6 +160,8 @@ function M.setup_contest(platform, contest_id, problem_id, language) vim.bo[bufnr].buftype = '' vim.bo[bufnr].swapfile = false + state.set_language(lang) + if cfg.hooks and cfg.hooks.setup_code and not vim.b[bufnr].cp_setup_done then local ok = pcall(cfg.hooks.setup_code, state) if ok then From de2bc0753228be518d0cf0a6d5614c281d5b3144 Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 6 Feb 2026 16:40:39 -0500 Subject: [PATCH 4/5] refactor: remove vim.g.cp_config compatibility shim Problem: the deprecated vim.g.cp_config fallback was kept for backwards compatibility after the rename to vim.g.cp in v0.7.6. Solution: drop the shim entirely and update the setup() deprecation target to v0.7.7. --- lua/cp/init.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lua/cp/init.lua b/lua/cp/init.lua index 1837901..3cb36c1 100644 --- a/lua/cp/init.lua +++ b/lua/cp/init.lua @@ -17,10 +17,6 @@ local function ensure_initialized() if initialized then return end - if vim.g.cp_config then - vim.deprecate('vim.g.cp_config', 'vim.g.cp', 'v0.7.6', 'cp.nvim', false) - vim.g.cp = vim.g.cp or vim.g.cp_config - end local user_config = vim.g.cp or {} local config = config_module.setup(user_config) config_module.set_current_config(config) @@ -40,7 +36,7 @@ end ---@deprecated Use `vim.g.cp` instead function M.setup(user_config) - vim.deprecate('require("cp").setup()', 'vim.g.cp', 'v0.1.0', 'cp.nvim', false) + vim.deprecate('require("cp").setup()', 'vim.g.cp', 'v0.7.7', 'cp.nvim', false) if user_config then vim.g.cp = vim.tbl_deep_extend('force', vim.g.cp or {}, user_config) From f831b569861df8188d536224acc7267ecd2876fe Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Sat, 7 Feb 2026 13:22:19 -0500 Subject: [PATCH 5/5] feat: add mappings for all primary actions Problem: users who want keybindings must call vim.cmd('CP run') or reach into internal Lua modules directly. There is no stable, discoverable, lazy-load-friendly public API for key binding. Solution: define 7 mappings in plugin/cp.lua that dispatch through the same handle_command() code path as :CP. Document them in a new MAPPINGS section in the vimdoc with helptags and an example config block. --- doc/cp.nvim.txt | 37 +++++++++++++++++++++++++++++++++++++ plugin/cp.lua | 14 ++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/doc/cp.nvim.txt b/doc/cp.nvim.txt index 17fd18c..9361121 100644 --- a/doc/cp.nvim.txt +++ b/doc/cp.nvim.txt @@ -202,6 +202,43 @@ Debug Builds ~ } < +============================================================================== +MAPPINGS *cp-mappings* + +cp.nvim provides mappings for all primary actions. These dispatch +through the same code path as |:CP|. + + *(cp-run)* +(cp-run) Run tests in I/O view. Equivalent to :CP run. + + *(cp-panel)* +(cp-panel) Open full-screen test panel. Equivalent to :CP panel. + + *(cp-edit)* +(cp-edit) Open the test case editor. Equivalent to :CP edit. + + *(cp-next)* +(cp-next) Navigate to the next problem. Equivalent to :CP next. + + *(cp-prev)* +(cp-prev) Navigate to the previous problem. Equivalent to :CP prev. + + *(cp-pick)* +(cp-pick) Launch the contest picker. Equivalent to :CP pick. + + *(cp-interact)* +(cp-interact) Open interactive mode. Equivalent to :CP interact. + +Example configuration: >lua + vim.keymap.set('n', 'cr', '(cp-run)') + vim.keymap.set('n', 'cp', '(cp-panel)') + vim.keymap.set('n', 'ce', '(cp-edit)') + vim.keymap.set('n', 'cn', '(cp-next)') + vim.keymap.set('n', 'cN', '(cp-prev)') + vim.keymap.set('n', 'cc', '(cp-pick)') + vim.keymap.set('n', 'ci', '(cp-interact)') +< + ============================================================================== CONFIGURATION *cp-config* diff --git a/plugin/cp.lua b/plugin/cp.lua index b91a3d5..2689e71 100644 --- a/plugin/cp.lua +++ b/plugin/cp.lua @@ -154,3 +154,17 @@ end, { return {} end, }) + +local function cp_action(action) + return function() + require('cp').handle_command({ fargs = { action } }) + end +end + +vim.keymap.set('n', '(cp-run)', cp_action('run'), { desc = 'CP run tests' }) +vim.keymap.set('n', '(cp-panel)', cp_action('panel'), { desc = 'CP open panel' }) +vim.keymap.set('n', '(cp-edit)', cp_action('edit'), { desc = 'CP edit test cases' }) +vim.keymap.set('n', '(cp-next)', cp_action('next'), { desc = 'CP next problem' }) +vim.keymap.set('n', '(cp-prev)', cp_action('prev'), { desc = 'CP previous problem' }) +vim.keymap.set('n', '(cp-pick)', cp_action('pick'), { desc = 'CP pick contest' }) +vim.keymap.set('n', '(cp-interact)', cp_action('interact'), { desc = 'CP interactive mode' })