2
2
mirror of https://github.com/Hilbis/Hilbish synced 2025-07-01 16:52:03 +00:00

feat: lots of changes

- doc gen is done differently
- docs look better too
- ... im lazy to rewrite the commit because i lost it because GPG_TTY ISNT SET FOR SOME REASON
This commit is contained in:
sammyette 2025-06-12 19:35:54 -04:00
parent 54f11e46b7
commit 85c197d64b
Signed by: sammyette
GPG Key ID: 904FC49417B44DCD
40 changed files with 6628 additions and 3439 deletions

File diff suppressed because it is too large Load Diff

View File

@ -110,7 +110,7 @@ menu:
]] ]]
for iface, dps in pairs(pieces) do for iface, dps in pairs(pieces) do
local mod = iface:match '(%w+)%.' or 'nature' local mod = iface ~= 'nature' and iface:match '(%w+)' or 'nature'
local docParent = 'Nature' local docParent = 'Nature'
path = string.format('docs/%s/%s.md', mod, iface) path = string.format('docs/%s/%s.md', mod, iface)
@ -128,100 +128,21 @@ for iface, dps in pairs(pieces) do
local exists = pcall(fs.stat, path) local exists = pcall(fs.stat, path)
local newOrNotNature = (exists and mod ~= 'nature') or iface == 'hilbish' local newOrNotNature = (exists and mod ~= 'nature') or iface == 'hilbish'
local f <close> = io.open(path, newOrNotNature and 'r+' or 'w+') --local f <close> = io.open(path, newOrNotNature and 'r+' or 'w+')
local tocPos
if not newOrNotNature then if not newOrNotNature then
f:write(string.format(header, 'Module', iface, (descriptions[iface] and #descriptions[iface] > 0) and descriptions[iface][1] or 'No description.', docParent)) --f:write(string.format(header, 'Module', iface, (descriptions[iface] and #descriptions[iface] > 0) and descriptions[iface][1] or 'No description.', docParent))
if descriptions[iface] and #descriptions[iface] > 0 then if descriptions[iface] and #descriptions[iface] > 0 then
table.remove(descriptions[iface], 1) table.remove(descriptions[iface], 1)
f:write(string.format('\n## Introduction\n%s\n\n', table.concat(descriptions[iface], '\n'))) --f:write(string.format('\n## Introduction\n%s\n\n', table.concat(descriptions[iface], '\n')))
f:write('## Functions\n') --f:write('## Functions\n')
f:write([[|||
|----|----|
]])
tocPos = f:seek()
end
end
local tocSearch = false
for line in f:lines() do
if line:match '^## Functions' then
tocSearch = true
end
if tocSearch and line == '' then
tocSearch = false
tocPos = f:seek() - 1
end end
end end
print(mod, dps)
table.sort(dps, function(a, b) return a[1] < b[1] end) table.sort(dps, function(a, b) return a[1] < b[1] end)
for _, piece in pairs(dps) do --[[for _, piece in pairs(dps) do
local func = piece[1] local func = piece[1]
local docs = piece[2] local docs = piece[2]
local sig = string.format('%s.%s(', iface, func) print(func, docs)
local params = '' end]]
for idx, param in ipairs(docs.params) do
sig = sig .. param.name:gsub('%?$', '')
params = params .. param.name:gsub('%?$', '')
if idx ~= #docs.params then
sig = sig .. ', '
params = params .. ', '
end
end
sig = sig .. ')'
if tocPos then
f:seek('set', tocPos)
local contents = f:read '*a'
f:seek('set', tocPos)
local tocLine = string.format('|<a href="#%s">%s</a>|%s|\n', func, string.format('%s(%s)', func, params), docs.description[1])
f:write(tocLine .. contents)
f:seek 'end'
end
f:write(string.format('<hr>\n<div id=\'%s\'>\n', func))
f:write(string.format([[
<h4 class='heading'>
%s
<a href="#%s" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
]], sig, func))
f:write(table.concat(docs.description, '\n') .. '\n')
f:write '#### Parameters\n'
if #docs.params == 0 then
f:write 'This function has no parameters. \n'
end
for _, param in ipairs(docs.params) do
f:write(string.format('`%s` **`%s`** \n', param.name:gsub('%?$', ''), param.type))
f:write(string.format('%s\n\n', param.description))
end
if #docs.example ~= 0 then
f:write '#### Example\n'
f:write(string.format('```lua\n%s\n```\n', table.concat(docs.example, '\n')))
end
--[[
local params = table.filter(docs, function(t)
return t:match '^%-%-%- @param'
end)
for i, str in ipairs(params) do
if i ~= 1 then
f:write ', '
end
f:write(str:match '^%-%-%- @param ([%w]+) ')
end
f:write(')\n')
for _, str in ipairs(docs) do
if not str:match '^%-%-%- @' then
f:write(str:match '^%-%-%- (.+)' .. '\n')
end
end
]]--
f:write('</div>')
f:write('\n\n')
end
end end

388
defs/bait.json Normal file
View File

@ -0,0 +1,388 @@
{
"name": "bait",
"shortDescription": "the event emitter",
"description": "\nBait is the event emitter for Hilbish. Much like Node.js and\nits `events` system, many actions in Hilbish emit events.\nUnlike Node.js, Hilbish events are global. So make sure to\npick a unique name!\n\nUsage of the Bait module consists of userstanding\nevent-driven architecture, but it's pretty simple:\nIf you want to act on a certain event, you can `catch` it.\nYou can act on events via callback functions.\n\nExamples of this are in the Hilbish default config!\nConsider this part of it:\n```lua\nbait.catch('command.exit', function(code)\n\trunning = false\n\tdoPrompt(code ~= 0)\n\tdoNotifyPrompt()\nend)\n```\n\nWhat this does is, whenever the `command.exit` event is thrown,\nthis function will set the user prompt.",
"properties": [],
"fields": [],
"docs": [
{
"name": "catch",
"description": [
"Catches an event. This function can be used to act on events.",
"",
""
],
"signature": "catch(name, cb)",
"goFuncName": "bcatch",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"The",
"name",
"of",
"the",
"hook."
]
},
{
"Name": "cb",
"Type": "function",
"Doc": [
"The",
"function",
"that",
"will",
"be",
"called",
"when",
"the",
"hook",
"is",
"thrown."
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"bait.catch('hilbish.exit', function()",
"\tprint 'Goodbye Hilbish!'",
"end)"
],
"StartIdx": 5
}
],
"param": [
{
"id": "name",
"fields": [
"string",
"The",
"name",
"of",
"the",
"hook."
],
"StartIdx": 2
},
{
"id": "cb",
"fields": [
"function",
"The",
"function",
"that",
"will",
"be",
"called",
"when",
"the",
"hook",
"is",
"thrown."
],
"StartIdx": 0
}
]
}
},
{
"name": "catchOnce",
"description": [
"Catches an event, but only once. This will remove the hook immediately after it runs for the first time."
],
"signature": "catchOnce(name, cb)",
"goFuncName": "bcatchonce",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"The",
"name",
"of",
"the",
"event"
]
},
{
"Name": "cb",
"Type": "function",
"Doc": [
"The",
"function",
"that",
"will",
"be",
"called",
"when",
"the",
"event",
"is",
"thrown."
]
}
],
"tags": {
"param": [
{
"id": "name",
"fields": [
"string",
"The",
"name",
"of",
"the",
"event"
],
"StartIdx": 2
},
{
"id": "cb",
"fields": [
"function",
"The",
"function",
"that",
"will",
"be",
"called",
"when",
"the",
"event",
"is",
"thrown."
],
"StartIdx": 0
}
]
}
},
{
"name": "hooks",
"description": [
"Returns a table of functions that are hooked on an event with the corresponding `name`."
],
"signature": "hooks(name) -\u003e table",
"goFuncName": "bhooks",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"The",
"name",
"of",
"the",
"hook"
]
}
],
"tags": {
"param": [
{
"id": "name",
"fields": [
"string",
"The",
"name",
"of",
"the",
"hook"
],
"StartIdx": 2
}
],
"returns": [
{
"id": "table\u003cfunction\u003e",
"fields": [],
"StartIdx": 3
}
]
}
},
{
"name": "release",
"description": [
"Removes the `catcher` for the event with `name`.",
"For this to work, `catcher` has to be the same function used to catch",
"an event, like one saved to a variable.",
"",
""
],
"signature": "release(name, catcher)",
"goFuncName": "brelease",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"Name",
"of",
"the",
"event",
"the",
"hook",
"is",
"on"
]
},
{
"Name": "catcher",
"Type": "function",
"Doc": [
"Hook",
"function",
"to",
"remove"
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"local hookCallback = function() print 'hi' end",
"",
"bait.catch('event', hookCallback)",
"",
"-- a little while later....",
"bait.release('event', hookCallback)",
"-- and now hookCallback will no longer be ran for the event."
],
"StartIdx": 7
}
],
"param": [
{
"id": "name",
"fields": [
"string",
"Name",
"of",
"the",
"event",
"the",
"hook",
"is",
"on"
],
"StartIdx": 4
},
{
"id": "catcher",
"fields": [
"function",
"Hook",
"function",
"to",
"remove"
],
"StartIdx": 0
}
]
}
},
{
"name": "throw",
"description": [
"Throws a hook with `name` with the provided `args`.",
"",
""
],
"signature": "throw(name, ...args)",
"goFuncName": "bthrow",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"The",
"name",
"of",
"the",
"hook."
]
},
{
"Name": "args",
"Type": "...any",
"Doc": [
"The",
"arguments",
"to",
"pass",
"to",
"the",
"hook."
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"bait.throw('greeting', 'world')",
"",
"-- This can then be listened to via",
"bait.catch('gretting', function(greetTo)",
"\tprint('Hello ' .. greetTo)",
"end)"
],
"StartIdx": 5
}
],
"param": [
{
"id": "name",
"fields": [
"string",
"The",
"name",
"of",
"the",
"hook."
],
"StartIdx": 1
},
{
"id": "args",
"fields": [
"...any",
"The",
"arguments",
"to",
"pass",
"to",
"the",
"hook."
],
"StartIdx": 0
}
]
}
}
]
}

152
defs/commander.json Normal file
View File

@ -0,0 +1,152 @@
{
"name": "commander",
"shortDescription": "library for custom commands",
"description": "\nCommander is the library which handles Hilbish commands. This makes\nthe user able to add Lua-written commands to their shell without making\na separate script in a bin folder. Instead, you may simply use the Commander\nlibrary in your Hilbish config.\n\n```lua\nlocal commander = require 'commander'\n\ncommander.register('hello', function(args, sinks)\n\tsinks.out:writeln 'Hello world!'\nend)\n```\n\nIn this example, a command with the name of `hello` is created\nthat will print `Hello world!` to output. One question you may\nhave is: What is the `sinks` parameter?\n\nThe `sinks` parameter is a table with 3 keys: `input`, `out`, and `err`.\nThere is an `in` alias to `input`, but it requires using the string accessor syntax (`sinks['in']`)\nas `in` is also a Lua keyword, so `input` is preferred for use.\nAll of them are a @Sink.\nIn the future, `sinks.in` will be removed.\n\n- `in` is the standard input.\nYou may use the read functions on this sink to get input from the user.\n- `out` is standard output.\nThis is usually where command output should go.\n- `err` is standard error.\nThis sink is for writing errors, as the name would suggest.",
"properties": [],
"fields": [],
"docs": [
{
"name": "deregister",
"description": [
"Removes the named command. Note that this will only remove Commander-registered commands."
],
"signature": "deregister(name)",
"goFuncName": "cderegister",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"Name",
"of",
"the",
"command",
"to",
"remove."
]
}
],
"tags": {
"param": [
{
"id": "name",
"fields": [
"string",
"Name",
"of",
"the",
"command",
"to",
"remove."
],
"StartIdx": 2
}
]
}
},
{
"name": "register",
"description": [
"Adds a new command with the given `name`. When Hilbish has to run a command with a name,",
"it will run the function providing the arguments and sinks.",
"",
""
],
"signature": "register(name, cb)",
"goFuncName": "cregister",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"Name",
"of",
"the",
"command"
]
},
{
"Name": "cb",
"Type": "function",
"Doc": [
"Callback",
"to",
"handle",
"command",
"invocation"
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"-- When you run the command `hello` in the shell, it will print `Hello world`.",
"-- If you run it with, for example, `hello Hilbish`, it will print 'Hello Hilbish'",
"commander.register('hello', function(args, sinks)",
"\tlocal name = 'world'",
"\tif #args \u003e 0 then name = args[1] end",
"",
"\tsinks.out:writeln('Hello ' .. name)",
"end)"
],
"StartIdx": 6
}
],
"param": [
{
"id": "name",
"fields": [
"string",
"Name",
"of",
"the",
"command"
],
"StartIdx": 3
},
{
"id": "cb",
"fields": [
"function",
"Callback",
"to",
"handle",
"command",
"invocation"
],
"StartIdx": 0
}
]
}
},
{
"name": "registry",
"description": [
"Returns all registered commanders. Returns a list of tables with the following keys:",
"- `exec`: The function used to run the commander. Commanders require args and sinks to be passed."
],
"signature": "registry() -\u003e table",
"goFuncName": "cregistry",
"isInterface": false,
"isMember": false,
"isType": false,
"tags": {
"returns": [
{
"id": "table",
"fields": [],
"StartIdx": 3
}
]
}
}
]
}

549
defs/fs.json Normal file
View File

