e4063b5559
Two changes that address a longstanding frustration: bash history is lost on every container recreate, and the container's ~/.bashrc and ~/.inputrc are stock Debian (no history tuning, no prefix search on arrow keys, no integrations). Added a named volume 'devbox-shell-history' mounted at ~/.cache/bash with HISTFILE pointing there; history now survives 'docker compose up --force-recreate'. The volume is added to both docker-compose.yml and docker-compose.shared.yml, and ~/.cache/bash is registered in the entrypoint ownership-fix loop per the AGENTS.md convention. Baked rootfs/home/developer/.bash_aliases (sourced automatically by Debian's default ~/.bashrc) and rootfs/home/developer/.inputrc into the image. They give new containers: 100k-entry timestamped dedup history with per-prompt flush, Up/Down arrow prefix history search, case-insensitive coloured completion, aliases that prefer eza and bat when present, git shortcuts, interactive rm/mv/cp, zoxide and fzf (via 'fzf --bash') integration, and a [devbox] prompt marker. The fzf integration uses 'fzf --bash' because we install fzf from GitHub releases, not apt — the apt-path key-bindings aren't present. Users who prefer their host's own shell config can uncomment two commented bind-mount lines in docker-compose.yml to shadow the baked defaults.
74 lines
2.9 KiB
Bash
74 lines
2.9 KiB
Bash
# opencode-devbox bash aliases and customizations
|
|
# Sourced by the Debian-default ~/.bashrc on shell startup.
|
|
# To override, bind-mount your host's ~/.bash_aliases over this file
|
|
# via docker-compose.yml.
|
|
|
|
# ── History persistence and quality ──────────────────────────────────
|
|
# The named volume devbox-shell-history is mounted at ~/.cache/bash
|
|
# so history survives container recreation.
|
|
export HISTFILE="${HOME}/.cache/bash/history"
|
|
mkdir -p "$(dirname "$HISTFILE")" 2>/dev/null || true
|
|
|
|
# Large, time-stamped, deduplicated history. Append rather than overwrite.
|
|
export HISTSIZE=100000
|
|
export HISTFILESIZE=200000
|
|
export HISTCONTROL=ignoreboth:erasedups
|
|
export HISTTIMEFORMAT='%F %T '
|
|
shopt -s histappend 2>/dev/null
|
|
shopt -s cmdhist 2>/dev/null
|
|
# Flush every command to disk immediately so reboots don't lose recent work.
|
|
# Guarded so repeated sourcing (e.g. `exec bash`) doesn't stack duplicates.
|
|
if [ -z "${DEVBOX_HIST_SET:-}" ]; then
|
|
PROMPT_COMMAND="history -a; ${PROMPT_COMMAND:-}"
|
|
export DEVBOX_HIST_SET=1
|
|
fi
|
|
|
|
# ── Common aliases ───────────────────────────────────────────────────
|
|
# Prefer eza (modern ls) when available
|
|
if command -v eza >/dev/null 2>&1; then
|
|
alias ls='eza --group-directories-first'
|
|
alias ll='eza -lh --group-directories-first --git'
|
|
alias la='eza -lha --group-directories-first --git'
|
|
alias tree='eza --tree'
|
|
else
|
|
alias ll='ls -lh'
|
|
alias la='ls -lha'
|
|
fi
|
|
|
|
# Prefer bat (syntax-highlighted cat) when available
|
|
if command -v bat >/dev/null 2>&1; then
|
|
alias cat='bat --style=plain --paging=never'
|
|
alias less='bat --paging=always'
|
|
fi
|
|
|
|
# Git shortcuts
|
|
alias gs='git status'
|
|
alias gd='git diff'
|
|
alias gl='git log --oneline --graph --decorate -20'
|
|
|
|
# Safety: confirm before destructive ops
|
|
alias rm='rm -i'
|
|
alias mv='mv -i'
|
|
alias cp='cp -i'
|
|
|
|
# ── Shell integrations ───────────────────────────────────────────────
|
|
# zoxide — smarter cd. Use 'z <fragment>' to jump to previously-visited dirs.
|
|
if command -v zoxide >/dev/null 2>&1; then
|
|
eval "$(zoxide init bash)"
|
|
fi
|
|
|
|
# fzf — fuzzy finder key bindings (Ctrl-R for history, Ctrl-T for files).
|
|
# We install fzf from GitHub releases (not apt), so sourcing from the
|
|
# apt-path /usr/share/doc/fzf/examples/* would find nothing. Use the
|
|
# binary's own --bash flag (available since fzf 0.48) for setup.
|
|
if command -v fzf >/dev/null 2>&1; then
|
|
eval "$(fzf --bash)" 2>/dev/null || true
|
|
fi
|
|
|
|
# ── Prompt: show [opencode-devbox] tag so it's obvious you're in the container
|
|
# Preserves the default Debian PS1 logic but prefixes with a container marker.
|
|
if [ -n "${PS1:-}" ] && [ -z "${DEVBOX_PS1_SET:-}" ]; then
|
|
PS1='\[\e[38;5;39m\][devbox]\[\e[0m\] '"${PS1}"
|
|
export DEVBOX_PS1_SET=1
|
|
fi
|