diff --git a/lua/bqf/qfwin/handler.lua b/lua/bqf/qfwin/handler.lua index 567bcc7..921ffc5 100644 --- a/lua/bqf/qfwin/handler.lua +++ b/lua/bqf/qfwin/handler.lua @@ -225,12 +225,51 @@ local function doEdit(qwinid, idx, close, action) return true end +local function doNativeOpen(qwinid, idx, close) + qwinid = qwinid or api.nvim_get_current_win() + local qs = qfs:get(qwinid) + local pwinid = qs:previousWinid() + local qlist = qs:list() + local size = qlist:getQfList({size = 0}).size + if size <= 0 then + api.nvim_err_writeln('E42: No Errors') + return false + end + if not utils.isWinValid(pwinid) then + vim.notify('file window is invalid', vim.log.levels.WARN) + cmd([[exe "norm! \"]]) + api.nvim_win_set_height(qwinid, math.min(10, size)) + return false + end + + idx = idx or api.nvim_win_get_cursor(qwinid)[1] + qlist:changeIdx(idx) + local entry = qlist:item(idx) + if entry.bufnr == 0 then + api.nvim_err_writeln('Buffer not found') + return false + end + + utils.winCall(qwinid, function() + pcall(api.nvim_win_set_cursor, qwinid, {idx, 0}) + cmd(('silent keepjumps %s'):format(qlist.type == 'loc' and '.ll' or '.cc')) + end) + + if close and utils.isWinValid(qwinid) then + pcall(api.nvim_win_close, qwinid, true) + end + return true +end + --- ---@param close boolean ---@param jumpCmd boolean ---@param qwinid number ---@param idx number function M.open(close, jumpCmd, qwinid, idx) + if not jumpCmd then + return doNativeOpen(qwinid, idx, close) + end doEdit(qwinid, idx, close, function(bufnr) if jumpCmd then local fname = fn.fnameescape(api.nvim_buf_get_name(bufnr))