SHARE
TWEET

Quick Shell

Oeed Mar 28th, 2014 978 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local programArgs = {
  2.         ['rom/programs/cd'] = {'path'},
  3.         ['rom/programs/copy'] = {'source', 'destination'},
  4.         ['rom/programs/delete'] = {'path'},
  5.         ['rom/programs/edit'] = {'path'},
  6.         ['rom/programs/eject'] = {'side'},
  7.         ['rom/programs/gps'] = {'locate'},
  8.         ['rom/programs/help'] = {'topic'},
  9.         ['rom/programs/label'] = {'set', 'text'},
  10.         ['rom/programs/mkdir'] = {'path'},
  11.         ['rom/programs/monitor'] = {'side', 'program', 'arguments'},
  12.         ['rom/programs/move'] = {'source', 'destination'},
  13.         ['rom/programs/color/paint'] = {'path'},
  14.         ['rom/programs/http/pastebin'] = {'get', 'code', 'filename'},
  15.         ['rom/programs/redpulse'] = {'side', 'count', 'period'},
  16.         ['rom/programs/redset'] = {'side', 'true/false'},
  17.         ['rom/programs/redstone'] = {'side', 'true/false'},
  18.         ['rom/programs/rename'] = {'source', 'destination'},
  19.         ['rom/programs/type'] = {'path'},
  20.         ['rom/programs/bg'] = {'program'},
  21.         ['rom/programs/fg'] = {'program'},
  22.         ['rom/programs/rednet/chat'] = {'join', 'hostname', 'username'},
  23.         ['rom/programs/turtle/craft'] = {'amount'},
  24.         ['rom/programs/turtle/equip'] = {'slot', 'side'},
  25.         ['rom/programs/turtle/excavate'] = {'diameter'},
  26.         ['rom/programs/turtle/go'] = {'direction', 'distance'},
  27.         ['rom/programs/turtle/refuel'] = {'amount'},
  28.         ['rom/programs/turtle/tunnel'] = {'length'},
  29.         ['rom/programs/turtle/turn'] = {'direction', 'turns'},
  30.         ['rom/programs/turtle/unequip'] = {'side'},
  31. }
  32. -- Colours
  33. local promptColour, textColour, bgColour, suggestionColour
  34. if term.isColour() then
  35.         promptColour = colours.yellow
  36.         textColour = colours.white
  37.         suggestionColour = colours.grey
  38.         suggestionBackgroundColour = colours.black
  39.         bgColour = colours.black
  40. else
  41.         promptColour = colours.white
  42.         textColour = colours.white
  43.         suggestionColour = colours.black
  44.         suggestionBackgroundColour = colours.white
  45.         bgColour = colours.black
  46. end
  47. term.setCursorPos(1,1) 
  48. term.setBackgroundColor( bgColour )
  49. term.setTextColour( promptColour )
  50. term.write( os.version())
  51. term.setTextColour(textColour)
  52. term.write(' Quick Shell')
  53. print()
  54. term.setTextColour( textColour )
  55.  
  56.  
  57. local function removeFileName(str)
  58.         local pos = 0
  59.         local current = 0
  60.  
  61.         repeat
  62.           current = string.find(str, "/", pos)
  63.           if current ~= nil then pos = current + 1 end
  64.         until (current == nil)
  65.  
  66.         return string.gsub (str, string.sub (str, pos), "")
  67. end
  68.  
  69. local function match(str, arg)
  70.         if #str == 0 then
  71.                 return ''
  72.         end
  73.     local items = {}
  74.     local function insertTable(tbl)
  75.         if tbl and type(tbl) == 'table' then
  76.                 for i, v in ipairs(tbl) do
  77.                         local add = true
  78.                         for i2, v2 in ipairs(items) do
  79.                                         if v2 == v then
  80.                                                 add = false
  81.                                                 break
  82.                                         end
  83.                                 end
  84.                                 if add then
  85.                                         table.insert(items, v)
  86.                                 end
  87.                 end
  88.             elseif tbl then
  89.                 table.insert(items, tbl)
  90.             end
  91.     end
  92.  
  93.     if arg == 'program' then
  94.             insertTable(shell.resolveProgram(str))
  95.             for k, v in pairs(shell.aliases()) do
  96.                 insertTable(k)
  97.             end
  98.             insertTable(shell.programs())
  99.         elseif arg == 'side' then
  100.                 insertTable({'left', 'right', 'top', 'bottom', 'front', 'back'})
  101.                 insertTable(peripheral.getNames())
  102.         elseif arg == 'direction' then
  103.                 insertTable({'left', 'right', 'forward', 'back', 'down', 'up'})
  104.         elseif arg == 'true/false' then
  105.                 insertTable({'true', 'false'})
  106.         elseif arg == 'set' then
  107.                 insertTable({'get', 'set', 'clear'})
  108.         elseif arg == 'locate' then
  109.                 insertTable({'locate', 'host'})
  110.         elseif arg == 'set' then
  111.                 insertTable({'get', 'set', 'clear'})
  112.         elseif arg == 'get' then
  113.                 insertTable({'get', 'put', 'run'})
  114.         elseif arg == 'topic' then
  115.                 insertTable(help.topics())
  116.                 insertTable('index')
  117.         elseif arg == 'path' or arg == 'source' then
  118.                 local path = removeFileName(str)
  119.                 local p, _ = removeFileName(path)
  120.                 if not fs.isDir(p) then
  121.                         return ''
  122.                 end
  123.                 local items = fs.list(p)
  124.                 for i, item in ipairs(items) do
  125.                 if string.lower(fs.getName(string.sub(fs.getName(item), 1, string.len(fs.getName(str))))) == string.lower(fs.getName(str)) then
  126.                         return p .. item
  127.                 end
  128.             end
  129.                 return ''
  130.         end
  131.  
  132.     for i, item in ipairs(items) do
  133.         if string.lower(string.sub(item, 1, string.len(str))) == string.lower(str) then
  134.                 return item
  135.         end
  136.     end
  137.         return ''
  138. end
  139. local function tabRead( _sReplaceChar, _tHistory )
  140.         term.setCursorBlink( true )
  141.  
  142.     local sLine = ""
  143.         local nHistoryPos = nil
  144.         local nPos = 0
  145.     if _sReplaceChar then
  146.                 _sReplaceChar = string.sub( _sReplaceChar, 1, 1 )
  147.         end
  148.        
  149.         local w, h = term.getSize()
  150.         local sx, sy = term.getCursorPos()     
  151.         local previousMatch = ''
  152.         local hasMatched = false
  153.         local function redraw( _sCustomReplaceChar, ignoreMatch )
  154.                 local nScroll = 0
  155.                 if sx + nPos >= w then
  156.                         nScroll = (sx + nPos) - w
  157.                 end
  158.                        
  159.                 term.setCursorPos( 1, sy )
  160.                 term.clearLine()
  161.                 term.setBackgroundColor( bgColour )
  162.                 term.setTextColour( promptColour )
  163.                 term.write( shell.dir() .. "> " )
  164.                 if not hasMatched and not ignoreMatch then
  165.                         term.setCursorPos( sx, sy )
  166.                         term.setTextColour(suggestionColour)
  167.                         term.setBackgroundColour(suggestionBackgroundColour)
  168.                         previousMatch = match(sLine, 'program')
  169.                         term.write(previousMatch)
  170.                         term.setBackgroundColour(bgColour)
  171.                 elseif not ignoreMatch and hasMatched and nPos >= #previousMatch + 1 then
  172.                         local args = programArgs[shell.resolveProgram(previousMatch)]
  173.                         previousArgs = ''
  174.                         if args then
  175.                                 term.setCursorPos( sx + #sLine, sy )
  176.                                 if sLine:sub(-1) ~= ' ' then
  177.                                         term.write(' ')
  178.                                         term.setCursorPos( sx + #sLine + 1, sy )
  179.                                 end
  180.                                 term.setTextColour(suggestionColour)
  181.                                 term.setBackgroundColour(suggestionBackgroundColour)
  182.                                 local tWords = {}
  183.                                 for _match in string.gmatch( sLine, "[^ \t]+" ) do
  184.                                         table.insert(tWords, _match)
  185.                                 end
  186.                                 table.remove(tWords,1)
  187.  
  188.                                 for i, arg in ipairs(args) do
  189.                                         if #tWords < i then
  190.                                                 term.write(arg..' ')
  191.                                         elseif i == #tWords and sLine:sub(-1) ~= ' ' then
  192.                                                 term.setCursorPos( sx + #sLine - #tWords[i], sy)
  193.                                                 local m = match(tWords[i], arg)
  194.                                                 if #m ~= 0 then
  195.                                                         term.write(m..' ')
  196.                                                 else
  197.                                                         term.write(tWords[i]..' ')
  198.                                                 end
  199.                                         end
  200.                                 end
  201.                                 term.setBackgroundColour(bgColour)
  202.                         end
  203.                 end
  204.                 term.setTextColour(textColour)
  205.                 term.setCursorPos( sx, sy )
  206.                 local sReplace = _sCustomReplaceChar or _sReplaceChar
  207.                 if sReplace then
  208.                         term.write( string.rep( sReplace, string.len(sLine) - nScroll ) )
  209.                 else
  210.                         term.write( string.sub( sLine, nScroll + 1 ) )
  211.                 end
  212.                 term.setCursorPos( sx + nPos - nScroll, sy )
  213.         end
  214.        
  215.         while true do
  216.                 local sEvent, param = os.pullEvent()
  217.                 if sEvent == "char" then
  218.                         sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 )
  219.                         if (hasMatched and nPos <= #previousMatch) or (not hasMatched and param == ' ') then
  220.                                 local pos, len = sLine:find("[^ \t]+")
  221.                                 if pos and len then
  222.                                         previousMatch = sLine:sub(pos, len)
  223.                                         hasMatched = true
  224.                                 end
  225.                         end
  226.                         term.setCursorPos(1, 2)
  227.                         nPos = nPos + 1
  228.                         redraw()
  229.                        
  230.                 elseif sEvent == "key" then
  231.                     if param == keys.enter then
  232.                                 -- Enter
  233.                                 redraw(nil, true)
  234.                                 break
  235.                                
  236.                         elseif param == keys.tab and nPos == #sLine then
  237.                                 if nPos >= #previousMatch + 1 and nPos == #sLine then
  238.                                         local args = programArgs[shell.resolveProgram(previousMatch)]
  239.                                         local sMatch = ''
  240.                                        
  241.                                         local tWords = {}
  242.                                         for match in string.gmatch( sLine, "[^ \t]+" ) do
  243.                                                 table.insert(tWords, match)
  244.                                         end
  245.  
  246.                                         sMatch = match(tWords[#tWords], args[#tWords-1])
  247.                                         if #sMatch ~= 0 then
  248.                                                 sLine = ''
  249.                                                 tWords[#tWords] = sMatch
  250.                                                 for i, v in ipairs(tWords) do
  251.                                                         sLine = sLine .. v .. ' '
  252.                                                 end
  253.                                                 nPos = #sLine
  254.                                                 redraw()
  255.                                         else
  256.                                                 sLine = sLine .. ' '
  257.                                                 nPos = #sLine
  258.                                                 redraw()
  259.                                         end
  260.                                 else
  261.                                         local sMatch = match(sLine, 'program')
  262.                                         if #sMatch ~= 0 then
  263.                                                 nPos = #sMatch + 1
  264.                                                 sLine = sMatch .. ' '
  265.                                                 hasMatched = true
  266.                                                 previousMatch = sMatch
  267.                                                 redraw()
  268.                                         end
  269.                                 end
  270.                         elseif param == keys.left then
  271.                                 -- Left
  272.                                 if nPos > 0 then
  273.                                         nPos = nPos - 1
  274.                                         redraw()
  275.                                 end
  276.                                
  277.                         elseif param == keys.right then
  278.                                 -- Right                               
  279.                                 if nPos < string.len(sLine) then
  280.                                         redraw(" ")
  281.                                         nPos = nPos + 1
  282.                                         redraw()
  283.                                 end
  284.                        
  285.                         elseif param == keys.up or param == keys.down then
  286.                 -- Up or down
  287.                                 if _tHistory then
  288.                                         redraw(" ")
  289.                                         if param == keys.up then
  290.                                                 -- Up
  291.                                                 if nHistoryPos == nil then
  292.                                                         if #_tHistory > 0 then
  293.                                                                 nHistoryPos = #_tHistory
  294.                                                         end
  295.                                                 elseif nHistoryPos > 1 then
  296.                                                         nHistoryPos = nHistoryPos - 1
  297.                                                 end
  298.                                         else
  299.                                                 -- Down
  300.                                                 if nHistoryPos == #_tHistory then
  301.                                                         nHistoryPos = nil
  302.                                                 elseif nHistoryPos ~= nil then
  303.                                                         nHistoryPos = nHistoryPos + 1
  304.                                                 end                                            
  305.                                         end
  306.                                         if nHistoryPos then
  307.                         sLine = _tHistory[nHistoryPos]
  308.                         nPos = string.len( sLine )
  309.                     else
  310.                                                 sLine = ""
  311.                                                 nPos = 0
  312.                                         end
  313.                                         redraw()
  314.                 end
  315.                         elseif param == keys.backspace then
  316.                                 -- Backspace
  317.                                 if nPos == #sLine and string.sub( sLine, nPos, nPos) == ' ' then
  318.                                 --if hasMatched and nPos == #previousMatch + 1 then
  319.                                         local tWords = {}
  320.                                         for match in string.gmatch( sLine, "[^ \t]+" ) do
  321.                                                 table.insert(tWords, match)
  322.                                         end
  323.                                         table.remove(tWords, #tWords)
  324.                                         sLine = ''
  325.                                         for i, v in ipairs(tWords) do
  326.                                                 sLine = sLine .. v .. ' '
  327.                                         end
  328.                                         nPos = #sLine
  329.                                         if #tWords == 0 then
  330.                                                 previousMatch = ''
  331.                                                 hasMatched = false
  332.                                         end
  333.  
  334.                                         redraw()
  335.                                 elseif nPos > 0 then
  336.                                         redraw(" ")
  337.                                         sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 )
  338.                                         if hasMatched and nPos <= #previousMatch then
  339.                                                 local pos, len = sLine:find("[^ \t]+")
  340.                                                 if pos and len then
  341.                                                         previousMatch = sLine:sub(pos, len)
  342.                                                 end
  343.                                         end
  344.                                         nPos = nPos - 1                                
  345.                                         redraw()
  346.                                 end
  347.                         elseif param == keys.home then
  348.                                 -- Home
  349.                                 redraw(" ")
  350.                                 nPos = 0
  351.                                 redraw()               
  352.                         elseif param == keys.delete then
  353.                                 if nPos < string.len(sLine) then
  354.                                         redraw(" ")
  355.                                         sLine = string.sub( sLine, 1, nPos ) .. string.sub( sLine, nPos + 2 )                          
  356.                                         redraw()
  357.                                 end
  358.                         elseif param == keys["end"] then
  359.                                 -- End
  360.                                 redraw(" ")
  361.                                 nPos = string.len(sLine)
  362.                                 redraw()
  363.                         end
  364.                 end
  365.         end
  366.        
  367.         term.setCursorBlink( false )
  368.         term.setCursorPos( w + 1, sy )
  369.         print()
  370.        
  371.         return sLine
  372. end
  373.  
  374.  
  375. -- Read commands and execute them
  376. local tCommandHistory = {}
  377. while not bExit do
  378.         term.setBackgroundColor( bgColour )
  379.         term.setTextColour( promptColour )
  380.         term.write( shell.dir() .. "> " )
  381.         term.setTextColour( textColour )
  382.  
  383.         local sLine = tabRead( nil, tCommandHistory )
  384.         table.insert( tCommandHistory, sLine )
  385.         shell.run(sLine)
  386. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top