feat(doc): update docs with language config

This commit is contained in:
Barrett Ruth 2025-09-15 08:16:41 -05:00
parent 1ef68a4847
commit 2b13676024
3 changed files with 52 additions and 18 deletions

View file

@ -9,12 +9,13 @@ cp.nvim is a competitive programming plugin that automates problem setup,
compilation, and testing workflow for online judges.
Supported platforms: AtCoder, Codeforces, CSES
Supported languages: C++, Python
REQUIREMENTS *cp-requirements*
- Neovim 0.10.0+
- uv package manager (https://docs.astral.sh/uv/)
- C++ compiler (g++/clang++)
- Language runtime/compiler (g++, python3)
Optional:
- LuaSnip for template expansion (https://github.com/L3MON4D3/LuaSnip)
@ -51,8 +52,8 @@ Action Commands ~
:CP debug Compile with debug flags and run current problem.
Includes sanitizers and debug symbols.
:CP diff Enter diff mode to compare actual vs expected
output. Run again to exit diff mode.
:CP test Open enhanced test viewer showing individual
test case results with pass/fail status.
Navigation Commands ~

View file

@ -7,10 +7,6 @@ local filetype_to_language = {
c = "cpp",
py = "python",
py3 = "python",
rs = "rust",
java = "java",
js = "javascript",
go = "go",
}
local function get_language_from_file(source_file)
@ -138,20 +134,36 @@ end
function M.run_problem(ctx, contest_config, is_debug)
ensure_directories()
local flags = is_debug and contest_config.debug_flags or contest_config.compile_flags
local language = get_language_from_file(ctx.source_file)
local language_config = contest_config[language]
local compile_result = compile_cpp(ctx.source_file, ctx.binary_file, flags)
if compile_result.code ~= 0 then
vim.fn.writefile({ compile_result.stderr }, ctx.output_file)
if not language_config then
vim.fn.writefile({ "Error: No configuration for language: " .. language }, ctx.output_file)
return
end
local substitutions = {
source = ctx.source_file,
binary = ctx.binary_file,
version = tostring(language_config.version or ""),
}
local compile_cmd = is_debug and language_config.debug or language_config.compile
if compile_cmd then
local compile_result = compile_generic(language_config, substitutions)
if compile_result.code ~= 0 then
vim.fn.writefile({ compile_result.stderr }, ctx.output_file)
return
end
end
local input_data = ""
if vim.fn.filereadable(ctx.input_file) == 1 then
input_data = table.concat(vim.fn.readfile(ctx.input_file), "\n") .. "\n"
end
local exec_result = execute_binary(ctx.binary_file, input_data, contest_config.timeout_ms)
local run_cmd = build_command(language_config.run, language_config.executable, substitutions)
local exec_result = execute_command(run_cmd, input_data, contest_config.timeout_ms)
local formatted_output = format_output(exec_result, ctx.expected_file, is_debug)
local output_buf = vim.fn.bufnr(ctx.output_file)
@ -172,18 +184,38 @@ function M.run_individual_tests(ctx, test_cases, contest_config, is_debug)
return {}
end
local flags = is_debug and contest_config.debug_flags or contest_config.compile_flags
local compile_result = compile_cpp(ctx.source_file, ctx.binary_file, flags)
if compile_result.code ~= 0 then
local language = get_language_from_file(ctx.source_file)
local language_config = contest_config[language]
if not language_config then
return {
compile_error = compile_result.stderr,
compile_error = "Error: No configuration for language: " .. language,
results = {},
}
end
local substitutions = {
source = ctx.source_file,
binary = ctx.binary_file,
version = tostring(language_config.version or ""),
}
local compile_cmd = is_debug and language_config.debug or language_config.compile
if compile_cmd then
local compile_result = compile_generic(language_config, substitutions)
if compile_result.code ~= 0 then
return {
compile_error = compile_result.stderr,
results = {},
}
end
end
local run_cmd = build_command(language_config.run, language_config.executable, substitutions)
local results = {}
for i, test_case in ipairs(test_cases) do
local exec_result = execute_binary(ctx.binary_file, test_case.input, contest_config.timeout_ms)
local exec_result = execute_command(run_cmd, test_case.input, contest_config.timeout_ms)
local actual_lines = vim.split(exec_result.stdout, "\n")
while #actual_lines > 0 and actual_lines[#actual_lines] == "" do

View file

@ -9,9 +9,10 @@ https://private-user-images.githubusercontent.com/62671086/489116291-391976d1-c2
## Features
- Support for multiple online judges ([AtCoder](https://atcoder.jp/), [Codeforces](https://codeforces.com/), [CSES](https://cses.fi))
- Multi-language support (C++, Python)
- Automatic problem scraping and test case management
- Integrated build, run, and debug commands
- Diff mode for comparing output with expected results
- Enhanced test viewer with individual test case management
- LuaSnip integration for contest-specific snippets
## Requirements