From e9b53c042194df8a429b3d164536a5f0b5799ea1 Mon Sep 17 00:00:00 2001 From: ushastoe <40743392+krolchonok@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:13:50 +0000 Subject: [PATCH] modified: .zshrc --- .zshrc | 168 +++++++++++++++++++++++++-------------------------------- 1 file changed, 74 insertions(+), 94 deletions(-) diff --git a/.zshrc b/.zshrc index 129ea28..26a7c24 100644 --- a/.zshrc +++ b/.zshrc @@ -1,107 +1,86 @@ +typeset -gA UpdaterCfg +UpdaterCfg[repoRawBase]="https://raw.githubusercontent.com/ushst/my-zsh/main" +UpdaterCfg[remoteZshrcPath]=".zshrc" +UpdaterCfg[remoteVersionPath]="version.txt" +UpdaterCfg[checkIntervalSeconds]=21600 # 6 часов + +localZshrc="${HOME}/.zshrc" +localStateDir="${XDG_STATE_HOME:-${HOME}/.local/state}/zsh-updater" +mkdir -p "${localStateDir}" + +lastCheckFile="${localStateDir}/last_check" +localVersionFile="${localStateDir}/local_version" +lockFile="${localStateDir}/lock" + +get_local_version() { + if [[ -f "${localVersionFile}" ]]; then cat "${localVersionFile}"; return; fi + if [[ -f "${localZshrc}" ]]; then sed -n 's/^# *VERSION=\(.*\)$/\1/p' "${localZshrc}" | head -n1; fi +} + +version_lt() { [[ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" != "$2" ]]; } + +should_check_now() { + now=$(date +%s) + [[ ! -f "${lastCheckFile}" ]] && return 0 + last=$(<"${lastCheckFile}") + (( now - last >= UpdaterCfg[checkIntervalSeconds] )) +} + +with_lock() { exec 9>"${lockFile}"; flock -n 9 || return 1; "$@"; } + +update_local_version_cache() { echo "$1" > "${localVersionFile}"; } + +zshrc_update_check() { + should_check_now || return 0 + with_lock _do_update_check + echo "$(date +%s)" > "${lastCheckFile}" +} + +_do_update_check() { + local repo="${UpdaterCfg[repoRawBase]}" + local rverPath="${UpdaterCfg[remoteVersionPath]}" + local rcfgPath="${UpdaterCfg[remoteZshrcPath]}" + + remoteVersion="$(curl -fsSL "${repo}/${rverPath}" 2>/dev/null || true)" + [[ -n "${remoteVersion}" ]] || return 0 + + localVersion="$(get_local_version)"; [[ -n "${localVersion}" ]] || localVersion="0.0.0" + + if version_lt "${localVersion}" "${remoteVersion}"; then + tmpNew="${localStateDir}/.zshrc.new" + backup="${localStateDir}/zshrc.backup.$(date +%Y%m%d-%H%M%S)" + + if curl -fsSL "${repo}/${rcfgPath}" -o "${tmpNew}"; then + grep -q "^# *VERSION=${remoteVersion}\b" "${tmpNew}" || { rm -f "${tmpNew}"; return 0; } + cp -f "${localZshrc}" "${backup}" 2>/dev/null || true + mv -f "${tmpNew}" "${localZshrc}" + update_local_version_cache "${remoteVersion}" + [[ -t 1 ]] && echo "[zsh-updater] Обновлено до ${remoteVersion}. Бэкап: ${backup}. Перезапусти shell." + fi + fi +} + +( zshrc_update_check ) >/dev/null 2>&1 & +# --- end zshrc auto-updater --- + # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/local/bin:$PATH # Path to your oh-my-zsh installation. export ZSH="$HOME/.oh-my-zsh" -# Set name of the theme to load --- if set to "random", it will -# load a random theme each time oh-my-zsh is loaded, in which case, -# to know which specific one was loaded, run: echo $RANDOM_THEME -# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes +# Theme ZSH_THEME="avit" -# Set list of themes to pick from when loading at random -# Setting this variable when ZSH_THEME=random will cause zsh to load -# a theme from this variable instead of looking in $ZSH/themes/ -# If set to an empty array, this variable will have no effect. -# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" ) - -# Uncomment the following line to use case-sensitive completion. -# CASE_SENSITIVE="true" - -# Uncomment the following line to use hyphen-insensitive completion. -# Case-sensitive completion must be off. _ and - will be interchangeable. -# HYPHEN_INSENSITIVE="true" - -# Uncomment one of the following lines to change the auto-update behavior -# zstyle ':omz:update' mode disabled # disable automatic updates -# zstyle ':omz:update' mode auto # update automatically without asking -# zstyle ':omz:update' mode reminder # just remind me to update when it's time - -# Uncomment the following line to change how often to auto-update (in days). -# zstyle ':omz:update' frequency 13 - -# Uncomment the following line if pasting URLs and other text is messed up. -# DISABLE_MAGIC_FUNCTIONS="true" - -# Uncomment the following line to disable colors in ls. -# DISABLE_LS_COLORS="true" - -# Uncomment the following line to disable auto-setting terminal title. -# DISABLE_AUTO_TITLE="true" - -# Uncomment the following line to enable command auto-correction. -# ENABLE_CORRECTION="true" - -# Uncomment the following line to display red dots whilst waiting for completion. -# You can also set it to another string to have that shown instead of the default red dots. -# e.g. COMPLETION_WAITING_DOTS="%F{yellow}waiting...%f" -# Caution: this setting can cause issues with multiline prompts in zsh < 5.7.1 (see #5765) -# COMPLETION_WAITING_DOTS="true" - -# Uncomment the following line if you want to disable marking untracked files -# under VCS as dirty. This makes repository status check for large repositories -# much, much faster. -# DISABLE_UNTRACKED_FILES_DIRTY="true" - -# Uncomment the following line if you want to change the command execution time -# stamp shown in the history command output. -# You can set one of the optional three formats: -# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" -# or set a custom format using the strftime function format specifications, -# see 'man strftime' for details. -# HIST_STAMPS="mm/dd/yyyy" - -# Would you like to use another custom folder than $ZSH/custom? -# ZSH_CUSTOM=/path/to/new-custom-folder - -# Which plugins would you like to load? -# Standard plugins can be found in $ZSH/plugins/ -# Custom plugins may be added to $ZSH_CUSTOM/plugins/ -# Example format: plugins=(rails git textmate ruby lighthouse) -# Add wisely, as too many plugins slow down shell startup. +# Plugins plugins=( -git -zsh-autosuggestions -zsh-syntax-highlighting + git + zsh-autosuggestions + zsh-syntax-highlighting ) source $ZSH/oh-my-zsh.sh # User configuration - -# export MANPATH="/usr/local/man:$MANPATH" - -# You may need to manually set your language environment -# export LANG=en_US.UTF-8 - -# Preferred editor for local and remote sessions -# if [[ -n $SSH_CONNECTION ]]; then -# export EDITOR='vim' -# else -# export EDITOR='mvim' -# fi - -# Compilation flags -# export ARCHFLAGS="-arch x86_64" - -# Set personal aliases, overriding those provided by oh-my-zsh libs, -# plugins, and themes. Aliases can be placed here, though oh-my-zsh -# users are encouraged to define aliases within the ZSH_CUSTOM folder. -# For a full list of active aliases, run `alias`. -# -# Example aliases -# alias zshconfig="mate ~/.zshrc" -# alias ohmyzsh="mate ~/.oh-my-zsh" prompt_context() { if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then prompt_segment black default "%(!.%{%F{yellow}%}.)" @@ -109,11 +88,12 @@ prompt_context() { } export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" +# Custom aliases and functions +alias untargz='tar -xvzf' -# Custom function for "a i" function a() { if [ "$1" = "i" ]; then shift