local vt100=require("vt100") local rules=vt100.rules rules[{"%[","%?","7","[hl]"}]=function(window,_,_,_,nowrap) window.nowrap=nowrap=="l" end local function set_cursor(window,x,y) window.x=math.min(math.max(x,1),window.width) window.y=math.min(math.max(y,1),window.height) end rules[{"%[","%d*","[ABCD]"}]=function(window,_,n,dir) local dx,dy=0,0 n=tonumber(n)or 1 if dir=="A"then dy=-n elseif dir=="B"then dy=n elseif dir=="C"then dx=n else dx=-n end set_cursor(window,window.x+dx,window.y+dy) end rules[{"%[","%d*",";","%d*","[Hf]"}]=function(window,_,y,_,x) set_cursor(window,tonumber(x)or 1,tonumber(y)or 1) end rules[{"%[[Hf]"}]=function(window) set_cursor(window,1,1) end local function clear_line(window,_,n) n=tonumber(n)or 0 local x=(n==0 and window.x or 1) local rep=n==1 and window.x or(window.width-x+1) window.gpu.fill(x+window.dx,window.y+window.dy,rep,1," ") end rules[{"%[","[012]?","K"}]=clear_line rules[{"%[","[012]?","J"}]=function(window,_,n) clear_line(window,_,n) n=tonumber(n)or 0 local y=n==0 and(window.y+1)or 1 local rep=n==1 and(window.y-1)or(window.height) window.gpu.fill(1+window.dx,y+window.dy,window.width,rep," ") end rules[{"%[","6","n"}]=function(window) io.stdin.bufferRead=string.format("%s%s[%d;%dR",io.stdin.bufferRead,string.char(0x1b),window.y,window.x) end rules[{"[DEM]"}]=function(window,_,dir) if dir=="D"then window.y=window.y+1 elseif dir=="E"then window.y=window.y+1 window.x=1 else window.y=window.y-1 end end