fix: spurious exits from faulty :wq detection (#221)
The previous mechanism used histget() to get the last command or expression to detect if the user issued a `:wq` or similar. This had the issue where if a user issued a `:wq`, started vim again, then entered oil and saved via some mechanism that is _not_ a command (e.g. a keymap), we would incorrectly detect that `:wq` and exit after saving. The new mechanism tracks all keypresses and may end up with false negatives (e.g. ":wqaff<backspace><backspace>ll"), but those are less frustrating than false positives.
This commit is contained in:
parent
18dfd2458d
commit
e045ee3b4e
2 changed files with 52 additions and 4 deletions
37
lua/oil/ringbuf.lua
Normal file
37
lua/oil/ringbuf.lua
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
---@class oil.Ringbuf
|
||||
---@field private size integer
|
||||
---@field private tail integer
|
||||
---@field private buf string[]
|
||||
local Ringbuf = {}
|
||||
function Ringbuf.new(size)
|
||||
local self = setmetatable({
|
||||
size = size,
|
||||
buf = {},
|
||||
tail = 0,
|
||||
}, { __index = Ringbuf })
|
||||
return self
|
||||
end
|
||||
|
||||
---@param val string
|
||||
function Ringbuf:push(val)
|
||||
self.tail = self.tail + 1
|
||||
if self.tail > self.size then
|
||||
self.tail = 1
|
||||
end
|
||||
self.buf[self.tail] = val
|
||||
end
|
||||
|
||||
---@return string
|
||||
function Ringbuf:as_str()
|
||||
local postfix = ""
|
||||
for i = 1, self.tail, 1 do
|
||||
postfix = postfix .. self.buf[i]
|
||||
end
|
||||
local prefix = ""
|
||||
for i = self.tail + 1, #self.buf, 1 do
|
||||
prefix = prefix .. self.buf[i]
|
||||
end
|
||||
return prefix .. postfix
|
||||
end
|
||||
|
||||
return Ringbuf
|
||||
Loading…
Add table
Add a link
Reference in a new issue