Rich Enhanced Shell History - Contextual shell history for zsh and bash
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
resh/shellrc.sh

196 lines
6.5 KiB

PATH=$PATH:~/.resh/bin
# if [ -n "$ZSH_VERSION" ]; then
# zmodload zsh/datetime
# fi
__resh_get_uuid() {
cat /proc/sys/kernel/random/uuid 2>/dev/null || resh-uuid
}
__resh_get_epochrealtime() {
if date +%s.%N | grep -vq 'N'; then
# GNU date
date +%s.%N
elif gdate --version >/dev/null && gdate +%s.%N | grep -vq 'N'; then
# GNU date take 2
gdate +%s.%N
elif [ -n "$ZSH_VERSION" ]; then
# zsh fallback using $EPOCHREALTIME
if [ -z "${__RESH_ZSH_LOADED_DATETIME+x}" ]; then
zmodload zsh/datetime
__RESH_ZSH_LOADED_DATETIME=1
fi
echo "$EPOCHREALTIME"
else
# dumb date
# XXX: we lost precison beyond seconds
date +%s
if [ -z "${__RESH_DATE_WARN+x}" ]; then
echo "resh WARN: can't get precise time - consider installing GNU date!"
__RESH_DATE_WARN=1
fi
fi
}
__resh_run_daemon() {
if [ -n "$ZSH_VERSION" ]; then
setopt LOCAL_OPTIONS NO_NOTIFY NO_MONITOR
fi
nohup resh-daemon &>/dev/null & disown
}
__RESH_MACOS=0
__RESH_LINUX=0
__RESH_UNAME=$(uname)
if [ "$__RESH_UNAME" = "Darwin" ]; then
__RESH_MACOS=1
elif [ "$__RESH_UNAME" = "Linux" ]; then
__RESH_LINUX=1
else
echo "resh PANIC unrecognized OS"
fi
if [ -n "$ZSH_VERSION" ]; then
__RESH_SHELL="zsh"
__RESH_HOST="$HOST"
__RESH_HOSTTYPE="$CPUTYPE"
elif [ -n "$BASH_VERSION" ]; then
__RESH_SHELL="bash"
__RESH_HOST="$HOSTNAME"
__RESH_HOSTTYPE="$HOSTTYPE"
else
echo "resh PANIC unrecognized shell"
fi
if [ -z "${__RESH_SESSION_ID+x}" ]; then
export __RESH_SESSION_ID=$(__resh_get_uuid)
export __RESH_SESSION_PID="$$"
# TODO add sesson time
fi
# posix
__RESH_HOME="$HOME"
__RESH_LOGIN="$LOGNAME"
__RESH_SHELL_ENV="$SHELL"
__RESH_TERM="$TERM"
# non-posix
__RESH_RT_SESSION=$(__resh_get_epochrealtime)
__RESH_OSTYPE="$OSTYPE"
__RESH_MACHTYPE="$MACHTYPE"
if [ $__RESH_LINUX -eq 1 ]; then
__RESH_OS_RELEASE_ID=$(. /etc/os-release; echo "$ID")
__RESH_OS_RELEASE_VERSION_ID=$(. /etc/os-release; echo "$VERSION_ID")
__RESH_OS_RELEASE_ID_LIKE=$(. /etc/os-release; echo "$ID_LIKE")
__RESH_OS_RELEASE_NAME=$(. /etc/os-release; echo "$NAME")
__RESH_OS_RELEASE_PRETTY_NAME=$(. /etc/os-release; echo "$PRETTY_NAME")
__RESH_RT_SESS_SINCE_BOOT=$(cut -d' ' -f1 /proc/uptime)
elif [ $__RESH_MACOS -eq 1 ]; then
__RESH_OS_RELEASE_ID="macos"
__RESH_OS_RELEASE_VERSION_ID=$(sw_vers -productVersion 2>/dev/null)
__RESH_OS_RELEASE_NAME="macOS"
__RESH_OS_RELEASE_PRETTY_NAME="Mac OS X"
__RESH_RT_SESS_SINCE_BOOT=$(sysctl -n kern.boottime | awk '{print $4}' | sed 's/,//g')
fi
__resh_run_daemon
__resh_preexec() {
# core
__RESH_COLLECT=1
__RESH_CMDLINE="$1"
# posix
__RESH_COLS="$COLUMNS"
__RESH_LANG="$LANG"
__RESH_LC_ALL="$LC_ALL"
# other LC ?
__RESH_LINES="$LINES"
__RESH_PATH="$PATH"
__RESH_PWD="$PWD"
# non-posix
__RESH_SHLVL="$SHLVL"
__RESH_GIT_CDUP="$(git rev-parse --show-cdup 2>/dev/null)"
__RESH_GIT_CDUP_EXIT_CODE=$?
__RESH_GIT_REMOTE="$(git remote get-url origin 2>/dev/null)"
__RESH_GIT_REMOTE_EXIT_CODE=$?
#__RESH_GIT_TOPLEVEL="$(git rev-parse --show-toplevel)"
#__RESH_GIT_TOPLEVEL_EXIT_CODE=$?
if [ -n "$ZSH_VERSION" ]; then
# assume Zsh
__RESH_PID="$$" # current pid
elif [ -n "$BASH_VERSION" ]; then
# assume Bash
__RESH_PID="$BASHPID" # current pid
fi
# time
__RESH_TZ_BEFORE=$(date +%z)
# __RESH_RT_BEFORE="$EPOCHREALTIME"
__RESH_RT_BEFORE=$(__resh_get_epochrealtime)
# TODO: we should evaluate symlinks in preexec
# -> maybe create resh-precollect that could handle most of preexec
# maybe even move resh-collect here and send data to daemon and
# send rest of the data ($?, timeAfter) to daemon in precmd
# daemon will combine the data and save the record
# and save the unfinnished record even if it never finishes
# detect if the command died with the parent ps and save it then
}
__resh_precmd() {
__RESH_EXIT_CODE=$?
__RESH_RT_AFTER=$(__resh_get_epochrealtime)
__RESH_TZ_AFTER=$(date +%z)
__RESH_PWD_AFTER="$PWD"
if [ -n "${__RESH_COLLECT}" ]; then
resh-collect -cmdLine "$__RESH_CMDLINE" \
-exitCode "$__RESH_EXIT_CODE" \
-shell "$__RESH_SHELL" \
-uname "$__RESH_UNAME" \
-sessionId "$__RESH_SESSION_ID" \
-cols "$__RESH_COLS" \
-home "$__RESH_HOME" \
-lang "$__RESH_LANG" \
-lcAll "$__RESH_LC_ALL" \
-lines "$__RESH_LINES" \
-login "$__RESH_LOGIN" \
-path "$__RESH_PATH" \
-pwd "$__RESH_PWD" \
-pwdAfter "$__RESH_PWD_AFTER" \
-shellEnv "$__RESH_SHELL_ENV" \
-term "$__RESH_TERM" \
-pid "$__RESH_PID" \
-sessionPid "$__RESH_SESSION_PID" \
-host "$__RESH_HOST" \
-hosttype "$__RESH_HOSTTYPE" \
-ostype "$__RESH_OSTYPE" \
-machtype "$__RESH_MACHTYPE" \
-shlvl "$__RESH_SHLVL" \
-gitCdup "$__RESH_GIT_CDUP" \
-gitCdupExitCode "$__RESH_GIT_CDUP_EXIT_CODE" \
-gitRemote "$__RESH_GIT_REMOTE" \
-gitRemoteExitCode "$__RESH_GIT_REMOTE_EXIT_CODE" \
-realtimeBefore "$__RESH_RT_BEFORE" \
-realtimeAfter "$__RESH_RT_AFTER" \
-realtimeSession "$__RESH_RT_SESSION" \
-realtimeSessSinceBoot "$__RESH_RT_SESS_SINCE_BOOT" \
-timezoneBefore "$__RESH_TZ_BEFORE" \
-timezoneAfter "$__RESH_TZ_AFTER" \
-osReleaseId "$__RESH_OS_RELEASE_ID" \
-osReleaseVersionId "$__RESH_OS_RELEASE_VERSION_ID" \
-osReleaseIdLike "$__RESH_OS_RELEASE_ID_LIKE" \
-osReleaseName "$__RESH_OS_RELEASE_NAME" \
-osReleasePrettyName "$__RESH_OS_RELEASE_PRETTY_NAME" \
&>~/.resh/client_last_run_out.txt || echo "resh ERROR: $(head -n 1 ~/.resh/client_last_run_out.txt)"
fi
unset __RESH_COLLECT
}
preexec_functions+=(__resh_preexec)
precmd_functions+=(__resh_precmd)