@ -0,0 +1,549 @@
{
"name": "fs",
"shortDescription": "filesystem interaction and functionality library",
"description": "\nThe fs module provides filesystem functions to Hilbish. While Lua's standard\nlibrary has some I/O functions, they're missing a lot of the basics. The `fs`\nlibrary offers more functions and will work on any operating system Hilbish does.",
"properties": [],
"fields": [
{
"name": "pathSep",
"description": [
"The",
"operating",
"system's",
"path",
"separator."
],
"isInterface": false,
"isMember": false,
"isType": false
}
],
"docs": [
{
"name": "abs",
"description": [
"Returns an absolute version of the `path`.",
"This can be used to resolve short paths like `..` to `/home/user`."
],
"signature": "abs(path) -\u003e string",
"goFuncName": "fabs",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "path",
"Type": "string",
"Doc": []
}
],
"tags": {
"param": [
{
"id": "path",
"fields": [
"string"
],
"StartIdx": 3
}
],
"returns": [
{
"id": "string",
"fields": [],
"StartIdx": 4
}
]
}
},
{
"name": "basename",
"description": [
"Returns the \"basename,\" or the last part of the provided `path`. If path is empty,",
"`.` will be returned."
],
"signature": "basename(path) -\u003e string",
"goFuncName": "fbasename",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "path",
"Type": "string",
"Doc": [
"Path",
"to",
"get",
"the",
"base",
"name",
"of."
]
}
],
"tags": {
"param": [
{
"id": "path",
"fields": [
"string",
"Path",
"to",
"get",
"the",
"base",
"name",
"of."
],
"StartIdx": 3
}
],
"returns": [
{
"id": "string",
"fields": [],
"StartIdx": 4
}
]
}
},
{
"name": "cd",
"description": [
"Changes Hilbish's directory to `dir`."
],
"signature": "cd(dir)",
"goFuncName": "fcd",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "dir",
"Type": "string",
"Doc": [
"Path",
"to",
"change",
"directory",
"to."
]
}
],
"tags": {
"param": [
{
"id": "dir",
"fields": [
"string",
"Path",
"to",
"change",
"directory",
"to."
],
"StartIdx": 2
}
]
}
},
{
"name": "dir",
"description": [
"Returns the directory part of `path`. If a file path like",
"`~/Documents/doc.txt` then this function will return `~/Documents`."
],
"signature": "dir(path) -\u003e string",
"goFuncName": "fdir",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "path",
"Type": "string",
"Doc": [
"Path",
"to",
"get",
"the",
"directory",
"for."
]
}
],
"tags": {
"param": [
{
"id": "path",
"fields": [
"string",
"Path",
"to",
"get",
"the",
"directory",
"for."
],
"StartIdx": 3
}
],
"returns": [
{
"id": "string",
"fields": [],
"StartIdx": 4
}
]
}
},
{
"name": "glob",
"description": [
"Match all files based on the provided `pattern`.",
"For the syntax' refer to Go's filepath.Match function: https://pkg.go.dev/path/filepath#Match",
"",
""
],
"signature": "glob(pattern) -\u003e matches (table)",
"goFuncName": "fglob",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "pattern",
"Type": "string",
"Doc": [
"Pattern",
"to",
"compare",
"files",
"with."
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"--[[",
"\tWithin a folder that contains the following files:",
"\ta.txt",
"\tinit.lua",
"\tcode.lua",
"\tdoc.pdf",
"]]--",
"local matches = fs.glob './*.lua'",
"print(matches)",
"-- -\u003e {'init.lua', 'code.lua'}"
],
"StartIdx": 6
}
],
"param": [
{
"id": "pattern",
"fields": [
"string",
"Pattern",
"to",
"compare",
"files",
"with."
],
"StartIdx": 3
}
],
"returns": [
{
"id": "table",
"fields": [
"A",
"list",
"of",
"file",
"names/paths",
"that",
"match."
],
"StartIdx": 4
}
]
}
},
{
"name": "join",
"description": [
"Takes any list of paths and joins them based on the operating system's path separator.",
"",
""
],
"signature": "join(...path) -\u003e string",
"goFuncName": "fjoin",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "path",
"Type": "...string",
"Doc": [
"Paths",
"to",
"join",
"together"
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"-- This prints the directory for Hilbish's config!",
"print(fs.join(hilbish.userDir.config, 'hilbish'))",
"-- -\u003e '/home/user/.config/hilbish' on Linux"
],
"StartIdx": 5
}
],
"param": [
{
"id": "path",
"fields": [
"...string",
"Paths",
"to",
"join",
"together"
],
"StartIdx": 2
}
],
"returns": [
{
"id": "string",
"fields": [
"The",
"joined",
"path."
],
"StartIdx": 3
}
]
}
},
{
"name": "mkdir",
"description": [
"Creates a new directory with the provided `name`.",
"With `recursive`, mkdir will create parent directories.",
"",
""
],
"signature": "mkdir(name, recursive)",
"goFuncName": "fmkdir",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "name",
"Type": "string",
"Doc": [
"Name",
"of",
"the",
"directory"
]
},
{
"Name": "recursive",
"Type": "boolean",
"Doc": [
"Whether",
"to",
"create",
"parent",
"directories",
"for",
"the",
"provided",
"name"
]
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"-- This will create the directory foo, then create the directory bar in the",
"-- foo directory. If recursive is false in this case, it will fail.",
"fs.mkdir('./foo/bar', true)"
],
"StartIdx": 6
}
],
"param": [
{
"id": "name",
"fields": [
"string",
"Name",
"of",
"the",
"directory"
],
"StartIdx": 3
},
{
"id": "recursive",
"fields": [
"boolean",
"Whether",
"to",
"create",
"parent",
"directories",
"for",
"the",
"provided",
"name"
],
"StartIdx": 0
}
]
}
},
{
"name": "pipe",
"description": [
"Returns a pair of connected files, also known as a pipe.",
"The type returned is a Lua file, same as returned from `io` functions."
],
"signature": "fpipe() -\u003e File, File",
"goFuncName": "fpipe",
"isInterface": false,
"isMember": false,
"isType": false,
"tags": {
"returns": [
{
"id": "File",
"fields": [],
"StartIdx": 3
},
{
"id": "File",
"fields": [],
"StartIdx": 0
}
]
}
},
{
"name": "readdir",
"description": [
"Returns a list of all files and directories in the provided path."
],
"signature": "readdir(path) -\u003e table[string]",
"goFuncName": "freaddir",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "dir",
"Type": "string",
"Doc": []
}
],
"tags": {
"param": [
{
"id": "dir",
"fields": [
"string"
],
"StartIdx": 2
}
],
"returns": [
{
"id": "table",
"fields": [],
"StartIdx": 3
}
]
}
},
{
"name": "stat",
"description": [
"Returns the information about a given `path`.",
"The returned table contains the following values:",
"name (string) - Name of the path",
"size (number) - Size of the path in bytes",
"mode (string) - Unix permission mode in an octal format string (with leading 0)",
"isDir (boolean) - If the path is a directory",
"",
""
],
"signature": "stat(path) -\u003e {}",
"goFuncName": "fstat",
"isInterface": false,
"isMember": false,
"isType": false,
"params": [
{
"Name": "path",
"Type": "string",
"Doc": []
}
],
"tags": {
"example": [
{
"id": "",
"fields": [
"local inspect = require 'inspect'",
"",
"local stat = fs.stat '~'",
"print(inspect(stat))",
"--[[",
"Would print the following:",
"{",
" isDir = true,",
" mode = \"0755\",",
" name = \"username\",",
" size = 12288",
"}",
"]]--"
],
"StartIdx": 10
}
],
"param": [
{
"id": "path",
"fields": [
"string"
],
"StartIdx": 7
}
],
"returns": [
{
"id": "table",
"fields": [],
"StartIdx": 8
}
]
}
}
]
}

3267
defs/hilbish.json Normal file

File diff suppressed because it is too large Load Diff

140
defs/snail.json Normal file
View File

@ -0,0 +1,140 @@
{
"name": "snail",
"shortDescription": "shell script interpreter library",
"description": "\nThe snail library houses Hilbish's Lua wrapper of its shell script interpreter.\nIt's not very useful other than running shell scripts, which can be done with other\nHilbish functions.",
"properties": [],
"fields": [],
"types": [
{
"name": "Snail",
"description": [
"A Snail is a shell script interpreter instance."
],
"parent": "snail",
"isInterface": false,
"isMember": false,
"isType": true,
"tags": {
"type": [
{
"id": "",
"fields": null,
"StartIdx": 0
}
]
}
}
],
"docs": [
{
"name": "dir",
"description": [
"Changes the directory of the snail instance.",
"The interpreter keeps its set directory even when the Hilbish process changes",
"directory, so this should be called on the `hilbish.cd` hook."
],
"signature": "dir(path)",
"goFuncName": "snaildir",
"isInterface": false,
"isMember": true,
"isType": false,
"params": [
{
"Name": "path",
"Type": "string",
"Doc": [
"Has",
"to",
"be",
"an",
"absolute",
"path."
]
}
],
"tags": {
"member": [
{
"id": "",
"fields": null,
"StartIdx": 0
}
],
"param": [
{
"id": "path",
"fields": [
"string",
"Has",
"to",
"be",
"an",
"absolute",
"path."
],
"StartIdx": 5
}
]
}
},
{
"name": "new",
"description": [
"Creates a new Snail instance."
],
"signature": "new() -\u003e @Snail",
"goFuncName": "snailnew",
"isInterface": false,
"isMember": false,
"isType": false
},
{
"name": "run",
"description": [
"Runs a shell command. Works the same as `hilbish.run`, but only accepts a table of streams."
],
"signature": "run(command, streams)",
"goFuncName": "snailrun",
"isInterface": false,
"isMember": true,
"isType": false,
"params": [
{
"Name": "command",
"Type": "string",
"Doc": []
},
{
"Name": "streams",
"Type": "table",
"Doc": []
}
],
"tags": {
"member": [
{
"id": "",
"fields": null,
"StartIdx": 0
}
],
"param": [
{
"id": "command",
"fields": [
"string"
],
"StartIdx": 3
},
{
"id": "streams",
"fields": [
"table"
],
"StartIdx": 0
}
]
}
}
]
}

54
defs/terminal.json Normal file
View File

@ -0,0 +1,54 @@
{
"name": "terminal",
"shortDescription": "low level terminal library",
"description": "The terminal library is a simple and lower level library for certain terminal interactions.",
"properties": [],
"fields": [],
"docs": [
{
"name": "restoreState",
"description": [
"Restores the last saved state of the terminal"
],
"signature": "restoreState()",
"goFuncName": "termrestorestate",
"isInterface": false,
"isMember": false,
"isType": false
},
{
"name": "saveState",
"description": [
"Saves the current state of the terminal."
],
"signature": "saveState()",
"goFuncName": "termsavestate",
"isInterface": false,
"isMember": false,
"isType": false
},
{
"name": "setRaw",
"description": [
"Puts the terminal into raw mode."
],
"signature": "setRaw()",
"goFuncName": "termsetraw",
"isInterface": false,
"isMember": false,
"isType": false
},
{
"name": "size",
"description": [
"Gets the dimensions of the terminal. Returns a table with `width` and `height`",
"NOTE: The size refers to the amount of columns and rows of text that can fit in the terminal."
],
"signature": "size()",
"goFuncName": "termsize",
"isInterface": false,
"isMember": false,
"isType": false
}
]
}

View File

@ -9,6 +9,7 @@ menu:
## Introduction ## Introduction
Bait is the event emitter for Hilbish. Much like Node.js and Bait is the event emitter for Hilbish. Much like Node.js and
its `events` system, many actions in Hilbish emit events. its `events` system, many actions in Hilbish emit events.
Unlike Node.js, Hilbish events are global. So make sure to Unlike Node.js, Hilbish events are global. So make sure to
@ -33,98 +34,140 @@ What this does is, whenever the `command.exit` event is thrown,
this function will set the user prompt. this function will set the user prompt.
## Functions ## Functions
|||
|----|----|
|<a href="#catch">catch(name, cb)</a>|Catches an event. This function can be used to act on events.|
|<a href="#catchOnce">catchOnce(name, cb)</a>|Catches an event, but only once. This will remove the hook immediately after it runs for the first time.|
|<a href="#hooks">hooks(name) -> table</a>|Returns a table of functions that are hooked on an event with the corresponding `name`.|
|<a href="#release">release(name, catcher)</a>|Removes the `catcher` for the event with `name`.|
|<a href="#throw">throw(name, ...args)</a>|Throws a hook with `name` with the provided `args`.|
<hr> ``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#catch">catch(name, cb)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Catches an event. This function can be used to act on events.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#catchOnce">catchOnce(name, cb)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Catches an event, but only once. This will remove the hook immediately after it runs for the first time.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#hooks">hooks(name) -> table</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns a table of functions that are hooked on an event with the corresponding `name`.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#release">release(name, catcher)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Removes the `catcher` for the event with `name`.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#throw">throw(name, ...args)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Throws a hook with `name` with the provided `args`.</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='catch'> <div id='catch'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
bait.catch(name, cb) bait.catch(name, cb)
<a href="#catch" class='heading-link'> <a href="#catch" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Catches an event. This function can be used to act on events. Catches an event. This function can be used to act on events.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
The name of the hook. The name of the hook.
`function` **`cb`** `function` `*cb*`
The function that will be called when the hook is thrown. The function that will be called when the hook is thrown.
#### Example #### Example
```lua ```lua
bait.catch('hilbish.exit', function() bait.catch('hilbish.exit', function()
print 'Goodbye Hilbish!' print 'Goodbye Hilbish!'
end) end)
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='catchOnce'> <div id='catchOnce'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
bait.catchOnce(name, cb) bait.catchOnce(name, cb)
<a href="#catchOnce" class='heading-link'> <a href="#catchOnce" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Catches an event, but only once. This will remove the hook immediately after it runs for the first time. Catches an event, but only once. This will remove the hook immediately after it runs for the first time.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
The name of the event The name of the event
`function` **`cb`** `function` `*cb*`
The function that will be called when the event is thrown. The function that will be called when the event is thrown.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='hooks'> <div id='hooks'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
bait.hooks(name) -> table bait.hooks(name) -> table
<a href="#hooks" class='heading-link'> <a href="#hooks" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns a table of functions that are hooked on an event with the corresponding `name`. Returns a table of functions that are hooked on an event with the corresponding `name`.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
The name of the hook The name of the hook
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='release'> <div id='release'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
bait.release(name, catcher) bait.release(name, catcher)
<a href="#release" class='heading-link'> <a href="#release" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Removes the `catcher` for the event with `name`. Removes the `catcher` for the event with `name`.
For this to work, `catcher` has to be the same function used to catch For this to work, `catcher` has to be the same function used to catch
an event, like one saved to a variable. an event, like one saved to a variable.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
Name of the event the hook is on Name of the event the hook is on
`function` **`catcher`** `function` `*catcher*`
Hook function to remove Hook function to remove
#### Example #### Example
```lua ```lua
local hookCallback = function() print 'hi' end local hookCallback = function() print 'hi' end
@ -134,27 +177,32 @@ bait.catch('event', hookCallback)
bait.release('event', hookCallback) bait.release('event', hookCallback)
-- and now hookCallback will no longer be ran for the event. -- and now hookCallback will no longer be ran for the event.
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='throw'> <div id='throw'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
bait.throw(name, ...args) bait.throw(name, ...args)
<a href="#throw" class='heading-link'> <a href="#throw" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Throws a hook with `name` with the provided `args`. Throws a hook with `name` with the provided `args`.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
The name of the hook. The name of the hook.
`any` **`args`** (This type is variadic. You can pass an infinite amount of parameters with this type.) `any` `*args*` (This type is variadic. You can pass an infinite amount of parameters with this type.)
The arguments to pass to the hook. The arguments to pass to the hook.
#### Example #### Example
```lua ```lua
bait.throw('greeting', 'world') bait.throw('greeting', 'world')
@ -163,5 +211,5 @@ bait.catch('gretting', function(greetTo)
print('Hello ' .. greetTo) print('Hello ' .. greetTo)
end) end)
``` ```
</div>

View File

@ -9,6 +9,7 @@ menu:
## Introduction ## Introduction
Commander is the library which handles Hilbish commands. This makes Commander is the library which handles Hilbish commands. This makes
the user able to add Lua-written commands to their shell without making the user able to add Lua-written commands to their shell without making
a separate script in a bin folder. Instead, you may simply use the Commander a separate script in a bin folder. Instead, you may simply use the Commander
@ -29,7 +30,7 @@ have is: What is the `sinks` parameter?
The `sinks` parameter is a table with 3 keys: `input`, `out`, and `err`. The `sinks` parameter is a table with 3 keys: `input`, `out`, and `err`.
There is an `in` alias to `input`, but it requires using the string accessor syntax (`sinks['in']`) There is an `in` alias to `input`, but it requires using the string accessor syntax (`sinks['in']`)
as `in` is also a Lua keyword, so `input` is preferred for use. as `in` is also a Lua keyword, so `input` is preferred for use.
All of them are a <a href="/Hilbish/docs/api/hilbish/#sink" style="text-decoration: none;">Sink</a>. All of them are a @Sink.
In the future, `sinks.in` will be removed. In the future, `sinks.in` will be removed.
- `in` is the standard input. - `in` is the standard input.
@ -40,49 +41,76 @@ This is usually where command output should go.
This sink is for writing errors, as the name would suggest. This sink is for writing errors, as the name would suggest.
## Functions ## Functions
|||
|----|----|
|<a href="#deregister">deregister(name)</a>|Removes the named command. Note that this will only remove Commander-registered commands.|
|<a href="#register">register(name, cb)</a>|Adds a new command with the given `name`. When Hilbish has to run a command with a name,|
|<a href="#registry">registry() -> table</a>|Returns all registered commanders. Returns a list of tables with the following keys:|
<hr> ``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#deregister">deregister(name)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Removes the named command. Note that this will only remove Commander-registered commands.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#register">register(name, cb)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Adds a new command with the given `name`. When Hilbish has to run a command with a name,</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#registry">registry() -> table</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns all registered commanders. Returns a list of tables with the following keys:</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='deregister'> <div id='deregister'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
commander.deregister(name) commander.deregister(name)
<a href="#deregister" class='heading-link'> <a href="#deregister" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Removes the named command. Note that this will only remove Commander-registered commands. Removes the named command. Note that this will only remove Commander-registered commands.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
Name of the command to remove. Name of the command to remove.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='register'> <div id='register'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
commander.register(name, cb) commander.register(name, cb)
<a href="#register" class='heading-link'> <a href="#register" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Adds a new command with the given `name`. When Hilbish has to run a command with a name, Adds a new command with the given `name`. When Hilbish has to run a command with a name,
it will run the function providing the arguments and sinks. it will run the function providing the arguments and sinks.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
Name of the command Name of the command
`function` **`cb`** `function` `*cb*`
Callback to handle command invocation Callback to handle command invocation
#### Example #### Example
```lua ```lua
-- When you run the command `hello` in the shell, it will print `Hello world`. -- When you run the command `hello` in the shell, it will print `Hello world`.
-- If you run it with, for example, `hello Hilbish`, it will print 'Hello Hilbish' -- If you run it with, for example, `hello Hilbish`, it will print 'Hello Hilbish'
@ -93,21 +121,25 @@ commander.register('hello', function(args, sinks)
sinks.out:writeln('Hello ' .. name) sinks.out:writeln('Hello ' .. name)
end) end)
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='registry'> <div id='registry'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
commander.registry() -> table commander.registry() -> table
<a href="#registry" class='heading-link'> <a href="#registry" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns all registered commanders. Returns a list of tables with the following keys: Returns all registered commanders. Returns a list of tables with the following keys:
- `exec`: The function used to run the commander. Commanders require args and sinks to be passed. - `exec`: The function used to run the commander. Commanders require args and sinks to be passed.
#### Parameters #### Parameters
This function has no parameters.
</div> This function has no parameters.

View File

