Merge pull request #36 from barrett-ruth/feat/diff

deprecate diff mode
This commit is contained in:
Barrett Ruth 2025-09-15 23:58:09 +02:00 committed by GitHub
commit 815522f8dc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 8 additions and 119 deletions

View file

@ -55,9 +55,6 @@ 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.
Navigation Commands ~
: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: >
:CP debug
<
6. Compare output visually: >
:CP diff
<
7. Move to next problem: >
6. Move to next problem: >
:CP next
< This automatically sets up problem B
8. Continue solving problems with :CP next/:CP prev navigation
9. Submit solutions on AtCoder website
7. Continue solving problems with :CP next/:CP prev navigation
8. Submit solutions on AtCoder website
Example: Quick setup for single Codeforces problem >
:CP codeforces 1933 a " One command setup

View file

@ -23,16 +23,14 @@ local state = {
platform = nil,
contest_id = nil,
problem_id = nil,
diff_mode = false,
saved_layout = nil,
saved_session = nil,
temp_output = nil,
test_cases = nil,
test_states = {},
}
local platforms = { "atcoder", "codeforces", "cses" }
local actions = { "run", "debug", "diff", "next", "prev" }
local actions = { "run", "debug", "next", "prev" }
local function set_platform(platform)
if not vim.tbl_contains(platforms, platform) then
@ -66,19 +64,6 @@ local function setup_problem(contest_id, problem_id, language)
)
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")
state.contest_id = contest_id
@ -207,61 +192,6 @@ local function debug_problem()
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 language? string
local function navigate_problem(delta, language)
@ -396,8 +326,6 @@ function M.handle_command(opts)
run_problem()
elseif cmd.action == "debug" then
debug_problem()
elseif cmd.action == "diff" then
diff_problem()
elseif cmd.action == "next" then
navigate_problem(1, cmd.language)
elseif cmd.action == "prev" then

View file

@ -122,42 +122,6 @@ function M.restore_layout(state, tile_fn)
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 input_buf integer
---@param output_buf integer

View file

@ -4,7 +4,7 @@ end
vim.g.loaded_cp = 1
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)
local cp = require("cp")

View file

@ -62,6 +62,7 @@ follows:
## Similar Projects
- [competitest.nvim](https://github.com/xeluxee/competitest.nvim)
- [assistant.nvim](https://github.com/A7Lavinraj/assistant.nvim)
## TODO
@ -70,3 +71,5 @@ follows:
- test case management
- USACO support
- 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