64 lines
1.7 KiB
Lua
Executable file
64 lines
1.7 KiB
Lua
Executable file
-- Starship.rs support for Hilbish
|
|
-- Supports the following features:
|
|
-- * exit codes
|
|
-- * command duration (kind of - it usually works but is not 100% perfect)
|
|
-- * number of jobs
|
|
-- * continuation prompt (which some shells like fish don't even support!)
|
|
-- * anything else inherently handled by starship (git, username, etc)
|
|
|
|
local bait = require 'bait'
|
|
local hilbish = require 'hilbish'
|
|
|
|
local M = {}
|
|
|
|
M.execTime = {}
|
|
|
|
function M.doPrompt(status, num_jobs, num_secs)
|
|
-- Since lua by default only has second-resolution with its os.time() function,
|
|
-- we need to multiply by 1000 to get milliseconds elapsed.
|
|
-- This, of course, means we don't actually get millisecond-level resolution, but whatever - we work with what we got.
|
|
local time_ms = num_secs * 1000
|
|
|
|
local cmd = "starship prompt --status " .. status .. " --jobs " .. num_jobs .. " --cmd-duration " .. time_ms
|
|
local res = io.popen(cmd)
|
|
hilbish.prompt(res:read("*all"))
|
|
end
|
|
|
|
function M.doCommandExit(code, cmdStr)
|
|
local cur_time = os.time()
|
|
local time_elapsed = 0
|
|
|
|
if cmdStr ~= nil then
|
|
if M.execTime[cmdStr] ~= nil then
|
|
time_elapsed = cur_time - M.execTime[cmdStr]
|
|
end
|
|
M.execTime[cmdStr] = nil
|
|
end
|
|
|
|
local jobs = hilbish.jobs.all()
|
|
M.doPrompt(code, #jobs, time_elapsed)
|
|
end
|
|
|
|
function M.doCommandPreExec(input)
|
|
if input ~= nil then
|
|
M.execTime[input] = os.time()
|
|
end
|
|
end
|
|
|
|
function M.setup()
|
|
local cmd = "starship prompt --continuation"
|
|
local res = io.popen(cmd)
|
|
hilbish.multiprompt(res:read("*all"))
|
|
|
|
M.doPrompt(0, 0, 0)
|
|
|
|
bait.catch("command.preexec", function(input, _)
|
|
M.doCommandPreExec(input)
|
|
end)
|
|
|
|
bait.catch('command.exit', function(code, cmdStr)
|
|
M.doCommandExit(code, cmdStr)
|
|
end)
|
|
end
|
|
|
|
return M
|