@ -9,117 +9,188 @@ menu:
## Introduction ## Introduction
The fs module provides filesystem functions to Hilbish. While Lua's standard The fs module provides filesystem functions to Hilbish. While Lua's standard
library has some I/O functions, they're missing a lot of the basics. The `fs` library has some I/O functions, they're missing a lot of the basics. The `fs`
library offers more functions and will work on any operating system Hilbish does. library offers more functions and will work on any operating system Hilbish does.
## Functions ## Functions
|||
|----|----| ``` =html
|<a href="#abs">abs(path) -> string</a>|Returns an absolute version of the `path`.| <div class='relative overflow-x-auto sm:rounded-lg my-4'>
|<a href="#basename">basename(path) -> string</a>|Returns the "basename," or the last part of the provided `path`. If path is empty,| <table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
|<a href="#cd">cd(dir)</a>|Changes Hilbish's directory to `dir`.| <tbody>
|<a href="#dir">dir(path) -> string</a>|Returns the directory part of `path`. If a file path like| <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
|<a href="#glob">glob(pattern) -> matches (table)</a>|Match all files based on the provided `pattern`.| <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#abs">abs(path) -> string</a></td>
|<a href="#join">join(...path) -> string</a>|Takes any list of paths and joins them based on the operating system's path separator.| <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns an absolute version of the `path`.</td>
|<a href="#mkdir">mkdir(name, recursive)</a>|Creates a new directory with the provided `name`.| </tr>
|<a href="#pipe">fpipe() -> File, File</a>|Returns a pair of connected files, also known as a pipe.| <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
|<a href="#readdir">readdir(path) -> table[string]</a>|Returns a list of all files and directories in the provided path.| <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#basename">basename(path) -> string</a></td>
|<a href="#stat">stat(path) -> {}</a>|Returns the information about a given `path`.| <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns the "basename," or the last part of the provided `path`. If path is empty,</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#cd">cd(dir)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Changes Hilbish's directory to `dir`.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#dir">dir(path) -> string</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns the directory part of `path`. If a file path like</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#glob">glob(pattern) -> matches (table)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Match all files based on the provided `pattern`.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#join">join(...path) -> string</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Takes any list of paths and joins them based on the operating system's path separator.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#mkdir">mkdir(name, recursive)</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Creates a new directory with the provided `name`.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#pipe">fpipe() -> File, File</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns a pair of connected files, also known as a pipe.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#readdir">readdir(path) -> table[string]</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns a list of all files and directories in the provided path.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#stat">stat(path) -> {}</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns the information about a given `path`.</td>
</tr>
</tbody>
</table>
</div>
```
## Static module fields ## Static module fields
|||
|----|----|
|pathSep|The operating system's path separator.|
<hr> ``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>pathSep</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>The operating system's path separator.</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='abs'> <div id='abs'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.abs(path) -> string fs.abs(path) -> string
<a href="#abs" class='heading-link'> <a href="#abs" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns an absolute version of the `path`. Returns an absolute version of the `path`.
This can be used to resolve short paths like `..` to `/home/user`. This can be used to resolve short paths like `..` to `/home/user`.
#### Parameters #### Parameters
`string` **`path`**
`string` `*path*`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='basename'> <div id='basename'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.basename(path) -> string fs.basename(path) -> string
<a href="#basename" class='heading-link'> <a href="#basename" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns the "basename," or the last part of the provided `path`. If path is empty, Returns the "basename," or the last part of the provided `path`. If path is empty,
`.` will be returned. `.` will be returned.
#### Parameters #### Parameters
`string` **`path`**
`string` `*path*`
Path to get the base name of. Path to get the base name of.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='cd'> <div id='cd'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.cd(dir) fs.cd(dir)
<a href="#cd" class='heading-link'> <a href="#cd" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Changes Hilbish's directory to `dir`. Changes Hilbish's directory to `dir`.
#### Parameters #### Parameters
`string` **`dir`**
`string` `*dir*`
Path to change directory to. Path to change directory to.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='dir'> <div id='dir'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.dir(path) -> string fs.dir(path) -> string
<a href="#dir" class='heading-link'> <a href="#dir" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns the directory part of `path`. If a file path like Returns the directory part of `path`. If a file path like
`~/Documents/doc.txt` then this function will return `~/Documents`. `~/Documents/doc.txt` then this function will return `~/Documents`.
#### Parameters #### Parameters
`string` **`path`**
`string` `*path*`
Path to get the directory for. Path to get the directory for.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='glob'> <div id='glob'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.glob(pattern) -> matches (table) fs.glob(pattern) -> matches (table)
<a href="#glob" class='heading-link'> <a href="#glob" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Match all files based on the provided `pattern`. Match all files based on the provided `pattern`.
For the syntax' refer to Go's filepath.Match function: https://pkg.go.dev/path/filepath#Match For the syntax' refer to Go's filepath.Match function: https://pkg.go.dev/path/filepath#Match
#### Parameters #### Parameters
`string` **`pattern`**
`string` `*pattern*`
Pattern to compare files with. Pattern to compare files with.
#### Example #### Example
```lua ```lua
--[[ --[[
Within a folder that contains the following files: Within a folder that contains the following files:
@ -132,100 +203,121 @@ local matches = fs.glob './*.lua'
print(matches) print(matches)
-- -> {'init.lua', 'code.lua'} -- -> {'init.lua', 'code.lua'}
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='join'> <div id='join'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.join(...path) -> string fs.join(...path) -> string
<a href="#join" class='heading-link'> <a href="#join" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Takes any list of paths and joins them based on the operating system's path separator. Takes any list of paths and joins them based on the operating system's path separator.
#### Parameters #### Parameters
`string` **`path`** (This type is variadic. You can pass an infinite amount of parameters with this type.)
`string` `*path*` (This type is variadic. You can pass an infinite amount of parameters with this type.)
Paths to join together Paths to join together
#### Example #### Example
```lua ```lua
-- This prints the directory for Hilbish's config! -- This prints the directory for Hilbish's config!
print(fs.join(hilbish.userDir.config, 'hilbish')) print(fs.join(hilbish.userDir.config, 'hilbish'))
-- -> '/home/user/.config/hilbish' on Linux -- -> '/home/user/.config/hilbish' on Linux
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='mkdir'> <div id='mkdir'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.mkdir(name, recursive) fs.mkdir(name, recursive)
<a href="#mkdir" class='heading-link'> <a href="#mkdir" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Creates a new directory with the provided `name`. Creates a new directory with the provided `name`.
With `recursive`, mkdir will create parent directories. With `recursive`, mkdir will create parent directories.
#### Parameters #### Parameters
`string` **`name`**
`string` `*name*`
Name of the directory Name of the directory
`boolean` **`recursive`** `boolean` `*recursive*`
Whether to create parent directories for the provided name Whether to create parent directories for the provided name
#### Example #### Example
```lua ```lua
-- This will create the directory foo, then create the directory bar in the -- This will create the directory foo, then create the directory bar in the
-- foo directory. If recursive is false in this case, it will fail. -- foo directory. If recursive is false in this case, it will fail.
fs.mkdir('./foo/bar', true) fs.mkdir('./foo/bar', true)
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='pipe'> <div id='pipe'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.fpipe() -> File, File fs.fpipe() -> File, File
<a href="#pipe" class='heading-link'> <a href="#pipe" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns a pair of connected files, also known as a pipe. Returns a pair of connected files, also known as a pipe.
The type returned is a Lua file, same as returned from `io` functions. The type returned is a Lua file, same as returned from `io` functions.
#### Parameters #### Parameters
This function has no parameters.
</div>
<hr> This function has no parameters.
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='readdir'> <div id='readdir'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.readdir(path) -> table[string] fs.readdir(path) -> table[string]
<a href="#readdir" class='heading-link'> <a href="#readdir" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns a list of all files and directories in the provided path. Returns a list of all files and directories in the provided path.
#### Parameters #### Parameters
`string` **`dir`**
`string` `*dir*`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='stat'> <div id='stat'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
fs.stat(path) -> {} fs.stat(path) -> {}
<a href="#stat" class='heading-link'> <a href="#stat" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns the information about a given `path`. Returns the information about a given `path`.
The returned table contains the following values: The returned table contains the following values:
name (string) - Name of the path name (string) - Name of the path
@ -234,10 +326,12 @@ mode (string) - Unix permission mode in an octal format string (with leading 0)
isDir (boolean) - If the path is a directory isDir (boolean) - If the path is a directory
#### Parameters #### Parameters
`string` **`path`**
`string` `*path*`
#### Example #### Example
```lua ```lua
local inspect = require 'inspect' local inspect = require 'inspect'
@ -253,5 +347,5 @@ Would print the following:
} }
]]-- ]]--
``` ```
</div>

View File

