canola.nvim/lua/oil/ringbuf.lua
Steven Arcangeli e045ee3b4e 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.
2024-03-12 15:57:57 -07:00

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