From 55b0d31604fd4c36e162f8adcd770c247d9d638f Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 18 Jan 2026 14:23:48 +0000 Subject: [PATCH] Refactor dotfiles - 2026-01-18 Changes: - Refactored .zshrc into modular oh-my-zsh/custom/ files - Created aliases.zsh, functions.zsh, path.zsh, keybindings.zsh - Added bira-time.zsh-theme (bira with timestamp) - Added tools/*.zsh for pyenv, nvm, kubectl - Updated .tmux.conf.local with cross-platform support - Updated gpakosz/.tmux framework - Cleaned up .zshenv --- dot_bash_aliases | 1 + dot_oh-my-zsh/custom/aliases.zsh | 154 +++++ dot_oh-my-zsh/custom/functions.zsh | 167 +++++ dot_oh-my-zsh/custom/keybindings.zsh | 13 + dot_oh-my-zsh/custom/path.zsh | 18 + .../custom/themes/bira-time.zsh-theme | 36 ++ dot_oh-my-zsh/custom/tools/kubectl.zsh | 10 + dot_oh-my-zsh/custom/tools/nvm.zsh | 6 + dot_oh-my-zsh/custom/tools/pyenv.zsh | 23 + dot_tmux.conf.local | 605 ++++++++++-------- dot_zshenv | 25 +- dot_zshrc | 206 ++---- 12 files changed, 811 insertions(+), 453 deletions(-) create mode 100644 dot_oh-my-zsh/custom/aliases.zsh create mode 100644 dot_oh-my-zsh/custom/functions.zsh create mode 100644 dot_oh-my-zsh/custom/keybindings.zsh create mode 100644 dot_oh-my-zsh/custom/path.zsh create mode 100644 dot_oh-my-zsh/custom/themes/bira-time.zsh-theme create mode 100644 dot_oh-my-zsh/custom/tools/kubectl.zsh create mode 100644 dot_oh-my-zsh/custom/tools/nvm.zsh create mode 100644 dot_oh-my-zsh/custom/tools/pyenv.zsh diff --git a/dot_bash_aliases b/dot_bash_aliases index 721553f..e3691c9 100644 --- a/dot_bash_aliases +++ b/dot_bash_aliases @@ -22,6 +22,7 @@ alias gs='git status' alias ga='git add' alias gc='git commit -S' alias gp='git push origin master' +alias gpf='git push -u forgejo master' # alias gp='for r in $(git remote); do echo "Pushing to $r" && git push $r master; done' alias gpull='git pull --rebase origin master' alias gl="git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all" diff --git a/dot_oh-my-zsh/custom/aliases.zsh b/dot_oh-my-zsh/custom/aliases.zsh new file mode 100644 index 0000000..96f4be5 --- /dev/null +++ b/dot_oh-my-zsh/custom/aliases.zsh @@ -0,0 +1,154 @@ +# Aliases - organized by category +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/ + +# ============================================================================ +# Basic utilities +# ============================================================================ +alias ls='ls --color=auto' +alias sl=ls +alias grep='grep --color=auto' +alias fgrep='fgrep --color=auto' +alias egrep='egrep --color=auto' + +alias vi="vim" +alias vimdiff="vim -d" +alias vix="vim -X" # Fast vim startup without X (no system clipboard) +alias vimrc="vim ~/.vimrc" +alias zshrc="vim ~/.zshrc" + +alias sizeof='du -sh' +alias mkdir="mkdir -pv" +alias f="free -h" +alias h="sudo htop" +alias a="sudo atop" +alias e="exa -bghHliS" +alias n="sudo nethogs" +alias i="sudo iotop" +alias hosts="sudo vim /etc/hosts" +alias root="sudo su -" +alias xo="xdg-open" +alias time='"time"' # Disable bash builtin +alias toclip="xclip -selection clipboard" + +# ============================================================================ +# Python +# ============================================================================ +alias py='python3' +alias ipy='ipython3' +alias pmr='python manage.py runserver' +alias nopmr="ps auxw | grep runserver | awk '{print \$2}' | xargs kill" +alias pmm='python manage.py migrate' +alias pmmm='python manage.py makemigrations' + +# ============================================================================ +# Git +# ============================================================================ +alias g='git' +alias gs='git status' +alias ga='git add' +alias gc='git commit -S' +alias gp='git push origin master' +alias gpf='git push -u forgejo master' +alias gpull='git pull --rebase origin master' +alias gl="git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all" +alias gd="git diff" +alias gds="git diff --staged" +alias gb="git branch" +alias gpp='git push production master' +alias git-pull-branches='git branch -r | grep -v "\->" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done' + +# ============================================================================ +# Docker +# ============================================================================ +alias dk="docker" +alias dsl="docker swarm leave --force" +alias dkon="sudo systemctl start docker" +alias dkoff="sudo systemctl stop docker" + +# ============================================================================ +# Kubernetes +# ============================================================================ +alias kb="kubectl" +alias kbp="kubectl get pods" +alias kbpo="kubectl get pods -o wide" +alias kbs="kubectl get svc" +alias kbn="kubectl get nodes -o wide" +alias kbd="kubectl describe pods" +alias kbf="kubectl logs --all-containers --max-log-requests 50 -f --since=5m" +alias kbe='kubectl exec -it $(kbp | tail -n 1 | awk "{print \$1}") -- sh' +alias kn="kubens" + +# ============================================================================ +# Terraform +# ============================================================================ +alias tf="terraform" +alias tfa="tf apply" + +# ============================================================================ +# Network +# ============================================================================ +alias s="ssh" +alias myip="curl https://icanhazip.com" +alias ifl="ifconfig|less" +alias whatisopen='sudo netstat -pnlt' +alias speedtest="curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -" +alias wg="sudo wg" + +# ============================================================================ +# System +# ============================================================================ +alias omg="sudo systemctl restart NetworkManager" +alias omg1.1="sudo rmmod iwlmvm && sudo rmmod iwlwifi; sudo modprobe iwlwifi" +alias omg2="kwin --replace &" +alias omg2.1="kquitapp5 plasmashell && kstart5 plasmashell" + +alias battery="upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E 'time to empty|state|to\ full|percentage'" +alias bye="sudo systemctl suspend" +alias hib="sudo systemctl hibernate" +alias gg="xset dpms force off" +alias wa="watch sensors" +alias gtop="sudo intel_gpu_top" + +alias vmon="sudo systemctl start vmware" +alias vmoff="sudo systemctl stop vmware" + +# ============================================================================ +# Misc tools +# ============================================================================ +alias aliases="vim ~/.oh-my-zsh/custom/aliases.zsh && source ~/.zshrc" +alias rmswp="find ~/.vim/tmp/ -iname \"*swp\" -delete" +alias clearsessions="rm -rf ~/.vim/tmp/sessions/*" +alias zsh_fix="mv ~/.zsh_history ~/.zsh_history_bad; strings ~/.zsh_history_bad > ~/.zsh_history; fc -R ~/.zsh_history; rm ~/.zsh_history_bad" +alias server="/opt/miniserve-linux" +alias gr="go run ." +alias hg="hugo -D server --bind 0.0.0.0" +alias cr="cargo run" +alias tricks="vi ~/tricks/tricks.txt" +alias logout="qdbus org.kde.ksmserver /KSMServer logout 0 0 0" + +# Shadowsocks +alias ss-tunnel="snap run shadowsocks-libev.ss-tunnel" +alias ss-local="snap run shadowsocks-libev.ss-local" + +# ============================================================================ +# Package manager detection (for update/install aliases) +# ============================================================================ +typeset -A osInfo +osInfo[/etc/redhat-release]=dnf +osInfo[/etc/arch-release]=pacman +osInfo[/etc/gentoo-release]=emerge +osInfo[/etc/SuSE-release]=zypp +osInfo[/etc/debian_version]=apt-get + +for f in "${(@k)osInfo}"; do + if [[ -f $f ]]; then + pm=${osInfo[$f]} + fi +done + +alias update="sudo $pm update" +alias u="update" +alias upgrade="sudo $pm upgrade" +alias install="sudo $pm install" +alias remove="sudo $pm remove" +alias reinstall="sudo $pm reinstall" diff --git a/dot_oh-my-zsh/custom/functions.zsh b/dot_oh-my-zsh/custom/functions.zsh new file mode 100644 index 0000000..2900fc4 --- /dev/null +++ b/dot_oh-my-zsh/custom/functions.zsh @@ -0,0 +1,167 @@ +# Shell functions +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/ + +# ============================================================================ +# Git functions +# ============================================================================ + +# Useful for daily stand-up +git-standup() { + AUTHOR=${AUTHOR:="$(git config user.name)"} + since=yesterday + if [[ $(date +%u) == 1 ]]; then + since="2 days ago" + fi + git log --all --since "$since" --oneline --author="$AUTHOR" +} + +# ============================================================================ +# Network functions +# ============================================================================ + +netok() { + echo 'Testing DNS settings.' + timeout 1 ping google.com -W 1 -c 1 &>> /dev/null + if (( $? == 0 )); then + echo 'Internet is up.' + return 0 + fi + echo 'Pinging 8.8.8.8' + ping 8.8.8.8 -W 1 -c 1 &>> /dev/null + if (( $? == 0 )); then + echo 'Issue spotted in DNS settings' + return 0 + fi + gateway=$(echo $(route -n | sed -n '3p' | awk '{print $2}')) + echo 'Pinging ' $gateway + ping $gateway -W 1 -c 2 &>> /dev/null + if (($? == 0 )); then + echo 'Gateway connectivity issues or being firewalled.' + return 0 + else + echo 'Cannot reach default gateway.' + return 0 + fi +} + +certinfo() { + curl --insecure -v https://"$1" 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }' +} + +# ============================================================================ +# Wireguard VPN +# ============================================================================ + +wgon() { + wg-quick up ~/vpn-certs/viktor.conf + # Add ipv4 precedence because vpn is v4 only for now + bash -c "grep -qxF 'precedence ::ffff:0:0/96 100' /etc/gai.conf || echo 'precedence ::ffff:0:0/96 100' | sudo tee -a /etc/gai.conf" + # Add dns if missing + ns_str="nameserver 10.0.20.1 # Added by wgon function" + search_str="search viktorbarzin.lan # Added by wgon function" + resolv_conf="/etc/resolv.conf" + bash -c "grep -qxF '$search_str' $resolv_conf || echo '$search_str' | sudo tee -a $resolv_conf" + bash -c "grep -qxF '$ns_str' $resolv_conf || echo '$ns_str' | sudo sed -i -e '1i $ns_str' $resolv_conf" +} + +wgoff() { + wg-quick down ~/vpn-certs/viktor.conf + ns_str="nameserver 10.0.20.1 # Added by wgon function" + search_str="search viktorbarzin.lan # Added by wgon function" + resolv_conf="/etc/resolv.conf" + sudo sed -i '/precedence ::ffff:0:0\/96 100/d' /etc/gai.conf + sudo sed -i "/$search_str/d" $resolv_conf + sudo sed -i "/$ns_str/d" $resolv_conf +} + +wgs() { + kubectl scale -n wireguard deployment wireguard --replicas=$1 +} + +# ============================================================================ +# Kubernetes +# ============================================================================ + +cephpw() { + kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o yaml | grep "password:" | grep -v '{}' | awk '{print $2}' | base64 --decode +} + +kbop() { + kb -n rook-ceph delete pods $(kbp | grep opera | awk '{print $1}') + kb -n rook-ceph logs -f $(kbp | grep operator | awk '{print $1}') +} + +# ============================================================================ +# Compilation / Development +# ============================================================================ + +c() { + # Pass any arguments to gcc and afterwards run executable + gcc "$@" && ./a.out +} + +dang_gcc() { + gcc "$@" -fno-stack-protector -z execstack +} + +make_tags() { + avr-gcc -M $* | sed -e 's/[\\ ]/\n/g' | \ + sed -e '/^$/d' -e '/\.o:[ \t]*$/d' | ctags -L - --c++-kinds=+p --fields=+iaS --extra=+q +} + +# ============================================================================ +# File encryption +# ============================================================================ + +encrypt() { + tar -czvf $1.tar.gz $1 && \ + gpg --symmetric --armor $1.tar.gz && \ + echo "Deleting $1 and $1.tar.gz" && \ + rm -rf $1 $1.tar.gz +} + +decrypt() { + gpg --decrypt $1 | tar xzvf - +} + +# ============================================================================ +# Utilities +# ============================================================================ + +camelcase() { + perl -pe 's#(_|^)(.)#\u$2#g' +} + +waitfor() { + while pidof $1 > /dev/null; do sleep 2; done +} + +b64() { + echo $1 | base64 -d +} + +# Include helper - source file if it exists +include() { + [[ -f "$1" ]] && source "$1" +} + +# Download GitHub folder using svn +download_github_folder() { + svn checkout $(echo $1 | sed "s/\/tree\/[a-zA-Z]\+/\/trunk/") +} +alias svali_papka=download_github_folder + +# Snapper wrapper for btrfs snapshots +snp() { + cmd="$@" + snapshot_nbr=$(snapper -c home create --type=pre --cleanup-algorithm=number --print-number --description="${cmd}") + eval "$cmd" + snapshot_nbr=$(snapper -c home create --type=post --cleanup-algorithm=number --print-number --pre-number="$snapshot_nbr") +} + +alias sp="snapper -c home" + +# YouTube playlist player +ytplaylist() { + youtube-dl -o - -f best $@ | vlc - +} diff --git a/dot_oh-my-zsh/custom/keybindings.zsh b/dot_oh-my-zsh/custom/keybindings.zsh new file mode 100644 index 0000000..51a1cb0 --- /dev/null +++ b/dot_oh-my-zsh/custom/keybindings.zsh @@ -0,0 +1,13 @@ +# Key bindings +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/ + +# Enable Ctrl-x-e to edit command line in $EDITOR +autoload -U edit-command-line +zle -N edit-command-line +bindkey '^xe' edit-command-line +bindkey '^x^e' edit-command-line + +# Zsh autosuggestions (if plugin is installed) +ZSH_AUTOSUGGEST_STRATEGY=(history completion) +bindkey '^[0' autosuggest-accept +bindkey '^[9' autosuggest-fetch diff --git a/dot_oh-my-zsh/custom/path.zsh b/dot_oh-my-zsh/custom/path.zsh new file mode 100644 index 0000000..3b5626b --- /dev/null +++ b/dot_oh-my-zsh/custom/path.zsh @@ -0,0 +1,18 @@ +# PATH modifications +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/ + +# Go +export GOPATH="$HOME/go" +export PATH="$HOME/go/bin:$PATH" + +# Local bin +export PATH="$HOME/.local/bin:$PATH" + +# JDK (if installed) +[[ -d /opt/jdk-12.0.1/bin ]] && export PATH="/opt/jdk-12.0.1/bin:$PATH" + +# Krew (kubectl plugin manager) +export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" + +# Add custom zsh functions +fpath+=~/.zfunc diff --git a/dot_oh-my-zsh/custom/themes/bira-time.zsh-theme b/dot_oh-my-zsh/custom/themes/bira-time.zsh-theme new file mode 100644 index 0000000..6e86577 --- /dev/null +++ b/dot_oh-my-zsh/custom/themes/bira-time.zsh-theme @@ -0,0 +1,36 @@ +# bira-time theme - bira with timestamp +# Based on bira theme, adds current time to prompt + +local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})" +local user_host="%B%(!.%{$fg[red]%}.%{$fg[green]%})%n@%m%{$reset_color%} " +local user_symbol='%(!.#.$)' +local current_dir="%B%{$fg[blue]%}%~ %{$reset_color%}" +local current_time="%{$fg_bold[red]%}%*%{$reset_color%} " + +local vcs_branch='$(git_prompt_info)$(hg_prompt_info)' +local rvm_ruby='$(ruby_prompt_info)' +local venv_prompt='$(virtualenv_prompt_info)' + +ZSH_THEME_RVM_PROMPT_OPTIONS="i v g" + +PROMPT="╭─${user_host}${current_time}${current_dir}${rvm_ruby}${vcs_branch}${venv_prompt} +╰─%B${user_symbol}%b " +RPROMPT="%B${return_code}%b" + +ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[yellow]%}‹" +ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$reset_color%}" +ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}●%{$fg[yellow]%}" +ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[yellow]%}" + +ZSH_THEME_HG_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX" +ZSH_THEME_HG_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX" +ZSH_THEME_HG_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY" +ZSH_THEME_HG_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN" + +ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}‹" +ZSH_THEME_RUBY_PROMPT_SUFFIX="› %{$reset_color%}" + +ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX="%{$fg[green]%}‹" +ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX="› %{$reset_color%}" +ZSH_THEME_VIRTUALENV_PREFIX="$ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX" +ZSH_THEME_VIRTUALENV_SUFFIX="$ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX" diff --git a/dot_oh-my-zsh/custom/tools/kubectl.zsh b/dot_oh-my-zsh/custom/tools/kubectl.zsh new file mode 100644 index 0000000..25cbd50 --- /dev/null +++ b/dot_oh-my-zsh/custom/tools/kubectl.zsh @@ -0,0 +1,10 @@ +# Kubectl configuration +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/tools/ +# Note: This must run after compinit, which oh-my-zsh handles + +if command -v kubectl >/dev/null 2>&1; then + source <(kubectl completion zsh) +fi + +# Load golang path if exists +[[ -f /etc/profile.d/golang_path.sh ]] && source /etc/profile.d/golang_path.sh diff --git a/dot_oh-my-zsh/custom/tools/nvm.zsh b/dot_oh-my-zsh/custom/tools/nvm.zsh new file mode 100644 index 0000000..ad5a118 --- /dev/null +++ b/dot_oh-my-zsh/custom/tools/nvm.zsh @@ -0,0 +1,6 @@ +# NVM (Node Version Manager) configuration +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/tools/ + +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" diff --git a/dot_oh-my-zsh/custom/tools/pyenv.zsh b/dot_oh-my-zsh/custom/tools/pyenv.zsh new file mode 100644 index 0000000..0c794b7 --- /dev/null +++ b/dot_oh-my-zsh/custom/tools/pyenv.zsh @@ -0,0 +1,23 @@ +# Pyenv configuration +# Auto-loaded by oh-my-zsh from $ZSH_CUSTOM/tools/ + +export PYENV_ROOT="$HOME/.pyenv" +[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" + +if command -v pyenv >/dev/null 2>&1; then + eval "$(pyenv init - zsh)" +fi + +# Virtualenvwrapper +export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 +export VIRTUALENV_PYTHON=python3 +export WORKON_HOME=$HOME/.virtualenvs + +if [[ -f /usr/local/bin/virtualenvwrapper.sh ]]; then + source /usr/local/bin/virtualenvwrapper.sh +elif [[ -f $HOME/.virtualenvwrapper.sh ]]; then + source $HOME/.virtualenvwrapper.sh +fi + +# Python debugging +export PYTHONBREAKPOINT=ipdb.set_trace diff --git a/dot_tmux.conf.local b/dot_tmux.conf.local index 93729a5..3284ffb 100644 --- a/dot_tmux.conf.local +++ b/dot_tmux.conf.local @@ -1,358 +1,405 @@ -# https://github.com/gpakosz/.tmux -# (‑●‑●)> dual licensed under the WTFPL v2 license and the MIT license, -# without any warranty. -# Copyright 2012— Gregory Pakosz (@gpakosz). +# ~/.tmux.conf.local - Personal tmux configuration +# Oh my tmux! https://github.com/gpakosz/.tmux +# Updated: 2025-01 +# Cross-platform: Linux (Ubuntu) + macOS + +# ============================================================================== +# BINDINGS +# ============================================================================== + +tmux_conf_preserve_stock_bindings=false -# -- navigation ---------------------------------------------------------------- +# ============================================================================== +# SESSION CREATION +# ============================================================================== -# if you're running tmux within iTerm2 -# - and tmux is 1.9 or 1.9a -# - and iTerm2 is configured to let option key act as +Esc -# - and iTerm2 is configured to send [1;9A -> [1;9D for option + arrow keys -# then uncomment the following line to make Meta + arrow keys mapping work -#set -ga terminal-overrides "*:kUP3=\e[1;9A,*:kDN3=\e[1;9B,*:kRIT3=\e[1;9C,*:kLFT3=\e[1;9D" +tmux_conf_new_session_prompt=false +tmux_conf_new_session_retain_current_path=false -# -- windows & pane creation --------------------------------------------------- +# ============================================================================== +# WINDOWS & PANES +# ============================================================================== -# new window retains current path, possible values are: -# - true -# - false (default) tmux_conf_new_window_retain_current_path=false - -# new pane retains current path, possible values are: -# - true (default) -# - false +tmux_conf_new_window_reconnect_ssh=false tmux_conf_new_pane_retain_current_path=true - -# new pane tries to reconnect ssh sessions (experimental), possible values are: -# - true -# - false (default) tmux_conf_new_pane_reconnect_ssh=false -# prompt for session name when creating a new session, possible values are: -# - true -# - false (default) -tmux_conf_new_session_prompt=false + +# ============================================================================== +# DISPLAY +# ============================================================================== + +# Auto-detect 24-bit color support +tmux_conf_24b_colour=auto -# -- display ------------------------------------------------------------------- +# ============================================================================== +# THEME +# ============================================================================== -# RGB 24-bit colour support (tmux >= 2.2), possible values are: -# - true -# - false (default) -tmux_conf_theme_24b_colour=false +tmux_conf_theme=enabled -# window style -tmux_conf_theme_window_fg='default' -tmux_conf_theme_window_bg='default' +# Color palette (dark theme) +tmux_conf_theme_colour_1="#080808" # dark gray +tmux_conf_theme_colour_2="#303030" # gray +tmux_conf_theme_colour_3="#8a8a8a" # light gray +tmux_conf_theme_colour_4="#00afff" # light blue +tmux_conf_theme_colour_5="#ffff00" # yellow +tmux_conf_theme_colour_6="#080808" # dark gray +tmux_conf_theme_colour_7="#e4e4e4" # white +tmux_conf_theme_colour_8="#080808" # dark gray +tmux_conf_theme_colour_9="#ffff00" # yellow +tmux_conf_theme_colour_10="#ff00af" # pink +tmux_conf_theme_colour_11="#5fff00" # green +tmux_conf_theme_colour_12="#8a8a8a" # light gray +tmux_conf_theme_colour_13="#e4e4e4" # white +tmux_conf_theme_colour_14="#080808" # dark gray +tmux_conf_theme_colour_15="#080808" # dark gray +tmux_conf_theme_colour_16="#d70000" # red +tmux_conf_theme_colour_17="#e4e4e4" # white -# highlight focused pane (tmux >= 2.1), possible values are: -# - true -# - false (default) +# Window style +tmux_conf_theme_window_fg="default" +tmux_conf_theme_window_bg="default" + +# Pane settings tmux_conf_theme_highlight_focused_pane=false - -# focused pane colours: -tmux_conf_theme_focused_pane_fg='default' -tmux_conf_theme_focused_pane_bg='#0087d7' # light blue - -# pane border style, possible values are: -# - thin (default) -# - fat +tmux_conf_theme_focused_pane_bg="$tmux_conf_theme_colour_2" tmux_conf_theme_pane_border_style=thin +tmux_conf_theme_pane_border="$tmux_conf_theme_colour_2" +tmux_conf_theme_pane_active_border="$tmux_conf_theme_colour_4" +%if #{>=:#{version},3.2} +tmux_conf_theme_pane_active_border="#{?pane_in_mode,$tmux_conf_theme_colour_9,#{?synchronize-panes,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_4}}" +%endif -# pane borders colours: -tmux_conf_theme_pane_border='#444444' # gray -tmux_conf_theme_pane_active_border='#00afff' # light blue +# Pane indicator colours +tmux_conf_theme_pane_indicator="$tmux_conf_theme_colour_4" +tmux_conf_theme_pane_active_indicator="$tmux_conf_theme_colour_4" -# pane indicator colours -tmux_conf_theme_pane_indicator='#00afff' # light blue -tmux_conf_theme_pane_active_indicator='#00afff' # light blue +# Message/command style +tmux_conf_theme_message_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_message_bg="$tmux_conf_theme_colour_5" +tmux_conf_theme_message_attr="bold" +tmux_conf_theme_message_command_fg="$tmux_conf_theme_colour_5" +tmux_conf_theme_message_command_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_message_command_attr="bold" -# status line style -tmux_conf_theme_message_fg='#000000' # black -tmux_conf_theme_message_bg='#ffff00' # yellow -tmux_conf_theme_message_attr='bold' - -# status line command style ( : Escape) -tmux_conf_theme_message_command_fg='#ffff00' # yellow -tmux_conf_theme_message_command_bg='#000000' # black -tmux_conf_theme_message_command_attr='bold' - -# window modes style -tmux_conf_theme_mode_fg='#000000' # black -tmux_conf_theme_mode_bg='#ffff00' # yellow -tmux_conf_theme_mode_attr='bold' - -# status line style -tmux_conf_theme_status_fg='#8a8a8a' # light gray -tmux_conf_theme_status_bg='#080808' # dark gray -tmux_conf_theme_status_attr='none' - -# terminal title -# - built-in variables are: -# - #{circled_window_index} -# - #{circled_session_name} -# - #{hostname} -# - #{hostname_ssh} -# - #{username} -# - #{username_ssh} -tmux_conf_theme_terminal_title='#h ❐ #S ● #I #W' - -# window status style -# - built-in variables are: -# - #{circled_window_index} -# - #{circled_session_name} -# - #{hostname} -# - #{hostname_ssh} -# - #{username} -# - #{username_ssh} -tmux_conf_theme_window_status_fg='#8a8a8a' # light gray -tmux_conf_theme_window_status_bg='#080808' # dark gray -tmux_conf_theme_window_status_attr='none' -tmux_conf_theme_window_status_format='#I #W' -#tmux_conf_theme_window_status_format='#{circled_window_index} #W' -#tmux_conf_theme_window_status_format='#I #W#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}' - -# window current status style -# - built-in variables are: -# - #{circled_window_index} -# - #{circled_session_name} -# - #{hostname} -# - #{hostname_ssh} -# - #{username} -# - #{username_ssh} -tmux_conf_theme_window_status_current_fg='#000000' # black -tmux_conf_theme_window_status_current_bg='#00afff' # light blue -tmux_conf_theme_window_status_current_attr='bold' -tmux_conf_theme_window_status_current_format='#I #W' -#tmux_conf_theme_window_status_current_format='#{circled_window_index} #W' -#tmux_conf_theme_window_status_current_format='#I #W#{?window_zoomed_flag,🔍,}' - -# window activity status style -tmux_conf_theme_window_status_activity_fg='default' -tmux_conf_theme_window_status_activity_bg='default' -tmux_conf_theme_window_status_activity_attr='underscore' - -# window bell status style -tmux_conf_theme_window_status_bell_fg='#ffff00' # yellow -tmux_conf_theme_window_status_bell_bg='default' -tmux_conf_theme_window_status_bell_attr='blink,bold' - -# window last status style -tmux_conf_theme_window_status_last_fg='#00afff' # light blue -tmux_conf_theme_window_status_last_bg='default' -tmux_conf_theme_window_status_last_attr='none' - -# status left/right sections separators -# tmux_conf_theme_left_separator_main='' -# tmux_conf_theme_left_separator_sub='|' -# tmux_conf_theme_right_separator_main='' -# tmux_conf_theme_right_separator_sub='|' -tmux_conf_theme_left_separator_main='\uE0B0' # /!\ you don't need to install Powerline -tmux_conf_theme_left_separator_sub='\uE0B1' # you only need fonts patched with -tmux_conf_theme_right_separator_main='\uE0B2' # Powerline symbols or the standalone -tmux_conf_theme_right_separator_sub='\uE0B3' # PowerlineSymbols.otf font, see README.md - -# status left/right content: -# - separate main sections with '|' -# - separate subsections with ',' -# - built-in variables are: -# - #{battery_bar} -# - #{battery_hbar} -# - #{battery_percentage} -# - #{battery_status} -# - #{battery_vbar} -# - #{circled_session_name} -# - #{hostname_ssh} -# - #{hostname} -# - #{loadavg} -# - #{pairing} -# - #{prefix} -# - #{root} -# - #{synchronized} -# - #{uptime_y} -# - #{uptime_d} (modulo 365 when #{uptime_y} is used) -# - #{uptime_h} -# - #{uptime_m} -# - #{uptime_s} -# - #{username} -# - #{username_ssh} - -# CPU info -# CPU: #{cpu_icon} #{cpu_percentage} RAM: #{ram_icon} #{ram_percentage} , - -# #(curl wttr.in/Southampton?format=3) , # - for weather -cpu_percentage_format="%3.1f%%" # printf format to use to display percentage -tmux_conf_theme_status_left=' ❐ #S | ↑#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} ' -#tmux_conf_theme_status_right='#{prefix}#{pairing}#{synchronized} #{?battery_status, #{battery_status},}#{?battery_bar, #{battery_bar},}#{?battery_percentage, #{battery_percentage},} , %R , %d %b | #{username}#{root} | #{hostname} ' -tmux_conf_theme_status_right=" IP:#(ip route get 8.8.8.8 | head -1 | cut -d' ' -f7) , \ -DNS:#(echo $(cat /etc/resolv.conf | grep 'nameserver [0-9]' | awk '{print $2}')) , \ -Gateway:#(echo $(route -n | sed -n '3p' | awk '{print $2}')) #{prefix}#{pairing} #[fg=green]#($TMUX_PLUGIN_MANAGER_PATH/tmux-mem-cpu-load/tmux-mem-cpu-load --colors --powerline-right --interval 2) , #{?battery_status, #{battery_status},}#{?battery_bar, #{battery_bar},}#{?battery_percentage, #{battery_percentage},} , %R , %d %b | #{username}#{root} | #{hostname}" +# Mode style +tmux_conf_theme_mode_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_mode_bg="$tmux_conf_theme_colour_5" +tmux_conf_theme_mode_attr="bold" -# status left style -tmux_conf_theme_status_left_fg='#000000,#e4e4e4,#e4e4e4' # black, white , white -tmux_conf_theme_status_left_bg='#ffff00,#ff00af,#00afff' # yellow, pink, white blue -tmux_conf_theme_status_left_attr='bold,none,none' +# ============================================================================== +# STATUS BAR +# ============================================================================== -# status right style -tmux_conf_theme_status_right_fg='#8a8a8a,#e4e4e4,#000000' # light gray, white, black -tmux_conf_theme_status_right_bg='#080808,#d70000,#e4e4e4' # dark gray, red, white -tmux_conf_theme_status_right_attr='none,none,bold' +tmux_conf_theme_status_fg="$tmux_conf_theme_colour_3" +tmux_conf_theme_status_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_status_attr="none" -# pairing indicator -tmux_conf_theme_pairing='👓 ' # U+1F453 -tmux_conf_theme_pairing_fg='none' -tmux_conf_theme_pairing_bg='none' -tmux_conf_theme_pairing_attr='none' +# Terminal title +tmux_conf_theme_terminal_title="#h ❐ #S ● #I #W" -# prefix indicator -tmux_conf_theme_prefix='⌨ ' # U+2328 -tmux_conf_theme_prefix_fg='none' -tmux_conf_theme_prefix_bg='none' -tmux_conf_theme_prefix_attr='none' +# Window status +tmux_conf_theme_window_status_fg="$tmux_conf_theme_colour_3" +tmux_conf_theme_window_status_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_window_status_attr="none" +tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" -# root indicator -tmux_conf_theme_root='!' -tmux_conf_theme_root_fg='none' -tmux_conf_theme_root_bg='none' -tmux_conf_theme_root_attr='bold,blink' +# Current window +tmux_conf_theme_window_status_current_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_window_status_current_bg="$tmux_conf_theme_colour_4" +tmux_conf_theme_window_status_current_attr="bold" +tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" -# synchronized indicator -tmux_conf_theme_synchronized='🔒' # U+1F512 -tmux_conf_theme_synchronized_fg='none' -tmux_conf_theme_synchronized_bg='none' -tmux_conf_theme_synchronized_attr='none' +# Activity/bell/last window +tmux_conf_theme_window_status_activity_fg="default" +tmux_conf_theme_window_status_activity_bg="default" +tmux_conf_theme_window_status_activity_attr="underscore" +tmux_conf_theme_window_status_bell_fg="$tmux_conf_theme_colour_5" +tmux_conf_theme_window_status_bell_bg="default" +tmux_conf_theme_window_status_bell_attr="blink,bold" +tmux_conf_theme_window_status_last_fg="$tmux_conf_theme_colour_4" +tmux_conf_theme_window_status_last_bg="$tmux_conf_theme_colour_2" +tmux_conf_theme_window_status_last_attr="none" -# battery bar symbols -# tmux_conf_battery_bar_symbol_full='◼' -# tmux_conf_battery_bar_symbol_empty='◻' -tmux_conf_battery_bar_symbol_full='♥' -tmux_conf_battery_bar_symbol_empty='·' +# Powerline separators +tmux_conf_theme_left_separator_main='\uE0B0' +tmux_conf_theme_left_separator_sub='\uE0B1' +tmux_conf_theme_right_separator_main='\uE0B2' +tmux_conf_theme_right_separator_sub='\uE0B3' -# battery bar length (in number of symbols), possible values are: -# - auto -# - a number, e.g. 5 -tmux_conf_battery_bar_length='auto' +# Status left: session name + uptime +tmux_conf_theme_status_left=" ❐ #S | ↑#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} " -# battery bar palette, possible values are: -# - gradient (default) -# - heat -# - 'colour_full_fg,colour_empty_fg,colour_bg' -tmux_conf_battery_bar_palette='gradient' -#tmux_conf_battery_bar_palette='#d70000,#e4e4e4,#000000' # red, white, black +# Status right: network info + mem/cpu + battery + time + user@host +# Battery vars use #{?...} conditionals so they're safe on non-laptop systems +tmux_conf_theme_status_right=" #{local_ip}#{gateway} #{prefix}#{mouse}#{pairing}#{synchronized} #{mem_cpu}#{battery_fallback} , %R , %d %b | #{username}#{root} | #{hostname} " -# battery hbar palette, possible values are: -# - gradient (default) -# - heat -# - 'colour_low,colour_half,colour_full' -tmux_conf_battery_hbar_palette='gradient' -#tmux_conf_battery_hbar_palette='#d70000,#ff5f00,#5fff00' # red, orange, green +# Status left colors: yellow, pink, green +tmux_conf_theme_status_left_fg="$tmux_conf_theme_colour_6,$tmux_conf_theme_colour_7,$tmux_conf_theme_colour_8" +tmux_conf_theme_status_left_bg="$tmux_conf_theme_colour_9,$tmux_conf_theme_colour_10,$tmux_conf_theme_colour_11" +tmux_conf_theme_status_left_attr="bold,none,none" -# battery vbar palette, possible values are: -# - gradient (default) -# - heat -# - 'colour_low,colour_half,colour_full' -tmux_conf_battery_vbar_palette='gradient' -#tmux_conf_battery_vbar_palette='#d70000,#ff5f00,#5fff00' # red, orange, green - -# symbols used to indicate whether battery is charging or discharging -# tmux_conf_battery_status_charging='↑' # U+2191 -# tmux_conf_battery_status_discharging='↓' # U+2193 -# tmux_conf_battery_status_charging='⚡ ' # U+26A1 -tmux_conf_battery_status_charging='🔌 ' # U+1F50C # if you can't see this, fonts are not working -tmux_conf_battery_status_discharging='🔋 ' # U+1F50B - -# clock style (when you hit + t) -# you may want to use %I:%M %p in place of %R in tmux_conf_theme_status_right -tmux_conf_theme_clock_colour='#00afff' # light blue -tmux_conf_theme_clock_style='24' +# Status right colors: gray, red, white +tmux_conf_theme_status_right_fg="$tmux_conf_theme_colour_12,$tmux_conf_theme_colour_13,$tmux_conf_theme_colour_14" +tmux_conf_theme_status_right_bg="$tmux_conf_theme_colour_15,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_17" +tmux_conf_theme_status_right_attr="none,none,bold" -# -- clipboard ----------------------------------------------------------------- +# ============================================================================== +# INDICATORS +# ============================================================================== + +tmux_conf_theme_pairing="👓" +tmux_conf_theme_pairing_fg="none" +tmux_conf_theme_pairing_bg="none" +tmux_conf_theme_pairing_attr="none" + +tmux_conf_theme_prefix="⌨" +tmux_conf_theme_prefix_fg="none" +tmux_conf_theme_prefix_bg="none" +tmux_conf_theme_prefix_attr="none" + +tmux_conf_theme_mouse="↗" +tmux_conf_theme_mouse_fg="none" +tmux_conf_theme_mouse_bg="none" +tmux_conf_theme_mouse_attr="none" + +tmux_conf_theme_root="!" +tmux_conf_theme_root_fg="none" +tmux_conf_theme_root_bg="none" +tmux_conf_theme_root_attr="bold,blink" + +tmux_conf_theme_synchronized="🔒" +tmux_conf_theme_synchronized_fg="none" +tmux_conf_theme_synchronized_bg="none" +tmux_conf_theme_synchronized_attr="none" + + +# ============================================================================== +# BATTERY +# ============================================================================== + +tmux_conf_battery_bar_symbol_full="♥" +tmux_conf_battery_bar_symbol_empty="·" +tmux_conf_battery_bar_length="auto" +tmux_conf_battery_bar_palette="gradient" +tmux_conf_battery_hbar_palette="gradient" +tmux_conf_battery_vbar_palette="gradient" +tmux_conf_battery_status_charging="🔌" +tmux_conf_battery_status_discharging="🔋" + + +# ============================================================================== +# CLOCK +# ============================================================================== + +tmux_conf_theme_clock_colour="$tmux_conf_theme_colour_4" +tmux_conf_theme_clock_style="24" + + +# ============================================================================== +# CLIPBOARD +# ============================================================================== -# in copy mode, copying selection also copies to the OS clipboard -# - true -# - false (default) -# on macOS, this requires installing reattach-to-user-namespace, see README.md -# on Linux, this requires xsel or xclip tmux_conf_copy_to_os_clipboard=false -# -- user customizations ------------------------------------------------------- -# this is the place to override or undo settings +# ============================================================================== +# URLSCAN +# ============================================================================== -# increase history size -#set -g history-limit 10000 +tmux_conf_urlscan_options="--compact --dedupe" -# start with mouse mode enabled -#set -g mouse on -# force Vi mode -# really you should export VISUAL or EDITOR environment variable, see manual +# ============================================================================== +# USER CUSTOMIZATIONS (keybindings, settings) +# ============================================================================== + +# Vi mode set -g status-keys vi set -g mode-keys vi -# replace C-b by C-a instead of using both prefixes +# Prefix key: Alt-x (instead of C-b) set -gu prefix2 unbind C-a -# unbind C-b -# set -g prefix C-a -# bind C-a send-prefix set -g prefix M-x bind M-x send-prefix -# move status line to top -#set -g status-position top +# Mouse support +set -g mouse on -bind \\ split-window -h -c "#{pane_current_path}" # Split panes horizontal -bind - split-window -v -c "#{pane_current_path}" # Split panes vertical +# Mouse scroll support +bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'" -# Use Alt-vim keys without prefix key to switch panes +# Split panes with | and - +bind \\ split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" + +# Vim-style pane navigation (Alt + hjkl) bind -n M-h select-pane -L bind -n M-j select-pane -D bind -n M-k select-pane -U bind -n M-l select-pane -R -# Use Alt-arrow keys without prefix key to switch panes + +# Arrow key pane navigation (Alt + arrows) bind -n M-Left select-pane -L bind -n M-Right select-pane -R bind -n M-Up select-pane -U bind -n M-Down select-pane -D -set -g mouse on -# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967 -bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'" + +# Pane resizing (prefix + hjkl) bind j resize-pane -D 5 bind k resize-pane -U 5 bind l resize-pane -R 5 bind h resize-pane -L 5 -# Copy to system clipboard using xlip -bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard' -bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard' +# Copy to system clipboard - cross-platform (Linux: xclip/xsel, macOS: pbcopy) +# Uses a helper script approach for portability +bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "sh -c 'if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v xclip >/dev/null 2>&1; then xclip -in -selection clipboard; elif command -v xsel >/dev/null 2>&1; then xsel --clipboard --input; else cat > /dev/null; fi'" +bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "sh -c 'if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v xclip >/dev/null 2>&1; then xclip -in -selection clipboard; elif command -v xsel >/dev/null 2>&1; then xsel --clipboard --input; else cat > /dev/null; fi'" +# Toggle synchronize-panes bind-key s set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}" -set-option -g default-shell /bin/zsh +# Default shell - use zsh if available, otherwise fall back to default +if-shell "command -v zsh >/dev/null 2>&1" "set-option -g default-shell /bin/zsh" +# Aggressive resize set-window-option -g aggressive-resize -# Putting this in .tmux.conf.local does not work :/ 3.0a -# Custom added - MUST be in the end -# List of plugins -set -g @plugin 'tmux-plugins/tpm' -set -g @plugin 'tmux-plugins/tmux-sensible' +# ============================================================================== +# TPM PLUGINS +# ============================================================================== + +# Plugin auto-update on launch/reload +tmux_conf_update_plugins_on_launch=true +tmux_conf_update_plugins_on_reload=true +tmux_conf_uninstall_plugins_on_reload=true + +# Plugins (installed/updated automatically) set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @resurrect-processes 'vi vim nvim man less more tail top htop' set -g @plugin 'tmux-plugins/tmux-continuum' - -#set -g @continuum-restore 'on' set -g @continuum-restore 'off' set -g @plugin 'thewtex/tmux-mem-cpu-load' -# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf) -run -b '~/.tmux/plugins/tpm/tpm' + +# ============================================================================== +# ============================================================================== +# CUSTOM VARIABLES (cross-platform) +# ============================================================================== + +# /!\ do not remove the following line +# EOF + +# /!\ do not "uncomment" the functions: the leading "# " characters are needed + +# usage: #{local_ip} +# Cross-platform: Linux (ip/hostname) and macOS (ipconfig/route) +local_ip() { + # Try Linux first (ip command) + if command -v ip >/dev/null 2>&1; then + result=$(ip route get 8.8.8.8 2>/dev/null | grep -oP 'src \K[0-9.]+' | head -1) + [ -n "$result" ] && printf 'IP:%s' "$result" && return + fi + # macOS fallback (route + ifconfig) + if [ "$(uname)" = "Darwin" ]; then + iface=$(route get 8.8.8.8 2>/dev/null | awk '/interface:/ {print $2}') + if [ -n "$iface" ]; then + result=$(ipconfig getifaddr "$iface" 2>/dev/null) + [ -n "$result" ] && printf 'IP:%s' "$result" && return + fi + fi + # Final fallback: hostname -I (Linux) + result=$(hostname -I 2>/dev/null | awk '{print $1}') + [ -n "$result" ] && printf 'IP:%s' "$result" && return + # No IP found + printf 'IP:offline' +} + +# usage: #{gateway} +# Cross-platform: Linux and macOS +gateway() { + # Try Linux first (ip command) + if command -v ip >/dev/null 2>&1; then + gw=$(ip route 2>/dev/null | awk '/default/ {print $3; exit}') + [ -n "$gw" ] && printf ' GW:%s' "$gw" && return + fi + # macOS fallback + if [ "$(uname)" = "Darwin" ]; then + gw=$(route -n get default 2>/dev/null | awk '/gateway:/ {print $2}') + [ -n "$gw" ] && printf ' GW:%s' "$gw" && return + fi + # No gateway - common on VPN or special network configs, don't show error + printf '' +} + +# usage: #{mem_cpu} +# Shows memory/CPU if tmux-mem-cpu-load plugin is installed +mem_cpu() { + # Check common installation paths + for path in \ + "${TMUX_PLUGIN_MANAGER_PATH:-$HOME/.tmux/plugins}/tmux-mem-cpu-load/tmux-mem-cpu-load" \ + "$HOME/.tmux/plugins/tmux-mem-cpu-load/tmux-mem-cpu-load" \ + "/usr/local/bin/tmux-mem-cpu-load" \ + "/usr/bin/tmux-mem-cpu-load" + do + if [ -x "$path" ]; then + "$path" --colors --powerline-right --interval 2 2>/dev/null + return + fi + done + # Plugin not installed - show basic load average as fallback + if [ -f /proc/loadavg ]; then + load=$(cut -d' ' -f1-3 /proc/loadavg 2>/dev/null) + [ -n "$load" ] && printf 'Load:%s' "$load" && return + fi + # macOS fallback + if [ "$(uname)" = "Darwin" ]; then + load=$(sysctl -n vm.loadavg 2>/dev/null | awk '{print $2, $3, $4}') + [ -n "$load" ] && printf 'Load:%s' "$load" && return + fi + printf '' +} + +# usage: #{battery_fallback} +# Shows battery status or nothing on desktops/servers +battery_fallback() { + # Linux: check /sys/class/power_supply + if [ -d /sys/class/power_supply/BAT0 ]; then + cap=$(cat /sys/class/power_supply/BAT0/capacity 2>/dev/null) + status=$(cat /sys/class/power_supply/BAT0/status 2>/dev/null) + if [ -n "$cap" ]; then + icon="🔋" + [ "$status" = "Charging" ] && icon="🔌" + printf '%s%s%%' "$icon" "$cap" + return + fi + fi + # macOS: use pmset + if [ "$(uname)" = "Darwin" ]; then + battery=$(pmset -g batt 2>/dev/null | grep -o '[0-9]*%' | head -1) + if [ -n "$battery" ]; then + charging=$(pmset -g batt 2>/dev/null | grep -q 'AC Power' && echo 1) + icon="🔋" + [ -n "$charging" ] && icon="🔌" + printf '%s%s' "$icon" "$battery" + return + fi + fi + # No battery (desktop/server) - show nothing + printf '' +} + +"$@" +# /!\ do not remove the previous line +# do not write below this line diff --git a/dot_zshenv b/dot_zshenv index b19aea4..8d3685e 100644 --- a/dot_zshenv +++ b/dot_zshenv @@ -1,20 +1,13 @@ -# export PYENV_ROOT="$HOME/.pyenv" -# export PATH="$PYENV_ROOT/bin:$PATH" -# eval "$(pyenv init -)" +# ~/.zshenv - Environment variables for ALL shells (including non-interactive) +# This file is sourced first, before .zshrc +# Only put truly global environment variables here -#export PATH="/home/viktor/.pyenv/bin:$PATH" -#eval "$(pyenv init -)" -#eval "$(pyenv virtualenv-init -)" +# Editor +export EDITOR='vim' +# Locale (uncomment if needed) +# export LANG=en_US.UTF-8 +# export LC_ALL=en_US.UTF-8 -export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 -export VIRTUALENV_PYTHON=python3 -export WORKON_HOME=$HOME/.virtualenvs -# export VIRTUALENV_PYTHON=python - -if [ -f $HOME/.virtualenvwrapper.sh ]; then - source $HOME/.virtualenvwrapper.sh -fi -export DRONE_SERVER=https://drone.viktorbarzin.me +# Cargo/Rust . "$HOME/.cargo/env" -export VAULT_ADDR="https://vault.viktorbarzin.me" diff --git a/dot_zshrc b/dot_zshrc index db59cd5..f806e5c 100644 --- a/dot_zshrc +++ b/dot_zshrc @@ -1,133 +1,61 @@ -#zmodload zsh/zprof -#[[ $TERM != "screen" ]] && exec tmux -# If you come from bash you might have to change your $PATH. -# export PATH=$HOME/bin:/usr/local/bin:$PATH +# ~/.zshrc - Zsh configuration for interactive shells +# Customizations are in ~/.oh-my-zsh/custom/*.zsh (auto-loaded) -include () { - [[ -f "$1" ]] && source "$1" -} -# Path to your oh-my-zsh installation. -export ZSH=~/.oh-my-zsh -# unset LD_PRELOAD +# ============================================================================ +# Oh-My-Zsh Configuration (BEFORE sourcing oh-my-zsh.sh) +# ============================================================================ -# Set name of the theme to load. Optionally, if you set this to "random" -# it'll load a random theme each time that oh-my-zsh is loaded. -# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes -ZSH_THEME="bira" -# ZSH_THEME="adben" +# Path to oh-my-zsh installation +export ZSH="$HOME/.oh-my-zsh" -# Uncomment the following line to use case-sensitive completion. -# CASE_SENSITIVE="true" -# +# Theme - see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes +ZSH_THEME="bira-time" + +# Case-insensitive completion (a-z matches A-Z) zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' -HISTSIZE=9000 -HISTFILESIZE=9000 -#HISTFILE="~/.bash_history" - -# Uncomment the following line to use hyphen-insensitive completion. Case -# sensitive completion must be off. _ and - will be interchangeable. +# Hyphen-insensitive completion (_ and - are interchangeable) HYPHEN_INSENSITIVE="true" -# Uncomment the following line to disable bi-weekly auto-update checks. -DISABLE_AUTO_UPDATE="true" +# Disable automatic updates (update manually with: omz update) +zstyle ':omz:update' mode disabled -# Uncomment the following line to change how often to auto-update (in days). -# export UPDATE_ZSH_DAYS=13 - -# Uncomment the following line to disable colors in ls. -# DISABLE_LS_COLORS="true" - -# Uncomment the following line to disable auto-setting terminal title. -# DISABLE_AUTO_TITLE="true" - -# Uncomment the following line to enable command auto-correction. -# ENABLE_CORRECTION="true" - -# Uncomment the following line to display red dots whilst waiting for completion. +# Show red dots while waiting for completion COMPLETION_WAITING_DOTS="true" -# Uncomment the following line if you want to disable marking untracked files -# under VCS as dirty. This makes repository status check for large repositories -# much, much faster. +# Don't mark untracked files as dirty (faster for large repos) DISABLE_UNTRACKED_FILES_DIRTY="true" -# Uncomment the following line if you want to change the command execution time -# stamp shown in the history command output. -# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# History timestamp format HIST_STAMPS="dd.mm.yyyy" -# Would you like to use another custom folder than $ZSH/custom? -# ZSH_CUSTOM=/path/to/new-custom-folder +# History settings +HISTSIZE=10000 +SAVEHIST=10000 -# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) -# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ -# Example format: plugins=(rails git textmate ruby lighthouse) -# Add wisely, as too many plugins slow down shell startup. -plugins=(encode64 gitignore zsh-z) +# Plugins - loaded from $ZSH/plugins/ and $ZSH_CUSTOM/plugins/ +# Keep this list minimal for fast startup +plugins=( + git + encode64 + gitignore + z +) +# ============================================================================ +# Load Oh-My-Zsh +# ============================================================================ source $ZSH/oh-my-zsh.sh -# Update PROMPT to include current time -local time='%{$terminfo[bold]$fg[red]%}%*%{$reset_color%}' -PROMPT="╭─${user_host}${time}${current_dir}${rvm_ruby}${git_branch}${venv_prompt} -╰─%B${user_symbol}%b " -# tmux source-file /home/viktor/.tmux.conf -# User configuration +# ============================================================================ +# Post-OMZ Settings +# ============================================================================ -# export MANPATH="/usr/local/man:$MANPATH" +# Enable extended glob patterns +setopt extendedglob -# You may need to manually set your language environment -# export LANG=en_US.UTF-8 - -# Preferred editor for local and remote sessions -if [[ -n $SSH_CONNECTION ]]; then - export EDITOR='vim' -else - # export EDITOR='mvim' - export EDITOR='vim' -fi - -# Compilation flags -# export ARCHFLAGS="-arch x86_64" - -# ssh -# export SSH_KEY_PATH="~/.ssh/rsa_id" - -# Set personal aliases, overriding those provided by oh-my-zsh libs, -# plugins, and themes. Aliases can be placed here, though oh-my-zsh -# users are encouraged to define aliases within the ZSH_CUSTOM folder. -# For a full list of active aliases, run `alias`. -# -# Example aliases -# alias zshconfig="mate ~/.zshrc" -# alias ohmyzsh="mate ~/.oh-my-zsh" -#eval "$(jump shell)" - -# Load aliases -. ~/.bash_aliases - -# . ~/.bash_completion - -# Locale settings for perl -#export LC_CTYPE=en_US.UTF-8 -#export LC_ALL=C -#export LC_ALL=en_US.UTF-8 - -# Defined in ~/.zshenv -PYENV_ROOT="$HOME/.pyenv" -[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" -eval "$(pyenv init - bash)" - -#export PYENV_VIRTUALENVWRAPPER_PREFER_PYVENV="true" -#export WORKON_HOME=$HOME/.virtualenvs -#pyenv virtualenvwrapper_lazy - -include /usr/local/bin/virtualenvwrapper.sh -# eval ssh-agent > /dev/null -# VIRTUALENVWRAPPER_PYTHON=python3 -export PYTHONBREAKPOINT=ipdb.set_trace -include ~/.zshenv +# Disable command_not_found handler (can be slow) +unset command_not_found_handle # Color man pages export LESS_TERMCAP_mb=$'\e[1;32m' @@ -138,51 +66,13 @@ export LESS_TERMCAP_so=$'\e[01;33m' export LESS_TERMCAP_ue=$'\e[0m' export LESS_TERMCAP_us=$'\e[1;4;31m' -# Enable extended glob -setopt extendedglob - -# Enable Ctrl-x-e to edit command line -autoload -U edit-command-line -# Emacs style -zle -N edit-command-line -bindkey '^xe' edit-command-line -bindkey '^x^e' edit-command-line -# Vi style: -# zle -N edit-command-line -# bindkey -M vicmd v edit-command-line - -# add GO to path -export PATH="/home/wizard/go/bin:$PATH" -export PATH="/home/wizard/.local/bin:$PATH" -#export GO111MODULE=on -export GOPATH="/home/$USER/go" - -# add JDK 12 go path -export PATH="/opt/jdk-12.0.1/bin:$PATH" - -# add azure core tools to path -# export PATH="/opt/azure/:$PATH" - -unset command_not_found_handle - -# Load nvm -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"# This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"# This loads nvm bash_completion - -export PATH="/home/viktor/.local/bin:$PATH" - -# Load Z to jump around recent dirs -#. ~/z.sh - -fpath+=~/.zfunc -autoload -Uz compinit && compinit - -# add k8s autocompletion, must be after compinit! -if which kubectl >/dev/null 2>/dev/null; then - source <(kubectl completion zsh) -fi -include /etc/profile.d/golang_path.sh - -# krew path -export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH" +# ============================================================================ +# Files in ~/.oh-my-zsh/custom/ are auto-loaded: +# - aliases.zsh : All aliases +# - functions.zsh : All functions +# - path.zsh : PATH modifications +# - prompt.zsh : Custom prompt +# - keybindings.zsh : Key bindings +# - secrets.zsh : API tokens (gitignored) +# - tools/*.zsh : Tool-specific configs (pyenv, nvm, kubectl) +# ============================================================================