diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml deleted file mode 100644 index 5742799..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ /dev/null @@ -1,78 +0,0 @@ -name: Bug Report -description: Report a bug -title: 'bug: ' -labels: [bug] -body: - - type: checkboxes - attributes: - label: Prerequisites - options: - - label: - I have searched [existing - issues](https://github.com/barrettruth/cp.nvim/issues) - required: true - - label: I have updated to the latest version - required: true - - - type: textarea - attributes: - label: 'Neovim version' - description: 'Output of `nvim --version`' - render: text - validations: - required: true - - - type: input - attributes: - label: 'Operating system' - placeholder: 'e.g. Arch Linux, macOS 15, Ubuntu 24.04' - validations: - required: true - - - type: textarea - attributes: - label: Description - description: What happened? What did you expect? - validations: - required: true - - - type: textarea - attributes: - label: Steps to reproduce - description: Minimal steps to trigger the bug - value: | - 1. - 2. - 3. - validations: - required: true - - - type: textarea - attributes: - label: 'Health check' - description: 'Output of `:checkhealth cp`' - render: text - - - type: textarea - attributes: - label: Minimal reproduction - description: | - Save the script below as `repro.lua`, edit if needed, and run: - ``` - nvim -u repro.lua - ``` - Confirm the bug reproduces with this config before submitting. - render: lua - value: | - vim.env.LAZY_STDPATH = '.repro' - load(vim.fn.system('curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua'))() - require('lazy.nvim').setup({ - spec = { - { - 'barrett-ruth/cp.nvim', - opts = {}, - }, - }, - }) - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml deleted file mode 100644 index 12ef1b0..0000000 --- a/.github/ISSUE_TEMPLATE/config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Questions - url: https://github.com/barrettruth/cp.nvim/discussions - about: Ask questions and discuss ideas diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml deleted file mode 100644 index 39c6692..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Feature Request -description: Suggest a feature -title: 'feat: ' -labels: [enhancement] -body: - - type: checkboxes - attributes: - label: Prerequisites - options: - - label: - I have searched [existing - issues](https://github.com/barrettruth/cp.nvim/issues) - required: true - - - type: textarea - attributes: - label: Problem - description: What problem does this solve? - validations: - required: true - - - type: textarea - attributes: - label: Proposed solution - validations: - required: true - - - type: textarea - attributes: - label: Alternatives considered diff --git a/.github/workflows/luarocks.yaml b/.github/workflows/luarocks.yaml index 5be8b55..95eaf0f 100644 --- a/.github/workflows/luarocks.yaml +++ b/.github/workflows/luarocks.yaml @@ -3,7 +3,7 @@ name: luarocks on: push: tags: - - 'v*' + - "v*" jobs: ci: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 971ffbe..22e6d2e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,7 @@ repos: hooks: - id: prettier name: prettier - files: \.(md|toml|ya?ml|sh)$ + files: \.(md|,toml,yaml,sh)$ - repo: local hooks: diff --git a/README.md b/README.md index cf82417..7d439f9 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,6 @@ https://github.com/user-attachments/assets/e81d8dfb-578f-4a79-9989-210164fc0148 - **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](https://luarocks.org/modules/barrettruth/cp.nvim): - -``` -luarocks install cp.nvim -``` - ## Optional Dependencies - [uv](https://docs.astral.sh/uv/) for problem scraping diff --git a/cp.nvim-scm-1.rockspec b/cp.nvim-scm-1.rockspec index 8152b7b..e38d924 100644 --- a/cp.nvim-scm-1.rockspec +++ b/cp.nvim-scm-1.rockspec @@ -2,7 +2,7 @@ rockspec_format = '3.0' package = 'cp.nvim' version = 'scm-1' -source = { url = 'git://github.com/barrettruth/cp.nvim' } +source = { url = 'git://github.com/barrett-ruth/cp.nvim' } build = { type = 'builtin' } test_dependencies = { diff --git a/doc/cp.nvim.txt b/doc/cp.nvim.txt index d6d1d73..866346f 100644 --- a/doc/cp.nvim.txt +++ b/doc/cp.nvim.txt @@ -205,66 +205,71 @@ Debug Builds ~ ============================================================================== CONFIGURATION *cp-config* -Configuration is done via `vim.g.cp_config`. Set this before using the plugin: +Here's an example configuration with lazy.nvim: >lua - vim.g.cp_config = { - languages = { - cpp = { - extension = 'cc', - commands = { - build = { 'g++', '-std=c++17', '{source}', '-o', '{binary}', - '-fdiagnostics-color=always' }, - run = { '{binary}' }, - debug = { 'g++', '-std=c++17', '-fsanitize=address,undefined', - '{source}', '-o', '{binary}' }, + { + 'barrett-ruth/cp.nvim', + cmd = 'CP', + build = 'uv sync', + opts = { + languages = { + cpp = { + extension = 'cc', + commands = { + build = { 'g++', '-std=c++17', '{source}', '-o', '{binary}', + '-fdiagnostics-color=always' }, + run = { '{binary}' }, + debug = { 'g++', '-std=c++17', '-fsanitize=address,undefined', + '{source}', '-o', '{binary}' }, + }, + }, + python = { + extension = 'py', + commands = { + run = { 'python', '{source}' }, + debug = { 'python', '{source}' }, + }, }, }, - python = { - extension = 'py', - commands = { - run = { 'python', '{source}' }, - debug = { 'python', '{source}' }, + platforms = { + cses = { + enabled_languages = { 'cpp', 'python' }, + default_language = 'cpp', + overrides = { + cpp = { extension = 'cpp', commands = { build = { ... } } } + }, + }, + atcoder = { + enabled_languages = { 'cpp', 'python' }, + default_language = 'cpp', + }, + codeforces = { + enabled_languages = { 'cpp', 'python' }, + default_language = 'cpp', }, }, - }, - platforms = { - cses = { - enabled_languages = { 'cpp', 'python' }, - default_language = 'cpp', - overrides = { - cpp = { extension = 'cpp', commands = { build = { ... } } } + open_url = true, + debug = false, + ui = { + ansi = true, + run = { + width = 0.3, + next_test_key = '', -- or nil to disable + prev_test_key = '', -- or nil to disable }, - }, - atcoder = { - enabled_languages = { 'cpp', 'python' }, - default_language = 'cpp', - }, - codeforces = { - enabled_languages = { 'cpp', 'python' }, - default_language = 'cpp', - }, - }, - open_url = true, - debug = false, - ui = { - ansi = true, - run = { - width = 0.3, - next_test_key = '', -- or nil to disable - prev_test_key = '', -- or nil to disable - }, - panel = { - diff_modes = { 'side-by-side', 'git', 'vim' }, - max_output_lines = 50, - }, - diff = { - git = { - args = { 'diff', '--no-index', '--word-diff=plain', - '--word-diff-regex=.', '--no-prefix' }, + panel = { + diff_modes = { 'side-by-side', 'git', 'vim' }, + max_output_lines = 50, }, + diff = { + git = { + args = { 'diff', '--no-index', '--word-diff=plain', + '--word-diff-regex=.', '--no-prefix' }, + }, + }, + picker = 'telescope', }, - picker = 'telescope', - }, + } } < @@ -274,7 +279,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 = { + { platforms = { codeforces = { default_language = 'python', @@ -285,7 +290,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 = { + { languages = { rust = { extension = 'rs', diff --git a/lua/cp/init.lua b/lua/cp/init.lua index fac3044..64a997d 100644 --- a/lua/cp/init.lua +++ b/lua/cp/init.lua @@ -11,25 +11,25 @@ if vim.fn.has('nvim-0.10.0') == 0 then return {} end +local user_config = {} +local config = nil local initialized = false -local function ensure_initialized() - if initialized then - return - end - local user_config = vim.g.cp_config or {} - local config = config_module.setup(user_config) - config_module.set_current_config(config) - initialized = true -end - ---@return nil function M.handle_command(opts) - ensure_initialized() local commands = require('cp.commands') commands.handle_command(opts) end +function M.setup(opts) + opts = opts or {} + user_config = opts + config = config_module.setup(user_config) + config_module.set_current_config(config) + + initialized = true +end + function M.is_initialized() return initialized end diff --git a/lua/cp/runner/execute.lua b/lua/cp/runner/execute.lua index 76d055a..5c89c8a 100644 --- a/lua/cp/runner/execute.lua +++ b/lua/cp/runner/execute.lua @@ -194,8 +194,6 @@ function M.compile_problem(debug, on_complete) return end - require('cp.utils').ensure_dirs() - local binary = debug and state.get_debug_file() or state.get_binary_file() local substitutions = { source = state.get_source_file(), binary = binary } diff --git a/lua/cp/scraper.lua b/lua/cp/scraper.lua index c42d8be..3c0af30 100644 --- a/lua/cp/scraper.lua +++ b/lua/cp/scraper.lua @@ -186,7 +186,7 @@ function M.scrape_all_tests(platform, contest_id, callback) return end vim.schedule(function() - require('cp.utils').ensure_dirs() + vim.system({ 'mkdir', '-p', 'build', 'io' }):wait() local config = require('cp.config') local base_name = config.default_filename(contest_id, ev.problem_id) for i, t in ipairs(ev.tests) do diff --git a/lua/cp/ui/views.lua b/lua/cp/ui/views.lua index c1d25fc..4b03b68 100644 --- a/lua/cp/ui/views.lua +++ b/lua/cp/ui/views.lua @@ -13,7 +13,6 @@ local utils = require('cp.utils') local current_diff_layout = nil local current_mode = nil -local io_view_running = false function M.disable() local active_panel = state.get_active_panel() @@ -391,8 +390,6 @@ function M.ensure_io_view() return end - require('cp.utils').ensure_dirs() - local source_file = state.get_source_file() if source_file then local source_file_abs = vim.fn.fnamemodify(source_file, ':p') @@ -625,12 +622,6 @@ local function render_io_view_results(io_state, test_indices, mode, combined_res end function M.run_io_view(test_indices_arg, debug, mode) - if io_view_running then - logger.log('Tests already running', vim.log.levels.WARN) - return - end - io_view_running = true - logger.log(('%s tests...'):format(debug and 'Debugging' or 'Running'), vim.log.levels.INFO, true) mode = mode or 'combined' @@ -642,7 +633,6 @@ function M.run_io_view(test_indices_arg, debug, mode) 'No platform/contest/problem configured. Use :CP [...] first.', vim.log.levels.ERROR ) - io_view_running = false return end @@ -650,7 +640,6 @@ function M.run_io_view(test_indices_arg, debug, mode) local contest_data = cache.get_contest_data(platform, contest_id) if not contest_data or not contest_data.index_map then logger.log('No test cases available.', vim.log.levels.ERROR) - io_view_running = false return end @@ -667,13 +656,11 @@ function M.run_io_view(test_indices_arg, debug, mode) local combined = cache.get_combined_test(platform, contest_id, problem_id) if not combined then logger.log('No combined test available', vim.log.levels.ERROR) - io_view_running = false return end else if not run.load_test_cases() then logger.log('No test cases available', vim.log.levels.ERROR) - io_view_running = false return end end @@ -694,7 +681,6 @@ function M.run_io_view(test_indices_arg, debug, mode) ), vim.log.levels.WARN ) - io_view_running = false return end end @@ -712,7 +698,6 @@ function M.run_io_view(test_indices_arg, debug, mode) local io_state = state.get_io_view_state() if not io_state then - io_view_running = false return end @@ -726,7 +711,6 @@ function M.run_io_view(test_indices_arg, debug, mode) execute.compile_problem(debug, function(compile_result) if not vim.api.nvim_buf_is_valid(io_state.output_buf) then - io_view_running = false return end @@ -746,7 +730,6 @@ function M.run_io_view(test_indices_arg, debug, mode) local ns = vim.api.nvim_create_namespace('cp_io_view_compile_error') utils.update_buffer_content(io_state.output_buf, lines, highlights, ns) - io_view_running = false return end @@ -754,7 +737,6 @@ function M.run_io_view(test_indices_arg, debug, mode) local combined = cache.get_combined_test(platform, contest_id, problem_id) if not combined then logger.log('No combined test found', vim.log.levels.ERROR) - io_view_running = false return end @@ -763,21 +745,18 @@ function M.run_io_view(test_indices_arg, debug, mode) run.run_combined_test(debug, function(result) if not result then logger.log('Failed to run combined test', vim.log.levels.ERROR) - io_view_running = false return end if vim.api.nvim_buf_is_valid(io_state.output_buf) then render_io_view_results(io_state, test_indices, mode, result, combined.input) end - io_view_running = false end) else run.run_all_test_cases(test_indices, debug, nil, function() if vim.api.nvim_buf_is_valid(io_state.output_buf) then render_io_view_results(io_state, test_indices, mode, nil, nil) end - io_view_running = false end) end end) @@ -880,9 +859,6 @@ function M.toggle_panel(panel_opts) end local function refresh_panel() - if state.get_active_panel() ~= 'run' then - return - end if not test_buffers.tab_buf or not vim.api.nvim_buf_is_valid(test_buffers.tab_buf) then return end @@ -908,10 +884,6 @@ function M.toggle_panel(panel_opts) vim.cmd.normal({ 'zz', bang = true }) end) end - - if test_windows.tab_win and vim.api.nvim_win_is_valid(test_windows.tab_win) then - vim.api.nvim_set_current_win(test_windows.tab_win) - end end local function navigate_test_case(delta) @@ -970,9 +942,6 @@ function M.toggle_panel(panel_opts) local function finalize_panel() vim.schedule(function() - if state.get_active_panel() ~= 'run' then - return - end if config.ui.ansi then require('cp.ui.ansi').setup_highlight_groups() end diff --git a/lua/cp/utils.lua b/lua/cp/utils.lua index 654c2ef..c2f353a 100644 --- a/lua/cp/utils.lua +++ b/lua/cp/utils.lua @@ -262,8 +262,4 @@ function M.cwd_executables() return out end -function M.ensure_dirs() - vim.system({ 'mkdir', '-p', 'build', 'io' }):wait() -end - return M diff --git a/new b/new deleted file mode 100644 index e69de29..0000000