2021-03-21 16:41:23 +00:00
|
|
|
-- The preload file initializes everything else for our shell
|
|
|
|
|
|
|
|
local fs = require 'fs'
|
|
|
|
local commander = require 'commander'
|
2021-03-31 03:58:12 +00:00
|
|
|
local bait = require 'bait'
|
2021-10-17 20:32:04 +00:00
|
|
|
require 'succulent' -- Function additions
|
2021-06-10 10:29:35 +00:00
|
|
|
local oldDir = hilbish.cwd()
|
2021-03-21 16:41:23 +00:00
|
|
|
|
2021-05-29 03:10:23 +00:00
|
|
|
local shlvl = tonumber(os.getenv 'SHLVL')
|
|
|
|
if shlvl ~= nil then os.setenv('SHLVL', shlvl + 1) else os.setenv('SHLVL', 1) end
|
|
|
|
|
2021-05-19 01:04:49 +00:00
|
|
|
-- Builtins
|
2021-10-17 22:39:26 +00:00
|
|
|
local recentDirs = {}
|
2021-03-31 17:46:22 +00:00
|
|
|
commander.register('cd', function (args)
|
|
|
|
if #args > 0 then
|
2021-10-17 21:55:41 +00:00
|
|
|
local path = table.concat(args, ' '):gsub('$%$','\0'):gsub('${([%w_]+)}', os.getenv)
|
2021-10-08 13:49:57 +00:00
|
|
|
:gsub('$([%w_]+)', os.getenv):gsub('%z','$'):gsub('^%s*(.-)%s*$', '%1')
|
2021-03-31 17:46:22 +00:00
|
|
|
|
2021-05-27 22:23:15 +00:00
|
|
|
if path == '-' then
|
2021-06-10 10:29:35 +00:00
|
|
|
path = oldDir
|
2021-05-27 23:06:45 +00:00
|
|
|
print(path)
|
2021-05-27 22:23:15 +00:00
|
|
|
end
|
2021-06-10 10:29:35 +00:00
|
|
|
oldDir = hilbish.cwd()
|
2021-05-27 23:06:45 +00:00
|
|
|
|
2021-03-31 17:46:22 +00:00
|
|
|
local ok, err = pcall(function() fs.cd(path) end)
|
2021-03-31 03:58:12 +00:00
|
|
|
if not ok then
|
2021-10-17 21:55:41 +00:00
|
|
|
print(err:sub(17))
|
|
|
|
return 1
|
2021-05-11 22:55:22 +00:00
|
|
|
end
|
2021-06-14 22:11:07 +00:00
|
|
|
bait.throw('cd', path)
|
2021-10-17 22:39:26 +00:00
|
|
|
|
|
|
|
-- add to table of recent dirs
|
|
|
|
table.insert(recentDirs, 1, path)
|
|
|
|
recentDirs[11] = nil
|
|
|
|
|
2021-03-31 03:59:59 +00:00
|
|
|
return
|
2021-03-21 16:41:23 +00:00
|
|
|
end
|
2021-06-14 22:12:12 +00:00
|
|
|
fs.cd(hilbish.home)
|
|
|
|
bait.throw('cd', hilbish.home)
|
2021-06-10 00:30:12 +00:00
|
|
|
|
|
|
|
return
|
2021-03-21 16:41:23 +00:00
|
|
|
end)
|
2021-04-03 20:08:04 +00:00
|
|
|
|
2021-04-05 19:21:44 +00:00
|
|
|
commander.register('exit', function()
|
|
|
|
os.exit(0)
|
|
|
|
end)
|
|
|
|
|
2021-10-16 19:42:55 +00:00
|
|
|
commander.register('doc', function(args)
|
|
|
|
local moddocPath = hilbish.dataDir .. '/docs/'
|
|
|
|
local globalDesc = [[
|
|
|
|
These are the global Hilbish functions that are always available and not part of a module.]]
|
|
|
|
if #args > 0 then
|
2021-11-22 21:36:32 +00:00
|
|
|
local mod = args[1]
|
2021-10-16 19:42:55 +00:00
|
|
|
|
|
|
|
local f = io.open(moddocPath .. mod .. '.txt', 'rb')
|
2021-11-22 21:36:32 +00:00
|
|
|
local funcdocs = nil
|
|
|
|
if not f then
|
|
|
|
-- assume subdir
|
|
|
|
-- dataDir/docs/<mod>/<mod>.txt
|
|
|
|
moddocPath = moddocPath .. mod .. '/'
|
|
|
|
local subdocName = args[2]
|
|
|
|
if not subdocName then
|
|
|
|
subdocName = 'index'
|
|
|
|
end
|
|
|
|
f = io.open(moddocPath .. subdocName .. '.txt', 'rb')
|
|
|
|
funcdocs = f:read '*a'
|
|
|
|
local subdocs = table.map(fs.readdir(moddocPath), function(f)
|
|
|
|
return lunacolors.underline(lunacolors.blue(string.gsub(f, '.txt', '')))
|
|
|
|
end)
|
|
|
|
if subdocName == 'index' then
|
|
|
|
funcdocs = funcdocs .. '\nSubdocs: ' .. table.concat(subdocs, ', ')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if not f then
|
2021-10-16 19:42:55 +00:00
|
|
|
print('Could not find docs for module named ' .. mod .. '.')
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
2021-11-22 23:29:26 +00:00
|
|
|
if not funcdocs then
|
|
|
|
funcdocs = f:read '*a'
|
|
|
|
end
|
2021-11-22 21:36:32 +00:00
|
|
|
local desc = ''
|
|
|
|
local ok = pcall(require, mod)
|
|
|
|
if ok then
|
|
|
|
desc = (mod == 'global' and globalDesc or getmetatable(require(mod)).__doc) .. '\n\n'
|
|
|
|
end
|
2021-10-16 19:42:55 +00:00
|
|
|
local backtickOccurence = 0
|
2021-11-22 21:36:32 +00:00
|
|
|
print(desc .. lunacolors.format(funcdocs:sub(1, #funcdocs - 1):gsub('`', function()
|
2021-10-16 19:42:55 +00:00
|
|
|
backtickOccurence = backtickOccurence + 1
|
|
|
|
if backtickOccurence % 2 == 0 then
|
|
|
|
return '{reset}'
|
|
|
|
else
|
2021-10-17 21:23:35 +00:00
|
|
|
return '{underline}{green}'
|
2021-10-16 19:42:55 +00:00
|
|
|
end
|
|
|
|
end)))
|
|
|
|
f:close()
|
|
|
|
|
|
|
|
return
|
|
|
|
end
|
2021-10-17 22:09:42 +00:00
|
|
|
local modules = table.map(fs.readdir(moddocPath), function(f)
|
2021-11-22 21:36:32 +00:00
|
|
|
return lunacolors.underline(lunacolors.blue(string.gsub(f, '.txt', '')))
|
2021-10-17 22:09:42 +00:00
|
|
|
end)
|
2021-10-16 19:42:55 +00:00
|
|
|
|
|
|
|
io.write [[
|
|
|
|
Welcome to Hilbish's doc tool! Here you can find documentation for builtin
|
|
|
|
functions and other things.
|
|
|
|
|
2021-11-22 21:36:32 +00:00
|
|
|
Usage: doc <section> [subdoc]
|
|
|
|
A section is a module or a literal section and a subdoc is a subsection for it.
|
2021-10-16 19:42:55 +00:00
|
|
|
|
2021-11-22 21:36:32 +00:00
|
|
|
Available sections: ]]
|
2021-10-16 19:42:55 +00:00
|
|
|
|
2021-10-17 22:10:06 +00:00
|
|
|
print(table.concat(modules, ', '))
|
2021-10-16 19:42:55 +00:00
|
|
|
|
|
|
|
return
|
|
|
|
end)
|
|
|
|
|
2021-04-03 20:08:04 +00:00
|
|
|
do
|
|
|
|
local virt_G = { }
|
2021-06-09 22:41:37 +00:00
|
|
|
|
2021-04-03 20:08:04 +00:00
|
|
|
setmetatable(_G, {
|
2021-06-09 22:41:37 +00:00
|
|
|
__index = function (_, key)
|
2021-04-03 20:08:04 +00:00
|
|
|
local got_virt = virt_G[key]
|
|
|
|
if got_virt ~= nil then
|
|
|
|
return got_virt
|
|
|
|
end
|
2021-06-09 22:41:37 +00:00
|
|
|
|
2021-04-03 20:08:04 +00:00
|
|
|
virt_G[key] = os.getenv(key)
|
|
|
|
return virt_G[key]
|
|
|
|
end,
|
2021-06-09 22:41:37 +00:00
|
|
|
|
|
|
|
__newindex = function (_, key, value)
|
2021-04-03 20:08:04 +00:00
|
|
|
if type(value) == 'string' then
|
|
|
|
os.setenv(key, value)
|
|
|
|
virt_G[key] = value
|
|
|
|
else
|
|
|
|
if type(virt_G[key]) == 'string' then
|
|
|
|
os.setenv(key, '')
|
|
|
|
end
|
|
|
|
virt_G[key] = value
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
})
|
2021-06-09 22:41:37 +00:00
|
|
|
|
2021-04-03 20:08:04 +00:00
|
|
|
bait.catch('command.exit', function ()
|
|
|
|
for key, value in pairs(virt_G) do
|
|
|
|
if type(value) == 'string' then
|
|
|
|
virt_G[key] = os.getenv(key)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
2021-05-01 05:08:20 +00:00
|
|
|
|
2021-10-17 22:39:26 +00:00
|
|
|
commander.register('cdr', function(args)
|
|
|
|
if not args[1] then
|
|
|
|
print(lunacolors.format [[
|
|
|
|
cdr: change directory to one which has been recently visied
|
|
|
|
|
|
|
|
usage: cdr <index>
|
|
|
|
|
|
|
|
to get a list of recent directories, use {green}{underline}cdr list{reset}]])
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
if args[1] == 'list' then
|
|
|
|
if #recentDirs == 0 then
|
|
|
|
print 'No directories have been visited.'
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
print(table.concat(recentDirs, '\n'))
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local index = tonumber(args[1])
|
|
|
|
if not index then
|
|
|
|
print(string.format('received %s as index, which isn\'t a number', index))
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
|
|
|
if not recentDirs[index] then
|
|
|
|
print(string.format('no recent directory found at index %s', index))
|
|
|
|
return 1
|
|
|
|
end
|
|
|
|
|
|
|
|
fs.cd(recentDirs[index])
|
|
|
|
return
|
|
|
|
end)
|
|
|
|
|
2021-05-19 01:04:49 +00:00
|
|
|
-- Hook handles
|
|
|
|
bait.catch('command.not-found', function(cmd)
|
|
|
|
print(string.format('hilbish: %s not found', cmd))
|
|
|
|
end)
|
|
|
|
|
2021-11-21 23:45:44 +00:00
|
|
|
bait.catch('command.no-perm', function(cmd)
|
|
|
|
print(string.format('hilbish: %s: no permission', cmd))
|
|
|
|
end)
|
|
|
|
|