diff --git a/.luarc.json b/.luarc.json index 19558f6..e0f7a7c 100644 --- a/.luarc.json +++ b/.luarc.json @@ -1,8 +1,16 @@ { - "runtime.version": "LuaJIT", - "runtime.path": ["lua/?.lua", "lua/?/init.lua"], - "diagnostics.globals": ["vim"], - "workspace.library": ["$VIMRUNTIME/lua", "${3rd}/luv/library"], - "workspace.checkThirdParty": false, - "completion.callSnippet": "Replace" + "runtime": { + "version": "LuaJIT", + "path": ["lua/?.lua", "lua/?/init.lua"] + }, + "diagnostics": { + "globals": ["vim"] + }, + "workspace": { + "library": ["$VIMRUNTIME/lua", "${3rd}/luv/library", "${3rd}/busted/library"], + "checkThirdParty": false + }, + "completion": { + "callSnippet": "Replace" + } } diff --git a/doc/cp.nvim.txt b/doc/cp.nvim.txt index 49cdaf7..27563a1 100644 --- a/doc/cp.nvim.txt +++ b/doc/cp.nvim.txt @@ -888,6 +888,116 @@ Functions ~ Parameters: ~ {bufnr} (integer) Buffer handle +============================================================================== +STATUSLINE INTEGRATION *cp-statusline* + +cp.nvim exposes its runtime state through a public module that can be queried +from any statusline plugin. Import it with: >lua + local state = require('cp.state') +< +All getters return nil when no problem is active, so guard every value before +use. Calling any getter outside a CP context is safe and has no side effects. + +State API ~ + *cp.State* +The following getters are available for statusline use: + + get_platform() (string?) Platform id. e.g. "codeforces", "atcoder" + get_contest_id() (string?) Contest id. e.g. "1933", "abc324" + get_problem_id() (string?) Problem id. e.g. "A", "B" + get_language() (string?) Language id. e.g. "cpp", "python" + get_base_name() (string?) Derived filename stem. e.g. "1933a" + get_source_file() (string?) Full source filename. e.g. "1933a.cc" + get_active_panel() (string?) Non-nil when the test panel is open. + +Recipe: vanilla statusline ~ + +Set vim.o.statusline from an autocommand so it is recalculated on every +BufEnter: >lua + local function cp_component() + local state = require('cp.state') + local platform = state.get_platform() + if not platform then + return '' + end + local parts = { + platform, + state.get_contest_id(), + state.get_problem_id(), + state.get_language(), + } + local filtered = {} + for _, v in ipairs(parts) do + if v then filtered[#filtered + 1] = v end + end + return '[' .. table.concat(filtered, ' · ') .. ']' + end + + vim.api.nvim_create_autocmd({ 'BufEnter', 'User' }, { + callback = function() + vim.o.statusline = cp_component() .. ' %f %=%l:%c' + end + }) +< + +Recipe: lualine ~ + +Add a custom component to any lualine section. The cond field hides the +component entirely when no problem is active: >lua + local function cp_lualine() + local state = require('cp.state') + local parts = { + state.get_platform(), + state.get_contest_id(), + state.get_problem_id(), + state.get_language(), + } + local filtered = {} + for _, v in ipairs(parts) do + if v then filtered[#filtered + 1] = v end + end + return table.concat(filtered, ' · ') + end + + require('lualine').setup({ + sections = { + lualine_c = { + { + cp_lualine, + cond = function() + return require('cp.state').get_platform() ~= nil + end, + }, + }, + }, + }) +< + +Recipe: heirline ~ + +Build a heirline component using a provider and condition: >lua + local CpComponent = { + condition = function() + return require('cp.state').get_platform() ~= nil + end, + provider = function() + local state = require('cp.state') + local parts = { + state.get_platform(), + state.get_contest_id(), + state.get_problem_id(), + state.get_language(), + } + local filtered = {} + for _, v in ipairs(parts) do + if v then filtered[#filtered + 1] = v end + end + return '[' .. table.concat(filtered, ' · ') .. ']' + end, + } +< +Include CpComponent in your heirline StatusLine spec wherever desired. + ============================================================================== PANEL KEYMAPS *cp-panel-keys* diff --git a/lua/cp/cache.lua b/lua/cp/cache.lua index efdcad7..33342c2 100644 --- a/lua/cp/cache.lua +++ b/lua/cp/cache.lua @@ -346,6 +346,8 @@ function M.get_data_pretty() return vim.inspect(cache_data) end -M._cache = cache_data +function M.get_raw_cache() + return cache_data +end return M diff --git a/lua/cp/health.lua b/lua/cp/health.lua index d3a3fea..97595d6 100644 --- a/lua/cp/health.lua +++ b/lua/cp/health.lua @@ -13,7 +13,7 @@ local function check() vim.health.error('cp.nvim requires Neovim 0.10.0+') end - local uname = vim.loop.os_uname() + local uname = vim.uv.os_uname() if uname.sysname == 'Windows_NT' then vim.health.error('Windows is not supported') end diff --git a/lua/cp/runner/run.lua b/lua/cp/runner/run.lua index 36a560c..4e4a8f6 100644 --- a/lua/cp/runner/run.lua +++ b/lua/cp/runner/run.lua @@ -276,26 +276,35 @@ function M.run_all_test_cases(indices, debug, on_each, on_done) end end - local function run_next(pos) - if pos > #to_run then - logger.log( - ('Finished %s %d test cases.'):format(debug and 'debugging' or 'running', #to_run), - vim.log.levels.INFO, - true - ) - on_done(panel_state.test_cases) - return - end - - M.run_test_case(to_run[pos], debug, function() - if on_each then - on_each(pos, #to_run) - end - run_next(pos + 1) - end) + if #to_run == 0 then + logger.log( + ('Finished %s %d test cases.'):format(debug and 'debugging' or 'running', 0), + vim.log.levels.INFO, + true + ) + on_done(panel_state.test_cases) + return end - run_next(1) + local total = #to_run + local remaining = total + + for _, idx in ipairs(to_run) do + M.run_test_case(idx, debug, function() + if on_each then + on_each(idx, total) + end + remaining = remaining - 1 + if remaining == 0 then + logger.log( + ('Finished %s %d test cases.'):format(debug and 'debugging' or 'running', total), + vim.log.levels.INFO, + true + ) + on_done(panel_state.test_cases) + end + end) + end end ---@return PanelState diff --git a/lua/cp/scraper.lua b/lua/cp/scraper.lua index 73b6177..29cc63e 100644 --- a/lua/cp/scraper.lua +++ b/lua/cp/scraper.lua @@ -57,7 +57,7 @@ local function run_scraper(platform, subcommand, args, opts) env.CONDA_PREFIX = '' if opts and opts.ndjson then - local uv = vim.loop + local uv = vim.uv local stdout = uv.new_pipe(false) local stderr = uv.new_pipe(false) local buf = '' diff --git a/lua/cp/setup.lua b/lua/cp/setup.lua index 0e8080b..86fdee1 100644 --- a/lua/cp/setup.lua +++ b/lua/cp/setup.lua @@ -198,7 +198,7 @@ function M.setup_contest(platform, contest_id, problem_id, language) contest_id = contest_id, language = lang, requested_problem_id = problem_id, - token = vim.loop.hrtime(), + token = vim.uv.hrtime(), }) logger.log('Fetching contests problems...', vim.log.levels.INFO, true) diff --git a/lua/cp/utils.lua b/lua/cp/utils.lua index b602940..285ebf8 100644 --- a/lua/cp/utils.lua +++ b/lua/cp/utils.lua @@ -5,7 +5,7 @@ local logger = require('cp.log') local _nix_python = nil local _nix_discovered = false -local uname = vim.loop.os_uname() +local uname = vim.uv.os_uname() local _time_cached = false local _time_path = nil @@ -336,7 +336,7 @@ function M.timeout_capability() end function M.cwd_executables() - local uv = vim.uv or vim.loop + local uv = vim.uv local req = uv.fs_scandir('.') if not req then return {}