dippin-dotfiles/.config/hilbish/starship.lua
2025-02-04 21:06:01 -07:00

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