-- Setup paths local sPath = ".:/rom/programs" if term.isColor() then sPath = sPath..":/rom/programs/advanced" end if turtle then sPath = sPath..":/rom/programs/turtle" else sPath = sPath..":/rom/programs/rednet:/rom/programs/fun" if term.isColor() then sPath = sPath..":/rom/programs/fun/advanced" end end if pocket then sPath = sPath..":/rom/programs/pocket" end if commands then sPath = sPath..":/rom/programs/command" end if http then sPath = sPath..":/rom/programs/http" end shell.setPath( sPath ) help.setPath( "/rom/help" ) -- Setup aliases shell.setAlias( "ls", "list" ) shell.setAlias( "dir", "list" ) shell.setAlias( "cp", "copy" ) shell.setAlias( "mv", "move" ) shell.setAlias( "rm", "delete" ) shell.setAlias( "clr", "clear" ) shell.setAlias( "rs", "redstone" ) shell.setAlias( "sh", "shell" ) if term.isColor() then shell.setAlias( "background", "bg" ) shell.setAlias( "foreground", "fg" ) end -- Setup completion functions local function completeMultipleChoice( sText, tOptions, bAddSpaces ) local tResults = {} for n=1,#tOptions do local sOption = tOptions[n] if #sOption + (bAddSpaces and 1 or 0) > #sText and string.sub( sOption, 1, #sText ) == sText then local sResult = string.sub( sOption, #sText + 1 ) if bAddSpaces then table.insert( tResults, sResult .. " " ) else table.insert( tResults, sResult ) end end end return tResults end local function completePeripheralName( sText, bAddSpaces ) return completeMultipleChoice( sText, peripheral.getNames(), bAddSpaces ) end local tRedstoneSides = redstone.getSides() local function completeSide( sText, bAddSpaces ) return completeMultipleChoice( sText, tRedstoneSides, bAddSpaces ) end local function completeFile( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return fs.complete( sText, shell.dir(), true, false ) end end local function completeDir( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return fs.complete( sText, shell.dir(), false, true ) end end local function completeEither( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return fs.complete( sText, shell.dir(), true, true ) end end local function completeEitherEither( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then local tResults = fs.complete( sText, shell.dir(), true, true ) for n=1,#tResults do local sResult = tResults[n] if string.sub( sResult, #sResult, #sResult ) ~= "/" then tResults[n] = sResult .. " " end end return tResults elseif nIndex == 2 then return fs.complete( sText, shell.dir(), true, true ) end end local function completeProgram( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return shell.completeProgram( sText ) end end local function completeHelp( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return help.completeTopic( sText ) end end local function completeAlias( shell, nIndex, sText, tPreviousText ) if nIndex == 2 then return shell.completeProgram( sText ) end end local function completePeripheral( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completePeripheralName( sText ) end end local tGPSOptions = { "host", "host ", "locate" } local function completeGPS( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tGPSOptions ) end end local tLabelOptions = { "get", "get ", "set ", "clear", "clear " } local function completeLabel( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tLabelOptions ) elseif nIndex == 2 then return completePeripheralName( sText ) end end local function completeMonitor( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completePeripheralName( sText, true ) elseif nIndex == 2 then return shell.completeProgram( sText ) end end local tRedstoneOptions = { "probe", "set ", "pulse " } local function completeRedstone( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tRedstoneOptions ) elseif nIndex == 2 then return completeSide( sText ) end end local tDJOptions = { "play", "play ", "stop " } local function completeDJ( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tDJOptions ) elseif nIndex == 2 then return completePeripheralName( sText ) end end local tPastebinOptions = { "put ", "get ", "run " } local function completePastebin( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tPastebinOptions ) elseif nIndex == 2 then if tPreviousText[2] == "put" then return fs.complete( sText, shell.dir(), true, false ) end end end local tChatOptions = { "host ", "join " } local function completeChat( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, tChatOptions ) end end local function completeSet( shell, nIndex, sText, tPreviousText ) if nIndex == 1 then return completeMultipleChoice( sText, settings.getNames(), true ) end end local tCommands if commands then tCommands = commands.list() end local function completeExec( shell, nIndex, sText, tPreviousText ) if nIndex == 1 and commands then return completeMultipleChoice( sText, tCommands, true ) end end shell.setCompletionFunction( "rom/programs/alias.lua", completeAlias ) shell.setCompletionFunction( "rom/programs/cd.lua", completeDir ) shell.setCompletionFunction( "rom/programs/copy.lua", completeEitherEither ) shell.setCompletionFunction( "rom/programs/delete.lua", completeEither ) shell.setCompletionFunction( "rom/programs/drive.lua", completeDir ) shell.setCompletionFunction( "rom/programs/edit.lua", completeFile ) shell.setCompletionFunction( "rom/programs/eject.lua", completePeripheral ) shell.setCompletionFunction( "rom/programs/gps.lua", completeGPS ) shell.setCompletionFunction( "rom/programs/help.lua", completeHelp ) shell.setCompletionFunction( "rom/programs/id.lua", completePeripheral ) shell.setCompletionFunction( "rom/programs/label.lua", completeLabel ) shell.setCompletionFunction( "rom/programs/list.lua", completeDir ) shell.setCompletionFunction( "rom/programs/mkdir.lua", completeFile ) shell.setCompletionFunction( "rom/programs/monitor.lua", completeMonitor ) shell.setCompletionFunction( "rom/programs/move.lua", completeEitherEither ) shell.setCompletionFunction( "rom/programs/redstone.lua", completeRedstone ) shell.setCompletionFunction( "rom/programs/rename.lua", completeEitherEither ) shell.setCompletionFunction( "rom/programs/shell.lua", completeProgram ) shell.setCompletionFunction( "rom/programs/type.lua", completeEither ) shell.setCompletionFunction( "rom/programs/set.lua", completeSet ) shell.setCompletionFunction( "rom/programs/advanced/bg.lua", completeProgram ) shell.setCompletionFunction( "rom/programs/advanced/fg.lua", completeProgram ) shell.setCompletionFunction( "rom/programs/fun/dj.lua", completeDJ ) shell.setCompletionFunction( "rom/programs/fun/advanced/paint.lua", completeFile ) shell.setCompletionFunction( "rom/programs/http/pastebin.lua", completePastebin ) shell.setCompletionFunction( "rom/programs/rednet/chat.lua", completeChat ) shell.setCompletionFunction( "rom/programs/command/exec.lua", completeExec ) -- Run autorun files if fs.exists( "/rom/autorun" ) and fs.isDir( "/rom/autorun" ) then local tFiles = fs.list( "/rom/autorun" ) table.sort( tFiles ) for n, sFile in ipairs( tFiles ) do if string.sub( sFile, 1, 1 ) ~= "." then local sPath = "/rom/autorun/"..sFile if not fs.isDir( sPath ) then shell.run( sPath ) end end end end local function findStartups( sBaseDir ) local tStartups = nil local sBasePath = "/" .. fs.combine( sBaseDir, "startup" ) local sStartupNode = shell.resolveProgram( sBasePath ) if sStartupNode then tStartups = { sStartupNode } end -- It's possible that there is a startup directory and a startup.lua file, so this has to be -- executed even if a file has already been found. if fs.isDir( sBasePath ) then if tStartups == nil then tStartups = {} end for _,v in pairs( fs.list( sBasePath ) ) do local sPath = "/" .. fs.combine( sBasePath, v ) if not fs.isDir( sPath ) then tStartups[ #tStartups + 1 ] = sPath end end end return tStartups end -- Run the user created startup, either from disk drives or the root local tUserStartups = nil if settings.get( "shell.allow_startup" ) then tUserStartups = findStartups( "/" ) end if settings.get( "shell.allow_disk_startup" ) then for n,sName in pairs( peripheral.getNames() ) do if disk.isPresent( sName ) and disk.hasData( sName ) then local startups = findStartups( disk.getMountPath( sName ) ) if startups then tUserStartups = startups break end end end end if tUserStartups then for _,v in pairs( tUserStartups ) do shell.run( v ) end end