term wrapping and sh tab completion fixes

term wrapping fixes
Backspacing or deleting during vertical wrap would not update the current end of line correctly what the text was being pulled from the next line

horizontal wrapping deletion was not using dx,dy and instead was removing text from absolute positions on the screen

horizontal wrapping was pushing spaces beyond the windowed areas
This commit is contained in:
payonel 2016-04-03 23:15:01 -07:00
parent 9535cad412
commit a9233e5bfc
2 changed files with 12 additions and 24 deletions

View File

@ -482,7 +482,7 @@ function --[[@delayloaded-start@]] sh.getMatchingPrograms(baseName)
baseName = "^(" .. text.escapeMagic(baseName) .. ".*)%.lua$" baseName = "^(" .. text.escapeMagic(baseName) .. ".*)%.lua$"
end end
for basePath in string.gmatch(os.getenv("PATH"), "[^:]+") do for basePath in string.gmatch(os.getenv("PATH"), "[^:]+") do
for file in fs.list(basePath) do for file in fs.list(shell.resolve(basePath)) do
local match = file:match(baseName) local match = file:match(baseName)
if match and not result_keys[match] then if match and not result_keys[match] then
table.insert(result, match) table.insert(result, match)

View File

@ -149,6 +149,7 @@ function term.internal.build_vertical_reader(input)
local win=_.w local win=_.w
local oi,w,h,dx,dy,ox,oy = _.index,term.getViewport(win) local oi,w,h,dx,dy,ox,oy = _.index,term.getViewport(win)
_:move(math.huge) _:move(math.huge)
_:move(-1)
local ex,ey=win.x,win.y local ex,ey=win.x,win.y
win.x,win.y,_.index=ox,oy,oi win.x,win.y,_.index=ox,oy,oi
x=oy==ey and ox or 1 x=oy==ey and ox or 1
@ -161,7 +162,7 @@ function term.internal.build_vertical_reader(input)
local ndata local ndata
if arg < 0 then if _.index<=0 then return end if arg < 0 then if _.index<=0 then return end
_:move(-1) _:move(-1)
ndata=unicode.wtrunc(s1,unicode.wlen(s1))..s2 ndata=unicode.sub(s1,1,-2)..s2
else if _.index>=unicode.len(_.data) then return end else if _.index>=unicode.len(_.data) then return end
s2=unicode.sub(s2,2) s2=unicode.sub(s2,2)
ndata=s1..s2 ndata=s1..s2
@ -324,12 +325,11 @@ function term.drawText(value, wrap, window)
local wlen_remaining = w - x + 1 local wlen_remaining = w - x + 1
local clean_end = "" local clean_end = ""
if wlen_remaining < wlen_needed then if wlen_remaining < wlen_needed then
if type(wrap)=="number" then next = unicode.wtrunc(next, wlen_remaining + 1)
next,wlen_needed,slen = term.internal.horizontal_push(x,y,window,wrap,next) wlen_needed = unicode.wlen(next)
else clean_end = (" "):rep(wlen_remaining-wlen_needed)
next = unicode.wtrunc(next, wlen_remaining + 1) if not wrap then
wlen_needed = unicode.wlen(next) si = math.huge
clean_end = (" "):rep(wlen_remaining-wlen_needed)
end end
end end
gpu.set(x+dx,y+dy,next..clean_end) gpu.set(x+dx,y+dy,next..clean_end)
@ -395,17 +395,6 @@ function --[[@delayloaded-start@]] term.internal.ctrl_movement(input, dir)
return last - index return last - index
end --[[@delayloaded-end@]] end --[[@delayloaded-end@]]
function --[[@delayloaded-start@]] term.internal.horizontal_push(x,y,win,wrap,next)
local gpu,w,h,dx,dy = win.gpu,term.getViewport(win)
local wlen_needed = unicode.wlen(next)
local next_width = math.min(wlen_needed, w - wrap)
next = unicode.sub(next, -next_width)
wlen_needed = unicode.wlen(next)
local xdiff = x - (w - wlen_needed)
gpu.copy(wrap+xdiff+dx,y+dy,x-(wrap+xdiff),1,-xdiff,0)
return next,wlen_needed,#next
end --[[@delayloaded-end@]]
function --[[@delayloaded-start@]] term.internal.onTouch(input,gx,gy) function --[[@delayloaded-start@]] term.internal.onTouch(input,gx,gy)
input:move(math.huge) input:move(math.huge)
local x2,y2,d = input.w.x,input.w.y,input.w.w local x2,y2,d = input.w.x,input.w.y,input.w.w
@ -418,7 +407,7 @@ function --[[@delayloaded-start@]] term.internal.build_horizontal_reader(input)
local w,h,dx,dy,x,y = term.getViewport(_.w) local w,h,dx,dy,x,y = term.getViewport(_.w)
local s1,s2=term.internal.split(_) local s1,s2=term.internal.split(_)
local wlen = math.min(unicode.wlen(s2),w-x+1) local wlen = math.min(unicode.wlen(s2),w-x+1)
_.w.gpu.fill(x,y,wlen,1," ") _.w.gpu.fill(x+dx,y+dy,wlen,1," ")
end end
input.move = function(_,n) input.move = function(_,n)
local win = _.w local win = _.w
@ -431,7 +420,7 @@ function --[[@delayloaded-start@]] term.internal.build_horizontal_reader(input)
_:scroll() _:scroll()
end end
input.draw = function(_,text) input.draw = function(_,text)
term.drawText(text,_.promptx) term.drawText(text,false)
end end
input.scroll = function(_) input.scroll = function(_)
local win = _.w local win = _.w
@ -450,9 +439,8 @@ function --[[@delayloaded-start@]] term.internal.build_horizontal_reader(input)
data = unicode.sub(data,1,i) data = unicode.sub(data,1,i)
local rev = unicode.reverse(data) local rev = unicode.reverse(data)
local ending = unicode.wtrunc(rev, available+1) local ending = unicode.wtrunc(rev, available+1)
local cut_wlen = unicode.wlen(data) - unicode.wlen(ending)
data = unicode.reverse(ending) data = unicode.reverse(ending)
gpu.set(sx,sy,data..blank:rep(cut_wlen)) gpu.set(sx,sy,data..blank)
win.x=math.min(w,_.promptx+unicode.wlen(data)) win.x=math.min(w,_.promptx+unicode.wlen(data))
elseif x < _.promptx then elseif x < _.promptx then
data = unicode.sub(data,_.index+1) data = unicode.sub(data,_.index+1)
@ -467,7 +455,7 @@ function --[[@delayloaded-start@]] term.internal.build_horizontal_reader(input)
local gpu,data,px=win.gpu,_.data,_.promptx local gpu,data,px=win.gpu,_.data,_.promptx
local w,h,dx,dy,x,y = term.getViewport(win) local w,h,dx,dy,x,y = term.getViewport(win)
_.index,_.data,win.x=0,"",px _.index,_.data,win.x=0,"",px
gpu.fill(px+dx,y+dy,w-px+1,1," ") gpu.fill(px+dx,y+dy,w-px+1-dx,1," ")
end end
end --[[@delayloaded-end@]] end --[[@delayloaded-end@]]