From f83b8c999c24d2fa72801a3b0e0009dd512a637d Mon Sep 17 00:00:00 2001 From: XeonSquared Date: Fri, 29 Sep 2023 10:15:25 +1000 Subject: [PATCH] fix lines longer than the screen causing weird scrolling artifacts, and avoid superfluous history entries --- module/buffer.lua | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/module/buffer.lua b/module/buffer.lua index 7ecbb72..4135662 100644 --- a/module/buffer.lua +++ b/module/buffer.lua @@ -257,11 +257,20 @@ function buffer:read(...) end end else - -- ????? - io.write("\27[s\27[8m") - local pos, buffer, hIndex = 1, "", 0 + -- this whole thing is a house of cards. good luck. + io.write("\27[s\27[8m\27[6n") + if not (self.mx or self.my) then + io.write("\27[9999;9999H\27[6n") + end + local pos, buffer, hIndex, sx, sy = 1, "", 0 self.history = self.history or {} local function redraw() + -- scroll until the buffer will fit on the screen + while sx and sy and self.mx and self.my and #buffer > (self.mx * ((self.my - sy) + 1)) - sx do + sy = sy - 1 + io.write("\27[9999;9999H ") + io.write(string.format("\27[2K\27[%i;%iH\27[s", sx, sy)) + end io.write(string.format("\27[u%s \27[u\27[%iC",buffer,(#buffer-pos)+1)) end while true do @@ -300,6 +309,9 @@ function buffer:read(...) end buffer = self.history[1+#self.history-hIndex] or buffer pos = 1 + elseif char == "R" then -- cursor position report + self.mx, self.my = sx and math.max(self.mx or 0, args[1]) or self.mx, sy and math.max(self.my or 0, args[2]) or self.my + sx, sy = sx or args[1], sy or args[2] end hIndex = math.max(math.min(hIndex,#self.history),0) end @@ -321,7 +333,7 @@ function buffer:read(...) pos = (nc and #buffer-nc+2) or 1 elseif char == "\13" or char == "\10" or char == "\n" then -- return / newline io.write("\n") - self.history[#self.history+1] = buffer + self.history[#self.history+1] = buffer ~= "" and buffer ~= self.history[#self.history] and buffer or nil if #self.history > (self.maxhistory or 16) then table.remove(self.history,1) end if chop then buffer = buffer .. "\n" end return buffer