Files
dotfiles/migrated/.zshrc
Artem Sheremet 2e02f82ae2 Leave symlink to latest nix-deploy'ed version
This will keep gc root on the linked derivation and prevent
nix-collect-garbage from removing it.
2026-05-26 17:02:09 +00:00

196 lines
5.4 KiB
Bash

# Interactive shell.
export PATH="${HOME}/bin:${PATH}"
# Login shell, connected via SSH, interactive (implied by running in this file),
# not in a GNU screen session already and screen is installed: jump to an active
# screen session or start a new, UTF-8 capable.
#
# Since we exec right afterwards, there's no point in setting this shell up.
if [[ -o login ]]; then
[ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] && \
[ -z "$TMUX" ] && \
command -v tmux >/dev/null && \
exec tmux new -A -D -s main
fi
HISTFILE=~/.zsh_history
# History in the file
HISTSIZE=10000
# History in RAM
SAVEHIST=10000
setopt appendhistory
setopt SHARE_HISTORY
# Self-explanatory
setopt hist_ignore_space
setopt hist_ignore_dups
# Remove older duplicates first
setopt hist_expire_dups_first
# Store timestamps
setopt EXTENDED_HISTORY
export EDITOR=vim
# Noticing this EDITOR setting, zsh will default to vim keybindings. No thanks.
bindkey -e
export PAGER='less -R -F -X -S -n -i -m'
export LESSCHARSET=utf-8
export PYTHONSTARTUP="$HOME/.pythonstartup"
export NCURSES_NO_UTF8_ACS=1
# For ls.
export CLICOLOR=1
# For dark terminal backgrounds.
export LSCOLORS=HxFxCxDxBxEgEdHbHgHcHd
# Looking for more environment variables? Check out .zshenv!
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -i'
alias crontab='crontab -i'
alias gb='git branch'
alias gba='git branch -a'
alias gc='git commit -v'
alias gd='git diff'
alias gdc='git diff --cached'
alias gst='git status'
alias sudo='sudo -E '
alias su='su -m'
alias pager=$PAGER
alias grep='grep --line-buffered --color=auto'
alias ipt='iptables -nvL --line-numbers'
alias ip6t='ip6tables -nvL --line-numbers'
alias tcpdump='tcpdump -l'
alias ag='ag -C 2 --noaffinity --pager="$PAGER" --smart-case'
alias mysql='mysql --select_limit=1000'
alias logcat='adb logcat -v "color printable usec year zone" -T 10'
alias readelf='readelf -W'
alias l='ls -lA'
alias ll='ls -la'
# To kill the ControlMaster session (e.g. to modify it or when it's stuck).
alias unssh='ssh -O exit'
alias ffmpeg_q='ffmpeg -hide_banner -nostats -loglevel warning'
alias curl_t='curl -w \
"# dnslookup: %{time_namelookup} | \
connect: %{time_connect} | \
appconnect: %{time_appconnect} | \
pretransfer: %{time_pretransfer} | \
starttransfer: %{time_starttransfer} | \
total: %{time_total} | \
size: %{size_download}\n"'
# nix-deploy # current host
# nix-deploy nas # deploy nas
# nix-deploy test secondary # deploy secondary but do not add to boot
nix-deploy() {
local action=switch target config cmd r_flake
if (( $# == 0 )); then
# Local deployment.
if [[ "$OSTYPE" == darwin* ]]; then
cmd=darwin-rebuild
r_flake="darwin#darwin-rebuild"
else
cmd=nixos-rebuild
r_flake="nixpkgs#nixos-rebuild"
fi
local run_cmd=($cmd)
command -v "$cmd" >/dev/null 2>&1 || run_cmd=(nix run "$r_flake" --)
sudo "${run_cmd[@]}" switch --flake . |& nom
# home-manager switch if exists.
local hm_conf="$(whoami)@$(hostname -s)"
if [[ "$(nix eval --json ".#homeConfigurations" --apply "x: x ? \"$hm_conf\"" 2>/dev/null)" == "true" ]]; then
local hm_run=(home-manager)
command -v home-manager >/dev/null 2>&1 || hm_run=(nix run "home-manager#home-manager" --)
"${hm_run[@]}" switch --flake .
fi
return
fi
# Remote deployment (always NixOS).
if (( $# == 1 )); then
target=$1
shift
else
action=$1
target=$2
shift 2
fi
config=${${target#*@}%%.*}
cmd=(nixos-rebuild)
command -v nixos-rebuild >/dev/null 2>&1 || cmd=(nix run "nixpkgs#nixos-rebuild" --)
nix build ".#nixosConfigurations.$config.config.system.build.toplevel" \
--out-link "result.$config" |& nom
local build_status=$pipestatus[1]
if (( build_status != 0 )); then
return $build_status
fi
if [[ "$action" != "build" ]]; then
# Bypass nixos-rebuild self-update check which errors in
# flake-only setups when --store-path is used.
_NIXOS_REBUILD_REEXEC=1 "${cmd[@]}" "$action" \
--store-path "$(readlink -f "result.$config")" \
--target-host "$target" \
--sudo \
"$@"
fi
}
myip() {
if [ $# -eq 0 ]; then
curl -4 --silent http://ipecho.net/plain; echo
curl -6 --silent http://ipecho.net/plain; echo
else
ip addr show "$1" | sed -nr 's/\s+inet ([0-9.]+)\/.*/\1/p'
fi
}
colordiff() {
local gitarg file1 file2
for arg; do
gitarg="$gitarg $file1"
file1="$file2"
file2="$arg"
done
# git won't diff against a pipe, so a kind of workaround
cat "$file2" | git diff --no-prefix $gitarg --no-index "$file1" -
}
alias backup-home-explore='eval "ncdu $(grep -A1 -- --exclude $HOME/bin/backup-home | tr -d \|)"'
# stderr redirect for if direnv is missing
eval "$(direnv hook zsh 2>/dev/null)"
if [ -z "$SSH_AUTH_SOCK" -a -z "$SSH_CLIENT" ]; then
# This path is only needed in a local shell.
#
# In a screen session, we set SSH_AUTH_SOCK to a fixed path in
# .screenrc before a shell is started.
#
# That fixed path is a symlink which gets updated by .ssh/rc scrtipt.
eval `ssh-agent -s`
trap 'ssh-agent -k' EXIT
fi
autoload -Uz vcs_info
precmd_functions+=( vcs_info )
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' stagedstr '%F{green}*%f'
zstyle ':vcs_info:*' unstagedstr '%F{red}*%f'
zstyle ':vcs_info:git:*' formats ' (%F{cyan}%b%f%c%u)'
setopt prompt_subst
PROMPT='${IN_NIX_SHELL}%(?..%F{red}%?%f )[%n@%m] %3~${vcs_info_msg_0_} %# '
# Expand aliases by the press of TAB.
zstyle ':completion:*' completer _expand_alias _complete _ignored
[ -r ~/.zshrc_local ] && source ~/.zshrc_local || true