@ -1,6 +1,6 @@
--- ---
title: Module hilbish title: Module hilbish
description: description: the core Hilbish API
layout: doc layout: doc
menu: menu:
docs: docs:
@ -9,100 +9,153 @@ menu:
## Introduction ## Introduction
The Hilbish module includes the core API, containing
interfaces and functions which directly relate to shell functionality.
## Functions ## Functions
``` =html ``` =html
<div class='p-2 rounded'> <div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full'> <table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody> <tbody>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#alias">alias(cmd, orig)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#alias">alias(cmd, orig)</a></td>
<td>Sets an alias, with a name of `cmd` to another command.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Sets an alias, with a name of `cmd` to another command.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#appendPath">appendPath(dir)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#appendPath">appendPath(dir)</a></td>
<td>Appends the provided dir to the command path (`$PATH`)</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Appends the provided dir to the command path (`$PATH`)</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#complete">complete(scope, cb)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#complete">complete(scope, cb)</a></td>
<td>Registers a completion handler for the specified scope.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Registers a completion handler for the specified scope.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#cwd">cwd() -> string</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#cwd">cwd() -> string</a></td>
<td>Returns the current directory of the shell.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Returns the current directory of the shell.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#exec">exec(cmd)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#exec">exec(cmd)</a></td>
<td>Replaces the currently running Hilbish instance with the supplied command.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Replaces the currently running Hilbish instance with the supplied command.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#goro">goro(fn)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#goro">goro(fn)</a></td>
<td>Puts `fn` in a Goroutine.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Puts `fn` in a Goroutine.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#highlighter">highlighter(line)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#highlighter">highlighter(line)</a></td>
<td>Line highlighter handler.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Line highlighter handler.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#hinter">hinter(line, pos)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#hinter">hinter(line, pos)</a></td>
<td>The command line hint handler. It gets called on every key insert to</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>The command line hint handler. It gets called on every key insert to</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#inputMode">inputMode(mode)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#inputMode">inputMode(mode)</a></td>
<td>Sets the input mode for Hilbish's line reader.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Sets the input mode for Hilbish's line reader.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#interval">interval(cb, time) -> @Timer</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#interval">interval(cb, time) -> @Timer</a></td>
<td>Runs the `cb` function every specified amount of `time`.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Runs the `cb` function every specified amount of `time`.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#multiprompt">multiprompt(str)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#multiprompt">multiprompt(str)</a></td>
<td>Changes the text prompt when Hilbish asks for more input.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Changes the text prompt when Hilbish asks for more input.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#prependPath">prependPath(dir)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#prependPath">prependPath(dir)</a></td>
<td>Prepends `dir` to $PATH.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Prepends `dir` to $PATH.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#prompt">prompt(str, typ)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#prompt">prompt(str, typ)</a></td>
<td>Changes the shell prompt to the provided string.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Changes the shell prompt to the provided string.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#read">read(prompt) -> input (string)</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#read">read(prompt) -> input (string)</a></td>
<td>Read input from the user, using Hilbish's line editor/input reader.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Read input from the user, using Hilbish's line editor/input reader.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#timeout">timeout(cb, time) -> @Timer</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#timeout">timeout(cb, time) -> @Timer</a></td>
<td>Executed the `cb` function after a period of `time`.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Executed the `cb` function after a period of `time`.</td>
</tr> </tr>
<tr class='m-2 bg-neutral-700'> <tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td><a href="#which">which(name) -> string</a></td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#which">which(name) -> string</a></td>
<td>Checks if `name` is a valid command.</td> <td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Checks if `name` is a valid command.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
``` ```
<hr> ## Static module fields
``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>ver</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>The version of Hilbish</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>goVersion</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>The version of Go that Hilbish was compiled with</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>user</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Username of the user</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>host</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Hostname of the machine</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>dataDir</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Directory for Hilbish data files, including the docs and default modules</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>interactive</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Is Hilbish in an interactive shell?</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>login</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Is Hilbish the login shell?</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>vimMode</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Current Vim input mode of Hilbish (will be nil if not in Vim input mode)</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>exitCode</td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Exit code of the last executed command</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='alias'> <div id='alias'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.alias(cmd, orig) hilbish.alias(cmd, orig)
<a href="#alias" class='heading-link'> <a href="#alias" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Sets an alias, with a name of `cmd` to another command. Sets an alias, with a name of `cmd` to another command.
#### Parameters #### Parameters
`string` *`cmd`* `string` `*cmd*`
Name of the alias Name of the alias
`string` *`orig`* `string` `*orig*`
Command that will be aliased Command that will be aliased
#### Example #### Example
@ -115,22 +168,25 @@ hilbish.alias('ga', 'git add')
hilbish.alias('dircount', 'ls %1 | wc -l') hilbish.alias('dircount', 'ls %1 | wc -l')
-- "dircount ~" would count how many files are in ~ (home directory). -- "dircount ~" would count how many files are in ~ (home directory).
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='appendPath'> <div id='appendPath'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.appendPath(dir) hilbish.appendPath(dir)
<a href="#appendPath" class='heading-link'> <a href="#appendPath" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Appends the provided dir to the command path (`$PATH`) Appends the provided dir to the command path (`$PATH`)
#### Parameters #### Parameters
`string|table` *`dir`* `string|table` `*dir*`
Directory (or directories) to append to path Directory (or directories) to append to path
#### Example #### Example
@ -145,17 +201,20 @@ hilbish.appendPath {
'~/.local/bin' '~/.local/bin'
} }
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='complete'> <div id='complete'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.complete(scope, cb) hilbish.complete(scope, cb)
<a href="#complete" class='heading-link'> <a href="#complete" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Registers a completion handler for the specified scope. Registers a completion handler for the specified scope.
A `scope` is expected to be `command.<cmd>`, A `scope` is expected to be `command.<cmd>`,
replacing <cmd> with the name of the command (for example `command.git`). replacing <cmd> with the name of the command (for example `command.git`).
@ -164,10 +223,10 @@ provides more details.
#### Parameters #### Parameters
`string` *`scope`* `string` `*scope*`
`function` *`cb`* `function` `*cb*`
#### Example #### Example
@ -197,52 +256,61 @@ hilbish.complete('command.sudo', function(query, ctx, fields)
return {compGroup}, pfx return {compGroup}, pfx
end) end)
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='cwd'> <div id='cwd'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.cwd() -> string hilbish.cwd() -> string
<a href="#cwd" class='heading-link'> <a href="#cwd" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Returns the current directory of the shell. Returns the current directory of the shell.
#### Parameters #### Parameters
This function has no parameters. This function has no parameters.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='exec'> <div id='exec'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.exec(cmd) hilbish.exec(cmd)
<a href="#exec" class='heading-link'> <a href="#exec" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Replaces the currently running Hilbish instance with the supplied command. Replaces the currently running Hilbish instance with the supplied command.
This can be used to do an in-place restart. This can be used to do an in-place restart.
#### Parameters #### Parameters
`string` *`cmd`* `string` `*cmd*`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='goro'> <div id='goro'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.goro(fn) hilbish.goro(fn)
<a href="#goro" class='heading-link'> <a href="#goro" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Puts `fn` in a Goroutine. Puts `fn` in a Goroutine.
This can be used to run any function in another thread at the same time as other Lua code. This can be used to run any function in another thread at the same time as other Lua code.
**NOTE: THIS FUNCTION MAY CRASH HILBISH IF OUTSIDE VARIABLES ARE ACCESSED.** **NOTE: THIS FUNCTION MAY CRASH HILBISH IF OUTSIDE VARIABLES ARE ACCESSED.**
@ -250,20 +318,23 @@ This can be used to run any function in another thread at the same time as other
#### Parameters #### Parameters
`function` *`fn`* `function` `*fn*`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='highlighter'> <div id='highlighter'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.highlighter(line) hilbish.highlighter(line)
<a href="#highlighter" class='heading-link'> <a href="#highlighter" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Line highlighter handler. Line highlighter handler.
This is mainly for syntax highlighting, but in reality could set the input This is mainly for syntax highlighting, but in reality could set the input
of the prompt to *display* anything. The callback is passed the current line of the prompt to *display* anything. The callback is passed the current line
@ -272,7 +343,7 @@ Note that to set a highlighter, one has to override this function.
#### Parameters #### Parameters
`string` *`line`* `string` `*line*`
#### Example #### Example
@ -283,17 +354,20 @@ function hilbish.highlighter(line)
return line:gsub('"%w+"', function(c) return lunacolors.green(c) end) return line:gsub('"%w+"', function(c) return lunacolors.green(c) end)
end end
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='hinter'> <div id='hinter'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.hinter(line, pos) hilbish.hinter(line, pos)
<a href="#hinter" class='heading-link'> <a href="#hinter" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
The command line hint handler. It gets called on every key insert to The command line hint handler. It gets called on every key insert to
determine what text to use as an inline hint. It is passed the current determine what text to use as an inline hint. It is passed the current
line and cursor position. It is expected to return a string which is used line and cursor position. It is expected to return a string which is used
@ -302,10 +376,10 @@ override this function with your custom handler.
#### Parameters #### Parameters
`string` *`line`* `string` `*line*`
`number` *`pos`* `number` `*pos*`
Position of cursor in line. Usually equals string.len(line) Position of cursor in line. Usually equals string.len(line)
#### Example #### Example
@ -316,65 +390,74 @@ function hilbish.hinter(line, pos)
return 'hi' return 'hi'
end end
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='inputMode'> <div id='inputMode'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.inputMode(mode) hilbish.inputMode(mode)
<a href="#inputMode" class='heading-link'> <a href="#inputMode" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Sets the input mode for Hilbish's line reader. Sets the input mode for Hilbish's line reader.
`emacs` is the default. Setting it to `vim` changes behavior of input to be `emacs` is the default. Setting it to `vim` changes behavior of input to be
Vim-like with modes and Vim keybinds. Vim-like with modes and Vim keybinds.
#### Parameters #### Parameters
`string` *`mode`* `string` `*mode*`
Can be set to either `emacs` or `vim` Can be set to either `emacs` or `vim`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='interval'> <div id='interval'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.interval(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a> hilbish.interval(cb, time) -> @Timer
<a href="#interval" class='heading-link'> <a href="#interval" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Runs the `cb` function every specified amount of `time`. Runs the `cb` function every specified amount of `time`.
This creates a timer that ticking immediately. This creates a timer that ticking immediately.
#### Parameters #### Parameters
`function` *`cb`* `function` `*cb*`
`number` *`time`* `number` `*time*`
Time in milliseconds. Time in milliseconds.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='multiprompt'> <div id='multiprompt'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.multiprompt(str) hilbish.multiprompt(str)
<a href="#multiprompt" class='heading-link'> <a href="#multiprompt" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Changes the text prompt when Hilbish asks for more input. Changes the text prompt when Hilbish asks for more input.
This will show up when text is incomplete, like a missing quote This will show up when text is incomplete, like a missing quote
#### Parameters #### Parameters
`string` *`str`* `string` `*str*`
#### Example #### Example
@ -396,35 +479,41 @@ hey ...!
]]-- ]]--
hilbish.multiprompt '-->' hilbish.multiprompt '-->'
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='prependPath'> <div id='prependPath'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.prependPath(dir) hilbish.prependPath(dir)
<a href="#prependPath" class='heading-link'> <a href="#prependPath" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Prepends `dir` to $PATH. Prepends `dir` to $PATH.
#### Parameters #### Parameters
`string` *`dir`* `string` `*dir*`
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='prompt'> <div id='prompt'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.prompt(str, typ) hilbish.prompt(str, typ)
<a href="#prompt" class='heading-link'> <a href="#prompt" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Changes the shell prompt to the provided string. Changes the shell prompt to the provided string.
There are a few verbs that can be used in the prompt text. There are a few verbs that can be used in the prompt text.
These will be formatted and replaced with the appropriate values. These will be formatted and replaced with the appropriate values.
@ -434,10 +523,10 @@ These will be formatted and replaced with the appropriate values.
#### Parameters #### Parameters
`string` *`str`* `string` `*str*`
`string` *`typ?`* `string` `*typ?*`
Type of prompt, being left or right. Left by default. Type of prompt, being left or right. Left by default.
#### Example #### Example
@ -449,72 +538,83 @@ hilbish.prompt '%u %d ∆'
hilbish.prompt '%u@%h :%d $' hilbish.prompt '%u@%h :%d $'
-- prompt: user@hostname: ~/directory $ -- prompt: user@hostname: ~/directory $
``` ```
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='read'> <div id='read'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.read(prompt) -> input (string) hilbish.read(prompt) -> input (string)
<a href="#read" class='heading-link'> <a href="#read" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Read input from the user, using Hilbish's line editor/input reader. Read input from the user, using Hilbish's line editor/input reader.
This is a separate instance from the one Hilbish actually uses. This is a separate instance from the one Hilbish actually uses.
Returns `input`, will be nil if Ctrl-D is pressed, or an error occurs. Returns `input`, will be nil if Ctrl-D is pressed, or an error occurs.
#### Parameters #### Parameters
`string` *`prompt?`* `string` `*prompt?*`
Text to print before input, can be empty. Text to print before input, can be empty.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='timeout'> <div id='timeout'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.timeout(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a> hilbish.timeout(cb, time) -> @Timer
<a href="#timeout" class='heading-link'> <a href="#timeout" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Executed the `cb` function after a period of `time`. Executed the `cb` function after a period of `time`.
This creates a Timer that starts ticking immediately. This creates a Timer that starts ticking immediately.
#### Parameters #### Parameters
`function` *`cb`* `function` `*cb*`
`number` *`time`* `number` `*time*`
Time to run in milliseconds. Time to run in milliseconds.
</div>
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='which'> <div id='which'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
hilbish.which(name) -> string hilbish.which(name) -> string
<a href="#which" class='heading-link'> <a href="#which" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Checks if `name` is a valid command. Checks if `name` is a valid command.
Will return the path of the binary, or a basename if it's a commander. Will return the path of the binary, or a basename if it's a commander.
#### Parameters #### Parameters
`string` *`name`* `string` `*name*`
</div>
## Types ## Types
<hr> ``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
```
## Sink ## Sink

View File

@ -1,539 +0,0 @@
---
title: Module hilbish
description: the core Hilbish API
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The Hilbish module includes the core API, containing
interfaces and functions which directly relate to shell functionality.
## Functions
|||
|----|----|
|<a href="#alias">alias(cmd, orig)</a>|Sets an alias, with a name of `cmd` to another command.|
|<a href="#appendPath">appendPath(dir)</a>|Appends the provided dir to the command path (`$PATH`)|
|<a href="#complete">complete(scope, cb)</a>|Registers a completion handler for the specified scope.|
|<a href="#cwd">cwd() -> string</a>|Returns the current directory of the shell.|
|<a href="#exec">exec(cmd)</a>|Replaces the currently running Hilbish instance with the supplied command.|
|<a href="#goro">goro(fn)</a>|Puts `fn` in a Goroutine.|
|<a href="#highlighter">highlighter(line)</a>|Line highlighter handler.|
|<a href="#hinter">hinter(line, pos)</a>|The command line hint handler. It gets called on every key insert to|
|<a href="#inputMode">inputMode(mode)</a>|Sets the input mode for Hilbish's line reader.|
|<a href="#interval">interval(cb, time) -> @Timer</a>|Runs the `cb` function every specified amount of `time`.|
|<a href="#multiprompt">multiprompt(str)</a>|Changes the text prompt when Hilbish asks for more input.|
|<a href="#prependPath">prependPath(dir)</a>|Prepends `dir` to $PATH.|
|<a href="#prompt">prompt(str, typ)</a>|Changes the shell prompt to the provided string.|
|<a href="#read">read(prompt) -> input (string)</a>|Read input from the user, using Hilbish's line editor/input reader.|
|<a href="#timeout">timeout(cb, time) -> @Timer</a>|Executed the `cb` function after a period of `time`.|
|<a href="#which">which(name) -> string</a>|Checks if `name` is a valid command.|
|<a href="#runnerMode">runnerMode(mode)</a>|Sets the execution/runner mode for interactive Hilbish.|
|<a href="#run">run(cmd, streams)</a>|Runs `cmd` in Hilbish's shell script interpreter.|
## Static module fields
|||
|----|----|
|ver|The version of Hilbish|
|goVersion|The version of Go that Hilbish was compiled with|
|user|Username of the user|
|host|Hostname of the machine|
|dataDir|Directory for Hilbish data files, including the docs and default modules|
|interactive|Is Hilbish in an interactive shell?|
|login|Is Hilbish the login shell?|
|vimMode|Current Vim input mode of Hilbish (will be nil if not in Vim input mode)|
|exitCode|Exit code of the last executed command|
<hr>
<div id='alias'>
<h4 class='heading'>
hilbish.alias(cmd, orig)
<a href="#alias" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sets an alias, with a name of `cmd` to another command.
#### Parameters
`string` **`cmd`**
Name of the alias
`string` **`orig`**
Command that will be aliased
#### Example
```lua
-- With this, "ga file" will turn into "git add file"
hilbish.alias('ga', 'git add')
-- Numbered substitutions are supported here!
hilbish.alias('dircount', 'ls %1 | wc -l')
-- "dircount ~" would count how many files are in ~ (home directory).
```
</div>
<hr>
<div id='appendPath'>
<h4 class='heading'>
hilbish.appendPath(dir)
<a href="#appendPath" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Appends the provided dir to the command path (`$PATH`)
#### Parameters
`string|table` **`dir`**
Directory (or directories) to append to path
#### Example
```lua
hilbish.appendPath '~/go/bin'
-- Will add ~/go/bin to the command path.
-- Or do multiple:
hilbish.appendPath {
'~/go/bin',
'~/.local/bin'
}
```
</div>
<hr>
<div id='complete'>
<h4 class='heading'>
hilbish.complete(scope, cb)
<a href="#complete" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Registers a completion handler for the specified scope.
A `scope` is expected to be `command.<cmd>`,
replacing <cmd> with the name of the command (for example `command.git`).
The documentation for completions, under Features/Completions or `doc completions`
provides more details.
#### Parameters
`string` **`scope`**
`function` **`cb`**
#### Example
```lua
-- This is a very simple example. Read the full doc for completions for details.
hilbish.complete('command.sudo', function(query, ctx, fields)
if #fields == 0 then
-- complete for commands
local comps, pfx = hilbish.completion.bins(query, ctx, fields)
local compGroup = {
items = comps, -- our list of items to complete
type = 'grid' -- what our completions will look like.
}
return {compGroup}, pfx
end
-- otherwise just be boring and return files
local comps, pfx = hilbish.completion.files(query, ctx, fields)
local compGroup = {
items = comps,
type = 'grid'
}
return {compGroup}, pfx
end)
```
</div>
<hr>
<div id='cwd'>
<h4 class='heading'>
hilbish.cwd() -> string
<a href="#cwd" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the current directory of the shell.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='exec'>
<h4 class='heading'>
hilbish.exec(cmd)
<a href="#exec" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Replaces the currently running Hilbish instance with the supplied command.
This can be used to do an in-place restart.
#### Parameters
`string` **`cmd`**
</div>
<hr>
<div id='goro'>
<h4 class='heading'>
hilbish.goro(fn)
<a href="#goro" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Puts `fn` in a Goroutine.
This can be used to run any function in another thread at the same time as other Lua code.
**NOTE: THIS FUNCTION MAY CRASH HILBISH IF OUTSIDE VARIABLES ARE ACCESSED.**
**This is a limitation of the Lua runtime.**
#### Parameters
`function` **`fn`**
</div>
<hr>
<div id='highlighter'>
<h4 class='heading'>
hilbish.highlighter(line)
<a href="#highlighter" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Line highlighter handler.
This is mainly for syntax highlighting, but in reality could set the input
of the prompt to *display* anything. The callback is passed the current line
and is expected to return a line that will be used as the input display.
Note that to set a highlighter, one has to override this function.
#### Parameters
`string` **`line`**
#### Example
```lua
--This code will highlight all double quoted strings in green.
function hilbish.highlighter(line)
return line:gsub('"%w+"', function(c) return lunacolors.green(c) end)
end
```
</div>
<hr>
<div id='hinter'>
<h4 class='heading'>
hilbish.hinter(line, pos)
<a href="#hinter" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
The command line hint handler. It gets called on every key insert to
determine what text to use as an inline hint. It is passed the current
line and cursor position. It is expected to return a string which is used
as the text for the hint. This is by default a shim. To set hints,
override this function with your custom handler.
#### Parameters
`string` **`line`**
`number` **`pos`**
Position of cursor in line. Usually equals string.len(line)
#### Example
```lua
-- this will display "hi" after the cursor in a dimmed color.
function hilbish.hinter(line, pos)
return 'hi'
end
```
</div>
<hr>
<div id='inputMode'>
<h4 class='heading'>
hilbish.inputMode(mode)
<a href="#inputMode" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sets the input mode for Hilbish's line reader.
`emacs` is the default. Setting it to `vim` changes behavior of input to be
Vim-like with modes and Vim keybinds.
#### Parameters
`string` **`mode`**
Can be set to either `emacs` or `vim`
</div>
<hr>
<div id='interval'>
<h4 class='heading'>
hilbish.interval(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
<a href="#interval" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Runs the `cb` function every specified amount of `time`.
This creates a timer that ticking immediately.
#### Parameters
`function` **`cb`**
`number` **`time`**
Time in milliseconds.
</div>
<hr>
<div id='multiprompt'>
<h4 class='heading'>
hilbish.multiprompt(str)
<a href="#multiprompt" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Changes the text prompt when Hilbish asks for more input.
This will show up when text is incomplete, like a missing quote
#### Parameters
`string` **`str`**
#### Example
```lua
--[[
imagine this is your text input:
user ~ ∆ echo "hey
but there's a missing quote! hilbish will now prompt you so the terminal
will look like:
user ~ ∆ echo "hey
--> ...!"
so then you get
user ~ ∆ echo "hey
--> ...!"
hey ...!
]]--
hilbish.multiprompt '-->'
```
</div>
<hr>
<div id='prependPath'>
<h4 class='heading'>
hilbish.prependPath(dir)
<a href="#prependPath" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Prepends `dir` to $PATH.
#### Parameters
`string` **`dir`**
</div>
<hr>
<div id='prompt'>
<h4 class='heading'>
hilbish.prompt(str, typ)
<a href="#prompt" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Changes the shell prompt to the provided string.
There are a few verbs that can be used in the prompt text.
These will be formatted and replaced with the appropriate values.
`%d` - Current working directory
`%u` - Name of current user
`%h` - Hostname of device
#### Parameters
`string` **`str`**
`string` **`typ?`**
Type of prompt, being left or right. Left by default.
#### Example
```lua
-- the default hilbish prompt without color
hilbish.prompt '%u %d ∆'
-- or something of old:
hilbish.prompt '%u@%h :%d $'
-- prompt: user@hostname: ~/directory $
```
</div>
<hr>
<div id='read'>
<h4 class='heading'>
hilbish.read(prompt) -> input (string)
<a href="#read" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Read input from the user, using Hilbish's line editor/input reader.
This is a separate instance from the one Hilbish actually uses.
Returns `input`, will be nil if Ctrl-D is pressed, or an error occurs.
#### Parameters
`string` **`prompt?`**
Text to print before input, can be empty.
</div>
<hr>
<div id='timeout'>
<h4 class='heading'>
hilbish.timeout(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
<a href="#timeout" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Executed the `cb` function after a period of `time`.
This creates a Timer that starts ticking immediately.
#### Parameters
`function` **`cb`**
`number` **`time`**
Time to run in milliseconds.
</div>
<hr>
<div id='which'>
<h4 class='heading'>
hilbish.which(name) -> string
<a href="#which" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Checks if `name` is a valid command.
Will return the path of the binary, or a basename if it's a commander.
#### Parameters
`string` **`name`**
</div>
## Types
<hr>
## Sink
A sink is a structure that has input and/or output to/from a desination.
### Methods
#### autoFlush(auto)
Sets/toggles the option of automatically flushing output.
A call with no argument will toggle the value.
#### flush()
Flush writes all buffered input to the sink.
#### read() -> string
Reads a liine of input from the sink.
#### readAll() -> string
Reads all input from the sink.
#### write(str)
Writes data to a sink.
#### writeln(str)
Writes data to a sink with a newline at the end.
<hr>
<div id='run'>
<h4 class='heading'>
hilbish.run(cmd, streams)
<a href="#run" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Runs `cmd` in Hilbish's shell script interpreter.
The `streams` parameter specifies the output and input streams the command should use.
For example, to write command output to a sink.
As a table, the caller can directly specify the standard output, error, and input
streams of the command with the table keys `out`, `err`, and `input` respectively.
As a boolean, it specifies whether the command should use standard output or return its output streams.
#### Parameters
`cmd` **`string`**
`streams` **`table|boolean`**
#### Example
```lua
-- This code is the same as `ls -l | wc -l`
local fs = require 'fs'
local pr, pw = fs.pipe()
hilbish.run('ls -l', {
stdout = pw,
stderr = pw,
})
pw:close()
hilbish.run('wc -l', {
stdin = pr
})
```
</div>
<hr>
<div id='runnerMode'>
<h4 class='heading'>
hilbish.runnerMode(mode)
<a href="#runnerMode" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sets the execution/runner mode for interactive Hilbish.
**NOTE: This function is deprecated and will be removed in 3.0**
Use `hilbish.runner.setCurrent` instead.
This determines whether Hilbish wll try to run input as Lua
and/or sh or only do one of either.
Accepted values for mode are hybrid (the default), hybridRev (sh first then Lua),
sh, and lua. It also accepts a function, to which if it is passed one
will call it to execute user input instead.
Read [about runner mode](../features/runner-mode) for more information.
#### Parameters
`mode` **`string|function`**
</div>

View File

@ -1,67 +0,0 @@
---
title: Module hilbish.abbr
description: command line abbreviations
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The abbr module manages Hilbish abbreviations. These are words that can be replaced
with longer command line strings when entered.
As an example, `git push` can be abbreviated to `gp`. When the user types
`gp` into the command line, after hitting space or enter, it will expand to `git push`.
Abbreviations can be used as an alternative to aliases. They are saved entirely in the history
Instead of the aliased form of the same command.
## Functions
|||
|----|----|
|<a href="#remove">remove(abbr)</a>|Removes the named `abbr`.|
|<a href="#add">add(abbr, expanded|function, opts)</a>|Adds an abbreviation. The `abbr` is the abbreviation itself,|
<hr>
<div id='add'>
<h4 class='heading'>
hilbish.abbr.add(abbr, expanded|function, opts)
<a href="#add" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Adds an abbreviation. The `abbr` is the abbreviation itself,
while `expanded` is what the abbreviation should expand to.
It can be either a function or a string. If it is a function, it will expand to what
the function returns.
`opts` is a table that accepts 1 key: `anywhere`.
`opts.anywhere` defines whether the abbr expands anywhere in the command line or not,
whereas the default behavior is only at the beginning of the line
#### Parameters
`abbr` **`string`**
`expanded|function` **`string`**
`opts` **`table`**
</div>
<hr>
<div id='remove'>
<h4 class='heading'>
hilbish.abbr.remove(abbr)
<a href="#remove" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Removes the named `abbr`.
#### Parameters
`abbr` **`string`**
</div>

View File

@ -1,91 +0,0 @@
---
title: Module hilbish.aliases
description: command aliasing
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The alias interface deals with all command aliases in Hilbish.
## Functions
|||
|----|----|
|<a href="#aliases.add">add(alias, cmd)</a>|This is an alias (ha) for the [hilbish.alias](../#alias) function.|
|<a href="#aliases.delete">delete(name)</a>|Removes an alias.|
|<a href="#aliases.list">list() -> table[string, string]</a>|Get a table of all aliases, with string keys as the alias and the value as the command.|
|<a href="#aliases.resolve">resolve(alias) -> string?</a>|Resolves an alias to its original command. Will thrown an error if the alias doesn't exist.|
<hr>
<div id='aliases.add'>
<h4 class='heading'>
hilbish.aliases.add(alias, cmd)
<a href="#aliases.add" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
This is an alias (ha) for the [hilbish.alias](../#alias) function.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='aliases.delete'>
<h4 class='heading'>
hilbish.aliases.delete(name)
<a href="#aliases.delete" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Removes an alias.
#### Parameters
`string` **`name`**
</div>
<hr>
<div id='aliases.list'>
<h4 class='heading'>
hilbish.aliases.list() -> table[string, string]
<a href="#aliases.list" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Get a table of all aliases, with string keys as the alias and the value as the command.
#### Parameters
This function has no parameters.
#### Example
```lua
hilbish.aliases.add('hi', 'echo hi')
local aliases = hilbish.aliases.list()
-- -> {hi = 'echo hi'}
```
</div>
<hr>
<div id='aliases.resolve'>
<h4 class='heading'>
hilbish.aliases.resolve(alias) -> string?
<a href="#aliases.resolve" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Resolves an alias to its original command. Will thrown an error if the alias doesn't exist.
#### Parameters
`string` **`alias`**
</div>

View File

@ -1,149 +0,0 @@
---
title: Module hilbish.completion
description: tab completions
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The completions interface deals with tab completions.
## Functions
|||
|----|----|
|<a href="#completion.bins">bins(query, ctx, fields) -> entries (table), prefix (string)</a>|Return binaries/executables based on the provided parameters.|
|<a href="#completion.call">call(name, query, ctx, fields) -> completionGroups (table), prefix (string)</a>|Calls a completer function. This is mainly used to call a command completer, which will have a `name`|
|<a href="#completion.files">files(query, ctx, fields) -> entries (table), prefix (string)</a>|Returns file matches based on the provided parameters.|
|<a href="#completion.handler">handler(line, pos)</a>|This function contains the general completion handler for Hilbish. This function handles|
<hr>
<div id='completion.bins'>
<h4 class='heading'>
hilbish.completion.bins(query, ctx, fields) -> entries (table), prefix (string)
<a href="#completion.bins" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Return binaries/executables based on the provided parameters.
This function is meant to be used as a helper in a command completion handler.
#### Parameters
`string` **`query`**
`string` **`ctx`**
`table` **`fields`**
#### Example
```lua
-- an extremely simple completer for sudo.
hilbish.complete('command.sudo', function(query, ctx, fields)
table.remove(fields, 1)
if #fields[1] then
-- return commands because sudo runs a command as root..!
local entries, pfx = hilbish.completion.bins(query, ctx, fields)
return {
type = 'grid',
items = entries
}, pfx
end
-- ... else suggest files or anything else ..
end)
```
</div>
<hr>
<div id='completion.call'>
<h4 class='heading'>
hilbish.completion.call(name, query, ctx, fields) -> completionGroups (table), prefix (string)
<a href="#completion.call" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Calls a completer function. This is mainly used to call a command completer, which will have a `name`
in the form of `command.name`, example: `command.git`.
You can check the Completions doc or `doc completions` for info on the `completionGroups` return value.
#### Parameters
`string` **`name`**
`string` **`query`**
`string` **`ctx`**
`table` **`fields`**
</div>
<hr>
<div id='completion.files'>
<h4 class='heading'>
hilbish.completion.files(query, ctx, fields) -> entries (table), prefix (string)
<a href="#completion.files" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns file matches based on the provided parameters.
This function is meant to be used as a helper in a command completion handler.
#### Parameters
`string` **`query`**
`string` **`ctx`**
`table` **`fields`**
</div>
<hr>
<div id='completion.handler'>
<h4 class='heading'>
hilbish.completion.handler(line, pos)
<a href="#completion.handler" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
This function contains the general completion handler for Hilbish. This function handles
completion of everything, which includes calling other command handlers, binaries, and files.
This function can be overriden to supply a custom handler. Note that alias resolution is required to be done in this function.
#### Parameters
`string` **`line`**
The current Hilbish command line
`number` **`pos`**
Numerical position of the cursor
#### Example
```lua
-- stripped down version of the default implementation
function hilbish.completion.handler(line, pos)
local query = fields[#fields]
if #fields == 1 then
-- call bins handler here
else
-- call command completer or files completer here
end
end
```
</div>

View File

@ -1,124 +0,0 @@
---
title: Module hilbish.editor
description: interactions for Hilbish's line reader
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The hilbish.editor interface provides functions to
directly interact with the line editor in use.
## Functions
|||
|----|----|
|<a href="#editor.deleteByAmount">deleteByAmount(amount)</a>|Deletes characters in the line by the given amount.|
|<a href="#editor.getLine">getLine() -> string</a>|Returns the current input line.|
|<a href="#editor.getVimRegister">getVimRegister(register) -> string</a>|Returns the text that is at the register.|
|<a href="#editor.insert">insert(text)</a>|Inserts text into the Hilbish command line.|
|<a href="#editor.getChar">getChar() -> string</a>|Reads a keystroke from the user. This is in a format of something like Ctrl-L.|
|<a href="#editor.setVimRegister">setVimRegister(register, text)</a>|Sets the vim register at `register` to hold the passed text.|
<hr>
<div id='editor.deleteByAmount'>
<h4 class='heading'>
hilbish.editor.deleteByAmount(amount)
<a href="#editor.deleteByAmount" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Deletes characters in the line by the given amount.
#### Parameters
`number` **`amount`**
</div>
<hr>
<div id='editor.getLine'>
<h4 class='heading'>
hilbish.editor.getLine() -> string
<a href="#editor.getLine" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the current input line.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='editor.getVimRegister'>
<h4 class='heading'>
hilbish.editor.getVimRegister(register) -> string
<a href="#editor.getVimRegister" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the text that is at the register.
#### Parameters
`string` **`register`**
</div>
<hr>
<div id='editor.insert'>
<h4 class='heading'>
hilbish.editor.insert(text)
<a href="#editor.insert" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Inserts text into the Hilbish command line.
#### Parameters
`string` **`text`**
</div>
<hr>
<div id='editor.getChar'>
<h4 class='heading'>
hilbish.editor.getChar() -> string
<a href="#editor.getChar" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Reads a keystroke from the user. This is in a format of something like Ctrl-L.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='editor.setVimRegister'>
<h4 class='heading'>
hilbish.editor.setVimRegister(register, text)
<a href="#editor.setVimRegister" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sets the vim register at `register` to hold the passed text.
#### Parameters
`string` **`register`**
`string` **`text`**
</div>

View File

@ -1,102 +0,0 @@
---
title: Module hilbish.history
description: command history
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The history interface deals with command history.
This includes the ability to override functions to change the main
method of saving history.
## Functions
|||
|----|----|
|<a href="#history.add">add(cmd)</a>|Adds a command to the history.|
|<a href="#history.all">all() -> table</a>|Retrieves all history as a table.|
|<a href="#history.clear">clear()</a>|Deletes all commands from the history.|
|<a href="#history.get">get(index)</a>|Retrieves a command from the history based on the `index`.|
|<a href="#history.size">size() -> number</a>|Returns the amount of commands in the history.|
<hr>
<div id='history.add'>
<h4 class='heading'>
hilbish.history.add(cmd)
<a href="#history.add" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Adds a command to the history.
#### Parameters
`string` **`cmd`**
</div>
<hr>
<div id='history.all'>
<h4 class='heading'>
hilbish.history.all() -> table
<a href="#history.all" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Retrieves all history as a table.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='history.clear'>
<h4 class='heading'>
hilbish.history.clear()
<a href="#history.clear" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Deletes all commands from the history.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='history.get'>
<h4 class='heading'>
hilbish.history.get(index)
<a href="#history.get" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Retrieves a command from the history based on the `index`.
#### Parameters
`number` **`index`**
</div>
<hr>
<div id='history.size'>
<h4 class='heading'>
hilbish.history.size() -> number
<a href="#history.size" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the amount of commands in the history.
#### Parameters
This function has no parameters.
</div>

View File

@ -1,146 +0,0 @@
---
title: Module hilbish.jobs
description: background job management
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
Manage interactive jobs in Hilbish via Lua.
Jobs are the name of background tasks/commands. A job can be started via
interactive usage or with the functions defined below for use in external runners.
## Functions
|||
|----|----|
|<a href="#jobs.add">add(cmdstr, args, execPath)</a>|Creates a new job. This function does not run the job. This function is intended to be|
|<a href="#jobs.all">all() -> table[@Job]</a>|Returns a table of all job objects.|
|<a href="#jobs.disown">disown(id)</a>|Disowns a job. This simply deletes it from the list of jobs without stopping it.|
|<a href="#jobs.get">get(id) -> @Job</a>|Get a job object via its ID.|
|<a href="#jobs.last">last() -> @Job</a>|Returns the last added job to the table.|
<hr>
<div id='jobs.add'>
<h4 class='heading'>
hilbish.jobs.add(cmdstr, args, execPath)
<a href="#jobs.add" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Creates a new job. This function does not run the job. This function is intended to be
used by runners, but can also be used to create jobs via Lua. Commanders cannot be ran as jobs.
#### Parameters
`string` **`cmdstr`**
String that a user would write for the job
`table` **`args`**
Arguments for the commands. Has to include the name of the command.
`string` **`execPath`**
Binary to use to run the command. Needs to be an absolute path.
#### Example
```lua
hilbish.jobs.add('go build', {'go', 'build'}, '/usr/bin/go')
```
</div>
<hr>
<div id='jobs.all'>
<h4 class='heading'>
hilbish.jobs.all() -> table[<a href="/Hilbish/docs/api/hilbish/hilbish.jobs/#job" style="text-decoration: none;" id="lol">Job</a>]
<a href="#jobs.all" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns a table of all job objects.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='jobs.disown'>
<h4 class='heading'>
hilbish.jobs.disown(id)
<a href="#jobs.disown" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Disowns a job. This simply deletes it from the list of jobs without stopping it.
#### Parameters
`number` **`id`**
</div>
<hr>
<div id='jobs.get'>
<h4 class='heading'>
hilbish.jobs.get(id) -> <a href="/Hilbish/docs/api/hilbish/hilbish.jobs/#job" style="text-decoration: none;" id="lol">Job</a>
<a href="#jobs.get" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Get a job object via its ID.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='jobs.last'>
<h4 class='heading'>
hilbish.jobs.last() -> <a href="/Hilbish/docs/api/hilbish/hilbish.jobs/#job" style="text-decoration: none;" id="lol">Job</a>
<a href="#jobs.last" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the last added job to the table.
#### Parameters
This function has no parameters.
</div>
## Types
<hr>
## Job
The Job type describes a Hilbish job.
## Object properties
|||
|----|----|
|cmd|The user entered command string for the job.|
|running|Whether the job is running or not.|
|id|The ID of the job in the job table|
|pid|The Process ID|
|exitCode|The last exit code of the job.|
|stdout|The standard output of the job. This just means the normal logs of the process.|
|stderr|The standard error stream of the process. This (usually) includes error messages of the job.|
### Methods
#### background()
Puts a job in the background. This acts the same as initially running a job.
#### foreground()
Puts a job in the foreground. This will cause it to run like it was
executed normally and wait for it to complete.
#### start()
Starts running the job.
#### stop()
Stops the job from running.

View File

@ -1,135 +0,0 @@
---
title: Module hilbish.messages
description: simplistic message passing
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The messages interface defines a way for Hilbish-integrated commands,
user config and other tasks to send notifications to alert the user.z
The `hilbish.message` type is a table with the following keys:
`title` (string): A title for the message notification.
`text` (string): The contents of the message.
`channel` (string): States the origin of the message, `hilbish.*` is reserved for Hilbish tasks.
`summary` (string): A short summary of the `text`.
`icon` (string): Unicode (preferably standard emoji) icon for the message notification
`read` (boolean): Whether the full message has been read or not.
## Functions
|||
|----|----|
|<a href="#unreadCount">unreadCount()</a>|Returns the amount of unread messages.|
|<a href="#send">send(message)</a>|Sends a message.|
|<a href="#readAll">readAll()</a>|Marks all messages as read.|
|<a href="#read">read(idx)</a>|Marks a message at `idx` as read.|
|<a href="#delete">delete(idx)</a>|Deletes the message at `idx`.|
|<a href="#clear">clear()</a>|Deletes all messages.|
|<a href="#all">all()</a>|Returns all messages.|
<hr>
<div id='all'>
<h4 class='heading'>
hilbish.messages.all()
<a href="#all" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns all messages.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='clear'>
<h4 class='heading'>
hilbish.messages.clear()
<a href="#clear" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Deletes all messages.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='delete'>
<h4 class='heading'>
hilbish.messages.delete(idx)
<a href="#delete" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Deletes the message at `idx`.
#### Parameters
`idx` **`number`**
</div>
<hr>
<div id='read'>
<h4 class='heading'>
hilbish.messages.read(idx)
<a href="#read" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Marks a message at `idx` as read.
#### Parameters
`idx` **`number`**
</div>
<hr>
<div id='readAll'>
<h4 class='heading'>
hilbish.messages.readAll()
<a href="#readAll" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Marks all messages as read.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='send'>
<h4 class='heading'>
hilbish.messages.send(message)
<a href="#send" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sends a message.
#### Parameters
`message` **`hilbish.message`**
</div>
<hr>
<div id='unreadCount'>
<h4 class='heading'>
hilbish.messages.unreadCount()
<a href="#unreadCount" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the amount of unread messages.
#### Parameters
This function has no parameters.
</div>

View File

@ -1,73 +0,0 @@
---
title: Module hilbish.module
description: native module loading
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The hilbish.module interface provides a function to load
Hilbish plugins/modules. Hilbish modules are Go-written
plugins (see https://pkg.go.dev/plugin) that are used to add functionality
to Hilbish that cannot be written in Lua for any reason.
Note that you don't ever need to use the load function that is here as
modules can be loaded with a `require` call like Lua C modules, and the
search paths can be changed with the `paths` property here.
To make a valid native module, the Go plugin has to export a Loader function
with a signature like so: `func(*rt.Runtime) rt.Value`.
`rt` in this case refers to the Runtime type at
https://pkg.go.dev/github.com/arnodel/golua@master/runtime#Runtime
Hilbish uses this package as its Lua runtime. You will need to read
it to use it for a native plugin.
Here is some code for an example plugin:
```go
package main
import (
rt "github.com/arnodel/golua/runtime"
)
func Loader(rtm *rt.Runtime) rt.Value {
return rt.StringValue("hello world!")
}
```
This can be compiled with `go build -buildmode=plugin plugin.go`.
If you attempt to require and print the result (`print(require 'plugin')`), it will show "hello world!"
## Functions
|||
|----|----|
|<a href="#module.load">load(path)</a>|Loads a module at the designated `path`.|
## Static module fields
|||
|----|----|
|paths|A list of paths to search when loading native modules. This is in the style of Lua search paths and will be used when requiring native modules. Example: `?.so;?/?.so`|
<hr>
<div id='module.load'>
<h4 class='heading'>
hilbish.module.load(path)
<a href="#module.load" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Loads a module at the designated `path`.
It will throw if any error occurs.
#### Parameters
`string` **`path`**
</div>

View File

@ -1,20 +0,0 @@
---
title: Module hilbish.os
description: operating system info
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
Provides simple text information properties about the current operating system.
This mainly includes the name and version.
## Static module fields
|||
|----|----|
|family|Family name of the current OS|
|name|Pretty name of the current OS|
|version|Version of the current OS|

View File

@ -1,247 +0,0 @@
---
title: Module hilbish.runner
description: interactive command runner customization
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
The runner interface contains functions that allow the user to change
how Hilbish interprets interactive input.
Users can add and change the default runner for interactive input to any
language or script of their choosing. A good example is using it to
write command in Fennel.
Runners are functions that evaluate user input. The default runners in
Hilbish can run shell script and Lua code.
A runner is passed the input and has to return a table with these values.
All are not required, only the useful ones the runner needs to return.
(So if there isn't an error, just omit `err`.)
- `exitCode` (number): Exit code of the command
- `input` (string): The text input of the user. This is used by Hilbish to append extra input, in case
more is requested.
- `err` (string): A string that represents an error from the runner.
This should only be set when, for example, there is a syntax error.
It can be set to a few special values for Hilbish to throw the right
hooks and have a better looking message.
- `\<command>: not-found` will throw a `command.not-found` hook
based on what `\<command>` is.
- `\<command>: not-executable` will throw a `command.not-executable` hook.
- `continue` (boolean): Whether Hilbish should prompt the user for no input
- `newline` (boolean): Whether a newline should be added at the end of `input`.
Here is a simple example of a fennel runner. It falls back to
shell script if fennel eval has an error.
```lua
local fennel = require 'fennel'
hilbish.runnerMode(function(input)
local ok = pcall(fennel.eval, input)
if ok then
return {
input = input
}
end
return hilbish.runner.sh(input)
end)
```
## Functions
|||
|----|----|
|<a href="#runner.lua">lua(cmd)</a>|Evaluates `cmd` as Lua input. This is the same as using `dofile`|
|<a href="#sh">sh()</a>|nil|
|<a href="#setMode">setMode(mode)</a>|**NOTE: This function is deprecated and will be removed in 3.0**|
|<a href="#setCurrent">setCurrent(name)</a>|Sets Hilbish's runner mode by name.|
|<a href="#set">set(name, runner)</a>|*Sets* a runner by name. The difference between this function and|
|<a href="#run">run(input, priv)</a>|Runs `input` with the currently set Hilbish runner.|
|<a href="#getCurrent">getCurrent()</a>|Returns the current runner by name.|
|<a href="#get">get(name)</a>|Get a runner by name.|
|<a href="#exec">exec(cmd, runnerName)</a>|Executes `cmd` with a runner.|
|<a href="#add">add(name, runner)</a>|Adds a runner to the table of available runners.|
<hr>
<div id='runner.lua'>
<h4 class='heading'>
hilbish.runner.lua(cmd)
<a href="#runner.lua" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Evaluates `cmd` as Lua input. This is the same as using `dofile`
or `load`, but is appropriated for the runner interface.
#### Parameters
`string` **`cmd`**
</div>
<hr>
<div id='add'>
<h4 class='heading'>
hilbish.runner.add(name, runner)
<a href="#add" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Adds a runner to the table of available runners.
If runner is a table, it must have the run function in it.
#### Parameters
`name` **`string`**
Name of the runner
`runner` **`function|table`**
</div>
<hr>
<div id='exec'>
<h4 class='heading'>
hilbish.runner.exec(cmd, runnerName)
<a href="#exec" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Executes `cmd` with a runner.
If `runnerName` is not specified, it uses the default Hilbish runner.
#### Parameters
`cmd` **`string`**
`runnerName` **`string?`**
</div>
<hr>
<div id='get'>
<h4 class='heading'>
hilbish.runner.get(name)
<a href="#get" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Get a runner by name.
#### Parameters
`name` **`string`**
Name of the runner to retrieve.
</div>
<hr>
<div id='getCurrent'>
<h4 class='heading'>
hilbish.runner.getCurrent()
<a href="#getCurrent" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Returns the current runner by name.
#### Parameters
This function has no parameters.
</div>
<hr>
<div id='run'>
<h4 class='heading'>
hilbish.runner.run(input, priv)
<a href="#run" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Runs `input` with the currently set Hilbish runner.
This method is how Hilbish executes commands.
`priv` is an optional boolean used to state if the input should be saved to history.
#### Parameters
`input` **`string`**
`priv` **`bool`**
</div>
<hr>
<div id='set'>
<h4 class='heading'>
hilbish.runner.set(name, runner)
<a href="#set" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
*Sets* a runner by name. The difference between this function and
add, is set will *not* check if the named runner exists.
The runner table must have the run function in it.
#### Parameters
`name` **`string`**
`runner` **`table`**
</div>
<hr>
<div id='setCurrent'>
<h4 class='heading'>
hilbish.runner.setCurrent(name)
<a href="#setCurrent" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Sets Hilbish's runner mode by name.
#### Parameters
`name` **`string`**
</div>
<hr>
<div id='setMode'>
<h4 class='heading'>
hilbish.runner.setMode(mode)
<a href="#setMode" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
**NOTE: This function is deprecated and will be removed in 3.0**
Use `hilbish.runner.setCurrent` instead.
This is the same as the `hilbish.runnerMode` function.
It takes a callback, which will be used to execute all interactive input.
Or a string which names the runner mode to use.
#### Parameters
`mode` **`string|function`**
</div>
<hr>
<div id='sh'>
<h4 class='heading'>
hilbish.runner.sh()
<a href="#sh" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
#### Parameters
This function has no parameters.
</div>

View File

@ -1,100 +0,0 @@
---
title: Module hilbish.timers
description: timeout and interval API
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
If you ever want to run a piece of code on a timed interval, or want to wait
a few seconds, you don't have to rely on timing tricks, as Hilbish has a
timer API to set intervals and timeouts.
These are the simple functions `hilbish.interval` and `hilbish.timeout` (doc
accessible with `doc hilbish`, or `Module hilbish` on the Website).
An example of usage:
```lua
local t = hilbish.timers.create(hilbish.timers.TIMEOUT, 5000, function()
print 'hello!'
end)
t:start()
print(t.running) // true
```
## Functions
|||
|----|----|
|<a href="#timers.create">create(type, time, callback) -> @Timer</a>|Creates a timer that runs based on the specified `time`.|
|<a href="#timers.get">get(id) -> @Timer</a>|Retrieves a timer via its ID.|
## Static module fields
|||
|----|----|
|INTERVAL|Constant for an interval timer type|
|TIMEOUT|Constant for a timeout timer type|
<hr>
<div id='timers.create'>
<h4 class='heading'>
hilbish.timers.create(type, time, callback) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
<a href="#timers.create" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Creates a timer that runs based on the specified `time`.
#### Parameters
`number` **`type`**
What kind of timer to create, can either be `hilbish.timers.INTERVAL` or `hilbish.timers.TIMEOUT`
`number` **`time`**
The amount of time the function should run in milliseconds.
`function` **`callback`**
The function to run for the timer.
</div>
<hr>
<div id='timers.get'>
<h4 class='heading'>
hilbish.timers.get(id) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
<a href="#timers.get" class='heading-link'>
<i class="fas fa-paperclip"></i>
</a>
</h4>
Retrieves a timer via its ID.
#### Parameters
`number` **`id`**
</div>
## Types
<hr>
## Timer
The Job type describes a Hilbish timer.
## Object properties
|||
|----|----|
|type|What type of timer it is|
|running|If the timer is running|
|duration|The duration in milliseconds that the timer will run|
### Methods
#### start()
Starts a timer.
#### stop()
Stops a timer.

View File

@ -1,20 +0,0 @@
---
title: Module hilbish.userDir
description: user-related directories
layout: doc
menu:
docs:
parent: "API"
---
## Introduction
This interface just contains properties to know about certain user directories.
It is equivalent to XDG on Linux and gets the user's preferred directories
for configs and data.
## Static module fields
|||
|----|----|
|config|The user's config directory|
|data|The user's directory for program data|

View File

@ -9,42 +9,66 @@ menu:
## Introduction ## Introduction
The snail library houses Hilbish's Lua wrapper of its shell script interpreter. The snail library houses Hilbish's Lua wrapper of its shell script interpreter.
It's not very useful other than running shell scripts, which can be done with other It's not very useful other than running shell scripts, which can be done with other
Hilbish functions. Hilbish functions.
## Functions ## Functions
|||
|----|----|
|<a href="#new">new() -> @Snail</a>|Creates a new Snail instance.|
<hr> ``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#new">new() -> @Snail</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Creates a new Snail instance.</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='new'> <div id='new'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
snail.new() -> <a href="/Hilbish/docs/api/snail/#snail" style="text-decoration: none;" id="lol">Snail</a> snail.new() -> @Snail
<a href="#new" class='heading-link'> <a href="#new" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Creates a new Snail instance. Creates a new Snail instance.
#### Parameters #### Parameters
This function has no parameters. This function has no parameters.
</div>
## Types ## Types
<hr>
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
```
## Snail ## Snail
A Snail is a shell script interpreter instance. A Snail is a shell script interpreter instance.
### Methods ### Methods
#### dir(path) #### dir(path)
Changes the directory of the snail instance. Changes the directory of the snail instance.
The interpreter keeps its set directory even when the Hilbish process changes The interpreter keeps its set directory even when the Hilbish process changes
directory, so this should be called on the `hilbish.cd` hook. directory, so this should be called on the `hilbish.cd` hook.
#### run(command, streams) #### run(command, streams)
Runs a shell command. Works the same as `hilbish.run`, but only accepts a table of streams. Runs a shell command. Works the same as `hilbish.run`, but only accepts a table of streams.

View File

@ -8,74 +8,112 @@ menu:
--- ---
## Introduction ## Introduction
The terminal library is a simple and lower level library for certain terminal interactions. The terminal library is a simple and lower level library for certain terminal interactions.
## Functions ## Functions
|||
|----|----|
|<a href="#restoreState">restoreState()</a>|Restores the last saved state of the terminal|
|<a href="#saveState">saveState()</a>|Saves the current state of the terminal.|
|<a href="#setRaw">setRaw()</a>|Puts the terminal into raw mode.|
|<a href="#size">size()</a>|Gets the dimensions of the terminal. Returns a table with `width` and `height`|
<hr> ``` =html
<div class='relative overflow-x-auto sm:rounded-lg my-4'>
<table class='w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400'>
<tbody>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#restoreState">restoreState()</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Restores the last saved state of the terminal</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#saveState">saveState()</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Saves the current state of the terminal.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#setRaw">setRaw()</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Puts the terminal into raw mode.</td>
</tr>
<tr class='bg-white border-b dark:bg-neutral-800 dark:border-neutral-700 border-neutral-200'>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'><a href="#size">size()</a></td>
<td class='p-3 font-medium text-black whitespace-nowrap dark:text-white'>Gets the dimensions of the terminal. Returns a table with `width` and `height`</td>
</tr>
</tbody>
</table>
</div>
```
## Functions
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='restoreState'> <div id='restoreState'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
terminal.restoreState() terminal.restoreState()
<a href="#restoreState" class='heading-link'> <a href="#restoreState" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Restores the last saved state of the terminal Restores the last saved state of the terminal
#### Parameters #### Parameters
This function has no parameters.
</div>
<hr> This function has no parameters.
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='saveState'> <div id='saveState'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
terminal.saveState() terminal.saveState()
<a href="#saveState" class='heading-link'> <a href="#saveState" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Saves the current state of the terminal. Saves the current state of the terminal.
#### Parameters #### Parameters
This function has no parameters.
</div>
<hr> This function has no parameters.
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='setRaw'> <div id='setRaw'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
terminal.setRaw() terminal.setRaw()
<a href="#setRaw" class='heading-link'> <a href="#setRaw" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Puts the terminal into raw mode. Puts the terminal into raw mode.
#### Parameters #### Parameters
This function has no parameters.
</div>
<hr> This function has no parameters.
``` =html
<hr class='my-4 text-neutral-400 dark:text-neutral-600'>
<div id='size'> <div id='size'>
<h4 class='heading'> <h4 class='text-xl font-medium mb-2'>
terminal.size() terminal.size()
<a href="#size" class='heading-link'> <a href="#size" class='heading-link'>
<i class="fas fa-paperclip"></i> <i class="fas fa-paperclip"></i>
</a> </a>
</h4> </h4>
```
Gets the dimensions of the terminal. Returns a table with `width` and `height` Gets the dimensions of the terminal. Returns a table with `width` and `height`
NOTE: The size refers to the amount of columns and rows of text that can fit in the terminal. NOTE: The size refers to the amount of columns and rows of text that can fit in the terminal.
#### Parameters #### Parameters
This function has no parameters.
</div> This function has no parameters.

View File

@ -1,28 +0,0 @@
--- @meta
local bait = {}
--- Catches an event. This function can be used to act on events.
---
---
function bait.catch(name, cb) end
--- Catches an event, but only once. This will remove the hook immediately after it runs for the first time.
function bait.catchOnce(name, cb) end
--- Returns a table of functions that are hooked on an event with the corresponding `name`.
function bait.hooks(name) end
--- Removes the `catcher` for the event with `name`.
--- For this to work, `catcher` has to be the same function used to catch
--- an event, like one saved to a variable.
---
---
function bait.release(name, catcher) end
--- Throws a hook with `name` with the provided `args`.
---
---
function bait.throw(name, ...args) end
return bait

View File

@ -1,18 +0,0 @@
--- @meta
local commander = {}
--- Removes the named command. Note that this will only remove Commander-registered commands.
function commander.deregister(name) end
--- Adds a new command with the given `name`. When Hilbish has to run a command with a name,
--- it will run the function providing the arguments and sinks.
---
---
function commander.register(name, cb) end
--- Returns all registered commanders. Returns a list of tables with the following keys:
--- - `exec`: The function used to run the commander. Commanders require args and sinks to be passed.
function commander.registry() end
return commander

View File

@ -1,54 +0,0 @@
--- @meta
local fs = {}
--- Returns an absolute version of the `path`.
--- This can be used to resolve short paths like `..` to `/home/user`.
function fs.abs(path) end
--- Returns the "basename," or the last part of the provided `path`. If path is empty,
--- `.` will be returned.
function fs.basename(path) end
--- Changes Hilbish's directory to `dir`.
function fs.cd(dir) end
--- Returns the directory part of `path`. If a file path like
--- `~/Documents/doc.txt` then this function will return `~/Documents`.
function fs.dir(path) end
--- Match all files based on the provided `pattern`.
--- For the syntax' refer to Go's filepath.Match function: https://pkg.go.dev/path/filepath#Match
---
---
function fs.glob(pattern) end
--- Takes any list of paths and joins them based on the operating system's path separator.
---
---
function fs.join(...path) end
--- Creates a new directory with the provided `name`.
--- With `recursive`, mkdir will create parent directories.
---
---
function fs.mkdir(name, recursive) end
--- Returns a pair of connected files, also known as a pipe.
--- The type returned is a Lua file, same as returned from `io` functions.
function fs.fpipe() end
--- Returns a list of all files and directories in the provided path.
function fs.readdir(path) end
--- Returns the information about a given `path`.
--- The returned table contains the following values:
--- name (string) - Name of the path
--- size (number) - Size of the path in bytes
--- mode (string) - Unix permission mode in an octal format string (with leading 0)
--- isDir (boolean) - If the path is a directory
---
---
function fs.stat(path) end
return fs

View File

@ -1,240 +0,0 @@
--- @meta
local hilbish = {}
--- Sets/toggles the option of automatically flushing output.
--- A call with no argument will toggle the value.
--- @param auto boolean|nil
function hilbish:autoFlush(auto) end
--- Flush writes all buffered input to the sink.
function hilbish:flush() end
--- Reads a liine of input from the sink.
--- @returns string
function hilbish:read() end
--- Reads all input from the sink.
--- @returns string
function hilbish:readAll() end
--- Writes data to a sink.
function hilbish:write(str) end
--- Writes data to a sink with a newline at the end.
function hilbish:writeln(str) end
--- This is an alias (ha) for the [hilbish.alias](../#alias) function.
--- @param alias string
--- @param cmd string
function hilbish.aliases.add(alias, cmd) end
--- Deletes characters in the line by the given amount.
function hilbish.editor.deleteByAmount(amount) end
--- Returns the current input line.
function hilbish.editor.getLine() end
--- Returns the text that is at the register.
function hilbish.editor.getVimRegister(register) end
--- Inserts text into the Hilbish command line.
function hilbish.editor.insert(text) end
--- Reads a keystroke from the user. This is in a format of something like Ctrl-L.
function hilbish.editor.getChar() end
--- Sets the vim register at `register` to hold the passed text.
function hilbish.editor.setVimRegister(register, text) end
--- Return binaries/executables based on the provided parameters.
--- This function is meant to be used as a helper in a command completion handler.
---
---
function hilbish.completion.bins(query, ctx, fields) end
--- Calls a completer function. This is mainly used to call a command completer, which will have a `name`
--- in the form of `command.name`, example: `command.git`.
--- You can check the Completions doc or `doc completions` for info on the `completionGroups` return value.
function hilbish.completion.call(name, query, ctx, fields) end
--- Returns file matches based on the provided parameters.
--- This function is meant to be used as a helper in a command completion handler.
function hilbish.completion.files(query, ctx, fields) end
--- This function contains the general completion handler for Hilbish. This function handles
--- completion of everything, which includes calling other command handlers, binaries, and files.
--- This function can be overriden to supply a custom handler. Note that alias resolution is required to be done in this function.
---
---
function hilbish.completion.handler(line, pos) end
--- Sets an alias, with a name of `cmd` to another command.
---
---
function hilbish.alias(cmd, orig) end
--- Appends the provided dir to the command path (`$PATH`)
---
---
function hilbish.appendPath(dir) end
--- Registers a completion handler for the specified scope.
--- A `scope` is expected to be `command.<cmd>`,
--- replacing <cmd> with the name of the command (for example `command.git`).
--- The documentation for completions, under Features/Completions or `doc completions`
--- provides more details.
---
---
function hilbish.complete(scope, cb) end
--- Returns the current directory of the shell.
function hilbish.cwd() end
--- Replaces the currently running Hilbish instance with the supplied command.
--- This can be used to do an in-place restart.
function hilbish.exec(cmd) end
--- Puts `fn` in a Goroutine.
--- This can be used to run any function in another thread at the same time as other Lua code.
--- **NOTE: THIS FUNCTION MAY CRASH HILBISH IF OUTSIDE VARIABLES ARE ACCESSED.**
--- **This is a limitation of the Lua runtime.**
function hilbish.goro(fn) end
--- Line highlighter handler.
--- This is mainly for syntax highlighting, but in reality could set the input
--- of the prompt to *display* anything. The callback is passed the current line
--- and is expected to return a line that will be used as the input display.
--- Note that to set a highlighter, one has to override this function.
---
function hilbish.highlighter(line) end
--- The command line hint handler. It gets called on every key insert to
--- determine what text to use as an inline hint. It is passed the current
--- line and cursor position. It is expected to return a string which is used
--- as the text for the hint. This is by default a shim. To set hints,
--- override this function with your custom handler.
---
---
function hilbish.hinter(line, pos) end
--- Sets the input mode for Hilbish's line reader.
--- `emacs` is the default. Setting it to `vim` changes behavior of input to be
--- Vim-like with modes and Vim keybinds.
function hilbish.inputMode(mode) end
--- Runs the `cb` function every specified amount of `time`.
--- This creates a timer that ticking immediately.
function hilbish.interval(cb, time) end
--- Changes the text prompt when Hilbish asks for more input.
--- This will show up when text is incomplete, like a missing quote
---
---
function hilbish.multiprompt(str) end
--- Prepends `dir` to $PATH.
function hilbish.prependPath(dir) end
--- Changes the shell prompt to the provided string.
--- There are a few verbs that can be used in the prompt text.
--- These will be formatted and replaced with the appropriate values.
--- `%d` - Current working directory
--- `%u` - Name of current user
--- `%h` - Hostname of device
---
function hilbish.prompt(str, typ) end
--- Read input from the user, using Hilbish's line editor/input reader.
--- This is a separate instance from the one Hilbish actually uses.
--- Returns `input`, will be nil if Ctrl-D is pressed, or an error occurs.
function hilbish.read(prompt) end
--- Executed the `cb` function after a period of `time`.
--- This creates a Timer that starts ticking immediately.
function hilbish.timeout(cb, time) end
--- Checks if `name` is a valid command.
--- Will return the path of the binary, or a basename if it's a commander.
function hilbish.which(name) end
--- Puts a job in the background. This acts the same as initially running a job.
function hilbish.jobs:background() end
--- Puts a job in the foreground. This will cause it to run like it was
--- executed normally and wait for it to complete.
function hilbish.jobs:foreground() end
--- Evaluates `cmd` as Lua input. This is the same as using `dofile`
--- or `load`, but is appropriated for the runner interface.
function hilbish.runner.lua(cmd) end
--- Starts running the job.
function hilbish.jobs:start() end
--- Stops the job from running.
function hilbish.jobs:stop() end
--- Loads a module at the designated `path`.
--- It will throw if any error occurs.
function hilbish.module.load(path) end
--- Starts a timer.
function hilbish.timers:start() end
--- Stops a timer.
function hilbish.timers:stop() end
--- Removes an alias.
function hilbish.aliases.delete(name) end
--- Get a table of all aliases, with string keys as the alias and the value as the command.
---
---
function hilbish.aliases.list() end
--- Resolves an alias to its original command. Will thrown an error if the alias doesn't exist.
function hilbish.aliases.resolve(alias) end
--- Creates a new job. This function does not run the job. This function is intended to be
--- used by runners, but can also be used to create jobs via Lua. Commanders cannot be ran as jobs.
---
---
function hilbish.jobs.add(cmdstr, args, execPath) end
--- Returns a table of all job objects.
function hilbish.jobs.all() end
--- Disowns a job. This simply deletes it from the list of jobs without stopping it.
function hilbish.jobs.disown(id) end
--- Get a job object via its ID.
--- @param id number
--- @returns Job
function hilbish.jobs.get(id) end
--- Returns the last added job to the table.
function hilbish.jobs.last() end
--- Adds a command to the history.
function hilbish.history.add(cmd) end
--- Retrieves all history as a table.
function hilbish.history.all() end
--- Deletes all commands from the history.
function hilbish.history.clear() end
--- Retrieves a command from the history based on the `index`.
function hilbish.history.get(index) end
--- Returns the amount of commands in the history.
function hilbish.history.size() end
--- Creates a timer that runs based on the specified `time`.
function hilbish.timers.create(type, time, callback) end
--- Retrieves a timer via its ID.
function hilbish.timers.get(id) end
return hilbish

View File

@ -1,16 +0,0 @@
--- @meta
local snail = {}
--- Changes the directory of the snail instance.
--- The interpreter keeps its set directory even when the Hilbish process changes
--- directory, so this should be called on the `hilbish.cd` hook.
function snail:dir(path) end
--- Creates a new Snail instance.
function snail.new() end
--- Runs a shell command. Works the same as `hilbish.run`, but only accepts a table of streams.
function snail:run(command, streams) end
return snail

View File

@ -1,18 +0,0 @@
--- @meta
local terminal = {}
--- Restores the last saved state of the terminal
function terminal.restoreState() end
--- Saves the current state of the terminal.
function terminal.saveState() end
--- Puts the terminal into raw mode.
function terminal.setRaw() end
--- Gets the dimensions of the terminal. Returns a table with `width` and `height`
--- NOTE: The size refers to the amount of columns and rows of text that can fit in the terminal.
function terminal.size() end
return terminal

View File

@ -1,83 +0,0 @@
--- @meta
local util = {}
---
function util.AbbrevHome changes the user's home directory in the path string to ~ (tilde) end
---
function util. end
---
function util.DoFile runs the contents of the file in the Lua runtime. end
---
function util.DoString runs the code string in the Lua runtime. end
--- directory.
function util.ExpandHome expands ~ (tilde) in the path, changing it to the user home end
---
function util. end
---
function util.ForEach loops through a Lua table. end
---
function util. end
--- a string and a closure.
function util.HandleStrCallback handles function parameters for Go functions which take end
---
function util. end
---
function util. end
---
function util.SetExports puts the Lua function exports in the table. end
--- It is accessible via the __docProp metatable. It is a table of the names of the fields.
function util.SetField sets a field in a table, adding docs for it. end
--- is one which has a metatable proxy to ensure no overrides happen to it.
--- It sets the field in the table and sets the __docProp metatable on the
--- user facing table.
function util.SetFieldProtected sets a field in a protected table. A protected table end
--- Sets/toggles the option of automatically flushing output.
--- A call with no argument will toggle the value.
--- @param auto boolean|nil
function util:autoFlush(auto) end
--- Flush writes all buffered input to the sink.
function util:flush() end
---
function util. end
--- Reads a liine of input from the sink.
--- @returns string
function util:read() end
--- Reads all input from the sink.
--- @returns string
function util:readAll() end
--- Writes data to a sink.
function util:write(str) end
--- Writes data to a sink with a newline at the end.
function util:writeln(str) end
---
function util. end
---
function util. end
---
function util. end
return util

View File

@ -5,56 +5,45 @@ layout: page
--- ---
## Official Binaries ## Official Binaries
The best way to get Hilbish is to get a build directly from GitHub. The best way to get Hilbish is to get a build directly from GitHub.
At any time, there are 2 versions of Hilbish recommended for download:
At any time, there are 2 versions of Hilbish available to install:
the latest stable release, and development builds from the master branch. the latest stable release, and development builds from the master branch.
You can download both at any time, but note that the development builds may You can download both at any time, but note that the development builds may
have breaking changes. have breaking changes.
For the latest **stable release**, check here: https://github.com/Rosettea/Hilbish/releases/latest For the latest *stable release*, check here: https://github.com/Rosettea/Hilbish/releases/latest
For a **development build**: https://nightly.link/Rosettea/Hilbish/workflows/build/master
For a *development build*: https://nightly.link/Rosettea/Hilbish/workflows/build/master
## Compiling ## Compiling
To read the steps for compiling Hilbish, head over to the [GitHub repository.](https://github.com/Rosettea/Hilbish#build) To read the steps for compiling Hilbish, head over to the [GitHub repository.](https://github.com/Rosettea/Hilbish#build)
## Package Repositories ## Package Repositories
Methods of installing Hilbish for your Linux distro. Methods of installing Hilbish for your Linux distro.
### Fedora (COPR) ### Fedora (COPR)
An official COPR is offered to install Hilbish easily on Fedora. An official COPR is offered to install Hilbish easily on Fedora.
Enable the repo: Enable the repo: `dnf copr enable sammyette/Hilbish`
```
sudo dnf copr enable sammyette/Hilbish
```
And install Hilbish: And install Hilbish: `dnf install hilbish`
```
sudo dnf install hilbish
```
Or for the latest development build from master: Or for the latest development build from master: `dnf install hilbish-git`
```
sudo dnf install hilbish-git
```
### Arch Linux (AUR) ### Arch Linux (AUR)
Hilbish is on the AUR. Setup an AUR helper, and install. Hilbish is on the AUR. Setup an AUR helper, and install.
Example with yay:
``` Example with yay: `yay -S hilbish`
yay -S hilbish
```
Or, from master branch: Or, from master branch: `yay -S hilbish-git`
```
yay -S hilbish-git
```
### Alpine Linux ### Alpine Linux
Hilbish is currentlty in the testing/edge repository for Alpine. Hilbish is currentlty in the testing/edge repository for Alpine.
Follow the steps [here](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository) Follow the steps [here](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository) (using testing repositories) and install: `apk add hilbish`
(Using testing repositories) and install:
```
apk add hilbish
```

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,17 @@
{ {
"dependencies": { "dependencies": {
"@djot/djot": "^0.3.2", "@djot/djot": "^0.3.2",
"@tailwindcss/cli": "^4.1.4", "@tailwindcss/cli": "^4.1.10",
"tailwindcss": "^4.1.4" "npm-watch": "^0.13.0",
"tailwindcss": "^4.1.10"
},
"watch": {
"website": "src/*.gleam"
},
"scripts": {
"website": "npm run gleam-build && npm run tailwind",
"gleam-build": "gleam run -m website",
"tailwind": "npx @tailwindcss/cli -o public/tailwind.css",
"watch": "npm-watch"
} }
} }

View File

@ -1,5 +1,5 @@
pub const base_url = "" pub const base_url = "http://localhost:9080"
pub fn base_url_join(cont: String) -> String { pub fn base_url_join(cont: String) -> String {
base_url <> "/" <> cont base_url <> "/" <> cont
} }

View File

@ -11,115 +11,137 @@ import jot
import post import post
pub fn page(p: post.Post, doc_pages_list) -> element.Element(a) { pub fn page(p: post.Post, doc_pages_list) -> element.Element(a) {
html.div([attribute.class("flex flex-col")], [ html.div([attribute.class("flex-auto flex flex-col overflow-none")], [
html.div([attribute.class("h-10 flex py-2 px-4 border-b border-b-zinc-300 w-full gap-2 backdrop-blur-sm bg-zinc-300/50 dark:bg-zinc-800/50 z-50")], [ html.div(
html.label([attribute.for("sidebar-toggle"), attribute.class("cursor-pointer")], [ [
element.unsafe_raw_html("", "tag", [], "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" class=\"fill-black\"><path d=\"M120-240v-80h240v80H120Zm0-200v-80h480v80H120Zm0-200v-80h720v80H120Z\"/></svg>"), attribute.class(
]), "sm:hidden h-10 flex py-2 px-4 border-b border-b-zinc-300 w-full gap-2 backdrop-blur-sm bg-zinc-300/50 dark:bg-zinc-800/50 z-50",
html.span([], [element.text(p.title)]) ),
]), ],
html.div([attribute.class("grid")], [ [
html.input([attribute.type_("checkbox"), attribute.id("sidebar-toggle"), attribute.class("peer hidden")]), html.label(
html.div([attribute.class("border-r border-r-zinc-300 col-start-1 row-start-1 sticky top-22 sm:top-12 h-full sm:h-svh bg-neutral-200 dark:bg-neutral-900 basis-3/5 transition-transform duration-300 -translate-x-full peer-checked:translate-x-0 z-30")], [ [attribute.for("sidebar-toggle"), attribute.class("cursor-pointer")],
html.div([attribute.class("p-4 -mb-4 overflow-y-auto h-full")], [ [
html.h2([attribute.class("text-xl font-semibold mb-4")], [element.text("Sidebar")]), element.unsafe_raw_html(
html.ul([], list.map(doc_pages_list, fn(post: #(String, post.Post)) { "",
html.li([attribute.class("mb-2")], [element.text(post.1.title)]) "tag",
})) [],
]) "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" class=\"fill-black\"><path d=\"M120-240v-80h240v80H120Zm0-200v-80h480v80H120Zm0-200v-80h720v80H120Z\"/></svg>",
]), ),
html.main([attribute.class("col-start-1 row-start-1 transition-all duration-300 peer-checked:filter peer-checked:blur-sm peer-checked:bg-black/30 px-4 pt-2")], [ ],
html.h1([attribute.class("font-bold text-4xl")], [element.text(p.title)]), ),
// todo: add date of publishing html.span([], [element.text(p.title)]),
//html.time([], []) ],
//html.small([], [element.text({{p.contents |> string.split(" ") |> list.length} / 200} |> int.to_string <> " min read")]), ),
//element.unsafe_raw_html("namespace", "Tag", [], render_doc(p.contents)) html.div([attribute.class("h-full sm:flex grid")], [
..render_doc(p.contents) html.input([
]) attribute.type_("checkbox"),
]) attribute.id("sidebar-toggle"),
]) attribute.class("peer hidden"),
]),
html.div(
[
attribute.class(
"p-4 border-r border-r-zinc-300 col-start-1 row-start-1 bg-neutral-200 dark:bg-neutral-900 basis-2/10 transition-transform duration-300 -translate-x-full peer-checked:translate-x-0 sm:translate-x-0 z-30",
),
],
[
html.ul(
[],
list.map(doc_pages_list, fn(post: #(String, post.Post)) {
html.li([attribute.class("mb-2")], [
html.a([attribute.href(post.0)], [
element.text({ post.1 }.title),
]),
])
}),
),
],
),
html.main(
[
attribute.class(
"mb-4 h-full overflow-y-auto basis-7/7 col-start-1 row-start-1 transition-all duration-300 peer-checked:filter peer-checked:blur-sm peer-checked:bg-black/30 px-4 pt-2",
),
],
[
html.h1([attribute.class("mb-2 font-bold text-4xl")], [
element.text(p.title),
]),
// todo: add date of publishing
//html.time([], [])
//html.small([], [element.text({{p.contents |> string.split(" ") |> list.length} / 200} |> int.to_string <> " min read")]),
//element.unsafe_raw_html("namespace", "Tag", [], render_doc(p.contents))
..render_doc(p.contents)
],
),
]),
])
} }
fn render_doc(md: String) { fn render_doc(md: String) {
let renderer = djot.Renderer( let renderer =
..djot.default_renderer(), djot.Renderer(
heading: fn(attrs, level, content) { ..djot.default_renderer(),
let size = case level { heading: fn(attrs, level, content) {
1 -> "text-4xl" let size = case level {
2 -> "text-3xl" 1 -> "text-4xl"
3 -> "text-2xl" 2 -> "text-3xl"
_ -> "text-xl" 3 -> "text-2xl"
} _ -> "text-xl"
let attr = dict.insert(attrs, "class", "font-bold " <> size) }
let attr =
dict.insert(
attrs,
"class",
"mb-1 text-neutral-800 dark:text-neutral-300 font-bold " <> size,
)
case level { case level {
1 -> html.h1(to_attr(attr), content) 1 -> html.h1(to_attr(attr), content)
2 -> html.h2(to_attr(attr), content) 2 -> html.h2(to_attr(attr), content)
3 -> html.h3(to_attr(attr), content) 3 -> html.h3(to_attr(attr), content)
_ -> html.p(to_attr(attr), content) _ -> html.p(to_attr(attr), content)
} }
} },
) code: fn(content) {
djot.render(md, renderer) html.code([attribute.class("text-violet-600 dark:text-violet-400")], [
element.text(content),
])
},
)
djot.render(md, renderer)
} }
fn to_attr(attrs) { fn to_attr(attrs) {
use attrs, key, val <- dict.fold(attrs, []) use attrs, key, val <- dict.fold(attrs, [])
[attribute.attribute(key, val), ..attrs] [attribute.attribute(key, val), ..attrs]
} }
fn render_doc_(md: String) -> String { fn render_doc_(md: String) -> String {
// w-full m-2 p-2 bg-neutral-700 // w-full m-2 p-2 bg-neutral-700
let doc = jot.parse(md) let doc = jot.parse(md)
let updated_content = list.map(doc.content, fn(container) { let updated_content =
case container { list.map(doc.content, fn(container) {
jot.Heading(attributes, level, content) -> { case container {
let size = case level { jot.Heading(attributes, level, content) -> {
1 -> "text-4xl" let size = case level {
2 -> "text-3xl" 1 -> "text-4xl"
3 -> "text-2xl" 2 -> "text-3xl"
_ -> "text-xl" 3 -> "text-2xl"
} _ -> "text-xl"
let attr = dict.insert(attributes, "class", "font-bold " <> size) }
jot.Heading(attr, level, content) let attr = dict.insert(attributes, "class", "font-bold " <> size)
} jot.Heading(attr, level, content)
_ -> container }
} _ -> container
}) }
echo doc })
echo doc
jot.document_to_html(jot.Document( jot.document_to_html(jot.Document(
content: updated_content, content: updated_content,
references: doc.references, references: doc.references,
footnotes: doc.footnotes footnotes: doc.footnotes,
)) ))
}
fn page_(p: post.Post, doc_pages_list) -> element.Element(a) {
html.div([attribute.class("relative h-screen flex")], [
html.div([attribute.class("-mt-2 -mx-4 py-2 px-4 border-b border-b-zinc-300 flex gap-2 font-semibold")], [
html.label([attribute.for("sidebar-toggle"), attribute.class("cursor-pointer")], [
element.unsafe_raw_html("", "tag", [], "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" class=\"fill-black\"><path d=\"M120-240v-80h240v80H120Zm0-200v-80h480v80H120Zm0-200v-80h720v80H120Z\"/></svg>"),
]),
html.span([], [element.text(p.title)])
]),
html.div([attribute.class("relative flex")], [
html.div([attribute.class("absolute top-0 left-0 h-full bg-gray-200 w-64 transition-transform duration-300 -translate-x-full peer-checked:translate-x-0 z-30")], [
html.div([attribute.class("p-4")], [
html.h2([attribute.class("text-xl font-semibold mb-4")], [element.text("Sidebar")]),
html.ul([], [
html.li([attribute.class("mb-2")], [element.text("Test")])
])
])
]),
html.input([attribute.type_("checkbox"), attribute.id("sidebar-toggle"), attribute.class("peer hidden")]),
html.main([attribute.class("flex-1 transition-all duration-300 peer-checked:filter peer-checked:blur-sm peer-checked:opacity-50")], [
html.h1([], [element.text(p.title)]),
// todo: add date of publishing
//html.time([], [])
//html.small([], [element.text({{p.contents |> string.split(" ") |> list.length} / 200} |> int.to_string <> " min read")]),
//element.unsafe_raw_html("namespace", "Tag", [], md.md_to_html(p.contents))
])
])
])
} }

View File

@ -1,204 +1,298 @@
import gleam/option
import gleam/dict
import gleam/io import gleam/io
import gleam/order
import gleam/list import gleam/list
import gleam/option
import gleam/order
import gleam/string import gleam/string
import glaml
import lustre/attribute import lustre/attribute
import lustre/element import lustre/element
import lustre/element/html import lustre/element/html
import lustre/ssg import lustre/ssg
import lustre/ssg/djot import lustre/ssg/djot
import tom
import simplifile import simplifile
import glaml import tom
import conf import conf
import post
import pages/index
import pages/doc import pages/doc
import pages/index
import post
pub fn main() { pub fn main() {
let assert Ok(files) = simplifile.get_files("./content") let assert Ok(files) = simplifile.get_files("./content")
let posts = list.map(files, fn(path: String) { let posts =
let assert Ok(ext) = path |> string.split(".") |> list.last list.map(files, fn(path: String) {
let slug = path |> string.replace("./content", "") |> string.drop_end({ext |> string.length()} + 1) let assert Ok(ext) = path |> string.split(".") |> list.last
let assert Ok(name) = slug |> string.split("/") |> list.last let slug =
path
|> string.replace("./content", "")
|> string.drop_end({ ext |> string.length() } + 1)
let assert Ok(name) = slug |> string.split("/") |> list.last
let assert Ok(content) = simplifile.read(path) let slug = case name {
let frontmatter = djot.frontmatter(content) "_index" -> slug |> string.drop_end({ "_index" |> string.length() } + 1)
let metadata = case frontmatter { _ -> slug
Ok(frntmtr) -> { }
let assert Ok([metadata]) = glaml.parse_string(frntmtr)
option.Some(metadata)
}
Error(_) -> option.None
}
let content = djot.content(content)
let title = case metadata { let assert Ok(content) = simplifile.read(path)
option.Some(metadata) -> { let frontmatter = djot.frontmatter(content)
case glaml.select_sugar(glaml.document_root(metadata), "title") { let metadata = case frontmatter {
Ok(glaml.NodeStr(s)) -> s Ok(frntmtr) -> {
_ -> "" let assert Ok([metadata]) = glaml.parse_string(frntmtr)
} option.Some(metadata)
}
} Error(_) -> option.None
option.None -> "" }
} let content = djot.content(content)
let assert Ok(filename) = path |> string.split("/") |> list.last let title = case metadata {
#(slug, post.Post(name, title, slug, metadata, content)) option.Some(metadata) -> {
}) case glaml.select_sugar(glaml.document_root(metadata), "title") {
Ok(glaml.NodeStr(s)) -> s
_ -> ""
}
}
option.None -> ""
}
let doc_pages = list.filter(posts, fn(page) { let assert Ok(filename) = path |> string.split("/") |> list.last
let isdoc = is_doc_page(page.0) #(slug, post.Post(name, title, slug, metadata, content))
//io.debug(page.0) })
//io.debug(isdoc)
isdoc
}) |> list.filter(fn(page) {
case page.1.metadata {
option.Some(_) -> True
option.None -> False
}
}) |> list.sort(fn(p1, p2) {
//io.debug(p1)
//io.debug(p2)
let assert option.Some(p1_metadata) = p1.1.metadata
let p1_weight = case glaml.select_sugar(glaml.document_root(p1_metadata), "weight") {
Ok(glaml.NodeInt(w)) -> w
_ -> 0
}
let assert option.Some(p2_metadata) = p2.1.metadata let doc_pages =
let p2_weight = case glaml.select_sugar(glaml.document_root(p2_metadata), "weight") { list.filter(posts, fn(page) {
Ok(glaml.NodeInt(w)) -> w let isdoc = is_doc_page(page.0)
_ -> 0 //io.debug(page.0)
} //io.debug(isdoc)
isdoc
})
|> list.filter(fn(page) {
case { page.1 }.metadata {
option.Some(_) -> True
option.None -> False
}
})
|> list.sort(fn(p1, p2) {
//io.debug(p1)
//io.debug(p2)
let assert option.Some(p1_metadata) = { p1.1 }.metadata
let p1_weight = case
glaml.select_sugar(glaml.document_root(p1_metadata), "weight")
{
Ok(glaml.NodeInt(w)) -> w
_ -> 0
}
case p1_weight == 0 { let assert option.Some(p2_metadata) = { p2.1 }.metadata
True -> order.Eq let p2_weight = case
False -> { glaml.select_sugar(glaml.document_root(p2_metadata), "weight")
case p1_weight < p2_weight { {
True -> order.Lt Ok(glaml.NodeInt(w)) -> w
False -> order.Gt _ -> 0
} }
}
}
})
let build = ssg.new("./public") case p1_weight == 0 {
|> ssg.add_static_dir("static") True -> {
|> ssg.add_static_route("/", create_page(index.page())) case p1_weight == 0 {
|> list.fold(posts, _, fn(config, post) { True -> order.Eq
let route = case post.1.name { False ->
"_index" -> post.0 |> string.drop_end("_index" |> string.length()) case p1_weight > p2_weight {
_ -> post.0 True -> order.Lt
} False -> order.Gt
}
}
}
False -> {
case p1_weight > p2_weight {
True -> order.Lt
False -> order.Gt
}
}
}
})
let page = case is_doc_page(post.0) { let build =
True -> doc.page(post.1, doc_pages) ssg.new("./public")
False -> doc.page(post.1, doc_pages) |> ssg.add_static_dir("static")
} |> ssg.add_static_route("/", create_page(index.page()))
ssg.add_static_route(config, route, create_page(page)) |> list.fold(posts, _, fn(config, post) {
}) let route = case { post.1 }.name {
|> ssg.use_index_routes "_index" -> post.0 |> string.drop_end("_index" |> string.length())
|> ssg.build _ -> post.0
}
case build { let page = case is_doc_page(post.0) {
Ok(_) -> io.println("Website successfully built!") True -> doc.page(post.1, doc_pages)
Error(e) -> { False -> doc.page(post.1, doc_pages)
io.debug(e) }
io.println("Website could not be built.") ssg.add_static_route(config, route, create_page(page))
} })
} |> ssg.use_index_routes
|> ssg.build
case build {
Ok(_) -> io.println("Website successfully built!")
Error(e) -> {
io.debug(e)
io.println("Website could not be built.")
}
}
} }
fn is_doc_page(slug: String) { fn is_doc_page(slug: String) {
case slug { case slug {
"/docs" <> _ -> True "/docs" <> _ -> True
_ -> False _ -> False
} }
} }
fn nav() -> element.Element(a) { fn nav() -> element.Element(a) {
html.nav([attribute.class("flex sticky top-0 w-full z-50 border-b border-b-zinc-300 backdrop-blur-md h-12")], [ html.nav(
html.div([attribute.class("flex my-auto px-2")], [ [
html.div([], [ attribute.class(
html.a([attribute.href("/"), attribute.class("flex items-center gap-1")], [ "bg-stone-50/80 dark:bg-neutral-900/80 flex justify-around sticky items-center top-0 w-full z-50 border-b border-b-zinc-300 backdrop-blur-md h-18",
html.img([ ),
attribute.src("/hilbish-flower.png"), ],
attribute.class("h-6") [
]), html.div([attribute.class("flex my-auto px-2")], [
html.span([ html.div([], [
attribute.class("self-center text-2xl") html.a(
], [ [attribute.href("/"), attribute.class("flex items-center gap-1")],
element.text("Hilbish"), [
]), html.img([
]), attribute.src("/hilbish-flower.png"),
]) attribute.class("h-16"),
]), ]),
]) html.span([attribute.class("self-center text-3xl font-medium")], [
element.text("Hilbish"),
]),
],
),
]),
]),
html.div(
[attribute.class("flex gap-3 dark:text-pink-300 text-pink-600")],
[
html.a([attribute.href("/")], [element.text("Home")]),
html.a([attribute.href("/install")], [element.text("Install")]),
html.a([attribute.href("/docs")], [element.text("Docs")]),
html.a([attribute.href("/blog")], [element.text("Blog")]),
],
),
],
)
} }
fn footer() -> element.Element(a) { fn footer() -> element.Element(a) {
html.footer([attribute.class("py-4 px-6 flex flex-row justify-around border-t border-t-zinc-300")], [ html.footer(
html.div([attribute.class("flex flex-col")], [ [
html.a([attribute.href(conf.base_url), attribute.class("flex items-center gap-1")], [ attribute.class(
html.img([ "py-4 px-6 flex flex-row justify-around border-t border-t-zinc-300",
attribute.src("/hilbish-flower.png"), ),
attribute.class("h-24") ],
]), [
html.span([ html.div([attribute.class("flex flex-col")], [
attribute.class("self-center text-6xl") html.a(
], [ [
element.text("Hilbish"), attribute.href(conf.base_url),
]), attribute.class("flex items-center gap-1"),
]), ],
html.span([attribute.class("text-xl")], [element.text("The Moon-powered shell!")]), [
html.span([attribute.class("text-light text-neutral-500")], [element.text("MIT License, copyright sammyette 2025")]) html.img([
]), attribute.src("/hilbish-flower.png"),
html.div([attribute.class("flex flex-col")], [ attribute.class("h-24"),
link("https://github.com/Rosettea/Hilbish", "GitHub") ]),
]) html.span([attribute.class("self-center text-6xl")], [
]) element.text("Hilbish"),
]),
],
),
html.span([attribute.class("text-xl")], [
element.text("The Moon-powered shell!"),
]),
html.span([attribute.class("text-light text-neutral-500")], [
element.text("MIT License, copyright sammyette 2025"),
]),
]),
html.div([attribute.class("flex flex-col")], [
link("https://github.com/Rosettea/Hilbish", "GitHub"),
]),
],
)
} }
fn create_page(content: element.Element(a)) -> element.Element(a) {
let description = "Something Unique. Hilbish is the new interactive shell for Lua fans. Extensible, scriptable, configurable: All in Lua."
html.html([attribute.class("bg-stone-50 dark:bg-neutral-900 text-black dark:text-white")], [ fn create_page(content: element.Element(a)) -> element.Element(a) {
html.head([], [ let description =
html.meta([ "Something Unique. Hilbish is the new interactive shell for Lua fans. Extensible, scriptable, configurable: All in Lua."
attribute.name("viewport"),
attribute.attribute("content", "width=device-width, initial-scale=1.0") html.html(
]), [
html.link([ attribute.class(
attribute.rel("stylesheet"), "bg-stone-50 dark:bg-neutral-900 text-black dark:text-white",
attribute.href(conf.base_url_join("tailwind.css")) ),
]), ],
html.title([], "Hilbish"), [
html.meta([attribute.name("theme-color"), attribute.content("#ff89dd")]), html.head([], [
html.meta([attribute.content(conf.base_url_join("hilbish-flower.png")), attribute.attribute("property", "og:image")]), html.meta([
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:title")]), // this should be same as title attribute.name("viewport"),
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:site_name")]), attribute.attribute(
html.meta([attribute.content("website"), attribute.attribute("property", "og:type")]), "content",
html.meta([attribute.content(description), attribute.attribute("property", "og:description")]), "width=device-width, initial-scale=1.0",
html.meta([attribute.content(description), attribute.name("description")]), ),
html.meta([attribute.name("keywords"), attribute.content("Lua,Shell,Hilbish,Linux,zsh,bash")]), ]),
html.meta([attribute.content(conf.base_url), attribute.attribute("property", "og:url")]) html.link([
]), attribute.rel("stylesheet"),
html.body([attribute.class("min-h-screen flex flex-col")], [ attribute.href(conf.base_url_join("tailwind.css")),
nav(), ]),
content, html.title([], "Hilbish"),
footer(), html.meta([attribute.name("theme-color"), attribute.content("#ff89dd")]),
]) html.meta([
]) attribute.content(conf.base_url_join("hilbish-flower.png")),
attribute.attribute("property", "og:image"),
]),
html.meta([
attribute.content("Hilbish"),
attribute.attribute("property", "og:title"),
]),
// this should be same as title
html.meta([
attribute.content("Hilbish"),
attribute.attribute("property", "og:site_name"),
]),
html.meta([
attribute.content("website"),
attribute.attribute("property", "og:type"),
]),
html.meta([
attribute.content(description),
attribute.attribute("property", "og:description"),
]),
html.meta([
attribute.content(description),
attribute.name("description"),
]),
html.meta([
attribute.name("keywords"),
attribute.content("Lua,Shell,Hilbish,Linux,zsh,bash"),
]),
html.meta([
attribute.content(conf.base_url),
attribute.attribute("property", "og:url"),
]),
]),
html.body([attribute.class("min-h-screen flex flex-col")], [
nav(),
content,
footer(),
]),
],
)
} }
fn link(url: String, text: String) { fn link(url: String, text: String) {
html.a([attribute.href(url)], [ html.a([attribute.href(url)], [
html.span([attribute.class("text-pink-300 text-light")], [element.text(text)]) html.span([attribute.class("text-pink-300 text-light")], [
]) element.text(text),
]),
])
} }