#!/bin/mksh
# Interactive mksh configuration
# Source login profile if not already loaded
[ -z "$EDITOR" ] && . "$HOME/.profile"
# Vi mode
set -o vi
# Prompt: user@host:dir >
PS1='$(print -n "\033[34m")${USER}$(print -n "\033[0m")@$(print -n "\033[35m")$(hostname -s)$(print -n "\033[0m"):$(print -n "\033[36m")${PWD/#$HOME/\~}$(print -n "\033[0m") > '
# History
HISTFILE="$HOME/.mksh_history"
HISTSIZE=10000
# Source config modules
. "$HOME/.config/.mksh/load.sh"
# Zoxide (smarter cd)
command -v zoxide >/dev/null 2>&1 && eval "$(zoxide init posix --hook prompt)"
# Direnv (bash hook works under mksh; there is no dedicated ksh hook)
command -v direnv >/dev/null 2>&1 && eval "$(direnv hook bash)"
# History logging (encrypted with SQLCipher)
_kh_db="$HOME/.local/share/history/history.db"
_kh_key_file="$HOME/.local/share/history/.key"
_kh_log() {
typeset cmd="$1" exit_code="$2" pwd_path="$PWD"
[ -z "$cmd" ] && return
case "$cmd" in history*) return ;; esac
[ -f "$_kh_key_file" ] || return
[ -f "$_kh_db" ] || return
typeset escaped_cmd=$(print -r -- "$cmd" | sed "s/'/''/g")
typeset escaped_pwd=$(print -r -- "$pwd_path" | sed "s/'/''/g")
typeset key=$(cat "$_kh_key_file")
(sqlcipher "$_kh_db" "PRAGMA key = '$key'; INSERT INTO terminal_history (command, exit_code, pwd, shell) VALUES ('$escaped_cmd', $exit_code, '$escaped_pwd', 'mksh');" &) >/dev/null 2>&1
}
# Command history logging hook.
if [ -n "$BASH_VERSION" ]; then
# bash: DEBUG trap captures the command, PROMPT_COMMAND logs it
_kh_last_cmd=""
trap '_kh_last_cmd=$(fc -ln -1 2>/dev/null | sed "s/^[[:space:]]*//")' DEBUG
PROMPT_COMMAND='_kh_log "$_kh_last_cmd" "$?"'
else
# mksh: no DEBUG trap / PROMPT_COMMAND. Log from PS1 each prompt.
# The leading $(...) captures $? first, so the exit code is accurate,
# and _kh_prompt emits nothing so the visible prompt is unchanged.
# Skip the first render: at shell start fc -ln -1 is a stale HISTFILE
# entry, not a command run this session.
_kh_first_prompt=1
_kh_prompt() {
if [ -n "$_kh_first_prompt" ]; then
unset _kh_first_prompt
return
fi
_kh_log "$(fc -ln -1 2>/dev/null | sed 's/^[[:space:]]*//')" "$1"
}
PS1='$(_kh_prompt "$?")'"$PS1"
fi