Custom theme is very minimal and has little info about your whereabouts on the server. "bira" theme set as default. Custom theme wasn't removed, just commented-out.
Server CLI Tools
Interactive installer for setting up a consistent shell environment on Ubuntu/Debian servers. Clone to any server, run the installer, pick what you need.
Quick start
git clone <repo-url> ~/server_cli_tools
cd ~/server_cli_tools
./install.sh # interactive menu
./install.sh --all # install everything
./install.sh --update # pull latest + re-run menu
./install.sh --uninstall # remove installed configs
What's included
| # | Component | What it does |
|---|---|---|
| 1 | Core packages | vim, bat, eza, fzf, htop, tmux, zsh, ripgrep, fd-find, zoxide, git-delta |
| 2 | Zsh + Oh-My-Zsh | Shell, plugins (zsh-autosuggestions, zsh-syntax-highlighting, z), bira prompt theme |
| 3 | Aliases + tools | General, git, and docker aliases with a self-documenting help system (h) |
| 4 | Terminal configs | bat theme (base16) |
| 5 | Docker | docker.io via apt, service enabled, user added to docker group, management aliases |
| 6 | Git config | git-delta as pager with side-by-side diffs |
NOTE: There's minimal custom theme in
<repo>/configs/zsh/zhann-elvis.zsh-theme. To apply it toggleZSH_THEMEand uncomment sourcing it in~/.zshrcafter install. For more themes, see Oh-My-Zsh themes.
Alias highlights
Type h after installation to see all aliases with descriptions. Some highlights:
ll — eza with icons, groups, timestamps
pf — fzf + bat file preview
cdf — fuzzy cd into any subdirectory
mkcd — mkdir + cd in one command
twd — tar current directory
gdn — numbered git diff (then gdn 3 to diff file #3)
gcpm — git add -u + commit + push in one command
gstm — git stash with mandatory message
ds — toggle docker container start/stop
da — docker ps -a
How it works
- Idempotent — safe to run multiple times; skips already-installed packages
- Non-destructive — existing configs are backed up to
~/.server_cli_tools_bkp/<timestamp>/ - Selective — interactive menu lets you toggle individual components
- Ubuntu/Debian — uses
apt; warns on other distros (configs still work)
Repo structure
server_cli_tools/
install.sh # main installer
configs/
aliases/
.aliases # general aliases (server-adapted)
.functions.sh # helper functions + alias help system
.git_aliases # git shortcuts + stash management
.docker_aliases # docker management aliases
.git_bash_autocomplete # bash git completion
custom_tools/
backup_dotfiles.sh # backup conflicting dotfiles
bat/config # bat theme
zshrc # .zshrc with oh-my-zsh, bira theme, plugins
Customization
After installation, create local overrides that won't be tracked:
~/.config/aliases/.local_aliases— machine-specific aliases~/.config/aliases/.custom_aliases— temporary/personal aliases
Use ea l to edit local aliases, ea c for custom, sa to re-source.
Troubleshooting
Terminal type / colors over SSH
Clients such as Ghostty set TERM to values like xterm-ghostty. SSH forwards that to the server, but the server usually has no matching terminfo entry. Symptoms include:
'xterm-ghostty': unknown terminal typewhen running./install.sh(the interactive menu callsclear)- Broken or missing colors in
vim,htop,tmux, and other TUI programs
install.sh detects an unknown TERM at startup and falls back to the first available of xterm-256color, xterm, screen, or dumb. You can also use the non-interactive installer: ./install.sh --all.
For all future SSH sessions to any server, force a portable TERM on the client before connecting. Add a wrapper on your local machine (not the server). The function body is the same in bash and zsh; what differs is where you put it and how you check that it took effect.
Bash (~/.bashrc) — append at the end of the file:
unalias ssh 2>/dev/null
ssh() {
TERM=xterm-256color command ssh "$@"
}
Zsh (~/.zshrc) — append at the end, after Oh-My-Zsh and other plugins so nothing loads later and overrides it:
unalias ssh 2>/dev/null
ssh() {
TERM=xterm-256color command ssh "$@"
}
Zsh also allows function ssh { ... } with the same body; ssh() { ... } is equivalent. In both shells, command ssh calls the real binary and avoids recursion.
| Bash | Zsh | |
|---|---|---|
| Config file | ~/.bashrc |
~/.zshrc |
| Placement | End of file | End of file, after OMZ/plugins |
| Clear alias first | unalias ssh (if present) |
Same — plugins sometimes define ssh aliases |
| Argument forwarding | "$@" |
"$@" — not "@" |
| Reload | exec bash or new terminal |
exec zsh or new terminal |
| Check wrapper is active | type ssh |
whence -v ssh (type can be ambiguous in zsh) |
Verify:
# bash
type ssh
ssh myhost 'echo $TERM'
# zsh
whence -v ssh
ssh myhost 'echo $TERM'
Both should report a shell function and print xterm-256color on the remote host.
One-off:
TERM=xterm-256color ./install.sh
Optional: in ~/.ssh/config, SetEnv TERM=xterm-256color under Host * only works when the remote sshd accepts TERM via AcceptEnv — many servers do not, so the shell wrapper above is more reliable.