commit
815522f8dc
5 changed files with 8 additions and 119 deletions
12
doc/cp.txt
12
doc/cp.txt
|
|
@ -55,9 +55,6 @@ Action Commands ~
|
||||||
:CP debug Compile with debug flags and run current problem.
|
:CP debug Compile with debug flags and run current problem.
|
||||||
Includes sanitizers and debug symbols.
|
Includes sanitizers and debug symbols.
|
||||||
|
|
||||||
:CP diff Enter diff mode to compare actual vs expected
|
|
||||||
output. Run again to exit diff mode.
|
|
||||||
|
|
||||||
Navigation Commands ~
|
Navigation Commands ~
|
||||||
|
|
||||||
:CP next Navigate to next problem in current contest.
|
:CP next Navigate to next problem in current contest.
|
||||||
|
|
@ -241,15 +238,12 @@ Example: Setting up and solving AtCoder contest ABC324
|
||||||
5. If needed, debug: >
|
5. If needed, debug: >
|
||||||
:CP debug
|
:CP debug
|
||||||
<
|
<
|
||||||
6. Compare output visually: >
|
6. Move to next problem: >
|
||||||
:CP diff
|
|
||||||
<
|
|
||||||
7. Move to next problem: >
|
|
||||||
:CP next
|
:CP next
|
||||||
< This automatically sets up problem B
|
< This automatically sets up problem B
|
||||||
|
|
||||||
8. Continue solving problems with :CP next/:CP prev navigation
|
7. Continue solving problems with :CP next/:CP prev navigation
|
||||||
9. Submit solutions on AtCoder website
|
8. Submit solutions on AtCoder website
|
||||||
|
|
||||||
Example: Quick setup for single Codeforces problem >
|
Example: Quick setup for single Codeforces problem >
|
||||||
:CP codeforces 1933 a " One command setup
|
:CP codeforces 1933 a " One command setup
|
||||||
|
|
|
||||||
|
|
@ -23,16 +23,14 @@ local state = {
|
||||||
platform = nil,
|
platform = nil,
|
||||||
contest_id = nil,
|
contest_id = nil,
|
||||||
problem_id = nil,
|
problem_id = nil,
|
||||||
diff_mode = false,
|
|
||||||
saved_layout = nil,
|
saved_layout = nil,
|
||||||
saved_session = nil,
|
saved_session = nil,
|
||||||
temp_output = nil,
|
|
||||||
test_cases = nil,
|
test_cases = nil,
|
||||||
test_states = {},
|
test_states = {},
|
||||||
}
|
}
|
||||||
|
|
||||||
local platforms = { "atcoder", "codeforces", "cses" }
|
local platforms = { "atcoder", "codeforces", "cses" }
|
||||||
local actions = { "run", "debug", "diff", "next", "prev" }
|
local actions = { "run", "debug", "next", "prev" }
|
||||||
|
|
||||||
local function set_platform(platform)
|
local function set_platform(platform)
|
||||||
if not vim.tbl_contains(platforms, platform) then
|
if not vim.tbl_contains(platforms, platform) then
|
||||||
|
|
@ -66,19 +64,6 @@ local function setup_problem(contest_id, problem_id, language)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
if state.diff_mode then
|
|
||||||
vim.cmd.diffoff()
|
|
||||||
if state.saved_session then
|
|
||||||
vim.fn.delete(state.saved_session)
|
|
||||||
state.saved_session = nil
|
|
||||||
end
|
|
||||||
if state.temp_output then
|
|
||||||
vim.fn.delete(state.temp_output)
|
|
||||||
state.temp_output = nil
|
|
||||||
end
|
|
||||||
state.diff_mode = false
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.cmd("silent only")
|
vim.cmd("silent only")
|
||||||
|
|
||||||
state.contest_id = contest_id
|
state.contest_id = contest_id
|
||||||
|
|
@ -207,61 +192,6 @@ local function debug_problem()
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function diff_problem()
|
|
||||||
if state.diff_mode then
|
|
||||||
vim.cmd.diffoff()
|
|
||||||
if state.saved_session then
|
|
||||||
vim.cmd(("source %s"):format(state.saved_session))
|
|
||||||
vim.fn.delete(state.saved_session)
|
|
||||||
state.saved_session = nil
|
|
||||||
end
|
|
||||||
if state.temp_output then
|
|
||||||
vim.fn.delete(state.temp_output)
|
|
||||||
state.temp_output = nil
|
|
||||||
end
|
|
||||||
state.diff_mode = false
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local problem_id = get_current_problem()
|
|
||||||
if not problem_id then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local ctx = problem.create_context(state.platform, state.contest_id, state.problem_id, config)
|
|
||||||
|
|
||||||
if vim.fn.filereadable(ctx.expected_file) == 0 then
|
|
||||||
logger.log("no expected output file found", vim.log.levels.WARN)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if vim.fn.filereadable(ctx.output_file) == 0 then
|
|
||||||
logger.log("no output file found. run the problem first", vim.log.levels.WARN)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local output_lines = vim.fn.readfile(ctx.output_file)
|
|
||||||
local actual_output = {}
|
|
||||||
for i = 1, #output_lines do
|
|
||||||
if output_lines[i]:match("^%[code%]:") then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
table.insert(actual_output, output_lines[i])
|
|
||||||
end
|
|
||||||
|
|
||||||
state.temp_output = vim.fn.tempname()
|
|
||||||
vim.fn.writefile(actual_output, state.temp_output)
|
|
||||||
|
|
||||||
state.saved_session = vim.fn.tempname()
|
|
||||||
vim.cmd(("mksession! %s"):format(state.saved_session))
|
|
||||||
|
|
||||||
vim.cmd("silent only")
|
|
||||||
vim.cmd(("edit %s"):format(state.temp_output))
|
|
||||||
vim.cmd.diffthis()
|
|
||||||
vim.cmd(("vertical diffsplit %s"):format(ctx.expected_file))
|
|
||||||
state.diff_mode = true
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param delta number 1 for next, -1 for prev
|
---@param delta number 1 for next, -1 for prev
|
||||||
---@param language? string
|
---@param language? string
|
||||||
local function navigate_problem(delta, language)
|
local function navigate_problem(delta, language)
|
||||||
|
|
@ -396,8 +326,6 @@ function M.handle_command(opts)
|
||||||
run_problem()
|
run_problem()
|
||||||
elseif cmd.action == "debug" then
|
elseif cmd.action == "debug" then
|
||||||
debug_problem()
|
debug_problem()
|
||||||
elseif cmd.action == "diff" then
|
|
||||||
diff_problem()
|
|
||||||
elseif cmd.action == "next" then
|
elseif cmd.action == "next" then
|
||||||
navigate_problem(1, cmd.language)
|
navigate_problem(1, cmd.language)
|
||||||
elseif cmd.action == "prev" then
|
elseif cmd.action == "prev" then
|
||||||
|
|
|
||||||
|
|
@ -122,42 +122,6 @@ function M.restore_layout(state, tile_fn)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param actual_output string
|
|
||||||
---@param expected_output string
|
|
||||||
---@param input_file string
|
|
||||||
function M.setup_diff_layout(actual_output, expected_output, input_file)
|
|
||||||
vim.validate({
|
|
||||||
actual_output = { actual_output, "string" },
|
|
||||||
expected_output = { expected_output, "string" },
|
|
||||||
input_file = { input_file, "string" },
|
|
||||||
})
|
|
||||||
|
|
||||||
vim.cmd.diffoff()
|
|
||||||
vim.cmd("silent only")
|
|
||||||
|
|
||||||
local output_lines = vim.split(actual_output, "\n")
|
|
||||||
local output_buf = vim.api.nvim_create_buf(false, true)
|
|
||||||
vim.api.nvim_buf_set_lines(output_buf, 0, -1, false, output_lines)
|
|
||||||
vim.bo[output_buf].filetype = "cp"
|
|
||||||
|
|
||||||
vim.cmd.edit()
|
|
||||||
vim.api.nvim_set_current_buf(output_buf)
|
|
||||||
M.clearcol()
|
|
||||||
vim.cmd.diffthis()
|
|
||||||
|
|
||||||
vim.cmd.vsplit(expected_output)
|
|
||||||
vim.bo.filetype = "cp"
|
|
||||||
M.clearcol()
|
|
||||||
vim.cmd.diffthis()
|
|
||||||
|
|
||||||
vim.cmd.wincmd("h")
|
|
||||||
vim.cmd(("botright split %s"):format(input_file))
|
|
||||||
vim.bo.filetype = "cp"
|
|
||||||
M.clearcol()
|
|
||||||
vim.cmd(("resize %d"):format(math.floor(vim.o.lines * 0.3)))
|
|
||||||
vim.cmd.wincmd("k")
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param source_buf integer
|
---@param source_buf integer
|
||||||
---@param input_buf integer
|
---@param input_buf integer
|
||||||
---@param output_buf integer
|
---@param output_buf integer
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ end
|
||||||
vim.g.loaded_cp = 1
|
vim.g.loaded_cp = 1
|
||||||
|
|
||||||
local platforms = { "atcoder", "codeforces", "cses" }
|
local platforms = { "atcoder", "codeforces", "cses" }
|
||||||
local actions = { "run", "debug", "diff", "next", "prev" }
|
local actions = { "run", "debug", "next", "prev" }
|
||||||
|
|
||||||
vim.api.nvim_create_user_command("CP", function(opts)
|
vim.api.nvim_create_user_command("CP", function(opts)
|
||||||
local cp = require("cp")
|
local cp = require("cp")
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ follows:
|
||||||
## Similar Projects
|
## Similar Projects
|
||||||
|
|
||||||
- [competitest.nvim](https://github.com/xeluxee/competitest.nvim)
|
- [competitest.nvim](https://github.com/xeluxee/competitest.nvim)
|
||||||
|
- [assistant.nvim](https://github.com/A7Lavinraj/assistant.nvim)
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
|
|
@ -70,3 +71,5 @@ follows:
|
||||||
- test case management
|
- test case management
|
||||||
- USACO support
|
- USACO support
|
||||||
- new video with functionality, notify discord members
|
- new video with functionality, notify discord members
|
||||||
|
- note that codeforces support is scuffed: https://codeforces.com/blog/entry/146423
|
||||||
|
- codeforces: use round number & api not the contest id
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue