diff --git a/.config/nvim/lsp/clangd.lua b/.config/nvim/lsp/clangd.lua index faa6589..66643a3 100644 --- a/.config/nvim/lsp/clangd.lua +++ b/.config/nvim/lsp/clangd.lua @@ -57,6 +57,61 @@ local function symbol_info() end, bufnr) end +local function find_build_buf() + for _, buf in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_is_valid(buf) and vim.api.nvim_get_option_value('buftype', { buf = buf }) == 'terminal' then + local ok, val = pcall(vim.api.nvim_buf_get_var, buf, 'is_build_term') + if ok and val then + return buf + end + end + end + return -1 +end + +local function compile_project() + local orig_win = vim.api.nvim_get_current_win() + local build_buf = find_build_buf() + local build_win = -1 + + if build_buf == -1 then + vim.cmd('botright vsplit') + -- vim.cmd('vertical resize ' .. math.floor(vim.o.columns * 0.395)) + vim.cmd('vertical resize ' .. math.floor(vim.o.columns * 0.46)) + build_win = vim.api.nvim_get_current_win() + vim.cmd('terminal') + build_buf = vim.api.nvim_get_current_buf() + vim.api.nvim_buf_set_var(build_buf, 'is_build_term', true) + vim.opt_local.bufhidden = 'delete' + else + vim.cmd("CompileClose") + compile_project() + return + -- build_win = vim.fn.bufwinid(build_buf) + -- if build_win == -1 then + -- vim.cmd('botright vsplit') + -- build_win = vim.api.nvim_get_current_win() + -- vim.api.nvim_win_set_buf(build_win, build_buf) + -- end + end + + vim.api.nvim_set_current_win(build_win) + local chan = vim.api.nvim_buf_get_var(build_buf, 'terminal_job_id') + vim.api.nvim_chan_send(chan, 'clear && ./build.sh krypton\n') + vim.api.nvim_set_current_win(orig_win) +end + +vim.api.nvim_create_user_command("CompileClose", function() + local build_buf = find_build_buf() + if build_buf ~= -1 then + local chan = vim.api.nvim_buf_get_var(build_buf, 'terminal_job_id') + vim.fn.jobstop(chan) + vim.api.nvim_buf_delete(build_buf, { force = true }) + end +end, {}) + +vim.keymap.set({ 'i', 'n', 'v' }, '', 'CompileClosewqa') + return { cmd = { 'clangd', @@ -98,6 +153,7 @@ return { symbol_info() end, { desc = 'Show symbol info' }) + vim.keymap.set('n', '', compile_project, { desc = '[H]eader and Source Switcher' }) vim.keymap.set('n', 'h', 'ClangdSwitchSourceHeader', { desc = '[H]eader and Source Switcher' }) vim.keymap.set('n', 'K', 'lua require("pretty_hover").hover()', { desc = 'Documentation Hover' }) -- TODO: do I need pretty_hover? maybe that's what causes issues? diff --git a/.config/nvim/lua/autocmds.lua b/.config/nvim/lua/autocmds.lua index 608708b..190e4e4 100644 --- a/.config/nvim/lua/autocmds.lua +++ b/.config/nvim/lua/autocmds.lua @@ -14,7 +14,7 @@ vim.api.nvim_create_autocmd('BufEnter', { desc = 'Disable newlines on commented lines from continuing the comment', group = augroup('disable-comments-continuation'), callback = function() - vim.opt_local.formatoptions:remove('r') -- no comments on enter + -- vim.opt_local.formatoptions:remove('r') -- no comments on enter vim.opt_local.formatoptions:remove('o') -- no comments on `o` or `O` end, }) @@ -266,3 +266,41 @@ vim.api.nvim_create_autocmd({ 'VimEnter', 'BufRead', 'BufWinEnter', 'BufWritePos RenderTodoHighlights(bufnr) end, }) + +function Jump_to_error(focus) + local line = vim.api.nvim_get_current_line() + local path, lnum, col = line:match('([^:]+):(%d+):(%d+):') + if not (path and lnum) then + vim.cmd('normal! gd') + return + end + + local main_win = nil + for _, win in ipairs(vim.api.nvim_list_wins()) do + local buf = vim.api.nvim_win_get_buf(win) + if vim.api.nvim_buf_get_option(buf, 'buftype') ~= 'terminal' then + main_win = win + break + end + end + + if main_win then + vim.api.nvim_win_call(main_win, function() + vim.cmd('edit ' .. path) + vim.api.nvim_win_set_cursor(0, { tonumber(lnum), tonumber(col) - 1 }) + end) + if focus then + vim.api.nvim_set_current_win(main_win) + end + else + vim.cmd('edit ' .. path) + vim.api.nvim_win_set_cursor(0, { tonumber(lnum), tonumber(col) - 1 }) + end +end + +vim.api.nvim_create_autocmd('TermOpen', { + callback = function(args) + vim.api.nvim_buf_set_keymap(args.buf, 'n', 'gd', 'lua Jump_to_error(true)', { noremap = true, silent = true }) + vim.api.nvim_buf_set_keymap(args.buf, 'n', 'go', 'lua Jump_to_error(false)', { noremap = true, silent = true }) + end, +})