diff options
| author | srdusr <trevorgray@srdusr.com> | 2025-09-24 00:51:52 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2025-09-24 00:51:52 +0200 |
| commit | 88370cd83f13c30d68119cbe3b229a1ab559cf55 (patch) | |
| tree | 59697e6b3a229726ed1ee876b00d889ff7d0c38a /linux/home/.config/zsh | |
| parent | a70909b2057bf8d5923241d53e8ef3daef328458 (diff) | |
| download | dotfiles-88370cd83f13c30d68119cbe3b229a1ab559cf55.tar.gz dotfiles-88370cd83f13c30d68119cbe3b229a1ab559cf55.zip | |
Zsh config changes
Diffstat (limited to 'linux/home/.config/zsh')
| -rw-r--r-- | linux/home/.config/zsh/.zshenv | 348 | ||||
| -rw-r--r-- | linux/home/.config/zsh/.zshrc | 114 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/aliases.zsh | 303 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/bindings.zsh | 160 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/completion.zsh | 176 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/functions.zsh | 2426 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/options.zsh | 105 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/prompt.zsh | 678 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/prompt_minimal.zsh | 295 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/prompt_new.zsh | 863 | ||||
| -rw-r--r-- | linux/home/.config/zsh/user/prompt_simple.zsh | 227 |
11 files changed, 0 insertions, 5695 deletions
diff --git a/linux/home/.config/zsh/.zshenv b/linux/home/.config/zsh/.zshenv deleted file mode 100644 index 1d6eee9..0000000 --- a/linux/home/.config/zsh/.zshenv +++ /dev/null @@ -1,348 +0,0 @@ -# Load local/system wide binaries and scripts -export PATH=$HOME/.bin:$HOME/.local/bin:$HOME/.scripts:$HOME/.scripts/test:/usr/local/bin:/sbin:/usr/sbin:$PATH -export PATH="/data/data/com.termux/files/usr/local/bin:$PATH" - -if [ -d "$HOME/.scripts" ]; then - for d in "$HOME/.scripts"/*; do - [ -d "$d" ] && PATH="$PATH:$d" - done -fi - -#export PATH - -export TERM=xterm-256color -# Skip the not really helpful global compinit -skip_global_compinit=1 - -#export WINEARCH=win64 #<or win32> -#export WINEPREFIX=~/.wine -#export PATH=$PATH:/usr/bin/wine -#winetricks vcrun2019 -### Conditionally set WM(window manager) -#available_wms=("bspwm" "mutter" "i3") -#for wm in "${available_wms[@]}"; do -# if command -v "$wm" &> /dev/null; then -# export WM="$wm" -# break -# fi -#done - -## Set a flag to indicate if the display server type is found -#display_server_found=0 -# -## Conditionally set Display server -#available_displays=("wayland" "x11") -#for display in "${available_displays[@]}"; do -# if [ "$WAYLAND_DISPLAY" = "$display" ]; then -# export XDG_SESSION_TYPE="$display" -# display_server_found=1 -# break -# fi -#done -# -## Check if XDG_SESSION_TYPE is "x11" and set X11-specific variables -#if [ "$display_server_found" -eq 1 ] && [ "$XDG_SESSION_TYPE" == "x11" ]; then -# # X11-specific variables -# export XINITRC="$HOME/.config/X11/.xinitrc" -# export XSERVERRC="$XDG_CONFIG_HOME/X11/xserverrc" -# export USERXSESSION="$XDG_CONFIG_HOME/X11/xsession" -# export USERXSESSIONRC="$XDG_CONFIG_HOME/X11/xsessionrc" -# export ALTUSERXSESSION="$XDG_CONFIG_HOME/X11/Xsession" -# export ERRFILE="$XDG_CONFIG_HOME/X11/xsession-errors" -# export ICEAUTHORITY="$XDG_CACHE_HOME/.ICEauthority" -#fi - -# Conditionally set default term -available_terms=("wezterm" "alacritty" "xterm") -for term in "${available_terms[@]}"; do - if command -v "$term" &> /dev/null; then - export TERMINAL="$term" - break - fi -done - -# Default Programs: -export EDITOR=$(command -v nvim || echo "vim") -#if command -v nvim &> /dev/null; then -# export EDITOR=nvim -#else -# export EDITOR=vim -#fi -export VISUAL=$EDITOR -export GIT_EDITOR="$EDITOR" -export COLORTERM="truecolor" -export TERM="xterm-256color" -export READER="zathura" -export BROWSER="firefox" -export OPENER="xdg-open" -#export MANPAGER="$EDITOR +Man!" -#if [ "$EDITOR" = "nvim" ]; then -if command -v nvim &> /dev/null; then - #export MANPAGER="sh -c 'col -b | nvim -c \"set ft=man ts=8 nomod nolist nonu noma\" -c \"autocmd VimEnter * call feedkeys(\\\"q\\\")\" -'" - export MANPAGER="sh -c 'col -b | nvim -c \"set ft=man ts=8 nomod nolist nonu noma\" -c \"autocmd VimEnter * call feedkeys(\\\"\\<CR>q\\\")\" -'" - #export MANPAGER="$nvim --clean -n -i NONE -u NORC -c 'colorscheme desert' -c 'highlight Normal ctermbg=NONE guibg=NONE' +Man\!" -else - export MANPAGER="bat" - #export MANPAGER="less -R --use-color -Dd+r -Du+b" - #export MANPAGER="sh -c 'col -bx | bat -l man -p --pager \"less -R\"'" -fi -export MANROFFOPT="-c" -export PAGER="less" -export SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass -export FAQ_STYLE='github' -export VIDEO="mpv" -export IMAGE="phototonic" - -# XDG Paths: -export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} -export XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} -export XDG_CACHE_HOME=${XDG_CACHE_HOME:-$HOME/.cache} -export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/inputrc" -export ZDOTDIR="$XDG_CONFIG_HOME/zsh" -export HISTFILE="$ZDOTDIR/.zhistory" # History filepath -export HISTSIZE=1000000 # Maximum events for internal history -export SAVEHIST=1000000 # Maximum events in history file -export BANG_HIST # Treat the '!' character specially during expansion. -export EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format. -export INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. -export SHARE_HISTORY # Share history between all sessions. -export HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history. -export HIST_IGNORE_DUPS # Don't record an entry that was just recorded again. -export HIST_IGNORE_ALL_DUPS # Delete old recorded entry if new entry is a duplicate. -export HIST_FIND_NO_DUPS # Do not display a line previously found. -export HIST_IGNORE_SPACE # Don't record an entry starting with a space. -export HIST_SAVE_NO_DUPS # Don't write duplicate entries in the history file. -export HIST_REDUCE_BLANKS # Remove superfluous blanks before recording entry. -export HIST_VERIFY # Don't execute immediately upon history expansion. -export HIST_BEEP # Beep when accessing nonexistent history. -export INC_APPEND_HISTORY - -# Customize `ls` colours -export LSCOLORS=ExGxBxDxCxEgEdxbxgxcxd - -# Other XDG paths: -export RIPGREP_CONFIG_PATH="$XDG_CONFIG_HOME/ripgrep/ripgreprc" -export DOCKER_CONFIG="$XDG_CONFIG_HOME/docker" -export VSCODE_PORTABLE="$XDG_DATA_HOME/vscode" -export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc" -export PATH="/usr/bin/cmake:$PATH" -export PATH=$PATH:/opt/google/chrome -export DISCORD_USER_DATA_DIR="$XDG_DATA_HOME" -export LYNX_CFG="$XDG_CONFIG_HOME/.lynxrc" - -# Manage Arch linux build sources -export ASPROOT="${XDG_CACHE_HOME:-$HOME/.cache}/asp" - -# Homebrew -#export PATH=/opt/homebrew/bin:$PATH -export PATH="/opt/homebrew/sbin:$PATH" - -# Nix-profile -export PATH=$HOME/.nix-profile/bin:$PATH - -# GnuPG -export GPG_TTY=$(tty) -#export GNUPGHOME="$XDG_CONFIG_HOME/gnupg" - -# Nvim -export NVIM_TUI_ENABLE_TRUE_COLOR=1 - -# Fzf -export FZF_DEFAULT_COMMAND="rg --files --hidden --glob '!{node_modules/*,.git/*}'" -export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" -export FZF_DEFAULT_OPTS='-m --height 50% --border' - - -# enable git scripts -export DEVELOPMENT_DIRECTORY="$HOME/code" - -# Android Home -export ANDROID_HOME=/opt/android-sdk -export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH -#export PATH=$ANDROID_HOME/cmdline-tools/bin:$PATH -export PATH=$ANDROID_HOME/tools:$PATH -export PATH=$ANDROID_HOME/tools/bin:$PATH -export PATH=$ANDROID_HOME/platform-tools:$PATH -# Android emulator PATH -export PATH=$ANDROID_HOME/emulator:$PATH -# Android SDK ROOT PATH -export ANDROID_SDK_ROOT=/opt/android-sdk -export PATH=$ANDROID_SDK_ROOT:$PATH -#export ANDROID_SDK_HOME="${XDG_CONFIG_HOME:-$HOME/.config}/android" - -# Programming Environment Variables: - -# Rust -export RUSTUP_HOME=${XDG_DATA_HOME:-$HOME/.local/share}/rustup -export CARGO_HOME=${XDG_DATA_HOME:-$HOME/.local/share}/cargo -export PATH="${CARGO_HOME}/bin:${RUSTUP_HOME}/bin:$PATH" -#export PATH="$PATH:$CARGO_HOME/bin" -#[[ -d $CARGO_HOME/bin ]] && path=($CARGO_HOME/bin $path) -if which rustc > /dev/null; then export RUST_BACKTRACE=1; fi -#export PATH="$HOME/.cargo/bin:$PATH" -#export CARGO_HOME=${XDG_DATA_HOME}/cargo -#export RUSTUP_HOME=${XDG_DATA_HOME}/rustup - - -# Dotnet -# # Currently dotnet does not support XDG ( https://github.com/dotnet/sdk/issues/10390 ) -#export DOTNET_TOOLS_DIR="$HOME/.dotnet/tools" -export DOTNET_HOME=${XDG_DATA_HOME:-$HOME/.local/share}/dotnet -export DOTNET_CLI_HOME="$XDG_CONFIG_HOME/dotnet" -#mkdir -p "$DOTNET_CLI_HOME"; -export PATH="$PATH":"$DOTNET_HOME"/tools -export DOTNET_ROOT=/opt/dotnet -# Disable telemetry for dotnet apps -export DOTNET_CLI_TELEMETRY_OPTOUT=1 - - -# Java -#export JAVA_HOME=/usr/lib/jvm/default-java -#export JAVA_HOME='/usr/lib/jvm/java-8-openjdk' -#export JAVA_HOME='/usr/lib/jvm/java-10-openjdk' -#export JAVA_HOME='/usr/lib/jvm/java-11-openjdk' -#export JAVA_HOME='/usr/lib/jvm/java-17-openjdk' -export JAVA_HOME='/usr/lib/jvm/java-20-openjdk' -#export PATH=$JAVA_HOME/bin:$PATH -export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java -#export DEFAULT_JVM_OPTS='"-Dcom.android.sdklib.toolsdir=$APP_HOME" -XX:+IgnoreUnrecognizedVMOptions' -#export _JAVA_AWT_WM_NONREPARENTING=1 -#export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee' -#export JAVA_OPTS='-XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind' -#Windows: -#set JAVA_OPTS=-XX:+IgnoreUnrecognizedVMOptions --add-modules java.se.ee - - -# Dart/Flutter -export PATH="/opt/flutter/bin:/usr/lib/dart/bin:$PATH" - - -# Go -export GO_PATH=${XDG_DATA_HOME}/go -export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go" - - -# Javascript -# NVM -export NVM_DIR="$HOME/.config/nvm" -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" -#[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm - -# global node installs (gross) -[[ -d "$XDG_DATA_HOME/node/bin" ]] && path=($XDG_DATA_HOME/node/bin $path) -export NODE_REPL_HISTORY="$XDG_DATA_HOME"/node_repl_history -export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc -#export NPM_CONFIG_INIT_AUTHOR_NAME='srdusr' -#export NPM_CONFIG_INIT_AUTHOR_EMAIL='trevorgray@srdusr.com' -#export NPM_CONFIG_INIT_AUTHOR_URL='https://srdusr.com' -#export NPM_CONFIG_INIT_LICENSE='GPL-3.0' -#export NPM_CONFIG_INIT_VERSION='0.0.0' -#export NPM_CONFIG_SIGN_GIT_TAG='true' - -# Yarn -#if command -v yarn >/dev/null 2>&1; then -# export PATH="$PATH:`yarn global bin`" -#fi -#export PATH="$(yarn global bin):$PATH" -#YARN_PATH="$HOME/.yarn/bin" -#YARN_BIN_EXPORT="$HOME/.config/yarn/global/node_modules/.bin" - -# Ruby -export GEM_PATH="$XDG_DATA_HOME/ruby/gems" -export GEM_SPEC_CACHE="$XDG_DATA_HOME/ruby/specs" -export GEM_HOME="$XDG_DATA_HOME/ruby/gems" -#if [[ -d ~/.gem/ruby ]]; then -# ver=$(find ~/.gem/ruby/* -maxdepth 0 | sort -rV | head -n 1) -# export PATH="$PATH:${ver}/bin" -#fi - - -# Python -# lazy load pyenv -#export PYENV_ROOT=${PYENV_ROOT:-$HOME/.pyenv} -#[[ -a $PYENV_ROOT/bin/pyenv ]] && path=($PYENV_ROOT/bin $path) -#if type pyenv &> /dev/null || [[ -a $PYENV_ROOT/bin/pyenv ]]; then -# function pyenv() { -# unset pyenv -# path=($PYENV_ROOT/shims $path) -# eval "$(command pyenv init -)" -# if which pyenv-virtualenv-init > /dev/null; then -# eval "$(pyenv virtualenv-init -)" -# export PYENV_VIRTUALENV_DISABLE_PROMPT=1 -# fi -# pyenv $@ -# } -#fi -#export WORKON_HOME="$XDG_DATA_HOME/virtualenvs" -export WORKON_HOME=$HOME/.virtualenvs -export VIRTUALENVWRAPPER_PYTHON=`which python3` -export VIRTUALENVWRAPPER_VIRTUALENV=`which virtualenv` -#source /usr/local/bin/virtualenvwrapper.sh -source $(which virtualenvwrapper.sh) -export VIRTUAL_ENV_DISABLE_PROMPT=false -export JUPYTER_CONFIG_DIR="$XDG_CONFIG_HOME/jupyter" -export IPYTHONDIR="$XDG_CONFIG_HOME/jupyter" - -# Python -[[ "$(uname)" == "Darwin" ]] && export PYTHON_CONFIGURE_OPTS="--enable-framework" -[[ "$(uname)" == "Linux" ]] && export PYTHON_CONFIGURE_OPTS="--enable-shared" - -export PYENV_ROOT="$HOME/.pyenv" -export PATH="$PYENV_ROOT/bin:$PATH" - -# PHP -PATH="$HOME/.config/composer/vendor/bin:$PATH" - - -# Lua -export PATH=$PATH:/usr/local/luarocks/bin -#export PATH="$XDG_DATA_HOME/luarocks/bin:$PATH" - -#ver=$(find lua* -maxdepth 0 | sort -rV | head -n 1) -#export LUA_PATH="$LUA_PATH:${ver}/share/lua/5.1/?.lua;${ver}/share/lua/5.1/?/init.lua;;" -#export LUA_CPATH="$LUA_CPATH:${ver}/lib/lua/5.1/?.so;;" - -#LUAROCKS_PREFIX=/usr/local -#export LUA_PATH="$LUAROCKS_PREFIX/share/lua/5.1/?.lua;$LUAROCKS_PREFIX/share/lua/5.1/?/init.lua;;" -#export LUA_CPATH="$LUAROCKS_PREFIX/lib/lua/5.1/?.so;;" - -#export LUA_PATH="<path-to-add>;;" -#export LUA_CPATH="./?.so;/usr/local/lib/lua/5.3/?.so; -# /usr/local/share/lua/5.3/?.so;<path-to-add>" - - -# Program settings -#export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. -# Pixel-perfect Firefox touchpad scrolling -export MOZ_USE_XINPUT2=1 - - -# Scaling -#export QT_AUTO_SCREEN_SCALE_FACTOR=0 -#export QT_SCALE_FACTOR=1 -#export QT_SCREEN_SCALE_FACTORS="1;1;1" -#export GDK_SCALE=1 -#export GDK_DPI_SCALE=1 - - -#typeset -U PATH path -export GTK_IM_MODULE='fcitx' -export QT_IM_MODULE='fcitx' -export SDL_IM_MODULE='fcitx' -export XMODIFIERS='@im=fcitx' - - -# Start blinking -export LESS_TERMCAP_mb=$(tput bold; tput setaf 2) # green -# Start bold -export LESS_TERMCAP_md=$(tput bold; tput setaf 2) # green -# Start stand out -export LESS_TERMCAP_so=$(tput bold; tput setaf 3) # yellow -# End standout -export LESS_TERMCAP_se=$(tput rmso; tput sgr0) -# Start underline -export LESS_TERMCAP_us=$(tput smul; tput bold; tput setaf 1) # red -# End Underline -export LESS_TERMCAP_ue=$(tput sgr0) -# End bold, blinking, standout, underline -export LESS_TERMCAP_me=$(tput sgr0). diff --git a/linux/home/.config/zsh/.zshrc b/linux/home/.config/zsh/.zshrc deleted file mode 100644 index 480f6f5..0000000 --- a/linux/home/.config/zsh/.zshrc +++ /dev/null @@ -1,114 +0,0 @@ -# ███████╗███████╗██╗ ██╗██████╗ ██████╗ -# ╚══███╔╝██╔════╝██║ ██║██╔══██╗██╔════╝ -# ███╔╝ ███████╗███████║██████╔╝██║ -# ███╔╝ ╚════██║██╔══██║██╔══██╗██║ -# ███████╗███████║██║ ██║██║ ██║╚██████╗ -# ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ - -# Profile zsh time -#zmodload zsh/zprof - - - -# If not running interactively, don't do anything -#[[ $- != *i* ]] && return -# If not running interactively, and not being sourced, don’t do anything -[[ $- != *i* ]] && [[ "${BASH_SOURCE[0]:-${(%):-%N}}" == "$0" ]] && return - -# Terminal key bindings -#stty intr '^q' # Free Ctrl+C for copy use Ctrl+Q instead for Interrupt -stty lnext '^-' # Free Ctrl+V for paste use Ctrl+- instead for Literal next -stty stop undef # Disable Ctrl+S to freeze terminal -stty start undef # Disable Ctrl+Q nfreeze terminal - -# Set the current prompt file (e.g., prompt, or prompt_minimal) -ZSH_PROMPT="${ZSH_PROMPT:-prompt}" -#ZSH_PROMPT="${ZSH_PROMPT:-prompt_minimal}" -#ZSH_PROMPT="${ZSH_PROMPT:-prompt_new}" -#ZSH_PROMPT="${ZSH_PROMPT:-prompt_simple}" - -# Source common Zsh files (excluding any that start with 'prompt') -ZSH_SOURCES=() - -for zsh_source in "$HOME"/.config/zsh/user/*.zsh; do - if [[ $(basename "$zsh_source") == prompt* && $(basename "$zsh_source" .zsh) != "$ZSH_PROMPT" ]]; then - continue - fi - ZSH_SOURCES+=("$zsh_source") -done - -# Faster SSH -if [[ -n "$SSH_CLIENT" ]]; then - export KEYTIMEOUT=10 -else - export KEYTIMEOUT=15 -fi - -# Prevent non-login shell anomalies or toolchain misidentification in VS Code -#[[ "$TERM_PROGRAM" == "vscode" ]] && unset ARGV0 -#[[ -n "$TERM_PROGRAM" && "$TERM_PROGRAM" == "vscode" ]] && unset ARGV0 -if [[ "${TERM_PROGRAM:-}" == "vscode" ]]; then - unset ARGV0 -fi - -# Tmux default session -#if [ "$TERM_PROGRAM" != "vscode" ] && command -v tmux &> /dev/null && [ -n "$PS1" ] && [ -n "$DISPLAY" ] && [ -z "$TMUX" ]; then -# if ! tmux list-sessions | grep -q '^tmux:'; then -# tmux new -s tmux -# fi -#fi - -# Enable various options for Zsh behavior -setopt interactive_comments # Allow comments to appear in interactive mode -unsetopt BEEP # Disable the system beep (to prevent annoying beeps) -setopt extendedglob # Enable extended globbing for complex pattern matching -setopt nomatch # Prevent errors when a glob pattern doesn't match any files -setopt notify # Notify when background jobs complete -setopt completeinword # Allow tab completion within words -setopt prompt_subst # Allow prompt variables to be substituted - -# Enable automatic directory navigation -setopt autocd # Automatically change to a directory if the directory name is typed alone -setopt AUTO_PUSHD # Save more directory history, and use "cd -" with tab completion - -# Optional: Uncomment to disable waiting dots on completion -# COMPLETION_WAITING_DOTS="false" - -# Hide history of commands starting with a space -setopt histignorespace # Do not save commands that start with a space in the history - -# Source ZSH files -for zsh_source in "${ZSH_SOURCES[@]}"; do - source "$zsh_source" -done - -########## Source Plugins, should be last ########## -#source /usr/share/nvm/init-nvm.sh - -# Load fzf keybindings and completion if fzf is installed -if command -v fzf >/dev/null 2>&1; then - FZF_BASE="/usr/local/bin/fzf/shell" - [[ -f "${FZF_BASE}/key-bindings.zsh" ]] && source "${FZF_BASE}/key-bindings.zsh" - [[ -f "${FZF_BASE}/completion.zsh" ]] && source "${FZF_BASE}/completion.zsh" -fi - - -# Source plugins -for plugin in \ - "$HOME/.config/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh" \ - "$HOME/.config/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" \ - "$HOME/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh" \ - "$HOME/.config/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" -do - [ -f "$plugin" ] && source "$plugin" -done - -DISABLE_MAGIC_FUNCTIONS=true - -# Zoxide (cd alternative) -if command -v zoxide >/dev/null 2>&1; then - eval "$(zoxide init zsh)" -fi - -# Profile zsh time -#zprof # At the end of .zshrc diff --git a/linux/home/.config/zsh/user/aliases.zsh b/linux/home/.config/zsh/user/aliases.zsh deleted file mode 100644 index 3bd661a..0000000 --- a/linux/home/.config/zsh/user/aliases.zsh +++ /dev/null @@ -1,303 +0,0 @@ -########## Aliases ########## - -### Dotfiles -#if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# # normal bare repo alias -# #alias _config='git --git-dir=$HOME/.cfg --work-tree=$HOME' -# -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME" "$@" -# } -# -# config() { -# if [ "$1" = "add" ]; then -# shift -# for f in "$@"; do -# case "$(uname -s)" in -# Linux) -# _config add -- "linux/home/$f" -# ;; -# Darwin) -# _config add -- "macos/home/$f" -# ;; -# MINGW*|MSYS*|CYGWIN*) -# _config add -- "windows/Documents/$f" -# ;; -# *) -# _config add -- "$f" -# ;; -# esac -# done -# else -# _config "$@" -# fi -# } -# -# cfg_files=$(_config ls-tree --name-only -r HEAD 2>/dev/null) -# export CFG_FILES="$cfg_files" -#fi - -## Only run if bare repo exists -#if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# -# # raw bare-repo command -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME" "$@" -# } -# -# # helper to map paths to OS-specific directories -# -# _os_path() { -# local f="$1" -# # if user already gave a path with prefix, just return it unchanged -# case "$f" in -# linux/*|macos/*|windows/*|common/*|profile/*) -# echo "$f" -# return -# ;; -# esac -# -# # otherwise map according to OS -# case "$(uname -s)" in -# Linux) echo "linux/home/$f" ;; -# Darwin) echo "macos/home/$f" ;; -# MINGW*|MSYS*|CYGWIN*) echo "windows/Documents/$f" ;; -# *) echo "$f" ;; -# esac -# } -# -# # wrapper -# config() { -# if [ "$1" = "add" ]; then -# shift -# for f in "$@"; do -# case "$(uname -s)" in -# Linux) -# case "$f" in -# /*) # absolute path -# rel="${f#$HOME/}" # strip leading /home/username/ -# if [[ "$rel" = "$f" ]]; then -# # wasn't under $HOME, just strip / -# rel="${f#/}" -# _config add -- "linux/$rel" -# else -# _config add -- "linux/home/$rel" -# fi -# ;; -# *) -# _config add -- "linux/home/$f" -# ;; -# esac -# ;; -# Darwin) -# case "$f" in -# /*) -# rel="${f#/}" -# _config add -- "macos/$rel" -# ;; -# *) -# _config add -- "macos/home/$f" -# ;; -# esac -# ;; -# MINGW*|MSYS*|CYGWIN*) -# case "$f" in -# /*) -# rel="${f#/}" -# _config add -- "windows/$rel" -# ;; -# *) -# _config add -- "windows/Documents/$f" -# ;; -# esac -# ;; -# *) -# _config add -- "$f" -# ;; -# esac -# done -# else -# _config "$@" -# fi -# } -# -# # export tracked files if needed -# cfg_files=$(_config ls-tree --name-only -r HEAD 2>/dev/null) -# export CFG_FILES="$cfg_files" -#fi - -# Define alias for nvim/vim (fallback to vim) -if command -v nvim > /dev/null; then - alias vi='nvim' -else - alias vi='vim' -fi - -#alias vv='$(history -p !vim)' -alias vv="vim -c 'norm! ^O'" - -# Confirmation # -alias mv='mv -i' -alias cp='cp -i' -alias ln='ln -i' - -# Disable 'rm' -#alias rm='function _rm() { echo -e "\033[0;31mrm\033[0m is disabled, use \033[0;32mtrash\033[0m or \033[0;32mdel \033[0m\033[0;33m$1\033[0m"; }; _rm' -#alias del='/bin/rm' - -# Use lsd for ls if available -if command -v lsd >/dev/null 2>&1; then - alias ls='lsd --color=auto --group-directories-first' -fi -#alias ls='lsd --all --color=auto --group-directories-first' -#alias ls="ls --color=auto --group-directories-first" - -# ls variants -alias l='ls -FAh --group-directories-first' -alias la='ls -lAFh --group-directories-first' -alias lt='ls -lFAht --group-directories-first' -alias lr='ls -RFAh --group-directories-first' - -# more ls variants -alias ldot='ls -ld .* --group-directories-first' -alias lS='ls -1FASsh --group-directories-first' -alias lart='ls -1Fcart --group-directories-first' -alias lrt='ls -1Fcrt --group-directories-first' - -# ls with different alphabethical sorting -#unalias ll -#ll() { LC_COLLATE=C ls "$@" } - -# suffix aliases -alias -g CP='| xclip -selection clipboard -rmlastnl' -alias -g LL="| less exit 2>1 /dev/null" -alias -g CA="| cat -A" -alias -g KE="2>&1" -alias -g NE="2>/dev/null" -alias -g NUL=">/dev/null 2>&1" - -alias grep='grep --color=auto --exclude-dir={.git,.svn,.hg}' -alias egrep='egrep --color=auto --exclude-dir={.git,.svn,.hg}' -alias egrep='fgrep --color=auto --exclude-dir={.git,.svn,.hg}' - -#alias hist="grep '$1' $HISTFILE" -alias hist="history | grep $1" - - -alias gdb='gdb -q' -alias rust-gdb='rust-gdb -q' - -alias cd="cd-clear-ls" -alias clear='newline_clear' - -# List upto last 10 visited directories using "d" and quickly cd into any specific one -alias d="dirs -v | head -10" - -# Using just a number from "0" to "9" -alias 0="cd +0" -alias 1="cd +1" -alias 2="cd +2" -alias 3="cd +3" -alias 4="cd +4" -alias 5="cd +5" -alias 6="cd +6" -alias 7="cd +7" -alias 8="cd +8" -alias 9="cd +9" - -alias sudo='sudo ' # zsh: elligible for alias expansion/fix syntax highlight -alias sedit='sudoedit' -#alias se='sudoedit' -alias se='sudo -e' -alias :q='exit 2>1 /dev/null' -alias disk-destroyer='$(command -v dd)' -alias dd='echo "Warning use command: disk-destroyer"' -alias sc="systemctl" -alias jc="journalctl" -alias jck="journalctl -k" # Kernel -alias jce='sudo journalctl -b --priority 0..3' # error -alias journalctl-error='sudo journalctl -b --priority 0..3' -alias jcssh="sudo journalctl -u sshd" -alias tunnel='ssh -fNTL' -# tty aliases -#if [[ "$TERM" == 'linux' ]]; then -# alias tmux='/usr/bin/tmux -L linux' -#fi -#alias logout="loginctl kill-user $(whoami)" - -logout() { - local wm - wm="$(windowManagerName)" - if [[ -n "$wm" ]]; then - echo "Logging out by killing window manager: $wm" - pkill "$wm" - else - echo "No window manager detected!" >&2 - fi -} -alias lg="logout" - -#alias suspend='systemctl suspend && betterlockscreen -l' # Suspend(sleep) and lock screen if using systemctl -#alias suspend='systemctl suspend' # Suspend(sleep) and lock screen if using systemctl -alias suspend='loginctl suspend' # Suspend(sleep) and lock screen if using systemctl -#alias shutdown='loginctl poweroff' # Suspend(sleep) and lock screen if using systemctl -#alias shutdown='sudo /sbin/shutdown -h' -#alias poweroff='loginctl poweroff' -#alias reboot='loginctl reboot' -alias reboot='sudo reboot' -#alias hibernate='systemctl hibernate' # Hibernate -alias lock='DISPLAY=:0 xautolock -locknow' # Lock my workstation screen from my phone -alias oports="sudo lsof -i -P -n | grep -i 'listen'" # List open ports -alias keyname="xev | sed -n 's/[ ]*state.* \([^ ]*\)).*/\1/p'" -alias wget=wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" # wget does not support environment variables -alias open="xdg-open" -alias pp='getlast 2>&1 |&tee -a output.txt' -#alias lg='la | grep' -alias pg='ps aux | grep' -alias py='python' -alias py3='python3' -alias activate='source ~/.local/share/venv/bin/activate' -alias sha256='shasum -a 256' -alias rgf='rg -F' -alias weather='curl wttr.in/durban' -alias diary='nvim "$HOME/documents/main/inbox/diary/$(date +'%Y-%m-%d').md"' -alias wifi='nmcli dev wifi show-password' -alias ddg='w3m lite.duckduckgo.com' -alias rss='newsboat' -alias vpn='protonvpn' -alias yt-dl="yt-dlp -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' --restrict-filename" -#alias com.obsproject.Studio="obs" -#alias obs="com.obsproject.Studio" -#alias obs-stuido="obs" - -# Time aliases -alias utc='TZ=Africa/Johannesburg date' -alias ber='TZ=Europe/Berlin date' -alias nyc='TZ=America/New_York date' -alias sfo='TZ=America/Los_Angeles date' -alias utc='TZ=Etc/UTC date' - -alias src='source $ZDOTDIR/.zshrc' -alias p=proxy - -alias cheat='~/.scripts/cheat.sh ~/documents/notes/cheatsheets' -alias crypto='curl -s rate.sx | head -n -2 | tail -n +10' -#alias todo='glow "$HOME"/documents/main/notes/TODO.md' - -alias todo='$EDITOR "$(find "$HOME"/documents/main -type f -iname "todo.md" | head -n 1)"' -alias android-studio='/opt/android-studio/bin/studio.sh' # android-studio -alias nomachine='/usr/NX/bin/nxplayer' # nomachine -alias firefox="firefox-bin" -alias discord="vesktop-bin" -alias fetch="fastfetch" -#alias land="env GDK_BACKEND=wayland $HOME/.local/bin/land" -#alias land="env env WAYLAND_DISPLAY=wayland-1 $HOME/.local/bin/land" -alias bat='upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -E "state|to full|percentage"' -alias emerge-fetch='sudo tail -f /var/log/emerge-fetch.log' -#alias spotify="env LD_PRELOAD=/usr/lib64/spotify-adblock.so spotify %U" -#Exec=env LD_PRELOAD=/usr/lib64/spotify-adblock.so spotify %U -alias spotify="env LD_PRELOAD=/usr/local/lib/spotify-adblock.so spotify %U" -#alias spotify='LD_PRELOAD=/usr/lib/spotify-adblock.so /bin/spotify %U' - -alias proofread='firejail --private --private-tmp --net=none --seccomp --caps.drop=all zathura' - diff --git a/linux/home/.config/zsh/user/bindings.zsh b/linux/home/.config/zsh/user/bindings.zsh deleted file mode 100644 index ecfb7a8..0000000 --- a/linux/home/.config/zsh/user/bindings.zsh +++ /dev/null @@ -1,160 +0,0 @@ -########## Vi mode ########## -bindkey -v -#bindkey -M viins '^?' backward-delete-char -#local WORDCHARS='*?_-.[]~=&;!#$%^(){}<>' -backward-kill-dir () { - local WORDCHARS=${WORDCHARS/\/} - zle backward-kill-word - zle -f kill -} -zle -N backward-kill-dir -bindkey '^[^?' backward-kill-dir -bindkey "^W" backward-kill-dir -bindkey -M viins '^[[3~' delete-char -bindkey -M vicmd '^[[3~' delete-char -bindkey -v '^?' backward-delete-char -bindkey -r '\e/' -bindkey -s jk '\e' -#bindkey "^W" backward-kill-word -bindkey "^H" backward-delete-char # Control-h also deletes the previous char -bindkey "^U" backward-kill-line -bindkey "^[j" history-search-forward # or you can bind it to the down key "^[[B" -bindkey "^[k" history-search-backward # or you can bind it to Up key "^[[A" - -bindkey '^[[D' backward-char # Left arrow -bindkey '^[[C' forward-char # Right arrow -bindkey '^[D' backward-char # Left arrow -bindkey '^[C' forward-char # Right arrow -bindkey '[C' forward-word -bindkey '[D' backward-word -bindkey -M viins '^[[D' backward-char # Left arrow -bindkey -M viins '^[[C' forward-char # Right arrow - -bindkey -M vicmd '^[[D' backward-char # Left arrow -bindkey -M vicmd '^[[C' forward-char # Right arrow - -# Define the 'autosuggest-execute' and 'autosuggest-accept' ZLE widgets -autoload -Uz autosuggest-execute autosuggest-accept -zle -N autosuggest-execute -zle -N autosuggest-accept -bindkey '^X' autosuggest-execute -bindkey '^Y' autosuggest-accept -bindkey '\M-l' accept-and-complete-next-history - -# Edit line in vim with alt-e -autoload edit-command-line; zle -N edit-command-line -bindkey '^e' edit-command-line -bindkey '^[e' edit-command-line # alt + e - -# Allow CTRL+D to exit zsh with partial command line (non empty line) -exit_zsh() { exit } -zle -N exit_zsh -bindkey '^D' exit_zsh - -# Copy/Paste -# Safe clipboard copy -smart_copy() { - local text="${LBUFFER}${RBUFFER}" - - # Prefer Wayland, fallback to X11, then others - if command -v wl-copy >/dev/null 2>&1 && [[ "$WAYLAND_DISPLAY" || "$XDG_SESSION_TYPE" == "wayland" ]]; then - echo -n "$text" | wl-copy --foreground --type text/plain 2>/dev/null || true - elif command -v xclip >/dev/null 2>&1 && [[ "$DISPLAY" || "$XDG_SESSION_TYPE" == "x11" || "$XDG_SESSION_TYPE" == "x11-xwayland" ]]; then - echo -n "$text" | xclip -selection clipboard 2>/dev/null || true - elif [[ "$(uname -s)" == "Darwin" ]] && command -v pbcopy >/dev/null 2>&1; then - echo -n "$text" | pbcopy 2>/dev/null || true - elif [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then - echo -n "$text" | clip.exe 2>/dev/null || true - else - echo "smart_copy: No supported clipboard utility found." >&2 - fi -} - -# Safe clipboard paste -smart_paste() { - local clip="" - if command -v wl-paste >/dev/null 2>&1 && [[ "$WAYLAND_DISPLAY" || "$XDG_SESSION_TYPE" == "wayland" ]]; then - clip=$(wl-paste --no-newline 2>/dev/null) - elif command -v xclip >/dev/null 2>&1 && [[ "$DISPLAY" || "$XDG_SESSION_TYPE" == "x11" || "$XDG_SESSION_TYPE" == "x11-xwayland" ]]; then - clip=$(xclip -selection clipboard -o 2>/dev/null) - elif [[ "$(uname -s)" == "Darwin" ]] && command -v pbpaste >/dev/null 2>&1; then - clip=$(pbpaste 2>/dev/null) - elif [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then - clip=$(powershell.exe -Command 'Get-Clipboard -Raw' 2>/dev/null | tr -d '\r') - else - echo "smart_paste: No supported clipboard utility found." >&2 - fi - - LBUFFER+="$clip" - zle reset-prompt -} - -# Register widgets -zle -N smart_copy -zle -N smart_paste - -# Bind keys (optional: choose your preferred) -bindkey '^V' smart_paste -bindkey -M viins '^V' smart_paste -bindkey -M vicmd '^V' smart_paste -bindkey -M vicmd 'p' smart_paste - -bindkey '^Y' smart_copy -bindkey -M viins '^Y' smart_copy -bindkey -M vicmd '^Y' smart_copy -bindkey -M vicmd 'y' smart_copy - -# In vi mode, map Alt-H and Alt-L -#bindkey -M viins "^[u" go_up # Alt-H to go up -#bindkey -M viins "^[o" go_into # Alt-L to go into a directory - - -# Newline and clear -function newline_clear() { - printf "\n" - command clear -} - -zle -N newline_clear - -no_tmux_clear() { - zle clear-screen -} -zle -N no_tmux_clear - -# Newline before clear -if [[ -n "$TMUX" ]]; then - # Bind Ctrl-L to send newline and clear screen - bindkey '^L' newline_clear -else - bindkey '^L' no_tmux_clear -fi - -# use ctrl-z to toggle in and out of bg -function toggle_fg_bg() { - if [[ $#BUFFER -eq 0 ]]; then - BUFFER="fg" - zle accept-line - else - BUFFER="" - zle clear-screen - fi -} -zle -N toggle_fg_bg -bindkey '^Z' toggle_fg_bg - - - - -## Custom key bindings to control history behavior -#bindkey -M vicmd '^[[C' vi-forward-char # Right arrow in normal mode - just move cursor -#bindkey -M vicmd '^[[D' vi-backward-char # Left arrow in normal mode - just move cursor -#bindkey -M vicmd '^A' beginning-of-line # Ctrl-A - go to beginning of line -#bindkey -M vicmd '^E' end-of-line # Ctrl-E - go to end of line - -# Disable automatic suggestion accept on right arrow in normal mode - -## Additional vi-mode key bindings to prevent unwanted history completion -## Disable automatic history completion in normal mode -#bindkey -M vicmd '^[[C' vi-forward-char # Right arrow - just move right, don't complete -#bindkey -M vicmd '^[[D' vi-backward-char # Left arrow - just move left diff --git a/linux/home/.config/zsh/user/completion.zsh b/linux/home/.config/zsh/user/completion.zsh deleted file mode 100644 index cddf638..0000000 --- a/linux/home/.config/zsh/user/completion.zsh +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/zsh - -########## Completion(s) ########## - -autoload -Uz compinit -_comp_path="${XDG_CACHE_HOME:-$HOME/.cache}/zcompdump" - -# Expands globs in conditional expressions -if [[ $_comp_path(#qNmh-20) ]]; then - # -C (skip function check) implies -i (skip security check). - compinit -C -d "$_comp_path" -else - mkdir -p "$_comp_path:h" - compinit -i -d "$_comp_path" - # Keep $_comp_path younger than cache time even if it isn't regenerated. - touch "$_comp_path" -fi -unset _comp_path - -# Accept completion with <tab> or Ctrl+i and go to next/previous suggestions with Vi like keys: Ctrl+n/p -zmodload -i zsh/complist -accept-and-complete-next-history() { - zle expand-or-complete-prefix -} -zle -N accept-and-complete-next-history -#bindkey -M menuselect '^i' accept-and-complete-next-history -bindkey '^n' expand-or-complete -bindkey '^p' reverse-menu-complete -#bindkey '^I' expand-or-complete -#bindkey '^[[Z]]' reverse-menu-complete -bindkey -M menuselect '^[' undo - -#zstyle ':completion:*' menu select=1 -#zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12' - -# Options -#setopt COMPLETE_IN_WORD # Complete from both ends of a word. -##setopt ALWAYS_TO_END # Move cursor to the end of a completed word. -##setopt PATH_DIRS # Perform path search even on command names with slashes. -#setopt AUTO_MENU # Show completion menu on a successive tab press. -#setopt AUTO_LIST # Automatically list choices on ambiguous completion. -#setopt AUTO_PARAM_SLASH # If completed parameter is a directory, add a trailing slash. -#setopt EXTENDED_GLOB # Needed for file modification glob modifiers with compinit. -#unsetopt MENU_COMPLETE # Do not autoselect the first completion entry. - -## Disable all custom completions -unsetopt COMPLETE_IN_WORD -#unsetopt AUTO_MENU -#unsetopt AUTO_LIST -#unsetopt AUTO_PARAM_SLASH -#unsetopt EXTENDED_GLOB -#unsetopt MENU_COMPLETE # Do not autoselect the first completion entry. - -setopt ALWAYS_TO_END # Move cursor to the end of a completed word. -setopt PATH_DIRS # Perform path search even on command names with slashes. -setopt AUTO_MENU # Show completion menu on a successive tab press. -setopt AUTO_LIST # Automatically list choices on ambiguous completion. -setopt AUTO_PARAM_SLASH # If completed parameter is a directory, add a trailing slash. -setopt EXTENDED_GLOB # Needed for file modification glob modifiers with compinit. -unsetopt MENU_COMPLETE # Do not autoselect the first completion entry. - -# Test the behavior with just the basics -compinit -# Variables -LS_COLORS=${LS_COLORS:-'di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'} - -# Styles -# Defaults. -zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} -zstyle ':completion:*:default' list-prompt '%S%M matches%s' - -# Use caching to make completion for commands such as dpkg and apt usable. -zstyle ':completion::complete:*' use-cache on -zstyle ':completion::complete:*' cache-path "${XDG_CACHE_HOME:-$HOME/.cache}/zcompcache" - - -# Group matches and describe. -zstyle ':completion:*:*:*:*:*' menu select -zstyle ':completion:*:matches' group 'yes' -zstyle ':completion:*:options' description 'yes' -zstyle ':completion:*:options' auto-description '%d' -zstyle ':completion:*:corrections' format ' %F{green}-- %d (errors: %e) --%f' -zstyle ':completion:*:descriptions' format ' %F{yellow}-- %d --%f' -zstyle ':completion:*:messages' format ' %F{purple} -- %d --%f' -zstyle ':completion:*:warnings' format ' %F{red}-- no matches found --%f' -zstyle ':completion:*' format ' %F{yellow}-- %d --%f' -zstyle ':completion:*' group-name '' -zstyle ':completion:*' verbose yes - -# Fuzzy match mistyped completions. -zstyle ':completion:*' completer _complete _match _approximate -zstyle ':completion:*:match:*' original only -zstyle ':completion:*:approximate:*' max-errors 1 numeric - -# Increase the number of errors based on the length of the typed word. But make -# sure to cap (at 7) the max-errors to avoid hanging. -zstyle -e ':completion:*:approximate:*' max-errors 'reply=($((($#PREFIX+$#SUFFIX)/3>7?7:($#PREFIX+$#SUFFIX)/3))numeric)' - -# Don't complete unavailable commands. -zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec))' - -# Array completion element sorting. -zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters - -# Directories -zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories -zstyle ':completion:*:*:cd:*:directory-stack' menu yes select -zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand' -zstyle ':completion:*' squeeze-slashes true - -# History -zstyle ':completion:*:history-words' stop yes -zstyle ':completion:*:history-words' remove-all-dups yes -zstyle ':completion:*:history-words' list false -zstyle ':completion:*:history-words' menu yes - -# Environment Variables -zstyle ':completion::*:(-command-|export):*' fake-parameters ${${${_comps[(I)-value-*]#*,}%%,*}:#-*-} - -# Populate hostname completion. But allow ignoring custom entries from static -# */etc/hosts* which might be uninteresting. -zstyle -a ':completion:*:hosts' etc-host-ignores '_etc_host_ignores' - -zstyle -e ':completion:*:hosts' hosts 'reply=( - ${=${=${=${${(f)"$(cat {/etc/ssh/ssh_,~/.ssh/}known_hosts(|2)(N) 2> /dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ } - ${=${(f)"$(cat /etc/hosts(|)(N) <<(ypcat hosts 2> /dev/null))"}%%(\#${_etc_host_ignores:+|${(j:|:)~_etc_host_ignores}})*} - ${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2> /dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}} -)' - -# Don't complete uninteresting users... -zstyle ':completion:*:*:*:users' ignored-patterns \ - adm amanda apache avahi beaglidx bin cacti canna clamav daemon \ - dbus distcache dovecot fax ftp games gdm gkrellmd gopher \ - hacluster haldaemon halt hsqldb ident junkbust ldap lp mail \ - mailman mailnull mldonkey mysql nagios \ - named netdump news nfsnobody nobody nscd ntp nut nx openvpn \ - operator pcap postfix postgres privoxy pulse pvm quagga radvd \ - rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs '_*' - -# ... unless we really want to. -zstyle '*' single-ignored show - -# Ignore multiple entries. -zstyle ':completion:*:(rm|kill|diff):*' ignore-line other -zstyle ':completion:*:rm:*' file-patterns '*:all-files' - -# Kill -zstyle ':completion:*:*:*:*:processes' command 'ps -u $LOGNAME -o pid,user,command -w' -zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;36=0=01' -zstyle ':completion:*:*:kill:*' menu yes select -zstyle ':completion:*:*:kill:*' force-list always -zstyle ':completion:*:*:kill:*' insert-ids single - -# Man -zstyle ':completion:*:manuals' separate-sections true -zstyle ':completion:*:manuals.(^1*)' insert-sections true - -# Media Players -zstyle ':completion:*:*:mpg123:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories' -zstyle ':completion:*:*:mpg321:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories' -zstyle ':completion:*:*:ogg123:*' file-patterns '*.(ogg|OGG|flac):ogg\ files *(-/):directories' -zstyle ':completion:*:*:mocp:*' file-patterns '*.(wav|WAV|mp3|MP3|ogg|OGG|flac):ogg\ files *(-/):directories' - -# Mutt -if [[ -s "$HOME/.mutt/aliases" ]]; then - zstyle ':completion:*:*:mutt:*' menu yes select - zstyle ':completion:*:mutt:*' users ${${${(f)"$(<"$HOME/.mutt/aliases")"}#alias[[:space:]]}%%[[:space:]]*} -fi - -# SSH/SCP/RSYNC -zstyle ':completion:*:(ssh|scp|rsync):*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *' -zstyle ':completion:*:(scp|rsync):*' group-order users files all-files hosts-domain hosts-host hosts-ipaddr -zstyle ':completion:*:ssh:*' group-order users hosts-domain hosts-host users hosts-ipaddr -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost broadcasthost -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-domain' ignored-patterns '<->.<->.<->.<->' '^[-[:alnum:]]##(.[-[:alnum:]]##)##' '*@*' -zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*' diff --git a/linux/home/.config/zsh/user/functions.zsh b/linux/home/.config/zsh/user/functions.zsh deleted file mode 100644 index 0ab101b..0000000 --- a/linux/home/.config/zsh/user/functions.zsh +++ /dev/null @@ -1,2426 +0,0 @@ -# Dotfiles Management System -if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then - # Core git wrapper with repository as work-tree - _config() { - git --git-dir="$HOME/.cfg" --work-tree="$HOME/.cfg" "$@" - } - - # Detect OS - case "$(uname -s)" in - Linux) CFG_OS="linux" ;; - Darwin) CFG_OS="macos" ;; - MINGW*|MSYS*|CYGWIN*) CFG_OS="windows" ;; - *) CFG_OS="other" ;; - esac - - # Map system path to repository path - _repo_path() { - local f="$1" - - # If it's an absolute path that's not in HOME, handle it specially - if [[ "$f" == /* && "$f" != "$HOME/"* ]]; then - echo "$CFG_OS/${f#/}" - return - fi - - # Check for paths that should go to the repository root - case "$f" in - common/*|linux/*|macos/*|windows/*|profile/*|README.md) - echo "$f" - return - ;; - "$HOME/"*) - f="${f#$HOME/}" - ;; - esac - - # Default: put under OS-specific home - echo "$CFG_OS/home/$f" - } - - _sys_path() { - local repo_path="$1" - local os_path_pattern="$CFG_OS/" - - # Handle OS-specific files that are not in the home subdirectory - if [[ "$repo_path" == "$os_path_pattern"* && "$repo_path" != */home/* ]]; then - echo "/${repo_path#$os_path_pattern}" - return - fi - - case "$repo_path" in - # Common configs → OS-specific config dirs - common/config/*) - case "$CFG_OS" in - linux) - local base="${XDG_CONFIG_HOME:-$HOME/.config}" - echo "$base/${repo_path#common/config/}" - ;; - macos) - echo "$HOME/Library/Application Support/${repo_path#common/config/}" - ;; - windows) - echo "$LOCALAPPDATA\\${repo_path#common/config/}" - ;; - *) - echo "$HOME/.config/${repo_path#common/config/}" - ;; - esac - ;; - - # Common assets → stay in repo - common/assets/*) - echo "$HOME/.cfg/$repo_path" - ;; - - # Other common files (dotfiles like .bashrc, .gitconfig, etc.) → $HOME - common/*) - echo "$HOME/${repo_path#common/}" - ;; - - # OS-specific home - */home/*) - echo "$HOME/${repo_path#*/home/}" - ;; - - # Profile configs and README → stay in repo - profile/*|README.md) - echo "$HOME/.cfg/$repo_path" - ;; - - # Default fallback - *) - echo "$HOME/.cfg/$repo_path" - ;; - - esac - } - - # Prompts for sudo if needed and runs the command - _sudo_prompt() { - if [[ $EUID -eq 0 ]]; then - "$@" - else - if command -v sudo >/dev/null; then - sudo "$@" - elif command -v doas >/dev/null; then - doas "$@" - elif command -v pkexec >/dev/null; then - pkexec "$@" - else - echo "Error: No privilege escalation tool found." - return 1 - fi - fi - } - - # Main config command - config() { - local cmd="$1"; shift - local target_dir="" - # Parse optional --target flag for add - if [[ "$cmd" == "add" ]]; then - while [[ "$1" == --* ]]; do - case "$1" in - --target|-t) - target_dir="$2" - shift 2 - ;; - *) - echo "Unknown option: $1" - return 1 - ;; - esac - done - fi - - case "$cmd" in - add) - local file_path - for file_path in "$@"; do - local repo_path - if [[ -n "$target_dir" ]]; then - local rel_path - if [[ "$file_path" == /* ]]; then - rel_path="$(basename "$file_path")" - else - rel_path="$file_path" - fi - repo_path="$target_dir/$rel_path" - else - repo_path="$(_repo_path "$file_path")" - fi - - local full_repo_path="$HOME/.cfg/$repo_path" - mkdir -p "$(dirname "$full_repo_path")" - cp -a "$file_path" "$full_repo_path" - - git --git-dir="$HOME/.cfg" --work-tree="$HOME/.cfg" add "$repo_path" - - echo "Added: $file_path -> $repo_path" - done - ;; - rm) - local rm_opts="" - local file_path_list=() - - for arg in "$@"; do - if [[ "$arg" == "-"* ]]; then - rm_opts+=" $arg" - else - file_path_list+=("$arg") - fi - done - - for file_path in "${file_path_list[@]}"; do - local repo_path="$(_repo_path "$file_path")" - - if [[ "$rm_opts" == *"-r"* ]]; then - _config rm --cached -r "$repo_path" - else - _config rm --cached "$repo_path" - fi - - eval "rm $rm_opts \"$file_path\"" - echo "Removed: $file_path" - done - ;; - sync) - local direction="${1:-to-repo}"; shift - _config ls-files | while read -r repo_file; do - local sys_file="$(_sys_path "$repo_file")" - local full_repo_path="$HOME/.cfg/$repo_file" - if [[ "$direction" == "to-repo" ]]; then - if [[ -e "$sys_file" && -n "$(diff "$full_repo_path" "$sys_file" 2>/dev/null || echo "diff")" ]]; then - cp -a "$sys_file" "$full_repo_path" - echo "Synced to repo: $sys_file" - fi - elif [[ "$direction" == "from-repo" ]]; then - if [[ -e "$full_repo_path" && -n "$(diff "$full_repo_path" "$sys_file" 2>/dev/null || echo "diff")" ]]; then - local dest_dir="$(dirname "$sys_file")" - if [[ "$sys_file" == /* && "$sys_file" != "$HOME/"* ]]; then - _sudo_prompt mkdir -p "$dest_dir" - _sudo_prompt cp -a "$full_repo_path" "$sys_file" - else - mkdir -p "$dest_dir" - cp -a "$full_repo_path" "$sys_file" - fi - echo "Synced from repo: $sys_file" - fi - fi - done - ;; - status) - local auto_synced=() - while read -r repo_file; do - local sys_file="$(_sys_path "$repo_file")" - local full_repo_path="$HOME/.cfg/$repo_file" - if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then - if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then - cp -fa "$sys_file" "$full_repo_path" - auto_synced+=("$repo_file") - fi - fi - done < <(_config ls-files) - if [[ ${#auto_synced[@]} -gt 0 ]]; then - echo "=== Auto-synced Files ===" - for repo_file in "${auto_synced[@]}"; do - echo "synced: $(_sys_path "$repo_file") -> $repo_file" - done - echo - fi - _config status - echo - ;; - deploy) - _config ls-files | while read -r repo_file; do - local full_repo_path="$HOME/.cfg/$repo_file" - local sys_file="$(_sys_path "$repo_file")" # destination only - - # Only continue if the source exists - if [[ -e "$full_repo_path" && -n "$sys_file" ]]; then - local dest_dir - dest_dir="$(dirname "$sys_file")" - - # Create destination if needed - if [[ "$sys_file" == /* && "$sys_file" != "$HOME/"* ]]; then - _sudo_prompt mkdir -p "$dest_dir" - _sudo_prompt cp -a "$full_repo_path" "$sys_file" - else - mkdir -p "$dest_dir" - cp -a "$full_repo_path" "$sys_file" - fi - - echo "Deployed: $repo_file -> $sys_file" - fi - done - ;; - checkout) - echo "Checking out dotfiles from .cfg..." - _config ls-files | while read -r repo_file; do - local full_repo_path="$HOME/.cfg/$repo_file" - local sys_file="$(_sys_path "$repo_file")" - - if [[ -e "$full_repo_path" && -n "$sys_file" ]]; then - local dest_dir - dest_dir="$(dirname "$sys_file")" - - # Create destination if it doesn't exist - if [[ "$sys_file" == /* && "$sys_file" != "$HOME/"* ]]; then - _sudo_prompt mkdir -p "$dest_dir" - _sudo_prompt cp -a "$full_repo_path" "$sys_file" - else - mkdir -p "$dest_dir" - cp -a "$full_repo_path" "$sys_file" - fi - - echo "Checked out: $repo_file -> $sys_file" - fi - done - ;; - backup) - local timestamp=$(date +%Y%m%d%H%M%S) - local backup_dir="$HOME/.dotfiles_backup/$timestamp" - echo "Backing up existing dotfiles to $backup_dir..." - - _config ls-files | while read -r repo_file; do - local sys_file="$(_sys_path "$repo_file")" - if [[ -e "$sys_file" ]]; then - local dest_dir_full="$backup_dir/$(dirname "$repo_file")" - mkdir -p "$dest_dir_full" - cp -a "$sys_file" "$backup_dir/$repo_file" - fi - done - echo "Backup complete. To restore, copy files from $backup_dir to their original locations." - ;; - *) - _config "$cmd" "$@" - ;; - esac - } -fi -#f [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# -# # Core git wrapper with repository as work-tree -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME/.cfg" "$@" -# } -# -# # Detect OS -# case "$(uname -s)" in -# Linux) CFG_OS="linux" ;; -# Darwin) CFG_OS="macos" ;; -# MINGW*|MSYS*|CYGWIN*) CFG_OS="windows" ;; -# *) CFG_OS="other" ;; -# esac -# -# # Map system path to repository path -# _repo_path() { -# local f="$1" -# -# # If it's an absolute path that's not in HOME, handle it specially -# if [[ "$f" == /* && "$f" != "$HOME/"* ]]; then -# echo "$CFG_OS/${f#/}" -# return -# fi -# -# # Check for paths that should go to the repository root -# case "$f" in -# common/*|linux/*|macos/*|windows/*|profile/*|README.md) -# # If path already looks like a repo path, use it as is -# echo "$f" -# return -# ;; -# # Otherwise, convert to a relative path -# "$HOME/"*) -# f="${f#$HOME/}" -# ;; -# esac -# -# # Default: put under OS-specific home -# echo "$CFG_OS/home/$f" -# } -# -# # Map repository path back to system path -# _sys_path() { -# local repo_path="$1" -# local os_path_pattern="$CFG_OS/" -# -# # Handle OS-specific files that are not in the home subdirectory -# if [[ "$repo_path" == "$os_path_pattern"* && "$repo_path" != */home/* ]]; then -# echo "/${repo_path#$os_path_pattern}" -# return -# fi -# -# case "$repo_path" in -# # Files in the home directory -# */home/*) -# echo "$HOME/${repo_path#*/home/}" -# ;; -# # Other files in the repo root -# common/*|profile/*|README.md|linux/*|macos/*|windows/*) -# echo "$HOME/.cfg/$repo_path" -# ;; -# *) -# echo "/$repo_path" -# ;; -# esac -# } -# -# # Prompts for sudo if needed and runs the command -# _sudo_prompt() { -# if [[ $EUID -eq 0 ]]; then -# "$@" -# else -# if command -v sudo >/dev/null; then -# sudo "$@" -# elif command -v doas >/dev/null; then -# doas "$@" -# elif command -v pkexec >/dev/null; then -# pkexec "$@" -# else -# echo "Error: No privilege escalation tool (sudo, doas, pkexec) found." -# return 1 -# fi -# fi -# } -# -# # NOTE: can change `config` to whatever you feel comfortable ie. dotfiles, dots, cfg etc. -# config() { -# local cmd="$1"; shift -# case "$cmd" in -# add) -# local file_path -# for file_path in "$@"; do -# local repo_path="$(_repo_path "$file_path")" -# local full_repo_path="$HOME/.cfg/$repo_path" -# mkdir -p "$(dirname "$full_repo_path")" -# cp -a "$file_path" "$full_repo_path" -# _config add "$repo_path" -# echo "Added: $file_path -> $repo_path" -# done -# ;; -# rm) -# local rm_opts="" -# local file_path_list=() -# -# # Separate options from file paths -# for arg in "$@"; do -# if [[ "$arg" == "-"* ]]; then -# rm_opts+=" $arg" -# else -# file_path_list+=("$arg") -# fi -# done -# -# for file_path in "${file_path_list[@]}"; do -# local repo_path="$(_repo_path "$file_path")" -# -# # Use a dummy run of `git rm` to handle the recursive flag -# if [[ "$rm_opts" == *"-r"* ]]; then -# _config rm --cached -r "$repo_path" -# else -# _config rm --cached "$repo_path" -# fi -# -# # Remove from the filesystem, passing the collected options -# eval "rm $rm_opts \"$file_path\"" -# -# echo "Removed: $file_path" -# done -# ;; -# sync) -# local direction="${1:-to-repo}"; shift -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ "$direction" == "to-repo" ]]; then -# if [[ -e "$sys_file" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# cp -a "$sys_file" "$full_repo_path" -# echo "Synced to repo: $sys_file" -# fi -# elif [[ "$direction" == "from-repo" ]]; then -# if [[ -e "$full_repo_path" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# local dest_dir="$(dirname "$sys_file")" -# if [[ "$sys_file" == /* && "$sys_file" != "$HOME/"* ]]; then -# _sudo_prompt mkdir -p "$dest_dir" -# _sudo_prompt cp -a "$full_repo_path" "$sys_file" -# else -# mkdir -p "$dest_dir" -# cp -a "$full_repo_path" "$sys_file" -# fi -# echo "Synced from repo: $sys_file" -# fi -# fi -# done -# ;; -# status) -# # Auto-sync any modified files -# local auto_synced=() -# while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then -# if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then -# \cp -fa "$sys_file" "$full_repo_path" -# auto_synced+=("$repo_file") -# fi -# fi -# done < <(_config ls-files) -# if [[ ${#auto_synced[@]} -gt 0 ]]; then -# echo "=== Auto-synced Files ===" -# for repo_file in "${auto_synced[@]}"; do -# echo "synced: $(_sys_path "$repo_file") -> $repo_file" -# done -# echo -# fi -# _config status -# echo -# ;; -# deploy) -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$full_repo_path" ]]; then -# if [[ -n "$sys_file" ]]; then -# local dest_dir="$(dirname "$sys_file")" -# if [[ "$sys_file" == /* && "$sys_file" != "$HOME/"* ]]; then -# _sudo_prompt mkdir -p "$dest_dir" -# _sudo_prompt cp -a "$full_repo_path" "$sys_file" -# else -# mkdir -p "$dest_dir" -# cp -a "$full_repo_path" "$sys_file" -# fi -# echo "Deployed: $repo_file -> $sys_file" -# fi -# fi -# done -# ;; -# backup) -# local timestamp=$(date +%Y%m%d%H%M%S) -# local backup_dir="$HOME/.dotfiles_backup/$timestamp" -# echo "Backing up existing dotfiles to $backup_dir..." -# -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# if [[ -e "$sys_file" ]]; then -# local dest_dir_full="$backup_dir/$(dirname "$repo_file")" -# mkdir -p "$dest_dir_full" -# cp -a "$sys_file" "$backup_dir/$repo_file" -# fi -# done -# echo "Backup complete. To restore, copy files from $backup_dir to their original locations." -# ;; -# *) -# _config "$cmd" "$@" -# ;; -# esac -# } -#fi - - -## OG -## Dotfiles Management System -#if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# -# # Core git wrapper with repository as work-tree -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME/.cfg" "$@" -# } -# -# # Detect OS -# case "$(uname -s)" in -# Linux) CFG_OS="linux" ;; -# Darwin) CFG_OS="macos" ;; -# MINGW*|MSYS*|CYGWIN*) CFG_OS="windows" ;; -# *) CFG_OS="other" ;; -# esac -# -# # Map system path to repository path -# _repo_path() { -# local f="$1" -# -# # Check for paths that should go to the repository root -# case "$f" in -# common/*|linux/*|macos/*|windows/*|profile/*|README.md) -# # If path already looks like a repo path, use it as is -# echo "$f" -# return -# ;; -# # Otherwise, convert to a relative path -# "$HOME/"*) -# f="${f#$HOME/}" -# ;; -# esac -# -# # Default: put under OS-specific home -# echo "$CFG_OS/home/$f" -# } -# -# # Map repository path back to system path -# _sys_path() { -# local repo_path="$1" -# case "$repo_path" in -# # Files in the root of the repo -# common/*|linux/*|macos/*|windows/*|profile/*) -# # For directories, map to the repository directory -# echo "$HOME/.cfg/$repo_path" -# ;; -# README.md) -# # Specific file in the root -# echo "$HOME/.cfg/README.md" -# ;; -# # Otherwise, map to the home directory -# */home/*) -# echo "$HOME/${repo_path#*/home/}" -# ;; -# *) -# echo "/$repo_path" -# ;; -# esac -# } -# -# # NOTE: can change `config` to whatever you feel comfortable ie. dotfiles, dots, cfg etc. -# config() { -# local cmd="$1"; shift -# case "$cmd" in -# add) -# local file_path -# for file_path in "$@"; do -# local repo_path="$(_repo_path "$file_path")" -# local full_repo_path="$HOME/.cfg/$repo_path" -# mkdir -p "$(dirname "$full_repo_path")" -# cp -a "$file_path" "$full_repo_path" -# _config add "$repo_path" -# echo "Added: $file_path -> $repo_path" -# done -# ;; -# -# rm) -# local file_path -# for file_path in "$@"; do -# local repo_path="$(_repo_path "$file_path")" -# _config rm "$repo_path" -# rm -f "$HOME/.cfg/$repo_path" -# echo "Removed: $file_path ($repo_path)" -# done -# ;; -# -# sync) -# local direction="${1:-to-repo}"; shift -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ "$direction" == "to-repo" ]]; then -# if [[ -e "$sys_file" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# cp "$sys_file" "$full_repo_path" -# echo "Synced to repo: $sys_file" -# fi -# elif [[ "$direction" == "from-repo" ]]; then -# if [[ -e "$full_repo_path" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# mkdir -p "$(dirname "$sys_file")" -# cp "$full_repo_path" "$sys_file" -# echo "Synced from repo: $sys_file" -# fi -# fi -# done -# ;; -# -# status) -# # Auto-sync any modified files -# local auto_synced=() -# while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then -# if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then -# \cp -f "$sys_file" "$full_repo_path" -# auto_synced+=("$repo_file") -# fi -# fi -# done < <(_config ls-files) -# if [[ ${#auto_synced[@]} -gt 0 ]]; then -# echo "=== Auto-synced Files ===" -# for repo_file in "${auto_synced[@]}"; do -# echo "synced: $(_sys_path "$repo_file") → $repo_file" -# done -# echo -# fi -# _config status -# echo -# ;; -# -# deploy) -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$full_repo_path" ]]; then -# mkdir -p "$(dirname "$sys_file")" -# cp -a "$full_repo_path" "$sys_file" -# echo "Deployed: $repo_file -> $sys_file" -# fi -# done -# ;; -# -# *) -# _config "$cmd" "$@" -# ;; -# esac -# } -#fi - - - - - - - -## new -## Dotfiles Management System -#if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# -# # Core git wrapper with repository as work-tree -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME" "$@" -# } -# -# # Detect OS -# case "$(uname -s)" in -# Linux) CFG_OS="linux" ;; -# Darwin) CFG_OS="macos" ;; -# MINGW*|MSYS*|CYGWIN*) CFG_OS="windows" ;; -# *) CFG_OS="other" ;; -# esac -# -# # Map system path to repository path -# _repo_path() { -# local f="$1" -# local relative_path="${f#$HOME/}" -# local repo_path -# -# # If it's an absolute path that's not in HOME, handle it specially -# if [[ "$f" == /* && "$f" != "$HOME/"* ]]; then -# echo "$CFG_OS/root/$f" -# return -# fi -# -# # Check for paths that are explicitly within the repo structure -# case "$f" in -# "$HOME/.cfg/"*) -# # We do not want to track files within the bare repo itself -# echo "" -# return -# ;; -# "common/"*) -# # Common files remain in the common directory -# echo "$f" -# return -# ;; -# "$CFG_OS/"*) -# # OS-specific files remain in their respective OS directories -# echo "$f" -# return -# ;; -# *) -# # Default: place under OS-specific home -# echo "$CFG_OS/home/$relative_path" -# return -# ;; -# esac -# } -# -# # Map repository path back to system path -# _sys_path() { -# local repo_path="$1" -# local file_path -# -# case "$repo_path" in -# common/config/*) -# # Maps common config files to the appropriate configuration directory -# file_path="${repo_path#common/config/}" -# if [[ "$CFG_OS" == "windows" ]]; then -# echo "$HOME/AppData/Local/$file_path" -# else -# echo "$HOME/.config/$file_path" -# fi -# ;; -# common/bin/*) -# # Maps common bin files to the appropriate user local bin directory -# file_path="${repo_path#common/bin/}" -# if [[ "$CFG_OS" == "windows" ]]; then -# echo "$HOME/bin/$file_path" -# else -# echo "$HOME/.local/bin/$file_path" -# fi -# ;; -# common/*) -# # Maps remaining common files to the home directory -# file_path="${repo_path#common/}" -# echo "$HOME/$file_path" -# ;; -# */home/*) -# # Maps OS-specific home files to $HOME -# file_path="${repo_path#*/home/}" -# echo "$HOME/$file_path" -# ;; -# */root/*) -# # Maps root files to the absolute root directory -# file_path="${repo_path#*/root/}" -# echo "/$file_path" -# ;; -# *) -# # Fallback for other paths -# echo "$HOME/$repo_path" -# ;; -# esac -# } -# -# # Prompts for sudo if needed and runs the command -# _sudo_prompt() { -# if [[ $EUID -eq 0 ]]; then -# "$@" -# else -# if command -v sudo >/dev/null; then -# sudo "$@" -# elif command -v doas >/dev/null; then -# doas "$@" -# elif command -v pkexec >/dev/null; then -# pkexec "$@" -# else -# echo "Error: No privilege escalation tool (sudo, doas, pkexec) found." -# return 1 -# fi -# fi -# } -# -# # NOTE: can change `config` to whatever you feel comfortable ie. dotfiles, dots, cfg etc. -# config() { -# local cmd="$1"; shift -# case "$cmd" in -# add) -# local file_path -# for file_path in "$@"; do -# local repo_path="$(_repo_path "$file_path")" -# if [[ -z "$repo_path" ]]; then -# echo "Warning: Ignoring file within the bare repo: $file_path" -# continue -# fi -# local full_repo_path="$HOME/.cfg/$repo_path" -# mkdir -p "$(dirname "$full_repo_path")" -# cp -a "$file_path" "$full_repo_path" -# _config add "$repo_path" -# echo "Added: $file_path -> $repo_path" -# done -# ;; -# rm) -# local rm_opts="" -# local file_path_list=() -# -# # Separate options from file paths -# for arg in "$@"; do -# if [[ "$arg" == "-"* ]]; then -# rm_opts+=" $arg" -# else -# file_path_list+=("$arg") -# fi -# done -# -# for file_path in "${file_path_list[@]}"; do -# local repo_path="$(_repo_path "$file_path")" -# -# # Use a dummy run of `git rm` to handle the recursive flag -# if [[ "$rm_opts" == *"-r"* ]]; then -# _config rm --cached -r "$repo_path" -# else -# _config rm --cached "$repo_path" -# fi -# -# # Remove from the filesystem, passing the collected options -# eval "rm $rm_opts \"$file_path\"" -# -# echo "Removed: $file_path" -# done -# ;; -# sync) -# local direction="${1:-to-repo}"; shift -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ "$direction" == "to-repo" ]]; then -# if [[ -e "$sys_file" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# cp -a "$sys_file" "$full_repo_path" -# echo "Synced to repo: $sys_file" -# fi -# elif [[ "$direction" == "from-repo" ]]; then -# if [[ -e "$full_repo_path" && -n "$(diff "$full_repo_path" "$sys_file")" ]]; then -# local dest_dir="$(dirname "$sys_file")" -# if [[ "$sys_file" == "/etc"* || "$sys_file" == "/usr"* ]]; then -# _sudo_prompt cp -a "$full_repo_path" "$sys_file" -# else -# mkdir -p "$dest_dir" -# cp -a "$full_repo_path" "$sys_file" -# fi -# echo "Synced from repo: $sys_file" -# fi -# fi -# done -# ;; -# status) -# local auto_synced=() -# while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then -# if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then -# \cp -fa "$sys_file" "$full_repo_path" -# auto_synced+=("$repo_file") -# fi -# fi -# done < <(_config ls-files) -# if [[ ${#auto_synced[@]} -gt 0 ]]; then -# echo "=== Auto-synced Files ===" -# for repo_file in "${auto_synced[@]}"; do -# echo "synced: $(_sys_path "$repo_file") → $repo_file" -# done -# echo -# fi -# _config status -# echo -# ;; -# deploy) -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$full_repo_path" ]]; then -# if [[ -n "$sys_file" ]]; then -# local dest_dir="$(dirname "$sys_file")" -# if [[ "$sys_file" == "/etc"* || "$sys_file" == "/usr"* ]]; then -# _sudo_prompt mkdir -p "$dest_dir" -# _sudo_prompt cp -a "$full_repo_path" "$sys_file" -# else -# mkdir -p "$dest_dir" -# cp -a "$full_repo_path" "$sys_file" -# fi -# echo "Deployed: $repo_file -> $sys_file" -# fi -# fi -# done -# ;; -# backup) -# local timestamp=$(date +%Y%m%d%H%M%S) -# local backup_dir="$HOME/.dotfiles_backup/$timestamp" -# echo "Backing up existing dotfiles to $backup_dir..." -# -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# if [[ -e "$sys_file" ]]; then -# local dest_dir_full="$backup_dir/$(dirname "$repo_file")" -# mkdir -p "$dest_dir_full" -# cp -a "$sys_file" "$backup_dir/$repo_file" -# fi -# done -# echo "Backup complete. To restore, copy files from $backup_dir to their original locations." -# ;; -# *) -# _config "$cmd" "$@" -# ;; -# esac -# } -#fi - - -## Dotfiles Management System -#if [[ -d "$HOME/.cfg" && -d "$HOME/.cfg/refs" ]]; then -# -# # Detect OS -# case "$(uname -s)" in -# Linux) CFG_OS="linux" ;; -# Darwin) CFG_OS="macos" ;; -# MINGW*|MSYS*|CYGWIN*) CFG_OS="windows" ;; -# *) CFG_OS="other" ;; -# esac -# -# # Core git wrapper with repository as work-tree -# _config() { -# git --git-dir="$HOME/.cfg" --work-tree="$HOME/.cfg" "$@" -# } -# -# # Map system path to repository path -# _repo_path() { -# local f="$1" -# -# # Already in repo structure - return as-is -# case "$f" in -# linux/*|macos/*|windows/*|common/*|profile/*|.*) -# echo "$f" -# return -# ;; -# esac -# -# # Convert absolute path to relative from HOME -# [[ "$f" = "$HOME"* ]] && f="${f#$HOME/}" -# -# # Default: put under OS-specific home -# echo "$CFG_OS/home/$f" -# } -# -# # Map repository path back to system path -# _sys_path() { -# local repo_path="$1" -# -# case "$repo_path" in -# */home/*) -# echo "$HOME/${repo_path#*/home/}" -# ;; -# *) -# echo "/$repo_path" -# ;; -# esac -# } -# -# # Enhanced config command -# config() { -# local cmd="$1"; shift -# -# case "$cmd" in -# add) -# # Auto-sync before adding -# config auto-sync -# -# for f in "$@"; do -# # Convert to absolute path -# [[ "$f" != /* ]] && f="$HOME/$f" -# -# if [[ ! -e "$f" ]]; then -# echo "File not found: $f" >&2 -# continue -# fi -# -# # Get repository path -# local repo_path="$(_repo_path "$f")" -# local full_repo_path="$HOME/.cfg/$repo_path" -# -# # Create directory structure in repository -# mkdir -p "$(dirname "$full_repo_path")" -# -# # Copy file to repository structure -# cp "$f" "$full_repo_path" -# -# # Add to git using the structured path -# _config add "$repo_path" -# -# echo "Added: $f → $repo_path" -# done -# ;; -# -# rm) -# for f in "$@"; do -# local repo_path="$(_repo_path "$f")" -# _config rm "$repo_path" -# rm -f "$HOME/.cfg/$repo_path" -# echo "Removed: $f ($repo_path)" -# done -# ;; -# -# sync) -# # Sync files between home and repository structure -# local direction="${1:-to-repo}" # to-repo or from-repo -# shift -# -# if [[ $# -gt 0 ]]; then -# # Sync specific files -# for f in "$@"; do -# [[ "$f" != /* ]] && f="$HOME/$f" -# local repo_path="$(_repo_path "$f")" -# local full_repo_path="$HOME/.cfg/$repo_path" -# -# case "$direction" in -# to-repo) -# if [[ -e "$f" ]]; then -# mkdir -p "$(dirname "$full_repo_path")" -# cp "$f" "$full_repo_path" -# echo "Synced to repo: $f → $repo_path" -# fi -# ;; -# from-repo) -# if [[ -e "$full_repo_path" ]]; then -# mkdir -p "$(dirname "$f")" -# cp "$full_repo_path" "$f" -# echo "Synced from repo: $repo_path → $f" -# fi -# ;; -# esac -# done -# else -# # Sync all tracked files -# _config ls-files | while read -r repo_path; do -# local sys_path="$(_sys_path "$repo_path")" -# local full_repo_path="$HOME/.cfg/$repo_path" -# -# case "$direction" in -# to-repo) -# if [[ -e "$sys_path" ]]; then -# cp "$sys_path" "$full_repo_path" -# echo "Synced to repo: $sys_path → $repo_path" -# fi -# ;; -# from-repo) -# if [[ -e "$full_repo_path" ]]; then -# mkdir -p "$(dirname "$sys_path")" -# cp "$full_repo_path" "$sys_path" -# echo "Synced from repo: $repo_path → $sys_path" -# fi -# ;; -# esac -# done -# fi -# ;; -# -# status) -# # Auto-sync any modified files -# local auto_synced=() -# while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then -# if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then -# \cp -f "$sys_file" "$full_repo_path" -# auto_synced+=("$repo_file") -# fi -# fi -# done < <(_config ls-files) -# -# if [[ ${#auto_synced[@]} -gt 0 ]]; then -# echo "=== Auto-synced Files ===" -# for repo_file in "${auto_synced[@]}"; do -# echo "synced: $(_sys_path "$repo_file") → $repo_file" -# done -# echo -# fi -# -# echo "=== Git Status ===" -# _config status -# -# echo -# #echo "=== Path Mappings ===" -# #_config ls-files | while read -r repo_file; do -# # echo "$repo_file ↔ $(_sys_path "$repo_file")" -# #done -# ;; -# -# deploy) -# # Deploy from repository structure to system -# echo "Deploying dotfiles from repository structure..." -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# -# if [[ -e "$full_repo_path" ]]; then -# echo "Deploying: $repo_file → $sys_file" -# mkdir -p "$(dirname "$sys_file")" -# cp "$full_repo_path" "$sys_file" -# fi -# done -# ;; -# -# auto-sync) -# # Auto-sync all modified tracked files -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# local full_repo_path="$HOME/.cfg/$repo_file" -# -# if [[ -e "$sys_file" && -e "$full_repo_path" ]]; then -# if ! diff -q "$full_repo_path" "$sys_file" >/dev/null 2>&1; then -# cp "$sys_file" "$full_repo_path" -# echo "Auto-synced: $sys_file → $repo_file" -# fi -# fi -# done -# ;; -# -# ls-structure) -# # Show repository structure -# echo "Repository structure:" -# _config ls-files | sed 's|/[^/]*$|/|' | sort -u | while read -r dir; do -# echo " $dir" -# done -# ;; -# -# ls-mappings) -# # List all tracked files with mappings -# _config ls-files | while read -r repo_file; do -# local sys_file="$(_sys_path "$repo_file")" -# echo "$repo_file ↔ $sys_file" -# done -# ;; -# -# *) -# # Pass through to git -# _config "$cmd" "$@" -# ;; -# esac -# } -# -# # Completion -# _config_completion() { -# local cur="${COMP_WORDS[COMP_CWORD]}" -# case "${COMP_WORDS[1]}" in -# add|edit) -# COMPREPLY=($(compgen -f -- "$cur")) -# ;; -# sync) -# if [[ ${COMP_WORDS[2]} == "to-repo" || ${COMP_WORDS[2]} == "from-repo" ]]; then -# COMPREPLY=($(compgen -f -- "$cur")) -# else -# COMPREPLY=($(compgen -W "to-repo from-repo" -- "$cur")) -# fi -# ;; -# esac -# } -# -# compdef _config_completion config -# #complete -F _config_completion config -#fi - -# Git -# Use gh instead of git (fast GitHub command line client). -#if type gh >/dev/null; then -# alias git=gh -# if type compdef >/dev/null 2>/dev/null; then -# compdef gh=git -# fi -#fi -#check_gh_installed() { -# if command -v gh &> /dev/null; then -# return 0 # gh is installed -# else -# return 1 # gh is not installed -# fi -#} -# -## Set alias for git to gh if gh is installed -#if check_gh_installed; then -# alias git=gh -#fi - -# No arguments: `git status` -# With arguments: acts like `git` -g() { - if [ $# -gt 0 ]; then - git "$@" # If arguments are provided, pass them to git - else - git status # Otherwise, show git status - fi -} - -# Complete g like git -compdef g=git - -# Git alias commands -ga() { g add "$@"; } # ga: Add files to the staging area -gaw() { g add -A && g diff --cached -w | g apply --cached -R; } # gaw: Add all changes to the staging area and unstage whitespace changes -grm() { g rm "$@"; } -gb() { g branch "$@"; } # gb: List branches -gbl() { g branch -l "$@"; } # gbl: List local branches -gbD() { g branch -D "$@"; } # gbD: Delete a branch -gbu() { g branch -u "$@"; } # gbu: Set upstream branch -ge() { g clone "$@"; } -gc() { g commit "$@"; } # gc: Commit changes -gcm() { g commit -m "$@"; } # gcm: Commit with a message -gca() { g commit -a "$@"; } # gca: Commit all changes -gcaa() { g commit -a --amend "$@"; } # gcaa: Amend the last commit -gcam() { g commit -a -m "$@"; } # gcam: Commit all changes with a message -gce() { g commit -e "$@"; } # gce: Commit with message and allow editing -gcfu() { g commit --fixup "$@"; } # gcfu: Commit fixes in the context of the previous commit -gco() { g checkout "$@"; } # gco: Checkout a branch or file -gcob() { g checkout -b "$@"; } # gcob: Checkout a new branch -gcoB() { g checkout -B "$@"; } # gcoB: Checkout a new branch, even if it exists -gcp() { g cherry-pick "$@"; } # gcp: Cherry-pick a commit -gcpc() { g cherry-pick --continue "$@"; } # gcpc: Continue cherry-picking after resolving conflicts -gd() { g diff "$@"; } # gd: Show changes -#gd^() { g diff HEAD^ HEAD "$@"; } # gd^: Show changes between HEAD^ and HEAD -gds() { g diff --staged "$@"; } # gds: Show staged changes -gl() { g lg "$@"; } # gl: Show a customized log -glg() { g log --graph --decorate --all "$@"; } # glg: Show a customized log with graph -gls() { # Query `glog` with regex query. - query="$1" - shift - glog --pickaxe-regex "-S$query" "$@" -} -gdc() { g diff --cached "$@"; } # gdc: Show changes between the working directory and the index -gu() { g pull "$@"} # gu: Pull -gp() { g push "$@"} # gp: Push -gpom() { g push origin main "$@"; } # gpom: Push changes to origin main -gr() { g remote "$@"; } # gr: Show remote -gra() { g rebase --abort "$@"; } # gra: Abort a rebase -grb() { g rebase --committer-date-is-author-date "$@"; } # grb: Rebase with the author date preserved -grbom() { grb --onto master "$@"; } # grbom: Rebase onto master -grbasi() { g rebase --autosquash --interactive "$@"; } # grbasi: Interactive rebase with autosquash -grc() { g rebase --continue "$@"; } # grc: Continue a rebase -grs() { g restore --staged "$@"; } # grs: Restore changes staged for the next commit -grv() { g remote -v "$@"; } # grv: Show remote URLs after each name -grh() { g reset --hard "$@"; } # grh: Reset the repository and the working directory -grH() { g reset HEAD "$@"; } # grH: Reset the index but not the working directory -#grH^() { g reset HEAD^ "$@"; } # grH^: Reset the index and working directory to the state of the HEAD's first parent -gs() { g status -sb "$@"; } # gs: Show the status of the working directory and the index -gsd() { g stash drop "$@"; } # gsd: Drop a stash -gsl() { g stash list --date=relative "$@"; } # gsl: List all stashes -gsp() { g stash pop "$@"; } # gsp: Apply and remove a single stash -gss() { g stash show "$@"; } # gss: Show changes recorded in the stash as a diff -gst() { g status "$@"; } # gst: Show the status of the working directory and the index -gsu() { g standup "$@"; } # gsu: Customized standup command -gforgotrecursive() { g submodule update --init --recursive --remote "$@"; } # gforgotrecursive: Update submodules recursively -gfp() { g commit --amend --no-edit && g push --force-with-lease "$@"; } # gfp: Amending the last commit and force-pushing - -# Temporarily unset GIT_WORK_TREE -function git_without_work_tree() { - # Only proceed if a git command is being run - if [ "$1" = "git" ]; then - shift - # Check if the current directory is inside a Git work tree - if git rev-parse --is-inside-work-tree &>/dev/null; then - # If inside a work tree, temporarily unset GIT_WORK_TREE - GIT_WORK_TREE_OLD="$GIT_WORK_TREE" - unset GIT_WORK_TREE - git "$@" - export GIT_WORK_TREE="$GIT_WORK_TREE_OLD" - else - # If not inside a work tree, call git command directly - git "$@" - fi - else - # If it's not a git command, just execute it normally - command "$@" - fi -} - -# Set alias conditionally -#alias git='git_without_work_tree git' - -# Set bare dotfiles repository git environment variables dynamically -function set_git_env_vars() { - # Do nothing unless ~/.cfg exists and is a bare git repo - [[ -d "$HOME/.cfg" ]] || return - git --git-dir="$HOME/.cfg" rev-parse --is-bare-repository &>/dev/null || return - - # Skip if last command was a package manager - if [[ "${(%)${(z)history[1]}}" =~ ^(pacman|yay|apt|dnf|brew|npm|pip|gem|go|cargo) ]]; then - return - fi - - # Only set env vars if not already inside another Git repo - if ! git rev-parse --is-inside-work-tree &>/dev/null; then - export GIT_DIR="$HOME/.cfg" - export GIT_WORK_TREE="$(realpath ~)" - else - unset GIT_DIR - unset GIT_WORK_TREE - fi -} - -# Hook and initial call -function chpwd() { set_git_env_vars } -set_git_env_vars - -# Git Subtrees -function gsp() { - # Config file for subtrees - # - # Format: - # <prefix>;<remote address>;<remote branch> - # # Lines starting with '#' will be ignored - GIT_SUBTREE_FILE="$PWD/.gitsubtrees" - - if [ ! -f "$GIT_SUBTREE_FILE" ]; then - echo "Nothing to do - file <$GIT_SUBTREE_FILE> does not exist." - return - fi - - if ! command -v config &> /dev/null; then - echo "Error: 'config' command not found. Make sure it's available in your PATH." - return - fi - - OLD_IFS=$IFS - IFS=$'\n' - for LINE in $(cat "$GIT_SUBTREE_FILE"); do - - # Skip lines starting with '#'. - if [[ $LINE = \#* ]]; then - continue - fi - - # Parse the current line. - PREFIX=$(echo "$LINE" | cut -d';' -f 1) - REMOTE=$(echo "$LINE" | cut -d';' -f 2) - BRANCH=$(echo "$LINE" | cut -d';' -f 3) - - # Pull from the remote. - echo "Executing: git subtree pull --prefix=$PREFIX $REMOTE $BRANCH" - if git subtree pull --prefix="$PREFIX" "$REMOTE" "$BRANCH"; then - echo "Subtree pull successful for $PREFIX." - else - echo "Error: Subtree pull failed for $PREFIX." - fi - done - - IFS=$OLD_IFS -} - -# Print previous command into a file -getlast () { - fc -nl $((HISTCMD - 1)) -} - -# Copy the current command to a file -copy_command_to_file() { - # Only write the last command if BUFFER is not empty - if [[ -n "$BUFFER" ]]; then - echo "$BUFFER" > ~/command_log.txt # Overwrite with the latest command - else - # If the buffer is empty, remove the previous log file - command rm -f ~/command_log.txt # Optionally remove the log if no command is present - fi -} - -# Display the latest command from the log in the user input -display_latest_command() { - if [[ -f ~/command_log.txt ]]; then - # Read the last command from the log - local last_command - last_command=$(< ~/command_log.txt) - - # Only display if the last command is not empty - if [[ -n "$last_command" ]]; then - BUFFER="$last_command" # Set the BUFFER to the last command - CURSOR=${#BUFFER} # Set the cursor to the end of the command - fi - fi - zle reset-prompt # Refresh the prompt -} - -# Go up a directory -go_up() { - copy_command_to_file # Copy the current command to a file - BUFFER="" # Clear the current command line - cd .. || return # Change directory and return if it fails - display_latest_command # Display the latest command in the user input -} - -# Initialize a variable to store the previous directory -previous_dir="" - -# Function to change directories -go_into() { - copy_command_to_file # Copy the current command to a file - - # Use fzf or another tool to choose the directory - local dir - dir=$( (ls -d */; echo "Go Last directory:") | fzf --height 40% --reverse --tac) # Include previous directory as an option - - if [[ -n "$dir" ]]; then - # Check if the user selected the previous directory - if [[ "$dir" == Previous:* ]]; then - cd - || return # Change to the previous directory - else - cd "${dir%/}" || return # Change directory if a selection is made (remove trailing slash) - fi - - # Save the current directory to previous_dir - previous_dir=$(pwd) # Update previous_dir to current directory after changing - BUFFER="" # Clear the current command line - display_latest_command # Display the last command if available - fi -} - -# Register functions as ZLE widgets -zle -N go_up -zle -N go_into - - - - -# Enter directory and list contents -function cd-clear-ls() { - if [ -n "$1" ]; then - builtin cd "$@" 2>/dev/null || { echo "cd: no such file or directory: $1"; return 1; } - else - builtin cd ~ || return 1 - fi - - echo -e "\033[H\033[J" # Clear screen but keep scroll buffer - - if [ "$PWD" != "$HOME" ] && git rev-parse --is-inside-work-tree &>/dev/null; then - ls -a - else - ls - fi -} - -# cd using "up n" as a command up as many directories, example "up 3" -up() { - # default parameter to 1 if non provided - declare -i d=${@:-1} - # ensure given parameter is non-negative. Print error and return if it is - (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1; - # remove last d directories from pwd, append "/" in case result is empty - cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/"; -} - -# cd into $XDG_CONFIG_HOME/$1 directory -c() { - local root=${XDG_CONFIG_HOME:-~/.config} - local dname="$root/$1" - if [[ ! -d "$dname" ]]; then - return - fi - cd "$dname" -} - -# Make and cd into directory and any parent directories -mkcd () { - if [[ -z "$1" ]]; then - echo "Usage: mkcd <dir>" 1>&2 - return 1 - fi - mkdir -p "$1" - cd "$1" -} - -bak() { - if [[ -e "$1" ]]; then - echo "Found: $1" - mv "${1%.*}"{,.bak} - elif [[ -e "$1.bak" ]]; then - echo "Found: $1.bak" - mv "$1"{.bak,} - fi -} - -back() { - for file in "$@"; do - cp -r "$file" "$file".bak - done -} - -# tre is a shorthand for tree -tre() { - tree -aC -I \ - '.git|.hg|.svn|.tmux|.backup|.vim-backup|.swap|.vim-swap|.undo|.vim-undo|*.bak|tags' \ - --dirsfirst "$@" \ - | less -} - -# switch from/to project/package dir -pkg() { - if [ "$#" -eq 2 ]; then - ln -s "$(readlink -f $1)" "$(readlink -f $2)"/._pkg - ln -s "$(readlink -f $2)" "$(readlink -f $1)"/._pkg - else - cd "$(readlink -f ./._pkg)" - fi -} - -# Prepare C/C++ project for Language Server Protoco -lsp-prep() { - (cd build && cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON) \ - && ln -sf build/compile_commands.json -} - -reposize() { - url=`echo $1 \ - | perl -pe 's#(?:https?://github.com/)([\w\d.-]+\/[\w\d.-]+).*#\1#g' \ - | perl -pe 's#git\@github.com:([\w\d.-]+\/[\w\d.-]+)\.git#\1#g' - ` - printf "https://github.com/$url => " - curl -s https://api.github.com/repos/$url \ - | jq '.size' \ - | numfmt --to=iec --from-unit=1024 -} - -# Launch a program in a terminal without getting any output, -# and detache the process from terminal -# (can then close the terminal without terminating process) --echo() { - "$@" &> /dev/null & disown -} - -# Reload shell -function reload() { - local compdump_files="$ZDOTDIR/.zcompdump*" - - if ls $compdump_files &> /dev/null; then - rm -f $compdump_files - fi - - exec $SHELL -l -} - -#pom() { -# local -r HOURS=${1:?} -# local -r MINUTES=${2:-0} -# local -r POMODORO_DURATION=${3:-25} -# -# bc <<< "(($HOURS * 60) + $MINUTES) / $POMODORO_DURATION" -#} - -#mnt() { -# local FILE="/mnt/external" -# if [ ! -z $2 ]; then -# FILE=$2 -# fi -# -# if [ ! -z $1 ]; then -# sudo mount "$1" "$FILE" -o rw -# echo "Device in read/write mounted in $FILE" -# fi -# -# if [ $# = 0 ]; then -# echo "You need to provide the device (/dev/sd*) - use lsblk" -# fi -#} -# -#umnt() { -# local DIRECTORY="/mnt" -# if [ ! -z $1 ]; then -# DIRECTORY=$1 -# fi -# MOUNTED=$(grep $DIRECTORY /proc/mounts | cut -f2 -d" " | sort -r) -# cd "/mnt" -# sudo umount $MOUNTED -# echo "$MOUNTED unmounted" -#} - -mntmtp() { - local DIRECTORY="$HOME/mnt" - if [ ! -z $2 ]; then - local DIRECTORY=$2 - fi - if [ ! -d $DIRECTORY ]; then - mkdir $DIRECTORY - fi - - if [ ! -z $1 ]; then - simple-mtpfs --device "$1" "$DIRECTORY" - echo "MTPFS device in read/write mounted in $DIRECTORY" - fi - - if [ $# = 0 ]; then - echo "You need to provide the device number - use simple-mtpfs -l" - fi -} - -umntmtp() { - local DIRECTORY="$HOME/mnt" - if ; then - DIRECTORY=$1 - fi - cd $HOME - umount $DIRECTORY - echo "$DIRECTORY with mtp filesystem unmounted" -} -duckduckgo() { - lynx -vikeys -accept_all_cookies "https://lite.duckduckgo.com/lite/?q=$@" -} - -wikipedia() { - lynx -vikeys -accept_all_cookies "https://en.wikipedia.org/wiki?search=$@" -} -#function filesize() { -# # Check if 'du' supports the -b option, which provides sizes in bytes. -# if du -b /dev/null > /dev/null 2>&1; then -# local arg=-sbh; # If supported, use -sbh options for 'du'. -# else -# local arg=-sh; # If not supported, use -sh options for 'du'. -# fi -# -# # Check if no arguments are provided. -# if [ "$#" -eq 0 ]; then -# # Calculate and display sizes for all files and directories in cwd. -# du $arg ./* -# else -# # Calculate and display sizes for the specified files and directories. -# du $arg -- "$@" -# fi -#} -# - -fgl() { - git log --graph --color=always \ - --format="%C(auto)%h%d %s %C(black)%C(bold)%cr" "$@" | - fzf --ansi --no-sort --reverse --tiebreak=index --bind=ctrl-s:toggle-sort \ - --bind "ctrl-m:execute: - (grep -o '[a-f0-9]\{7\}' | head -1 | - xargs -I % sh -c 'git show --color=always % | less -R') << 'FZF-EOF' - {} -FZF-EOF" -} - -fgb() { - local branches branch - branches=$(git --no-pager branch -vv) && - branch=$(echo "$branches" | fzf +m) && - git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //") -} - -# +--------+ -# | Pacman | -# +--------+ - -# TODO can improve that with a bind to switch to what was installed -fpac() { - pacman -Slq | fzf --multi --reverse --preview 'pacman -Si {1}' | xargs -ro sudo pacman -S -} - -fyay() { - yay -Slq | fzf --multi --reverse --preview 'yay -Si {1}' | xargs -ro yay -S -} - -# +------+ -# | tmux | -# +------+ - -fmux() { - prj=$(find $XDG_CONFIG_HOME/tmuxp/ -execdir bash -c 'basename "${0%.*}"' {} ';' | sort | uniq | nl | fzf | cut -f 2) - echo $prj - [ -n "$prj" ] && tmuxp load $prj -} - -# ftmuxp - propose every possible tmuxp session -ftmuxp() { - if [[ -n $TMUX ]]; then - return - fi - - # get the IDs - ID="$(ls $XDG_CONFIG_HOME/tmuxp | sed -e 's/\.yml$//')" - if [[ -z "$ID" ]]; then - tmux new-session - fi - - create_new_session="Create New Session" - - ID="${create_new_session}\n$ID" - ID="$(echo $ID | fzf | cut -d: -f1)" - - if [[ "$ID" = "${create_new_session}" ]]; then - tmux new-session - elif [[ -n "$ID" ]]; then - # Change name of urxvt tab to session name - printf '\033]777;tabbedx;set_tab_name;%s\007' "$ID" - tmuxp load "$ID" - fi -} - -# ftmux - help you choose tmux sessions -ftmux() { - if [[ ! -n $TMUX ]]; then - # get the IDs - ID="`tmux list-sessions`" - if [[ -z "$ID" ]]; then - tmux new-session - fi - create_new_session="Create New Session" - ID="$ID\n${create_new_session}:" - ID="`echo $ID | fzf | cut -d: -f1`" - if [[ "$ID" = "${create_new_session}" ]]; then - tmux new-session - elif [[ -n "$ID" ]]; then - printf '\033]777;tabbedx;set_tab_name;%s\007' "$ID" - tmux attach-session -t "$ID" - else - : # Start terminal normally - fi - fi -} - -# +-------+ -# | Other | -# +-------+ - -# List install files for dotfiles -fdot() { - file=$(find "$DOTFILES/install" -exec basename {} ';' | sort | uniq | nl | fzf | cut -f 2) - [ -n "$file" ] && "$EDITOR" "$DOTFILES/install/$file" -} - -# List projects -fwork() { - result=$(find ~/workspace/* -type d -prune -exec basename {} ';' | sort | uniq | nl | fzf | cut -f 2) - [ -n "$result" ] && cd ~/workspace/$result -} - -# Open pdf with Zathura -fpdf() { - result=$(find -type f -name '*.pdf' | fzf --bind "ctrl-r:reload(find -type f -name '*.pdf')" --preview "pdftotext {} - | less") - [ -n "$result" ] && nohup zathura "$result" &> /dev/null & disown -} - -# Open epubs with Zathura -fepub() { - result=$(find -type f -name '*.epub' | fzf --bind "ctrl-r:reload(find -type f -name '*.epub')") - [ -n "$result" ] && nohup zathura "$result" &> /dev/null & disown -} - -# Search and find directories in the dir stack -fpop() { - # Only work with alias d defined as: - - # alias d='dirs -v' - # for index ({1..9}) alias "$index"="cd +${index}"; unset index - - d | fzf --height="20%" | cut -f 1 | source /dev/stdin -} - -#ip() { -# emulate -LR zsh -# -# if [[ $1 == 'get' ]]; then -# res=$(curl -s ipinfo.io/ip) -# echo -n $res | xsel --clipboard -# echo "copied $res to clipboard" -# # only run ip if it exists -# elif (( $+commands[ip] )); then -# command ip $* -# fi -#} - -ssh-create() { - if [ ! -z "$1" ]; then - ssh-keygen -f $HOME/.ssh/$1 -t rsa -N '' -C "$1" - chmod 700 $HOME/.ssh/$1* - fi -} - -guest() { - local guest="$1" - shift - - local port - if [[ "$#" -ge 2 && "${@: -1}" =~ ^[0-9]+$ ]]; then - port="${@: -1}" - set -- "${@:1:$(($#-1))}" - fi - - if [[ -z "$guest" || "$#" -lt 1 ]]; then - echo "Send file(s) or directories to remote machine" - echo "Usage: guest <guest-alias> <file-or-directory>... [port]" - return 1 - fi - - # Auto-detect port - if [[ -z "$port" ]]; then - if nc -z localhost 22220 2>/dev/null; then - port=22220 - elif nc -z localhost 22 2>/dev/null; then - port=22 - else - echo "No known SSH port (22220 or 22) is open. Specify a port manually." - return 1 - fi - fi - - for src in "$@"; do - src="${src/#\~/$HOME}" - if [[ ! -e "$src" ]]; then - echo "Error: '$src' does not exist." - continue - fi - - local abs_path dest_dir rel_dir rsync_src rsync_dest - - abs_path=$(realpath "$src") - rel_dir="${abs_path#$HOME/}" - dest_dir=$(dirname "$rel_dir") - - # Ensure target dir exists remotely - ssh -p "$port" "$guest" "mkdir -p ~/$dest_dir" - - if [[ -d "$src" ]]; then - # Add trailing slash to copy contents instead of nesting the dir - rsync_src="${src%/}/" - rsync_dest="~/$rel_dir/" - else - rsync_src="$src" - rsync_dest="~/$dest_dir/" - fi - - echo "Sending '$src' to '$guest:$rsync_dest'..." - rsync -avz -e "ssh -p $port" "$rsync_src" "$guest:$rsync_dest" - done -} -historystat() { - history 0 | awk '{print $2}' | sort | uniq -c | sort -n -r | head -} - -promptspeed() { - for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done -} - -#matrix () { -# local lines=$(tput lines) -# cols=$(tput cols) -# -# awkscript=' -# { -# letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()" -# lines=$1 -# random_col=$3 -# c=$4 -# letter=substr(letters,c,1) -# cols[random_col]=0; -# for (col in cols) { -# line=cols[col]; -# cols[col]=cols[col]+1; -# printf "\033[%s;%sH\033[2;32m%s", line, col, letter; -# printf "\033[%s;%sH\033[1;37m%s\033[0;0H", cols[col], col, letter; -# if (cols[col] >= lines) { -# cols[col]=0; -# } -# } -# } -# ' -# -# echo -e "\e[1;40m" -# clear -# -# while :; do -# echo $lines $cols $(( $RANDOM % $cols)) $(( $RANDOM % 72 )) -# sleep 0.05 -# done | awk "$awkscript" -#} - -matrix() { - local lines=$(tput lines) - cols=$(tput cols) - - # Check if tmux is available - if command -v tmux > /dev/null; then - # Save the current status setting - local status_setting=$(tmux show -g -w -v status) - - # Turn off tmux status - tmux set -g status off - else - echo "tmux is not available. Exiting." - return 1 - fi - - # Function to restore terminal state - restore_terminal() { - # Clear the screen - clear - - # Bring back tmux status to its original setting - if command -v tmux > /dev/null; then - tmux set -g status "$status_setting" - fi - } - - trap 'restore_terminal' INT - - awkscript=' - { - letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()" - lines=$1 - random_col=$3 - c=$4 - letter=substr(letters,c,1) - cols[random_col]=0; - for (col in cols) { - line=cols[col]; - cols[col]=cols[col]+1; - printf "\033[%s;%sH\033[2;32m%s", line, col, letter; - printf "\033[%s;%sH\033[1;37m%s\033[0;0H", cols[col], col, letter; - if (cols[col] >= lines) { - cols[col]=0; - } - } - } - ' - - echo -e "\e[1;40m" - clear - - while :; do - echo $lines $cols $(( $RANDOM % $cols)) $(( $RANDOM % 72 )) - sleep 0.05 - done | awk "$awkscript" - - # Restore terminal state - restore_terminal -} - -## Reload shell -function reload() { - local compdump_files="$ZDOTDIR/.zcompdump*" - - if ls $compdump_files &> /dev/null; then - rm -f $compdump_files - fi - - exec $SHELL -l -} -## Generate a secure password -function passgen() { - LC_ALL=C tr -dc ${1:-"[:graph:]"} < /dev/urandom | head -c ${2:-20} -} -## Encode/Decode string using base64 -function b64e() { - echo "$@" | base64 -} - -function b64d() { - echo "$@" | base64 -D -} -# Search through all man pages -function fman() { - man -k . | fzf -q "$1" --prompt='man> ' --preview $'echo {} | tr -d \'()\' | awk \'{printf "%s ", $2} {print $1}\' | xargs -r man' | tr -d '()' | awk '{printf "%s ", $2} {print $1}' | xargs -r man -} -# Back up a file. Usage "backupthis <filename>" -backupthis() { - cp -riv $1 ${1}-$(date +%Y%m%d%H%M).backup; -} - -# Spawn a clone of current terminal -putstate () { - declare +x >~/environment.tmp - declare -x >>~/environment.tmp - echo cd "$PWD" >>~/environment.tmp -} - -getstate () { - . ~/environment.tmp -} - - -# Tmux layout -openSession () { - tmux split-window -h -t - tmux split-window -v -t - tmux resize-pane -U 5 -} - -# archive compress -compress() { - if [[ -n "$1" ]]; then - local file=$1 - shift - case "$file" in - *.tar ) tar cf "$file" "$*" ;; - *.tar.bz2 ) tar cjf "$file" "$*" ;; - *.tar.gz ) tar czf "$file" "$*" ;; - *.tgz ) tar czf "$file" "$*" ;; - *.zip ) zip "$file" "$*" ;; - *.rar ) rar "$file" "$*" ;; - * ) tar zcvf "$file.tar.gz" "$*" ;; - esac - else - echo 'usage: compress <foo.tar.gz> ./foo ./bar' - fi -} - -extract() { - if [[ -f "$1" ]] ; then - local filename - filename=$(basename "$1") - local foldername="${filename%%.*}" - local fullpath - fullpath=$(perl -e 'use Cwd "abs_path";print abs_path(shift)' "$1") - local didfolderexist=false - - if [[ -d "$foldername" ]]; then - didfolderexist=true - read -p "$foldername already exists, do you want to overwrite it? (y/n) " -n 1 - echo - if [[ "$REPLY" =~ ^[Nn]$ ]]; then - return - fi - fi - - mkdir -p "$foldername" && cd "$foldername" || return - - case "$1" in - *.tar.bz2) tar xjf "$fullpath" ;; - *.tar.gz) tar xzf "$fullpath" ;; - *.tar.xz) tar Jxf "$fullpath" ;; - *.tar.Z) tar xzf "$fullpath" ;; - *.tar) tar xf "$fullpath" ;; - *.taz) tar xzf "$fullpath" ;; - *.tb2) tar xjf "$fullpath" ;; - *.tbz) tar xjf "$fullpath" ;; - *.tbz2) tar xjf "$fullpath" ;; - *.tgz) tar xzf "$fullpath" ;; - *.txz) tar Jxf "$fullpath" ;; - *.rar) unrar x -o+ "$fullpath" >/dev/null ;; - *.zip) unzip -o "$fullpath" ;; - *) - echo "'$1' cannot be extracted via extract()" \ - && cd .. \ - && ! "$didfolderexist" \ - && rm -r "$foldername" - ;; - esac - else - echo "'$1' is not a valid file" - fi -} -## Extract with one command -#extract () { -# if [ -f $1 ] ; then -# case $1 in -# *.tar.bz2) tar xjf $1 ;; -# *.tar.gz) tar xzf $1 ;; -# *.bz2) bunzip2 $1 ;; -# *.rar) rar x $1 ;; -# *.gz) gunzip $1 ;; -# *.tar) tar xf $1 ;; -# *.tbz2) tar xjf $1 ;; -# *.tgz) tar xzf $1 ;; -# *.zip) unzip $1 ;; -# *.Z) uncompress $1 ;; -# *.7z) 7z x $1 ;; -# *) echo "'$1' cannot be extracted via extract()" ;; -# esac -# else -# echo "'$1' is not a valid file" -# fi -#} - -ports() { - local result - result=$(sudo netstat -tulpn | grep LISTEN) - echo "$result" | fzf -} - -trash() { - case "$1" in - --list) - ls -A1 ~/.local/share/Trash/files/ - ;; - --empty) - ls -A1 ~/.local/share/Trash/files/ && \rm -rfv ~/.local/share/Trash/files/* - ;; - --restore) - gio trash --restore "$(gio trash --list | fzf | cut -f 1)" - ;; - --delete) - trash_files=$(ls -A ~/.local/share/Trash/files/ | fzf --multi); echo $trash_files | xargs -I {} rm -rf ~/.local/share/Trash/files/{} - ;; - *) - gio trash "$@" - ;; - esac -} - -what() { - type "$1" - echo "$PATH" -} - -shutdown() { - if [ "$#" -eq 0 ]; then - sudo /sbin/shutdown -h now - else - sudo /sbin/shutdown -h "$@" - fi -} - -windowManagerName () { - local window=$( - xprop -root -notype - ) - - local identifier=$( - echo "${window}" | - awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}' - ) - - local attributes=$( - xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t - ) - - local name=$( - echo "${attributes}" | - grep "_NET_WM_NAME = " | - cut --delimiter=' ' --fields=3 | - cut --delimiter='"' --fields=2 - ) - - echo "${name}" -} - -logout() { - local wm - wm="$(windowManagerName)" - if [[ -n "$wm" ]]; then - echo "Logging out by killing window manager: $wm" - pkill "$wm" - else - echo "No window manager detected!" >&2 - fi -} - -# Gentoo -emg() { - if [[ -z "$1" ]]; then - echo "Usage: emg [USE_FLAGS] package [package...]" - return 1 - fi - - if [[ "$1" =~ ^[^-].* ]]; then - local use_flags="$1" - shift - sudo USE="$use_flags" emerge -av "$@" - else - sudo emerge -av "$@" - fi -} - -# Remove command from history -forget () { # Accepts one history line number as argument or search term - if [[ -z "$1" ]]; then - echo "Usage: hist <history_number> | hist -s <search_term>" - return 1 - fi - - if [[ "$1" == "-s" ]]; then - if [[ -z "$2" ]]; then - echo "Usage: hist -s <search_term>" - return 1 - fi - - local search_term="$2" - - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - LC_ALL=C sed -i "/${search_term}/d" "$HISTFILE" # GNU sed - else - LC_ALL=C sed -i '' "/${search_term}/d" "$HISTFILE" # BSD/macOS sed - fi - - fc -R "$HISTFILE" - echo "Deleted all history entries matching '$search_term'." - else - local num=$1 - local cmd=$(fc -ln $num $num 2>/dev/null) - - if [[ -z "$cmd" ]]; then - echo "No history entry found for index $num" - return 1 - fi - - history -d $num - - local escaped_cmd=$(echo "$cmd" | sed 's/[\/&]/\\&/g') - - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - LC_ALL=C sed -i "/${escaped_cmd}/d" "$HISTFILE" - else - LC_ALL=C sed -i '' "/${escaped_cmd}/d" "$HISTFILE" - fi - - fc -R "$HISTFILE" - echo "Deleted '$cmd' from history." - fi -} - -# Remove hist command itself -remove_hist_command() { - [[ $1 != 'hist '* ]] -} - -remove_hist_command - - -search() { - # Search for a pattern in the specified directory (non-recursive). - dir="${1:-.}" - ls -1 "$dir" | grep -i "$2" -} - -deepsearch() { - # Perform a recursive search for a pattern in the specified directory. - dir="${1:-.}" - find "$dir" -iname "$2" -} - -notes() { - local base_dir="$HOME/documents/main/" - - if [[ -z "$1" ]]; then - # No argument → cd to notes directory - cd "$base_dir" || return - return - fi - - local target="$1" # The argument itself - - # Use find to check if the file exists anywhere in the base directory - local found_files=($(find "$base_dir" -type f -name "$target")) - - if [[ ${#found_files[@]} -eq 1 ]]; then - # Only one match found, open it directly - $EDITOR "${found_files[0]}" - elif [[ ${#found_files[@]} -gt 1 ]]; then - # Multiple files found, prompt the user to select one - echo "Multiple files found for '$target'. Please choose one:" - PS3="Please enter a number to select a file (1-${#found_files[@]}): " - select selected_file in "${found_files[@]}"; do - if [[ -n "$selected_file" ]]; then - $EDITOR "$selected_file" - break - else - echo "Invalid selection, try again." - fi - done - else - # If no match found, search for a directory - local found_dir=$(find "$base_dir" -type d -name "$target" -print -quit) - - if [[ -n "$found_dir" ]]; then - # Directory found, cd into it - cd "$found_dir" || return - else - # If no match found, create the file and open it - local full_target="$base_dir/$target" - mkdir -p "$(dirname "$full_target")" - $EDITOR "$full_target" - fi - fi -} - -# Enable tab completion for files and directories -_notes_complete() { - local base_dir="$HOME/documents/main" - compadd -o nospace -- $(find "$base_dir" -type f -o -type d -printf '%P\n') -} - -compdef _notes_complete notes - - -ship() { - local binary_dir="$HOME/.local/share" - local bin_symlink_dir="$HOME/.local/bin" - local project_dirs=( - "$HOME/projects/" - "$HOME/src/" - "$HOME/src/site/" - ) - - mkdir -p "$binary_dir" "$bin_symlink_dir" - - local project_dir="" - - if [[ -n "$1" ]]; then - # Project name specified - for dir in "${project_dirs[@]}"; do - if [[ -d "$dir/$1" ]]; then - project_dir="$dir/$1" - break - fi - done - - if [[ -z "$project_dir" ]]; then - echo "Project '$1' not found." - return 1 - fi - else - # No argument: pick latest edited - local bin_file - bin_file=$(find "${project_dirs[@]}" -type f -name "Cargo.toml" -exec stat --format="%Y %n" {} \; 2>/dev/null | sort -nr | head -n1 | cut -d' ' -f2-) - - if [[ -z "$bin_file" ]]; then - echo "No Cargo.toml found." - return 1 - fi - - project_dir=$(dirname "$bin_file") - fi - - cd "$project_dir" || return - echo "Building project in $project_dir..." - - # Build it - cargo build --release || { echo "Build failed"; return 1; } - - # Assume binary has same name as project dir - local binary_name - binary_name=$(basename "$project_dir") - local built_binary="target/release/$binary_name" - - if [[ -x "$built_binary" ]]; then - echo "Copying $built_binary to $binary_dir/$binary_name" - cp "$built_binary" "$binary_dir/$binary_name" - - # Create/Update symlink - local symlink_path="$bin_symlink_dir/$binary_name" - ln -sf "$binary_dir/$binary_name" "$symlink_path" - - echo "Binary is now at: $binary_dir/$binary_name" - echo "Symlink created at: $symlink_path" - else - echo "Built binary not found: $built_binary" - echo "You may need to manually specify the output binary." - fi -} - - -forge() { - - local install=no - local usage="Usage: forge [--install]" - - # Handle --install flag - if [[ "$1" == "--install" ]]; then - install=yes - shift - elif [[ "$1" == "-h" || "$1" == "--help" ]]; then - echo "$usage" - return 0 - fi - - if [[ -f "CMakeLists.txt" ]]; then - echo "📦 CMake project detected" - [[ ! -d build ]] && mkdir build - cmake -B build -DCMAKE_BUILD_TYPE=Release || return 1 - cmake --build build || return 1 - [[ "$install" == "yes" ]] && sudo cmake --install build - - elif [[ -f "meson.build" ]]; then - echo "📦 Meson project detected" - if [[ ! -d build ]]; then - meson setup build || return 1 - fi - ninja -C build || return 1 - [[ "$install" == "yes" ]] && sudo ninja -C build install - - elif [[ -f "Makefile" ]]; then - echo "📦 Makefile project detected" - # Try `make all`, fallback to `make` if `all` fails - if make -q all 2>/dev/null; then - make all || return 1 - else - make || return 1 - fi - [[ "$install" == "yes" ]] && sudo make install - - else - echo "❌ No supported build system found." - return 1 - fi -} - -windows_home() { - for dir in /mnt/windows/Users/*(N); do - base=${dir:t} # `:t` is zsh's "tail" = basename - if [[ -d $dir && ! $base =~ ^(All Users|Default|Default User|Public|nx|desktop.ini)$ ]]; then - echo "$dir" - return 0 - fi - done - return 1 -} - -if winhome_path=$(windows_home); then - hash -d winhome="$winhome_path" -fi diff --git a/linux/home/.config/zsh/user/options.zsh b/linux/home/.config/zsh/user/options.zsh deleted file mode 100644 index 7115641..0000000 --- a/linux/home/.config/zsh/user/options.zsh +++ /dev/null @@ -1,105 +0,0 @@ -## Let FZF use ripgrep by default -#if type rg &> /dev/null; then -# export FZF_DEFAULT_COMMAND='rg --files' -# export FZF_DEFAULT_OPTS='-m --height 50% --border' -#fi - - -# Allow nnn filemanager to cd on quit -nnn() { - declare -x +g NNN_TMPFILE=$(mktemp --tmpdir $0.XXXX) - trap "command rm -f $NNN_TMPFILE" EXIT - =nnn $@ - [ -s $NNN_TMPFILE ] && source $NNN_TMPFILE -} - -FUNCNEST=999 - -# NVM -#nvm() { -# local green_color -# green_color=$(tput setaf 2) -# local reset_color -# reset_color=$(tput sgr0) -# echo -e "${green_color}nvm${reset_color} $@" -#} -if [ -s "$NVM_DIR/nvm.sh" ]; then - nvm_cmds=(nvm node npm yarn) - for cmd in "${nvm_cmds[@]}"; do - alias "$cmd"="unalias ${nvm_cmds[*]} && unset nvm_cmds && . $NVM_DIR/nvm.sh && $cmd" - done -fi - -# Kubernetes -# kubernetes aliases -if command -v kubectl > /dev/null; then - replaceNS() { kubectl config view --minify --flatten --context=$(kubectl config current-context) | yq ".contexts[0].context.namespace=\"$1\"" ; } - alias kks='KUBECONFIG=<(replaceNS "kube-system") kubectl' - alias kam='KUBECONFIG=<(replaceNS "authzed-monitoring") kubectl' - alias kas='KUBECONFIG=<(replaceNS "authzed-system") kubectl' - alias kar='KUBECONFIG=<(replaceNS "authzed-region") kubectl' - alias kt='KUBECONFIG=<(replaceNS "tenant") kubectl' - - if command -v kubectl-krew > /dev/null; then - path=($XDG_CONFIG_HOME/krew/bin $path) - fi - - rmfinalizers() { - kubectl get deployment "$1" -o json | jq '.metadata.finalizers = null' | kubectl apply -f - - } -fi - - -castero() { - if [[ -f ~/.local/share/venv/bin/activate ]]; then - . ~/.local/share/venv/bin/activate - fi - command castero "$@" -} - -# --- Detect terminal control characters and behavior --- - -# Set these to true/false to run on every new tmux/terms -: ${CHECK_ON_TMUX_CHANGES:=false} -: ${CHECK_ON_NEW_INSTANCES:=false} - -# Fast terminal fingerprinting for optimizing prompt rendering -function initialize_terminal_fingerprint() { - # --- Fast terminal fingerprint --- - TERM_BASIC="$TERM-$COLORTERM" - TERM_TMUX="" - [[ "$CHECK_ON_TMUX_CHANGES" == "true" && -n "$TMUX" ]] && TERM_TMUX="-tmux$TMUX_PANE" - TERM_INSTANCE="" - [[ "$CHECK_ON_NEW_INSTANCES" == "true" ]] && TERM_INSTANCE="-$$" - # Combine fingerprint parts only if they're non-empty (faster than function call) - CURRENT_TERM_FINGERPRINT="${TERM_BASIC}${TERM_TMUX}${TERM_INSTANCE}" - # Only run detection if terminal has changed (single comparison) - if [[ "$CURRENT_TERM_FINGERPRINT" != "$LAST_TERM_FINGERPRINT" ]]; then - export LAST_TERM_FINGERPRINT="$CURRENT_TERM_FINGERPRINT" - # Fast reset - export CTRL_C_SIGINT=false - export CTRL_V_PASTE=false - # Fast SIGINT check (single command, no pipes) - INTR_CHAR=$(stty -a 2>/dev/null | sed -n 's/.*intr = \([^;]*\);.*/\1/p' | tr -d ' ') - [[ "$INTR_CHAR" == "^C" ]] && export CTRL_C_SIGINT=true - # Check if Ctrl+V is bound to lnext terminal function - LNEXT_CHAR=$(stty -a 2>/dev/null | sed -n 's/.*lnext = \([^;]*\);.*/\1/p' | tr -d ' ') - # If lnext is NOT ^V, then Ctrl+V might work as paste - if [[ "$LNEXT_CHAR" != "^V" ]]; then - # Check if clipboard tools exist - if [[ -n "$WAYLAND_DISPLAY" && -x "$(command -v wl-paste)" ]]; then - export CTRL_V_PASTE=true - elif [[ -n "$DISPLAY" && -x "$(command -v xclip)" ]]; then - export CTRL_V_PASTE=true - fi - fi - # Print status only if debug is enabled - [[ -n "$DEBUG_TERM_DETECT" ]] && echo "Terminal: CTRL_C_SIGINT=$CTRL_C_SIGINT CTRL_V_PASTE=$CTRL_V_PASTE" - fi -} - -# Initialize terminal fingerprint on startup -initialize_terminal_fingerprint - -# Register Bun completion -fpath=("$HOME/.bun" $fpath) diff --git a/linux/home/.config/zsh/user/prompt.zsh b/linux/home/.config/zsh/user/prompt.zsh deleted file mode 100644 index b8b1b97..0000000 --- a/linux/home/.config/zsh/user/prompt.zsh +++ /dev/null @@ -1,678 +0,0 @@ -#!/bin/zsh - -########## Prompt(s) ########## - -# Autoload necessary functions for vcs_info and coloring -autoload -Uz vcs_info -autoload -Uz add-zsh-hook -autoload -U colors && colors - -# Enable prompt substitution -setopt prompt_subst - -# Display git branch status and color -precmd_vcs_info() { vcs_info } - -# Add vcs_info to precmd functions -precmd_functions+=( precmd_vcs_info ) - -# Manipulates cursor position: moves down by 2 lines, saves position, and restores cursor after an operation. -terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1] - -# Track last executed command for exit code display -typeset -g _last_executed_command="" -typeset -g _cmd_start_time=0 -typeset -g _cmd_end_time=0 -typeset -g _cmd_duration=0 -typeset -g _spinner_idx=0 -typeset -ga _spinner_frames=('⣾' '⣽' '⣻' '⢿' '⡿' '⣟' '⣯' '⣷') -typeset -g _cmd_is_running=0 -typeset -g _show_spinner=0 -typeset -g _SPINNER_DELAY=5 # Only show spinner after 5 seconds -typeset -g _FINISHED_DELAY=10 # Only show finished message after 10 seconds - -# Register the ZLE widget for spinner updates - do this early -zle -N update_spinner - -# Cache git information to avoid repeated expensive operations -typeset -g _git_cached_info="" -typeset -g _git_cache_timestamp=0 -typeset -g _git_cache_lifetime=2 # seconds before cache expires - -# Calculate how much space is available for the prompt components -function available_space() { - local width=${COLUMNS:-80} - echo $width -} - -# Check if we need to abbreviate git info -function need_to_abbreviate_git() { - local available=$(available_space) - local vi_mode_len=13 # Length of "-- INSERT --" - local prompt_base_len=20 # Base prompt elements length - local path_len=${#${PWD/#$HOME/\~}} - local git_full_len=0 - - # Try to estimate git info length if available - if git rev-parse --is-inside-work-tree &>/dev/null; then - local branch=$(git symbolic-ref --short HEAD 2>/dev/null) - git_full_len=${#branch} - - # Add length for status indicators - if [[ -n "$(git status --porcelain)" ]]; then - # Rough estimate for status text - git_full_len=$((git_full_len + 20)) - fi - fi - - # Calculate total space needed - local total_needed=$((vi_mode_len + prompt_base_len + path_len + git_full_len)) - - # Determine if we need to abbreviate - if [[ $total_needed -gt $available ]]; then - return 0 # Need to abbreviate - else - return 1 # Don't need to abbreviate - fi -} - -# Custom git branch coloring based on status -git_branch_test_color() { - local now=$(date +%s) - local cache_age=$((now - _git_cache_timestamp)) - - # Use cached value if available and not expired - if [[ -n "$_git_cached_info" && $cache_age -lt $_git_cache_lifetime ]]; then - echo "$_git_cached_info" - return - fi - - local ref=$(git symbolic-ref --short HEAD 2> /dev/null) - if [ -n "${ref}" ]; then - if [ -n "$(git status --porcelain)" ]; then - local gitstatuscolor='%F{green}' - else - local gitstatuscolor='%F{82}' - fi - _git_cached_info="${gitstatuscolor}${ref}" - _git_cache_timestamp=$now - echo "$_git_cached_info" - else - _git_cached_info="" - _git_cache_timestamp=$now - echo "" - fi -} - -# Git branch with dynamic abbreviation -git_branch_dynamic() { - local now=$(date +%s) - local cache_age=$((now - _git_cache_timestamp)) - - # Only query git if cache is expired - if [[ $cache_age -ge $_git_cache_lifetime ]]; then - local ref=$(git symbolic-ref --short HEAD 2> /dev/null) - if [ -n "${ref}" ]; then - if need_to_abbreviate_git; then - # Abbreviated version for small terminals - case "${ref}" in - "main") _git_cached_info="m" ;; - "master") _git_cached_info="m" ;; - "development") _git_cached_info="d" ;; - "develop") _git_cached_info="d" ;; - "feature/"*) _git_cached_info="f/${ref#feature/}" | cut -c 1-4 ;; - "release/"*) _git_cached_info="r/${ref#release/}" | cut -c 1-4 ;; - "hotfix/"*) _git_cached_info="h/${ref#hotfix/}" | cut -c 1-4 ;; - *) _git_cached_info="${ref}" | cut -c 1-5 ;; # Truncate to first 5 chars for other branches - esac - else - # Full branch name when there's room - _git_cached_info="${ref}" - fi - _git_cache_timestamp=$now - echo "$_git_cached_info" - else - _git_cached_info="" - _git_cache_timestamp=$now - echo "" - fi - else - echo "$_git_cached_info" - fi -} - -# VCS info styles (e.g., git) -zstyle ':vcs_info:*' check-for-changes true -zstyle ':vcs_info:*' enable git - -# Dynamically configure vcs_info formats based on available space -function configure_vcs_styles() { - if need_to_abbreviate_git; then - # Abbreviated versions - zstyle ':vcs_info:*' stagedstr ' +%F{15}s%f' - zstyle ':vcs_info:*' unstagedstr ' -%F{15}u%f' - else - # Full versions - zstyle ':vcs_info:*' stagedstr ' +%F{15}staged%f' - zstyle ':vcs_info:*' unstagedstr ' -%F{15}unstaged%f' - fi - - zstyle ':vcs_info:*' actionformats '%F{5}%F{2}%b%F{3}|%F{1}%a%F{5}%f ' - zstyle ':vcs_info:*' formats '%F{208} '$'\uE0A0'' %f$(git_branch_test_color)%f%F{76}%c%F{3}%u%f ' - zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-dynamic -} - -# Show "untracked" status in git - with conditional abbreviation -+vi-git-untracked() { - if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ - git status --porcelain | grep '??' &> /dev/null ; then - - if need_to_abbreviate_git; then - hook_com[unstaged]+='%F{196} !%f%F{15}u%f' - else - hook_com[unstaged]+='%F{196} !%f%F{15}untracked%f' - fi - fi -} - -# Dynamic git branch hook -+vi-git-dynamic() { - hook_com[branch]=$(git_branch_dynamic) -} - -# SSH info with conditional abbreviation -ssh_name() { - if [[ -n $SSH_CONNECTION ]]; then - local ssh_info - - if need_to_abbreviate_git; then - # Abbreviated SSH info - ssh_info="ssh:%F{green}%n$nc%f" - else - ssh_info="ssh:%F{green}%n$nc%f" - if [[ -n $SSH_CONNECTION ]]; then - local ip_address - ip_address=$(echo $SSH_CONNECTION | awk '{print $3}') - ssh_info="$ssh_info@%F{green}$ip_address%f" - fi - fi - echo " ${ssh_info}" - fi -} - -# Job names (for job control) with conditional abbreviation -function job_name() { - job_name="" - job_length=0 - local available=$(available_space) - - # Only show jobs if we have reasonable space - if [ "${available}" -gt 60 ]; then - local job_count=$(jobs | wc -l) - if [ "${job_count}" -gt 0 ]; then - if need_to_abbreviate_git; then - job_name+="%F{green}j:${job_count}%f" - else - local title_jobs="jobs:" - job_name="${title_jobs}" - job_length=$((${available}-70)) - [ "${job_length}" -lt "0" ] && job_length=0 - - if [ "${job_length}" -gt 0 ]; then - job_name+="%F{green}$(jobs | grep + | tr -s " " | cut -d " " -f 4- | cut -b 1-${job_length} | sed "s/\(.*\)/\1/")%f" - else - job_name+="%F{green}${job_count}%f" - fi - fi - fi - fi - - echo "${job_name}" -} - -# Check if we should show the spinner based on elapsed time -function should_show_spinner() { - if [[ $_cmd_is_running -eq 1 ]]; then - local current_time=$(date +%s) - local elapsed=$((current_time - _cmd_start_time)) - - # Show spinner only after delay threshold - if [[ $elapsed -ge $_SPINNER_DELAY ]]; then - _show_spinner=1 - return 0 # Yes, show spinner - fi - fi - - _show_spinner=0 - return 1 # No, don't show spinner -} - -# Update spinner animation - simplified version -function update_spinner() { - # This function is now just a ZLE widget placeholder - # The actual spinner updates happen in the TRAPALRM handler - : -} - -# Start spinner timer when command runs longer than threshold -function start_spinner_timer() { - _spinner_idx=0 - _cmd_is_running=1 - _show_spinner=0 # Start with spinner hidden until delay passes - - # Set up the TRAPALRM for periodic updates - CRITICAL FIX - TMOUT=0.5 # Update spinner every 0.5 seconds - - # Define TRAPALRM function - this is key to the spinner working - TRAPALRM() { - if [[ $_cmd_is_running -eq 1 ]]; then - local current_time=$(date +%s) - local elapsed=$((current_time - _cmd_start_time)) - - # Show spinner only after delay threshold - if [[ $elapsed -ge $_SPINNER_DELAY ]]; then - _show_spinner=1 - _spinner_idx=$(( (_spinner_idx + 1) % ${#_spinner_frames[@]} )) - - # Force prompt refresh - critical for updating the spinner - if [[ -o zle ]]; then - zle reset-prompt 2>/dev/null || true - zle -R - fi - fi - fi - } -} - -# Stop spinner when command finishes -function stop_spinner_timer() { - _cmd_is_running=0 - _show_spinner=0 - - # Disable the alarm trap and timer - TRAPALRM() { : } - TMOUT=0 - - # Force prompt refresh to clear spinner - if [[ -o zle ]]; then - zle reset-prompt 2>/dev/null || true - zle -R - fi -} - -# Format time in a human-readable way -function format_time() { - local seconds=$1 - local result="" - - # Format time as hours:minutes:seconds for long durations - if [[ $seconds -ge 3600 ]]; then - local hours=$((seconds / 3600)) - local minutes=$(( (seconds % 3600) / 60 )) - local secs=$((seconds % 60)) - result="${hours}h${minutes}m${secs}s" - elif [[ $seconds -ge 60 ]]; then - local minutes=$((seconds / 60)) - local secs=$((seconds % 60)) - result="${minutes}m${secs}s" - else - result="${seconds}s" - fi - - echo "$result" -} - -# Error code display for RPROMPT with spinner - fixed version -function exit_code_info() { - local exit_code=$? - - # If a command is running and we should show spinner - if [[ $_cmd_is_running -eq 1 && $_show_spinner -eq 1 ]]; then - local spinner=${_spinner_frames[$_spinner_idx]} - local current_time=$(date +%s) - local elapsed=$((current_time - _cmd_start_time)) - echo "%F{yellow}${spinner} ${elapsed}s%f" - return - fi - - # Don't show error code when line editor is active (user is typing) - if [[ -o zle ]]; then - echo "" - return - fi - - # Show command finished message for completed commands that took longer than threshold - if [[ -n "$_last_executed_command" && $_cmd_duration -ge $_FINISHED_DELAY ]]; then - local duration_formatted=$(format_time $_cmd_duration) - - # Show error code along with finished message if there was an error - if [[ $exit_code -ne 0 ]]; then - # Show TSTP (148) as a suspension indicator instead of error - if [[ $exit_code -eq 148 ]]; then - echo "%F{cyan}finished ${duration_formatted}%f %F{yellow}⏸ TSTP%f" - return - fi - - local signal_name="" - # Check if it's a signal - if [[ $exit_code -gt 128 && $exit_code -le 165 ]]; then - local signal_num=$((exit_code - 128)) - signal_name=$(kill -l $signal_num 2>/dev/null) - if [[ -n "$signal_name" ]]; then - signal_name=" ($signal_name)" - fi - fi - - # Return formatted error code with finished message - echo "%F{cyan}finished ${duration_formatted}%f %F{red}✘ $exit_code$signal_name%f" - else - echo "%F{cyan}finished ${duration_formatted}%f %F{green}✓%f" - fi - return - fi - - # Don't show anything for exit code 0 (success) if this is first command - if [[ -z "$_last_executed_command" && $exit_code -eq 0 ]]; then - echo "" - return - fi - - # Show TSTP (148) as a suspension indicator instead of error - if [[ $exit_code -eq 148 ]]; then - echo "%F{yellow}⏸ TSTP%f" - return - fi - - if [[ $exit_code -ne 0 ]]; then - local signal_name="" - - # Check if it's a signal - if [[ $exit_code -gt 128 && $exit_code -le 165 ]]; then - local signal_num=$((exit_code - 128)) - signal_name=$(kill -l $signal_num 2>/dev/null) - if [[ -n "$signal_name" ]]; then - signal_name=" ($signal_name)" - fi - fi - - # Return formatted error code - echo "%F{red}✘ $exit_code$signal_name%f" - else - echo "%F{green}✓%f" # Success indicator - fi -} - -abbreviated_path() { - local full_path="${PWD/#$HOME/~}" # Replace $HOME with ~ - local available=$(available_space) - - # If path is root - if [[ "$full_path" == "/" ]]; then - echo "%F{4}/%f" - return - fi - - # If path is just ~ - if [[ "$full_path" == "~" ]]; then - echo "%F{4}~%f" - return - fi - - # If extremely small terminal, show nothing to avoid breaking prompt - if (( available < 20 )); then - echo "" - return - fi - - # For very narrow terminals, just show the current dir - if (( available < 30 )); then - echo "%F{4}%1~%f" - return - fi - - # For moderately narrow terminals, show last two components - if (( available < 40 )); then - echo "%F{4}%2~%f" - return - fi - - # For wide terminals, show full path - if (( available > 70 )); then - echo "%F{4}${full_path}%f" - return - fi - - # Otherwise, show abbreviated path (e.g. ~/d/p/n) - local parts=("${(s:/:)full_path}") - local result="" - local last_index=${#parts[@]} - - for i in {1..$((last_index - 1))}; do - [[ -n ${parts[i]} ]] && result+="/${parts[i]:0:1}" - done - - result+="/${parts[last_index]}" - echo "%F{4}${result}%f" -} - - -# Prompt variables -user="%n" -at="%F{15}at%{$reset_color%}" -machine="%F{4}%m%{$reset_color%}" -relative_home="%F{4}%~%{$reset_color%}" -carriage_return=""$'\n'"" -empty_line_bottom="" -chevron_right="" -color_reset="%{$(tput sgr0)%}" -color_yellow="%{$(tput setaf 226)%}" -color_blink="%{$(tput blink)%}" -prompt_symbol="$" -dollar_sign="${color_yellow}${color_blink}${prompt_symbol}${color_reset}" -dollar="%(?:%F{2}${dollar_sign}:%F{1}${dollar_sign})" -space=" " -#thin_space=$'\u2009' -thin_space=$'\u202F' -cmd_prompt="%(?:%F{2}${chevron_right} :%F{1}${chevron_right} )" -git_info="\$vcs_info_msg_0_" -v1="%{┌─[%}" -v2="%{]%}" -v3="└─[" -v4="]" -newline=$'\n' - -# Indicate INSERT mode for vi - NEVER truncate this -function insert-mode () { - echo "-- INSERT --" -} - -# Indicate NORMAL mode for vi - NEVER truncate this -function normal-mode () { - echo "-- NORMAL --" -} - -# Vi mode indicator -vi-mode-indicator () { - if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then - echo -ne '\e[1 q' - vi_mode=$(normal-mode) - elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then - echo -ne '\e[5 q' - vi_mode=$(insert-mode) - fi -} - -# Prompt function to ensure the prompt stays on one line, even in narrow terminals -function set-prompt() { - vi-mode-indicator - configure_vcs_styles # Dynamically set vcs styles based on available space - vcs_info # Refresh vcs info with new styles - - local available=$(available_space) - if (( available < 14 )); then - # Extremely narrow terminal — use minimal prompt - PS1="${carriage_return}${dollar}${space}${empty_line_bottom}" - #RPROMPT='$(exit_code_info)' - - else - # Path display - always show something for path, but adapt based on space - local path_display="$(abbreviated_path)" - - # Git info - omit entirely if not enough space - local gitinfo="" - if [[ $available -gt 40 ]]; then - gitinfo="${vcs_info_msg_0_}" - fi - - # Jobs info - local jobs=" $(job_name)" - - # SSH info - local sshinfo="$(ssh_name)" - - # Vi mode is priority 1 - ALWAYS show it - mode="%F{145}%{$terminfo_down_sc$vi_mode$terminfo[rc]%f%}" - - # Right prompt for error codes or spinner - #RPROMPT='$(exit_code_info)' - - PS1="${newline}${v1}${user}${v2} ${path_display}${gitinfo}${jobs}${sshinfo}${carriage_return}${mode}${v3}${dollar}${v4}${empty_line_bottom}" - fi -} - -# Pre-command hook to set prompt -my_precmd() { - # Calculate command duration if a command was run - if [[ -n "$_last_executed_command" && $_cmd_start_time -gt 0 ]]; then - _cmd_end_time=$(date +%s) - _cmd_duration=$((_cmd_end_time - _cmd_start_time)) - else - _cmd_duration=0 - fi - - stop_spinner_timer # Make sure spinner is stopped - vcs_info - set-prompt - vi-mode-indicator -} -add-zsh-hook precmd my_precmd - -# Update mode file based on current mode -update-mode-file() { - set-prompt - local current_mode=$(cat ~/.vi-mode 2>/dev/null || echo "") - local new_mode="$vi_mode" - - if [[ "$new_mode" != "$current_mode" ]]; then - echo "$new_mode" >| ~/.vi-mode - fi - - # Ensure we're in an interactive shell and ZLE is active - if [[ -o zle ]] && zle -l &>/dev/null; then - zle reset-prompt 2>/dev/null || true - else - # If ZLE is not active, fallback and print the prompt manually - set-prompt - print -Pn "$PS1" - fi - - # Refresh tmux client if tmux is running - if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then - tmux refresh-client -S - fi -} - -# Check if nvim is running and update mode -function check-nvim-running() { - if pgrep -x "nvim" > /dev/null; then - vi_mode="" - update-mode-file - if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then - tmux refresh-client -S - fi - else - if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then - vi_mode=$(normal-mode) - elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then - vi_mode=$(insert-mode) - fi - update-mode-file - if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then - tmux refresh-client -S - fi - fi -} - -# ZLE line initialization hook -function zle-line-init() { - zle reset-prompt - vi-mode-indicator - case "${KEYMAP}" in - vicmd) - echo -ne '\e[1 q' - ;; - main|viins|*) - echo -ne '\e[5 q' - ;; - esac -} - -# ZLE keymap select hook -function zle-keymap-select() { - update-mode-file - zle reset-prompt - zle -R - vi-mode-indicator - case "${KEYMAP}" in - vicmd) - echo -ne '\e[1 q' - ;; - main|viins|*) - echo -ne '\e[5 q' - ;; - esac -} - -# Safer version of zle reset-prompt -function safe_reset_prompt() { - # Only reset if ZLE is active - if [[ -o zle ]] && zle -l &>/dev/null; then - zle reset-prompt 2>/dev/null || true - fi -} - -# Preexec hook for command execution - NO BACKGROUND JOBS VERSION -function preexec() { - # Store the command being executed - _last_executed_command=$1 - _cmd_start_time=$(date +%s) - _cmd_is_running=1 - _show_spinner=0 # Reset spinner flag - - # Start the spinner timer immediately - start_spinner_timer - - print -rn -- $terminfo[el] - echo -ne '\e[5 q' - vi-mode-indicator -} - -# Terminal resizing: resets the prompt if ZLE is active, updates the mode file. -TRAPWINCH() { - if [[ -o zle ]] && zle -l &>/dev/null; then - zle -R - zle reset-prompt 2>/dev/null || true - fi - update-mode-file 2>/dev/null -} - -# Register ZLE hooks -zle -N zle-line-init -zle -N zle-keymap-select -zle -N update_spinner - -# Register hooks -add-zsh-hook preexec preexec -add-zsh-hook precmd my_precmd - -set-prompt diff --git a/linux/home/.config/zsh/user/prompt_minimal.zsh b/linux/home/.config/zsh/user/prompt_minimal.zsh deleted file mode 100644 index 0389e7d..0000000 --- a/linux/home/.config/zsh/user/prompt_minimal.zsh +++ /dev/null @@ -1,295 +0,0 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 -#=#=#= -# simle_is_power theme -# folked from agnoster's Theme - https://gist.github.com/3712874 -# -# In order for this theme to render correctly, you will need a -# [Powerline-patched font](https://github.com/Lokaltog/powerline-fonts). -#=#= -#============================================================================== -# Color setting {{{ -#============================================================================== - -setopt prompt_subst - -bg_dir=240 -bg_dark=237 -fg_red=210 - -#===========================================================================}}} -# Segment drawing {{{ -#============================================================================== -# A few utility functions to make it easy and re-usable to draw segmented prompts - -CURRENT_BG='NONE' -# SEGMENT_SEPARATOR='' -SEGMENT_SEPARATOR='' -# SEGMENT_SEPARATOR='' -# SEGMENT_SEPARATOR='▒' -# SEGMENT_SEPARATOR='▓▒░' - -# Begin a segment -# Takes two arguments, background and foreground. Both can be omitted, -# rendering default background/foreground. -prompt_segment() { - local bg fg - [[ -n $1 ]] && bg="%K{$1}" || bg="%k" - [[ -n $2 ]] && fg="%F{$2}" || fg="%f" - if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then - echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} " - else - echo -n "%{$bg%}%{$fg%} " - fi - CURRENT_BG=$1 - [[ -n $3 ]] && echo -n $3 -} - -# End the prompt, closing any open segments -prompt_end() { - if [[ -n $CURRENT_BG ]]; then - echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" - else - echo -n "%{%k%}" - fi - echo -n "%{%f%}" - CURRENT_BG='' -} - -#===========================================================================}}} -# Prompt components {{{ -#============================================================================== -# Each component will draw itself, and hide itself if no information needs to be shown -#------------------------------------------------------------------------------ -# Init: {{{ -#------------------------------------------------------------------------------ - -prompt_init() { - echo -n "%{%F{240}%K{240}%}" -} - -#---------------------------------------------------------------------------}}} -# Status: {{{ -#------------------------------------------------------------------------------ -# - was there an error -# - am I root -# - are there background jobs? -# - am I in ranger subshell? - -prompt_status() { - local symbols - symbols=() - [[ $RETVAL -ne 0 ]] && symbols+="%{%F{${fg_red}}%}✞" - [[ $UID -eq 0 ]] && symbols+="%{%F{223}%}⚡" - [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" - [[ -n ${RANGER_LEVEL} ]] && symbols+="%{%F{153}%}®" - - [[ -n "$symbols" ]] && prompt_segment ${bg_dark} NONE "$symbols" -} - -#---------------------------------------------------------------------------}}} -# Virtualenv: current working virtualenv {{{ -#------------------------------------------------------------------------------ - -prompt_virtualenv() { - local virtualenv_path="$VIRTUAL_ENV" - if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then - prompt_segment green black "(`basename $virtualenv_path`)" - fi -} - -#---------------------------------------------------------------------------}}} -# Dir: current working directory {{{ -#------------------------------------------------------------------------------ - -prompt_dir() { - prompt_segment ${bg_dir} 231 '%~' -} - -#---------------------------------------------------------------------------}}} -# Git: branch/detached head, dirty status {{{ -#------------------------------------------------------------------------------ - -prompt_git() { - local ref dirty mode repo_path - repo_path=$(git rev-parse --git-dir 2>/dev/null) - - if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then - # dirty=$(parse_git_dirty) - ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➔ $(git show-ref --head -s --abbrev |head -n1 2> /dev/null)" - # if [[ -n $dirty ]]; then - # prompt_segment ${bg_dark} 223 - # else - prompt_segment ${bg_dark} 153 - # fi - - if [[ -e "${repo_path}/BISECT_LOG" ]]; then - mode=" <B>" - elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then - mode=" >M<" - elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then - mode=" >R>" - fi - - autoload -Uz vcs_info - - zstyle ':vcs_info:*' enable git - zstyle ':vcs_info:*' get-revision true - zstyle ':vcs_info:*' check-for-changes true - zstyle ':vcs_info:*' stagedstr '+' - zstyle ':vcs_info:git:*' unstagedstr '*' - zstyle ':vcs_info:*' formats ' %u%c' - zstyle ':vcs_info:*' actionformats ' %u%c' - vcs_info - echo -n "${ref/refs\/heads\// }${vcs_info_msg_0_%% }${mode}" - fi -} - -#---------------------------------------------------------------------------}}} -# Hg: prompt {{{ -#------------------------------------------------------------------------------ - -prompt_hg() { - local rev status - if $(hg id >/dev/null 2>&1); then - if $(hg prompt >/dev/null 2>&1); then - if [[ $(hg prompt "{status|unknown}") = "?" ]]; then - # if files are not added - prompt_segment ${fg_red} ${bg_dark} - st='±' - elif [[ -n $(hg prompt "{status|modified}") ]]; then - # if any modification - prompt_segment 223 ${bg_dark} - st='±' - else - # if working copy is clean - prompt_segment 153 ${bg_dark} - fi - echo -n $(hg prompt "☿ {rev}@{branch}") $st - else - st="" - rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') - branch=$(hg id -b 2>/dev/null) - if `hg st | grep -q "^\?"`; then - prompt_segment ${fg_red} ${bg_dark} - st='±' - elif `hg st | grep -q "^(M|A)"`; then - prompt_segment 223 ${bg_dark} - st='±' - else - prompt_segment 153 ${bg_dark} - fi - echo -n "☿ $rev@$branch" $st - fi - fi -} - -#}}}========================================================================}}} -# Build main prompt {{{ -#============================================================================== - - -function vi-mode-indicator() { - local current_mode - current_mode=$(cat ~/.vi-mode 2>/dev/null || echo "") - - if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then - [[ "$current_mode" != "-- NORMAL --" ]] && echo "-- NORMAL --" >| ~/.vi-mode - elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then - [[ "$current_mode" != "-- INSERT --" ]] && echo "-- INSERT --" >| ~/.vi-mode - fi -} - -build_prompt() { - RETVAL=$? - vi-mode-indicator - prompt_init - prompt_virtualenv - prompt_dir - prompt_git - prompt_hg - prompt_status - prompt_end -} - -color_reset="%{$(tput sgr0)%}" -color_yellow="%{$(tput setaf 226)%}" -color_blink="%{$(tput blink)%}" -prompt_symbol="$" -dollar_sign="${color_yellow}${color_blink}${prompt_symbol}${color_reset}" -dollar="%(?:%F{2}${dollar_sign}:%F{1}${dollar_sign})" - -v1="%{┌─[%}" -v2="%{]%}" -v3="└─[" -v4="]" -user="%n" - -PROMPT="${v1}${user}%f%b%k${v2}$(build_prompt)$reset_color -${v3}${dollar}${v4}${empty_line_bottom}$reset_color" -#PROMPT='%n@%m:%~%# ' -#%{%F{240}%}\$ %{$reset_color%}' -#%{${dollar}%} %{$reset_color%}' -RPROMPT='' - -PROMPT2='%{%F{30}%}↪%{$reset_color%} ' -RPROMPT2='%{$fg_bold[green]%}%_%{$reset_color%}' - -function update-mode-file() { - local current_mode=$(cat ~/.vi-mode 2>/dev/null || echo "") - local new_mode="$vi_mode" - - # Check if the mode is different before updating - if [[ "$new_mode" != "$current_mode" ]]; then - echo "$new_mode" >| ~/.vi-mode - fi - - # Only call zle if ZLE is active - if [[ -o zle ]]; then - zle reset-prompt # Force refresh - fi - - # Ensure tmux client refresh only happens if tmux is running - if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then - tmux refresh-client -S - fi -} -function zle-line-init() { - zle reset-prompt - case "${KEYMAP}" in - vicmd) - echo -ne '\e[1 q' - ;; - main|viins|*) - echo -ne '\e[5 q' - ;; - esac -} -function zle-keymap-select() { - local current_keymap - current_keymap="${KEYMAP}" - - update-mode-file - zle reset-prompt - - case "$current_keymap" in - vicmd) - echo -ne '\e[1 q' - ;; - main|viins|*) - echo -ne '\e[5 q' - ;; - esac -} - -precmd () { - print -rP -} - -preexec () { - print -rn -- $terminfo[el] - echo -ne '\e[5 q' # Reset cursor shape -} -zle -N zle-line-init -zle -N zle-keymap-select - -#===========================================================================}}} diff --git a/linux/home/.config/zsh/user/prompt_new.zsh b/linux/home/.config/zsh/user/prompt_new.zsh deleted file mode 100644 index 78791ef..0000000 --- a/linux/home/.config/zsh/user/prompt_new.zsh +++ /dev/null @@ -1,863 +0,0 @@ -# __ _ __ _| | _____ ______ _| | __ -# / _` |/ _` | |/ / _ \_ / _` | |/ / -# | (_| | (_| | < (_) / / (_| | < -# \__,_|\__, |_|\_\___/___\__,_|_|\_\ -# |___/ -# -# An asynchronous, dynamic color prompt for ZSH with Git, vi mode, and exit -# status indicators -# -# -# MIT License -# -# Copyright (c) 2017-2019 Alexandros Kozak -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# -# -# https://github.com/agkozak/agkozak-zsh-prompt -# - -# shellcheck disable=SC1090,SC2016,SC2034,SC2088,SC2148,SC2154,SC2190 - -# psvar[] Usage -# -# psvar Index Prompt String Equivalent Usage -# -# psvar[1] %1v Hostname/abbreviated hostname (only -# displayed for SSH connections) -# psvar[2] %2v Working directory or abbreviation -# thereof -# psvar[3] %3v Current working Git branch, along -# with indicator of changes made -# psvar[4] %4v Equals 'vicmd' when vi command mode -# is enabled; otherwise empty - -# Set AGKOZAK_PROMPT_DEBUG=1 to see debugging information -AGKOZAK_PROMPT_DEBUG=${AGKOZAK_PROMPT_DEBUG:-0} - -############################################################ -# Display a message on STDERR if debug mode is enabled -# -# Globals: -# AGKOZAK_PROMPT_DEBUG -# Arguments: -# $1 Message to send to STDERR -############################################################ -_agkozak_debug_print() { - (( AGKOZAK_PROMPT_DEBUG )) && print -- "agkozak-zsh-prompt: $1" >&2 -} - -if (( AGKOZAK_PROMPT_DEBUG )); then - autoload -Uz is-at-least - - setopt WARN_CREATE_GLOBAL - - if is-at-least 5.4.0; then - setopt WARN_NESTED_VAR - fi -fi - -# Set AGKOZAK_PROMPT_DIRTRIM to the desired number of directory elements to -# display, or set it to 0 for no directory trimming -typeset -g AGKOZAK_PROMPT_DIRTRIM=${AGKOZAK_PROMPT_DIRTRIM:-2} - -# Set AGKOZAK_MULTILINE to 0 to enable the legacy, single-line prompt -typeset -g AGKOZAK_MULTILINE=${AGKOZAK_MULTILINE:-1} - -# Set AGKOZAK_LEFT_PROMPT_ONLY to have the Git status appear in the left prompt -typeset -g AGKOZAK_LEFT_PROMPT_ONLY=${AGKOZAK_LEFT_PROMPT_ONLY:-0} - -# Set AGKOZAK_COLORS_* variables to any valid color -# AGKOZAK_COLORS_EXIT_STATUS changes the exit status color (default: red) -# AGKOZAK_COLORS_USER_HOST changes the username/hostname color (default: green) -# AGKOZAK_COLORS_PATH changes the path color (default: blue) -# AGKOZAK_COLORS_BRANCH_STATUS changes the branch status color (default: yellow) -# AGKOZAK_COLORS_PROMPT_CHAR changes the prompt character color (default: white) -typeset -g AGKOZAK_COLORS_EXIT_STATUS=${AGKOZAK_COLORS_EXIT_STATUS:-red} -typeset -g AGKOZAK_COLORS_USER_HOST=${AGKOZAK_COLORS_USER_HOST:-green} -typeset -g AGKOZAK_COLORS_PATH=${AGKOZAK_COLORS_PATH:-blue} -typeset -g AGKOZAK_COLORS_BRANCH_STATUS=${AGKOZAK_COLORS_BRANCH_STATUS:-yellow} - -setopt PROMPT_SUBST NO_PROMPT_BANG - -###################################################################### -# GENERAL FUNCTIONS -###################################################################### - -############################################################ -# Are colors available? -# -# Globals: -# AGKOZAK_HAS_COLORS -############################################################ -_agkozak_has_colors() { - if (( $+AGKOZAK_HAS_COLORS )); then - : - else - case $TERM in - *-256color) typeset -g AGKOZAK_HAS_COLORS=1 ;; - vt100|dumb) typeset -g AGKOZAK_HAS_COLORS=0 ;; - *) - local colors - case $OSTYPE in - freebsd*|dragonfly*) colors=$(tput Co) ;; - *) colors=$(tput colors) ;; - esac - typeset -g AGKOZAK_HAS_COLORS=$(( colors >= 8 )) - ;; - esac - fi - (( AGKOZAK_HAS_COLORS )) -} - -############################################################ -# Is the user connected via SSH? -# -# This function works perfectly for regular users. It is -# nearly impossible to detect with accuracy how a superuser -# is connected, so this prompt opts simply to display his or -# her username and hostname in inverse video. -############################################################ -_agkozak_is_ssh() { - [[ -n "${SSH_CONNECTION-}${SSH_CLIENT-}${SSH_TTY-}" ]] -} - -############################################################ -# Emulation of bash's PROMPT_DIRTRIM for ZSH -# -# Take PWD and substitute HOME with `~'. If the rest of PWD -# has more than a certain number of elements in its -# directory tree, keep the number specified by -# AGKOZAK_PROMPT_DIRTRIM (default: 2) and abbreviate the -# rest with `...'. (Set AGKOZAK_PROMPT_DIRTRIM=0 to disable -# directory trimming). For example, -# -# $HOME/dotfiles/polyglot/img -# -# will be displayed as -# -# ~/.../polyglot/img -# -# Named directories will by default be displayed using their -# aliases in the prompt (e.g. `~project'). Set -# AGKOZAK_NAMED_DIRS=0 to have them displayed just like any -# other directory. -# -# Globals: -# AGKOZAK_NAMED_DIRS -# Arguments: -# $@ [Optional] If `-v', store the function's output in -# psvar[2] instead of printing it to STDOUT -# $@ Number of directory elements to display (default: 2) -############################################################ -_agkozak_prompt_dirtrim() { - # Process arguments - local argument - for argument in $@; do - [[ $argument == '-v' ]] && local var=1 - done - until [[ $1 != '-v' ]]; do - shift - done - [[ $1 -ge 0 ]] || set 2 - - # Default behavior (when AGKOZAK_NAMED_DIRS is 1) - typeset -g AGKOZAK_NAMED_DIRS=${AGKOZAK_NAMED_DIRS:-1} - if (( AGKOZAK_NAMED_DIRS )); then - local zsh_pwd - print -Pnz '%~' - - # IF AGKOZAK_PROMPT_DIRTRIM is not 0, trim directory - if (( $1 )); then - read -rz zsh_pwd - case $zsh_pwd in - \~) print -Pnz $zsh_pwd ;; - \~/*) print -Pnz "%($(( $1 + 2 ))~|~/.../%${1}~|%~)" ;; - \~*) print -Pnz "%($(( $1 + 2 ))~|${zsh_pwd%%${zsh_pwd#\~*\/}}.../%${1}~|%~)" ;; - *) print -Pnz "%($(( $1 + 1 ))/|.../%${1}d|%d)" ;; - esac - fi - - # If AGKOZAK_NAMED_DIRS is 0 - else - local dir dir_count - case $HOME in - /) dir=${PWD} ;; - *) dir=${PWD#$HOME} ;; - esac - - # If AGKOZAK_PROMPT_DIRTRIM is not 0, trim the directory - if (( $1 > 0 )); then - - # The number of directory elements is the number of slashes in ${PWD#$HOME} - dir_count=$(( ${#dir} - ${#${dir//\//}} )) - if (( dir_count <= $1 )); then - case $PWD in - ${HOME}) print -nz '~' ;; - ${HOME}*) print -nz "~${dir}" ;; - *) print -nz "$PWD" ;; - esac - else - local lopped_path i - lopped_path=${dir} - i=0 - while (( i != $1 )); do - lopped_path=${lopped_path%\/*} - (( i++ )) - done - case $PWD in - ${HOME}*) print -nz "~/...${dir#${lopped_path}}" ;; - *) print -nz -f '...%s' "${PWD#${lopped_path}}" ;; - esac - fi - - # If AGKOZAK_PROMPT_DIRTRIM is 0 - else - case $PWD in - ${HOME}) print -nz '~' ;; - ${HOME}*) print -nz "~${dir}" ;; - *) print -nz "$PWD" ;; - esac - fi - fi - - local output - read -rz output - - # Argument -v stores the output to psvar[2]; otherwise send to STDOUT - if (( var )); then - psvar[2]=$output - else - print $output - fi -} - -############################################################ -# Display current branch name, followed by symbols -# representing changes to the working copy -############################################################ -_agkozak_branch_status() { - local ref branch - ref=$(command git symbolic-ref --quiet HEAD 2> /dev/null) - case $? in # See what the exit code is. - 0) ;; # $ref contains the name of a checked-out branch. - 128) return ;; # No Git repository here. - # Otherwise, see if HEAD is in detached state. - *) ref=$(command git rev-parse --short HEAD 2> /dev/null) || return ;; - esac - branch=${ref#refs/heads/} - - if [[ -n $branch ]]; then - local git_status symbols i=1 k - git_status="$(LC_ALL=C command git status 2>&1)" - - typeset -A messages - messages=( - '&*' ' have diverged,' - '&' 'Your branch is behind ' - '*' 'Your branch is ahead of ' - '+' 'new file: ' - 'x' 'deleted: ' - '!' 'modified: ' - '>' 'renamed: ' - '?' 'Untracked files:' - ) - - for k in '&*' '&' '*' '+' 'x' '!' '>' '?'; do - case $git_status in - *${messages[$k]}*) symbols+="${AGKOZAK_CUSTOM_SYMBOLS[$i]:-$k}" ;; - esac - (( i++ )) - done - - [[ -n $symbols ]] && symbols=" ${symbols}" - - printf '%s(%s%s)' "${AGKOZAK_BRANCH_STATUS_SEPARATOR- }" "$branch" "$symbols" - fi -} - -############################################################ -# Redraw the prompt when the vi mode changes. When the user -# enters vi command mode, the % or # in the prompt changes -# to a colon -############################################################ -zle-keymap-select() { - [[ $KEYMAP == 'vicmd' ]] && psvar[4]='vicmd' || psvar[4]='' - zle reset-prompt - zle -R -} - -############################################################ -# Redraw prompt when terminal size changes -############################################################ -TRAPWINCH() { - zle && zle -R -} - -############################################################ -# For legacy custom prompts: print a vi mode indicator -############################################################ -_agkozak_vi_mode_indicator() { - case $KEYMAP in - vicmd) print -n ':' ;; - *) print -n '%#' ;; - esac -} - -###################################################################### -# ASYNCHRONOUS FUNCTIONS -###################################################################### - -# Standarized $0 handling -# (See https://github.com/zdharma/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc) -0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" -typeset -g AGKOZAK_PROMPT_DIR="${0:A:h}" - -############################################################ -# If zsh-async has not already been loaded, try to load it -# -# Globals: -# AGKOZAK_PROMPT_DEBUG -# AGKOZAK_PROMPT_DIR -############################################################ -_agkozak_load_async_lib() { - if ! whence -w async_init &> /dev/null; then # Don't load zsh-async twice - if (( AGKOZAK_PROMPT_DEBUG )); then - source "${AGKOZAK_PROMPT_DIR}/lib/async.zsh" - else - source "${AGKOZAK_PROMPT_DIR}/lib/async.zsh" &> /dev/null - fi - local success=$? - return $success - fi -} - -############################################################ -# If SIGUSR1 is available and not already in use by ZSH, use -# it; otherwise disable asynchronous mode -############################################################ -_agkozak_has_usr1() { - if whence -w TRAPUSR1 &> /dev/null; then - _agkozak_debug_print 'TRAPUSR1 already defined.' - return 1 - else - case $signals in # Array containing names of available signals - *USR1*) return 0 ;; - *) - _agkozak_debug_print 'SIGUSR1 not available.' - return 1 - ;; - esac - fi -} - -############################################################ -# If AGKOZAK_FORCE_ASYNC_METHOD is set to a valid value, -# set AGKOZAK_ASYNC_METHOD to that; otherwise, determine -# the optimal asynchronous method from the environment (usr1 -# for MSYS2/Cygwin, zsh-async for WSL, subst-async for -# everything else), with fallbacks being available. Define -# the necessary asynchronous functions (loading async.zsh -# when necessary). -# -# Globals: -# AGKOZAK_IS_WSL -# AGKOZAK_ASYNC_METHOD -# AGKOZAK_FORCE_ASYNC_METHOD -# AGKOZAK_TRAPUSR1_FUNCTION -############################################################ -_agkozak_async_init() { - - # WSL should have BG_NICE disabled, since it does not have a Linux kernel - setopt LOCAL_OPTIONS EXTENDED_GLOB - if [[ -e /proc/version ]]; then - if [[ -n ${(M)${(f)"$(</proc/version)"}:#*Microsoft*} ]]; then - unsetopt BG_NICE - typeset -g AGKOZAK_IS_WSL=1 # For later reference - fi - fi - - # If AGKOZAK_FORCE_ASYNC_METHOD is set, force the asynchronous method - [[ $AGKOZAK_FORCE_ASYNC_METHOD == 'zsh-async' ]] && _agkozak_load_async_lib - if [[ $AGKOZAK_FORCE_ASYNC_METHOD == (subst-async|zsh-async|usr1|none) ]]; then - typeset -g AGKOZAK_ASYNC_METHOD=$AGKOZAK_FORCE_ASYNC_METHOD - - # Otherwise, first provide for certain quirky systems - else - - if (( AGKOZAK_IS_WSL )) || [[ $OSTYPE == solaris* ]]; then - if [[ $ZSH_VERSION != '5.0.2' ]] &&_agkozak_load_async_lib; then - typeset -g AGKOZAK_ASYNC_METHOD='zsh-async' - elif _agkozak_has_usr1; then - typeset -g AGKOZAK_ASYNC_METHOD='usr1' - else - typeset -g AGKOZAK_ASYNC_METHOD='subst-async' - fi - - # SIGUSR1 method is still much faster on MSYS2, Cygwin, and ZSH v5.0.2 - elif [[ $ZSH_VERSION == '5.0.2' ]] || [[ $OSTYPE == (msys|cygwin) ]]; then - if _agkozak_has_usr1; then - typeset -g AGKOZAK_ASYNC_METHOD='usr1' - else - typeset -g AGKOZAK_ASYNC_METHOD='subst-async' - fi - - # Asynchronous methods don't work in Emacs shell mode (but they do in term - # and ansi-term) - elif [[ $TERM == 'dumb' ]]; then - typeset -g AGKOZAK_ASYNC_METHOD='none' - - # Otherwise use subst-async - else - typeset -g AGKOZAK_ASYNC_METHOD='subst-async' - fi - fi - - ############################################################ - # Process substitution async method - # - # Fork a background process to fetch the Git status and feed - # it asynchronously to a file descriptor. Install a callback - # handler to process input from the file descriptor. - # - # Globals: - # AGKOZAK_ASYNC_FD - # AGKOZAK_IS_WSL - ############################################################ - _agkozak_subst_async() { - setopt LOCAL_OPTIONS NO_IGNORE_BRACES - typeset -g AGKOZAK_ASYNC_FD=13371 - - # Workaround for buggy behavior in MSYS2, Cygwin, and Solaris - if [[ $OSTYPE == (msys|cygwin|solaris*) ]]; then - exec {AGKOZAK_ASYNC_FD}< <(_agkozak_branch_status; command true) - # Prevent WSL from locking up when using X; also workaround for ZSH v5.0.2 - elif (( AGKOZAK_IS_WSL )) && (( $+DISPLAY )) \ - || [[ $ZSH_VERSION == '5.0.2' ]]; then - exec {AGKOZAK_ASYNC_FD}< <(_agkozak_branch_status) - command sleep 0.01 - else - exec {AGKOZAK_ASYNC_FD}< <(_agkozak_branch_status) - fi - - # Bug workaround; see http://www.zsh.org/mla/workers/2018/msg00966.html - command true - - zle -F "$AGKOZAK_ASYNC_FD" _agkozak_zsh_subst_async_callback - } - - ############################################################ - # ZLE callback handler - # - # Read Git status from file descriptor and set psvar[3] - # - # Arguments: - # $1 File descriptor - ############################################################ - _agkozak_zsh_subst_async_callback() { - setopt LOCAL_OPTIONS NO_IGNORE_BRACES - - local FD="$1" response - - # Read data from $FD descriptor - IFS='' builtin read -rs -d $'\0' -u "$FD" response - - # Withdraw callback and close the file descriptor - zle -F ${FD}; exec {FD}<&- - - # Make the changes visible - psvar[3]="$response" - zle && zle reset-prompt - } - - case $AGKOZAK_ASYNC_METHOD in - - zsh-async) - - ############################################################ - # Create zsh-async worker - ############################################################ - _agkozak_zsh_async() { - async_start_worker agkozak_git_status_worker -n - async_register_callback agkozak_git_status_worker _agkozak_zsh_async_callback - async_job agkozak_git_status_worker _agkozak_branch_status - } - - ############################################################ - # Set RPROMPT and stop worker - ############################################################ - _agkozak_zsh_async_callback() { - psvar[3]=$3 - zle && zle reset-prompt - async_stop_worker agkozak_git_status_worker -n - } - ;; - - usr1) - - ############################################################ - # Launch async workers to calculate Git status. TRAPUSR1 - # actually displays the status; if some other script - # redefines TRAPUSR1, drop the prompt into synchronous mode. - # - # Globals: - # AGKOZAK_TRAPUSR1_FUNCTION - # AGKOZAK_USR1_ASYNC_WORKER - # AGKOZAK_ASYNC_METHOD - ############################################################ - _agkozak_usr1_async() { - if [[ "$(builtin which TRAPUSR1)" = "$AGKOZAK_TRAPUSR1_FUNCTION" ]]; then - # Kill running child process if necessary - if (( AGKOZAK_USR1_ASYNC_WORKER )); then - kill -s HUP "$AGKOZAK_USR1_ASYNC_WORKER" &> /dev/null || : - fi - - # Start background computation of Git status - _agkozak_usr1_async_worker &! - typeset -g AGKOZAK_USR1_ASYNC_WORKER=$! - else - _agkozak_debug_print 'TRAPUSR1 has been redefined. Switching to subst-async mode.' - typeset -g AGKOZAK_ASYNC_METHOD='subst-async' - psvar[3]="$(_agkozak_branch_status)" - fi - } - - ############################################################ - # Calculate Git status and store it in a temporary file; - # then kill own process, sending SIGUSR1 - # - # Globals: - # AGKOZAK_PROMPT_DEBUG - ############################################################ - _agkozak_usr1_async_worker() { - # Save Git branch status to temporary file - _agkozak_branch_status >| /tmp/agkozak_zsh_prompt_$$ - - # Signal parent process - if (( AGKOZAK_PROMPT_DEBUG )); then - kill -s USR1 $$ - else - kill -s USR1 $$ &> /dev/null - fi - } - - ############################################################ - # On SIGUSR1, fetch Git status from temprary file and store - # it in psvar[3]. This function caches its own code in - # AGKOZAK_TRAPUSR1_FUNCTION so that it can tell if it has - # been redefined by another script. - # - # Globals: - # AGKOZAK_USR1_ASYNC_WORKER - # AGKOZAK_TRAPUSR1_FUNCTION - ############################################################ - TRAPUSR1() { - # Set prompt from contents of temporary file - psvar[3]=$(print -n -- "$(< /tmp/agkozak_zsh_prompt_$$)") - - # Reset asynchronous process number - typeset -g AGKOZAK_USR1_ASYNC_WORKER=0 - - # Redraw the prompt - zle && zle reset-prompt - } - - typeset -g AGKOZAK_TRAPUSR1_FUNCTION="$(builtin which TRAPUSR1)" - ;; - esac -} - -###################################################################### -# THE PROMPT -###################################################################### - -############################################################ -# Strip color codes from a prompt string -# -# Arguments: -# $1 The prompt string -############################################################ -_agkozak_strip_colors() { - - local prompt=$1 - local open_braces - - while [[ -n $prompt ]]; do - case $prompt in - %F\{*|%K\{*) - (( open_braces++ )) - prompt=${prompt#%[FK]\{} - while (( open_braces )); do - case ${prompt:0:1} in - \{) (( open_braces++ )) ;; - \}) (( open_braces-- )) ;; - esac - prompt=${prompt#?} - done - ;; - %f*|%k*) prompt=${prompt#%[fk]} ;; - *) - print -n -- "${prompt:0:1}" - prompt=${prompt#?} - ;; - esac - done -} - -############################################################ -# Runs right before each prompt is displayed; hooks into -# precmd -# -# 1) Redisplays path ($psvar[2]) whenever the value of -# AGKOZAK_PROMPT_DIRTRIM or AGKOZAK_NAMED_DIRS changes -# 2) If AGKOZAK_MULTILINE is changed to 0, set -# AGKOZAK_LEFT_PROMPT_ONLY=0 -# 3) If AGKOZAK_LEFT_PROMPT_ONLY is changed, updated both -# prompt strings -# 4) Resets Git status and vi mode display -# 5) Begins to calculate Git status -# 6) Sets AGKOZAK_PROMPT_WHITESPACE based on value of -# AGKOZAK_MULTILINE -# 7) Optionally display a blank line (AGKOZAK_BLANK_LINES), -# while avoiding a blank line when the shell is first -# loaded -# 8) If custom prompts are defined, update the prompt -# strings -# -# TODO: Consider making AGKOZAK_PROMPT_WHITESPACE a psvar -# -# Globals: -# AGKOZAK_PROMPT_DIRTRIM -# AGKOZAK_OLD_PROMPT_DIRTRIM -# AGKOZAK_NAMED_DIRS -# AGKOZAK_OLD_NAMED_DIRS -# AGKOZAK_MULTILINE -# AGKOZAK_OLD_MULTILINE -# AGKOZAK_LEFT_PROMPT_ONLY -# AGKOZAK_OLD_LEFT_PROMPT_ONLY -# AGKOZAK_ASYNC_METHOD -# AGKOZAK_PROMPT_WHITESPACE -# AGKOZAK_BLANK_LINES -# AGKOZAK_FIRST_PROMPT_PRINTED -# AGKOZAK_CUSTOM_PROMPT -# AGKOZAK_CURRENT_CUSTOM_PROMPT -# AGKOZAK_CUSTOM_RPROMPT -# AGKOZAK_CURRENT_CUSTOM_RPROMPT -############################################################ -_agkozak_precmd() { - # Update displayed directory when AGKOZAK_PROMPT_DIRTRIM or AGKOZAK_NAMED_DIRS - # changes or when first sourcing this script - if (( AGKOZAK_PROMPT_DIRTRIM != AGKOZAK_OLD_PROMPT_DIRTRIM )) \ - || (( AGKOZAK_NAMED_DIRS != AGKOZAK_OLD_NAMED_DIRS )) \ - || (( ! $+psvar[2] )); then - _agkozak_prompt_dirtrim -v $AGKOZAK_PROMPT_DIRTRIM - typeset -g AGKOZAK_OLD_PROMPT_DIRTRIM=$AGKOZAK_PROMPT_DIRTRIM - typeset -g AGKOZAK_OLD_NAMED_DIRS=$AGKOZAK_NAMED_DIRS - fi - - if (( AGKOZAK_MULTILINE != AGKOZAK_OLD_MULTILINE )); then - (( AGKOZAK_MULTILINE == 0 )) && AGKOZAK_LEFT_PROMPT_ONLY=0 - typeset -g AGKOZAK_OLD_MULTILINE=$AGKOZAK_MULTILINE - fi - - if (( AGKOZAK_LEFT_PROMPT_ONLY != AGKOZAK_OLD_LEFT_PROMPT_ONLY )); then - unset AGKOZAK_CUSTOM_PROMPT AGKOZAK_CUSTOM_RPROMPT - typeset -g AGKOZAK_OLD_LEFT_PROMPT_ONLY=$AGKOZAK_LEFT_PROMPT_ONLY - _agkozak_prompt_string - fi - - psvar[3]='' - psvar[4]='' - - case $AGKOZAK_ASYNC_METHOD in - 'subst-async') _agkozak_subst_async ;; - 'zsh-async') _agkozak_zsh_async ;; - 'usr1') _agkozak_usr1_async ;; - *) psvar[3]="$(_agkozak_branch_status)" ;; - esac - - if (( AGKOZAK_MULTILINE == 0 )) && (( ! AGKOZAK_LEFT_PROMPT_ONLY )) \ - && [[ -z $INSIDE_EMACS ]]; then - typeset -g AGKOZAK_PROMPT_WHITESPACE=' ' - else - typeset -g AGKOZAK_PROMPT_WHITESPACE=$'\n' - fi - - if (( AGKOZAK_BLANK_LINES )); then - if (( AGKOZAK_FIRST_PROMPT_PRINTED )); then - print - fi - typeset -g AGKOZAK_FIRST_PROMPT_PRINTED=1 - fi - - # If AGKOZAK_CUSTOM_PROMPT or AGKOZAK_CUSTOM_RPROMPT changes, the - # corresponding prompt is updated - - if [[ ${AGKOZAK_CUSTOM_PROMPT} != "${AGKOZAK_CURRENT_CUSTOM_PROMPT}" ]]; then - typeset -g AGKOZAK_CURRENT_CUSTOM_PROMPT=${AGKOZAK_CUSTOM_PROMPT} - PROMPT=${AGKOZAK_CUSTOM_PROMPT} - if ! _agkozak_has_colors; then - PROMPT=$(_agkozak_strip_colors "${PROMPT}") - fi - fi - - if [[ ${AGKOZAK_CUSTOM_RPROMPT} != "${AGKOZAK_CURRENT_CUSTOM_RPROMPT}" ]]; then - typeset -g AGKOZAK_CURRENT_CUSTOM_RPROMPT=${AGKOZAK_CUSTOM_RPROMPT} - RPROMPT=${AGKOZAK_CUSTOM_RPROMPT} - if ! _agkozak_has_colors; then - RPROMPT=$(_agkozak_strip_colors "${RPROMPT}") - fi - fi -} - -############################################################ -# Set the prompt strings -# -# Globals: -# AGKOZAK_CUSTOM_PROMPT -# AGKOZAK_COLORS_EXIT_STATUS -# AGKOZAK_COLORS_USER_HOST -# AGKOZAK_COLORS_PATH -# AGKOZAK_PROMPT_WHITESPACE -# AGKOZAK_COLORS_PROMPT_CHAR -# AGKOZAK_PROMPT_CHAR -# AGKOZAK_CURRENT_CUSTOM_PROMPT -# AGKOZAK_CUSTOM_RPROMPT -# AGKOZAK_COLORS_BRANCH_STATUS -# AGKOZAK_CURRENT_CUSTOM_RPROMPT -############################################################ -_agkozak_prompt_string () { - if (( $+AGKOZAK_CUSTOM_PROMPT )); then - PROMPT=${AGKOZAK_CUSTOM_PROMPT} - else - # The color left prompt - PROMPT='%(?..%B%F{${AGKOZAK_COLORS_EXIT_STATUS}}(%?%)%f%b )' - PROMPT+='%(!.%S%B.%B%F{${AGKOZAK_COLORS_USER_HOST}})%n%1v%(!.%b%s.%f%b) ' - PROMPT+='%B%F{${AGKOZAK_COLORS_PATH}}%2v%f%b' - if (( AGKOZAK_LEFT_PROMPT_ONLY )); then - PROMPT+='%(3V.%F{${AGKOZAK_COLORS_BRANCH_STATUS}}%3v%f.)' - fi - PROMPT+='${AGKOZAK_PROMPT_WHITESPACE}' - PROMPT+='${AGKOZAK_COLORS_PROMPT_CHAR:+%F{${AGKOZAK_COLORS_PROMPT_CHAR}\}}' - PROMPT+='%(4V.${AGKOZAK_PROMPT_CHAR[3]:-:}.%(!.${AGKOZAK_PROMPT_CHAR[2]:-%#}.${AGKOZAK_PROMPT_CHAR[1]:-%#}))' - PROMPT+='${AGKOZAK_COLORS_PROMPT_CHAR:+%f} ' - - typeset -g AGKOZAK_CUSTOM_PROMPT=${PROMPT} - typeset -g AGKOZAK_CURRENT_CUSTOM_PROMPT=${AGKOZAK_CUSTOM_PROMPT} - fi - - if (( $+AGKOZAK_CUSTOM_RPROMPT )); then - RPROMPT=${AGKOZAK_CUSTOM_RPROMPT} - else - # The color right prompt - if (( ! AGKOZAK_LEFT_PROMPT_ONLY )); then - typeset -g RPROMPT='%(3V.%F{${AGKOZAK_COLORS_BRANCH_STATUS}}%3v%f.)' - else - typeset -g RPROMPT='' - fi - - typeset -g AGKOZAK_CUSTOM_RPROMPT=${RPROMPT} - typeset -g AGKOZAK_CURRENT_CUSTOM_RPROMPT=${RPROMPT} - fi - - if ! _agkozak_has_colors; then - PROMPT=$(_agkozak_strip_colors "$PROMPT") - RPROMPT=$(_agkozak_strip_colors "$RPROMPT") - fi -} - -############################################################ -# Prompt setup -# -# Globals: -# AGKOZAK_ASYNC_METHOD -# AGKOZAK_USR1_ASYNC_WORKER -# AGKOZAK_PROMPT_DIRTRIM -############################################################ -() { - - _agkozak_async_init - - case $AGKOZAK_ASYNC_METHOD in - 'subst-async') ;; - 'zsh-async') async_init ;; - 'usr1') typeset -g AGKOZAK_USR1_ASYNC_WORKER=0 ;; - esac - - zle -N zle-keymap-select - - # Don't use ZSH hooks in Emacs classic shell - if (( $+INSIDE_EMACS )) && [[ $TERM == 'dumb' ]]; then - : - else - autoload -Uz add-zsh-hook - add-zsh-hook precmd _agkozak_precmd - - ############################################################ - # Update the displayed directory when the PWD changes - ############################################################ - _agkozak_chpwd() { - _agkozak_prompt_dirtrim -v $AGKOZAK_PROMPT_DIRTRIM - } - - add-zsh-hook chpwd _agkozak_chpwd - fi - - # Only display the HOSTNAME for an SSH connection or for a superuser - if _agkozak_is_ssh || (( EUID == 0 )); then - psvar[1]="@${HOST%%.*}" - else - psvar[1]='' - fi - - # The DragonFly BSD console and Emacs shell can't handle bracketed paste. - # Avoid the ugly ^[[?2004 control sequence. - if [[ $TERM == 'cons25' ]] || [[ $TERM == 'dumb' ]]; then - unset zle_bracketed_paste - fi - - # The Emacs shell has only limited support for some ZSH features, so use a - # more limited prompt. - if [[ $TERM == 'dumb' ]]; then - PROMPT='%(?..(%?%) )' - PROMPT+='%n%1v ' - PROMPT+='$(_agkozak_prompt_dirtrim "$AGKOZAK_PROMPT_DIRTRIM")' - PROMPT+='$(_agkozak_branch_status) ' - PROMPT+='%# ' - else - # Avoid continuation lines in Emacs term and ansi-term - (( $+INSIDE_EMACS )) && ZLE_RPROMPT_INDENT=3 - - # When VSCode is using the DOM renderer, the right prompt overflows off the - # side of the screen - (( $+VSCODE_PID )) && ZLE_RPROMPT_INDENT=6 - - _agkozak_prompt_string - - fi - - _agkozak_debug_print "Using async method: $AGKOZAK_ASYNC_METHOD" -} - -# Clean up environment -unfunction _agkozak_load_async_lib _agkozak_has_usr1 _agkozak_is_ssh \ - _agkozak_async_init - -# vim: ts=2:et:sts=2:sw=2:ROMPT='%~%<< $(git_prompt_info)${PR_BOLD_WHITE}>%{${reset_color}%} ' diff --git a/linux/home/.config/zsh/user/prompt_simple.zsh b/linux/home/.config/zsh/user/prompt_simple.zsh deleted file mode 100644 index 0bbad44..0000000 --- a/linux/home/.config/zsh/user/prompt_simple.zsh +++ /dev/null @@ -1,227 +0,0 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 -# -### Segment drawing -# A few utility functions to make it easy and re-usable to draw segmented prompts -CURRENT_BG='NONE' - -case ${SOLARIZED_THEME:-dark} in - light) CURRENT_FG='white';; - *) CURRENT_FG='black';; -esac - -# Segments -() { - local LC_ALL="" LC_CTYPE="en_US.UTF-8" - SEGMENT_SEPARATOR= -} - -# Begin a segment -# Takes two arguments, background and foreground. Both can be omitted, -# rendering default background/foreground. -prompt_segment() { - local bg fg - [[ -n $2 ]] && fg="$FG[254]" || fg="%f" - if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then - echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} " - else - echo -n "%{$bg%}%{$fg%}" - fi - CURRENT_BG=$1 - [[ -n $3 ]] && echo -n $3 -} - -# End the prompt, closing any open segments -prompt_end() { - if [[ -n $CURRENT_BG ]]; then - echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR" - else - echo -n "%{%k%}" - fi - echo -n "%{%f%}" - CURRENT_BG='' -} - -### Prompt components -# Each component will draw itself, and hide itself if no information needs to be shown - -# Context: user@hostname (who am I and where am I) -prompt_context() { } - -parse_git_dirty() { - local -a git_status - git_status=($(git status --porcelain 2>/dev/null)) - if [[ ${#git_status[@]} -gt 0 ]]; then - echo "±" - fi -} - -# Git: branch/detached head, dirty status -prompt_git() { - (( $+commands[git] )) || return - if [[ "$(git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then - return - fi - local PL_BRANCH_CHAR - () { - local LC_ALL="" LC_CTYPE="en_US.UTF-8" - PL_BRANCH_CHAR=$'' # - } - local ref dirty mode repo_path - - if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then - repo_path=$(git rev-parse --git-dir 2>/dev/null) - dirty=$(parse_git_dirty) - ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" - if [[ -n $dirty ]]; then - prompt_segment yellow black - PL_BRANCH_CHAR=%{%F{yellow}%}'' - else - prompt_segment green $CURRENT_FG - fi - - if [[ -e "${repo_path}/BISECT_LOG" ]]; then - mode=" <B>" - elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then - mode=" >M<" - elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then - mode=" >R>" - fi - - setopt promptsubst - autoload -Uz vcs_info - - zstyle ':vcs_info:*' enable git - zstyle ':vcs_info:*' get-revision true - zstyle ':vcs_info:*' check-for-changes true - zstyle ':vcs_info:*' stagedstr '✚' - zstyle ':vcs_info:*' unstagedstr '± ' - zstyle ':vcs_info:*' formats ' %u%c' - zstyle ':vcs_info:*' actionformats ' %u%c' - vcs_info - echo -n "${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}" - fi -} - -prompt_bzr() { - (( $+commands[bzr] )) || return - - # Test if bzr repository in directory hierarchy - local dir="$PWD" - while [[ ! -d "$dir/.bzr" ]]; do - [[ "$dir" = "/" ]] && return - dir="${dir:h}" - done - - local bzr_status status_mod status_all revision - if bzr_status=$(bzr status 2>&1); then - status_mod=$(echo -n "$bzr_status" | head -n1 | grep "modified" | wc -m) - status_all=$(echo -n "$bzr_status" | head -n1 | wc -m) - revision=$(bzr log -r-1 --log-format line | cut -d: -f1) - if [[ $status_mod -gt 0 ]] ; then - prompt_segment yellow black "bzr@$revision ✚" - else - if [[ $status_all -gt 0 ]] ; then - prompt_segment yellow black "bzr@$revision" - else - prompt_segment green black "bzr@$revision" - fi - fi - fi -} - -prompt_hg() { - (( $+commands[hg] )) || return - local rev st branch - if $(hg id >/dev/null 2>&1); then - if $(hg prompt >/dev/null 2>&1); then - if [[ $(hg prompt "{status|unknown}") = "?" ]]; then - # if files are not added - prompt_segment red white - st='±' - elif [[ -n $(hg prompt "{status|modified}") ]]; then - # if any modification - prompt_segment yellow black - st='±' - else - # if working copy is clean - prompt_segment green $CURRENT_FG - fi - echo -n $(hg prompt "☿ {rev}@{branch}") $st - else - st="" - rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') - branch=$(hg id -b 2>/dev/null) - if `hg st | grep -q "^\?"`; then - prompt_segment red black - st='±' - elif `hg st | grep -q "^[MA]"`; then - prompt_segment yellow black - st='±' - else - prompt_segment green $CURRENT_FG - fi - echo -n "☿ $rev@$branch" $st - fi - fi -} - -# Change prompt for HOME dir -prompt_dir () { - if [[ "$PWD" == "$HOME" ]]; then - prompt_segment blue $CURRENT_FG '' - else - prompt_segment blue CURRENT_FG '%2~' - fi -} - -# Virtualenv: current working virtualenv -prompt_virtualenv() { - local virtualenv_path="$VIRTUAL_ENV" - if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then - prompt_segment blue black "(`basename $virtualenv_path`)" - fi -} - -# Status: -# - was there an error -# - am I root -# - are there background jobs? -prompt_status() { - local -a symbols - - [[ $RETVAL -ne 0 ]] && symbols+=" %{%F{red}%}" - [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" - [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" - - [[ -n "$symbols" ]] && prompt_segment black default "$symbols" -} - -#AWS Profile: -# - display current AWS_PROFILE name -# - displays yellow on red if profile name contains 'production' or -# ends in '-prod' -# - displays black on green otherwise -prompt_aws() { - [[ -z "$AWS_PROFILE" || "$SHOW_AWS_PROMPT" = false ]] && return - case "$AWS_PROFILE" in - *-prod|*production*) prompt_segment red yellow "AWS: $AWS_PROFILE" ;; - *) prompt_segment green black "AWS: $AWS_PROFILE" ;; - esac -} - -## Main prompt -build_prompt() { - RETVAL=$? - prompt_status - prompt_virtualenv - prompt_aws - prompt_context - prompt_dir - prompt_git - prompt_bzr - prompt_hg - prompt_end -} - -PROMPT='%{%F{blue}%} %{%f%b%k%}$(build_prompt) ' -bindkey -M vicmd '\e[C' vi-forward-char # ESC + right arrow |
