From 5250b7a01986c9a71d8cf5ff4b7038d7a695db9d Mon Sep 17 00:00:00 2001 From: Barrett Ruth Date: Fri, 12 Sep 2025 15:48:12 -0500 Subject: [PATCH] feat: snippets and more --- lua/cp/execute.lua | 6 ++--- lua/cp/init.lua | 18 +++++++++++-- lua/cp/snippets.lua | 65 +++++++++++++++++++++++++++++++++++++++++---- readme.md | 2 ++ 4 files changed, 81 insertions(+), 10 deletions(-) diff --git a/lua/cp/execute.lua b/lua/cp/execute.lua index f4d0d78..e37c296 100644 --- a/lua/cp/execute.lua +++ b/lua/cp/execute.lua @@ -50,7 +50,7 @@ local function execute_binary(binary_path, input_data, timeout_ms) } end -local function format_output(exec_result, expected_file) +local function format_output(exec_result, expected_file, is_debug) local lines = { exec_result.stdout } if exec_result.timed_out then @@ -63,7 +63,7 @@ local function format_output(exec_result, expected_file) end table.insert(lines, ("\n[time]: %.2f ms"):format(exec_result.time_ms)) - table.insert(lines, "\n[debug]: false") + table.insert(lines, ("\n[debug]: %s"):format(is_debug and "true" or "false")) if vim.fn.filereadable(expected_file) == 1 and exec_result.code == 0 then local expected_content = vim.fn.readfile(expected_file) @@ -103,7 +103,7 @@ function M.run_problem(problem_id, contest_config, is_debug) end local exec_result = execute_binary(paths.binary, input_data, contest_config.timeout_ms) - local formatted_output = format_output(exec_result, paths.expected) + local formatted_output = format_output(exec_result, paths.expected, is_debug) vim.fn.writefile(vim.split(formatted_output, "\n"), paths.output) end diff --git a/lua/cp/init.lua b/lua/cp/init.lua index 0660712..d3d1aa3 100644 --- a/lua/cp/init.lua +++ b/lua/cp/init.lua @@ -12,7 +12,7 @@ local function log(msg, level) end if not vim.fn.has("nvim-0.10.0") then - log("cp.nvim requires Neovim 0.10.0+", vim.log.levels.ERROR) + log("cp.nvim requires nvim-0.10.0+", vim.log.levels.ERROR) return M end @@ -105,7 +105,21 @@ local function setup_problem(problem_id, problem_letter) vim.cmd.e(filename) if vim.api.nvim_buf_get_lines(0, 0, -1, true)[1] == "" then - vim.api.nvim_input(("i%s"):format(vim.g.cp_contest)) + local has_luasnip, luasnip = pcall(require, "luasnip") + if has_luasnip then + vim.api.nvim_buf_set_lines(0, 0, -1, false, { vim.g.cp_contest }) + vim.api.nvim_win_set_cursor(0, { 1, #vim.g.cp_contest }) + vim.cmd.startinsert({ bang = true }) + + vim.schedule(function() + if luasnip.expandable() then + luasnip.expand() + end + vim.cmd.stopinsert() + end) + else + vim.api.nvim_input(("i%s"):format(vim.g.cp_contest)) + end end vim.api.nvim_set_option_value("winbar", "", { scope = "local" }) diff --git a/lua/cp/snippets.lua b/lua/cp/snippets.lua index 4025324..a20fd00 100644 --- a/lua/cp/snippets.lua +++ b/lua/cp/snippets.lua @@ -3,18 +3,73 @@ local M = {} function M.setup(config) local has_luasnip, luasnip = pcall(require, "luasnip") if not has_luasnip then + vim.notify("[cp.nvim]: LuaSnip not available - snippets disabled", vim.log.levels.INFO) return end - local snippets = {} + local s = luasnip.snippet + local i = luasnip.insert_node + local fmt = require("luasnip.extras.fmt").fmt + local default_snippets = { + s( + "codeforces", + fmt( + [[void solve() {{ + {} +}} + +int main() {{ + std::cin.tie(nullptr)->sync_with_stdio(false); + + int tc = 1; + std::cin >> tc; + + for (int t = 0; t < tc; ++t) {{ + solve(); + }} + + return 0; +}}]], + { i(1) } + ) + ), + + s( + "atcoder", + fmt( + [[void solve() {{ + {} +}} + +int main() {{ + std::cin.tie(nullptr)->sync_with_stdio(false); + +#ifdef LOCAL + int tc; + std::cin >> tc; + + for (int t = 0; t < tc; ++t) {{ + solve(); + }} +#else + solve(); +#endif + + return 0; +}}]], + { i(1) } + ) + ), + } + + local user_snippets = {} for _, snippet in pairs(config.snippets or {}) do - table.insert(snippets, snippet) + table.insert(user_snippets, snippet) end - if #snippets > 0 then - luasnip.add_snippets("cpp", snippets) - end + local all_snippets = vim.list_extend(default_snippets, user_snippets) + luasnip.add_snippets("cpp", all_snippets) end return M diff --git a/readme.md b/readme.md index 9962669..002f713 100644 --- a/readme.md +++ b/readme.md @@ -41,6 +41,8 @@ Using [lazy.nvim](https://github.com/folke/lazy.nvim): ## TODO +- update templates to minimum vrsion that's comatible with scrapers (i.e. + aggregated testcases, ifdef local, etc.) - vimdocs - example video - more flexible setup (more of a question of philosophy)