-
Notifications
You must be signed in to change notification settings - Fork 27
/
session.lua
107 lines (94 loc) · 2.52 KB
/
session.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
local api = vim.api
local fn = vim.fn
local list = require('bqf.qfwin.list')
local utils = require('bqf.utils')
local function isNormalWinType(winid)
return fn.win_gettype(winid) == ''
end
---
---@param winid number
---@param qlist BqfQfList
---@return number
local function getPwinid(winid, qlist)
local pwinid
if qlist.type == 'loc' then
pwinid = qlist.filewinid > 0 and qlist.filewinid or -1
else
local function isValid(wid)
return wid > 0 and isNormalWinType(wid)
end
pwinid = fn.win_getid(fn.winnr('#'))
if not isValid(pwinid) then
local tabpage = api.nvim_win_get_tabpage(winid)
for _, owinid in ipairs(api.nvim_tabpage_list_wins(tabpage)) do
if isNormalWinType(owinid) then
pwinid = owinid
break
end
end
end
if not isValid(pwinid) then
pwinid = -1
end
end
return pwinid
end
---
---@class BqfQfSession
---@field private pool table<number, BqfQfSession>
---@field private _list BqfQfList
---@field private _pwinid number
---@field winid number
local QfSession = {pool = {}}
function QfSession:list()
return self._list
end
function QfSession:previousWinid()
if not utils.isWinValid(self._pwinid) or fn.win_gettype(self._pwinid) ~= '' then
self._pwinid = getPwinid(self.winid, self._list)
end
return utils.isWinValid(self._pwinid) and self._pwinid or -1
end
function QfSession:validate()
local winType = fn.win_gettype(self.winid)
return winType == 'quickfix' or winType == 'loclist'
end
---
---@param winid number
---@return BqfQfSession?
function QfSession:new(winid)
local obj = {}
setmetatable(obj, self)
self.__index = self
obj.winid = winid
obj._list = list:get(winid)
if not obj._list then
return nil
end
obj._list:sign():reset()
obj._pwinid = getPwinid(winid, obj._list)
self.pool[winid] = obj
return obj
end
---
---@param winid? number
---@return BqfQfSession
function QfSession:get(winid)
winid = winid or api.nvim_get_current_win()
return self.pool[winid]
end
function QfSession:saveWinView(winid)
if winid then
local obj = self.pool[winid]
local wv = utils.winCall(winid, fn.winsaveview)
obj:list():setWinView(wv)
end
end
function QfSession:dispose()
for wId in pairs(self.pool) do
if not utils.isWinValid(wId) then
QfSession.pool[wId] = nil
end
end
end
return QfSession