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.
37 lines
734 B
Lua
37 lines
734 B
Lua
---@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
|