Add comprehensive Zsh configuration files including aliases, completion settings, environment variables, custom functions, keybindings, shell options, plugins, and prompt configuration

- Created aliases for navigation, file management, system commands, and Git operations
- Configured completion settings with caching and custom formatting
- Set environment variables for editor, history, and various programming languages
- Implemented custom functions for navigation, file extraction, and process management
- Defined keybindings for efficient command line navigation and editing
- Established shell options for enhanced history management and command correction
- Integrated various plugins for improved functionality, including FZF, autosuggestions, and syntax highlighting
- Configured Powerlevel10k theme for a visually appealing prompt
This commit is contained in:
Dmitry
2025-12-11 12:09:10 +03:00
parent 89c55ac4ef
commit 8c5234c800
29 changed files with 5781 additions and 1 deletions

1844
zsh/.config/zsh/.p10k.zsh Normal file

File diff suppressed because it is too large Load Diff

2395
zsh/.config/zsh/.zcompdump Normal file

File diff suppressed because it is too large Load Diff

45
zsh/.config/zsh/.zshrc Normal file
View File

@@ -0,0 +1,45 @@
# ════════════════════════════════════════════════════════════
# Ada's Modular ZSH Configuration
# ════════════════════════════════════════════════════════════
# ═══ Powerlevel10k Instant Prompt ══════════════════════════
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# Путь к конфигурации zsh
export ZDOTDIR="${ZDOTDIR:-${HOME}/.config/zsh}"
ZSH_CONFIG_DIR="${ZDOTDIR}/config"
# ═══ Zinit (Plugin Manager) ════════════════════════════════
# Автоматическая установка zinit при первом запуске
ZINIT_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}/zinit/zinit.git"
if [[ ! -d "$ZINIT_HOME" ]]; then
print -P "%F{blue}▓▒░ Установка zinit...%f"
mkdir -p "$(dirname $ZINIT_HOME)"
git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME"
fi
# Загрузка zinit
source "${ZINIT_HOME}/zinit.zsh"
# ═══ Загрузка модулей ══════════════════════════════════════
# Порядок загрузки важен!
source "${ZSH_CONFIG_DIR}/env.zsh" # Переменные окружения
source "${ZSH_CONFIG_DIR}/options.zsh" # Настройки оболочки
source "${ZSH_CONFIG_DIR}/plugins.zsh" # Плагины через zinit
source "${ZSH_CONFIG_DIR}/completion.zsh" # Автодополнение
source "${ZSH_CONFIG_DIR}/aliases.zsh" # Алиасы
source "${ZSH_CONFIG_DIR}/functions.zsh" # Пользовательские функции
source "${ZSH_CONFIG_DIR}/keybindings.zsh" # Горячие клавиши
source "${ZSH_CONFIG_DIR}/prompt.zsh" # Настройка промпта (starship)
# ═══ Локальные настройки (опционально) ═════════════════════
# Для машинно-специфичных настроек
[[ -f "${ZSH_CONFIG_DIR}/local.zsh" ]] && source "${ZSH_CONFIG_DIR}/local.zsh"
# To customize prompt, run `p10k configure` or edit ~/.config/zsh/.p10k.zsh.
[[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh

View File

@@ -0,0 +1,269 @@
# ════════════════════════════════════════════════════════════
# Powerlevel10k Configuration (Nord Theme)
# ════════════════════════════════════════════════════════════
# Сгенерировано для Ada's dotfiles
# Для полной настройки запустите: p10k configure
# Временно отключить опции для безопасной загрузки
'builtin' 'local' '-a' 'p10k_config_opts'
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases')
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
() {
emulate -L zsh -o extended_glob
# Unset all configuration options. This allows you to apply configuration changes without
# restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`.
unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR'
# Zsh >= 5.1 is required.
autoload -Uz is-at-least && is-at-least 5.1 || return
# ═══ Prompt Elements ═══════════════════════════════════════
# Левая часть промпта
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
os_icon # иконка ОС
dir # текущая директория
vcs # git status
newline # перенос строки
prompt_char # символ промпта
)
# Правая часть промпта
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
status # код возврата последней команды
command_execution_time # время выполнения команды
background_jobs # фоновые задачи
direnv # direnv
asdf # asdf version manager
virtualenv # python virtualenv
anaconda # anaconda
pyenv # pyenv
goenv # goenv
nodenv # nodenv
nvm # nvm
nodeenv # nodeenv
node_version # node version
go_version # go version
rust_version # rust version
dotnet_version # .NET version
php_version # php version
laravel_version # laravel version
java_version # java version
package # package version (package.json)
rbenv # rbenv
rvm # rvm
fvm # fvm
luaenv # luaenv
jenv # jenv
plenv # plenv
perlbrew # perlbrew
phpenv # phpenv
scalaenv # scalaenv
haskell_stack # haskell stack
kubecontext # kubernetes context
terraform # terraform workspace
aws # aws profile
aws_eb_env # aws elastic beanstalk
azure # azure account
gcloud # google cloud
google_app_cred # google application credentials
toolbox # toolbox
context # user@hostname
nordvpn # nordvpn
ranger # ranger
nnn # nnn
lf # lf
xplr # xplr
vim_shell # vim shell
midnight_commander # midnight commander
nix_shell # nix shell
vi_mode # vi mode indicator
vpn_ip # vpn ip
load # cpu load
disk_usage # disk usage
ram # ram usage
swap # swap usage
todo # todo items
timewarrior # timewarrior
taskwarrior # taskwarrior
time # время
newline # перенос строки
)
# ═══ Стиль ═════════════════════════════════════════════════
# Стиль промпта: (lean|classic|rainbow|pure)
typeset -g POWERLEVEL9K_MODE='nerdfont-v3'
typeset -g POWERLEVEL9K_ICON_PADDING=moderate
# Prompt style
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX=''
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX=''
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX=''
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX=''
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX=''
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX=''
typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=''
typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=''
typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR=' '
typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR=' '
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION=''
typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true
# ═══ Nord Colors ═══════════════════════════════════════════
# Nord color palette
local nord0='#2E3440' # Polar Night - darkest
local nord1='#3B4252' # Polar Night
local nord2='#434C5E' # Polar Night
local nord3='#4C566A' # Polar Night - brightest
local nord4='#D8DEE9' # Snow Storm
local nord5='#E5E9F0' # Snow Storm
local nord6='#ECEFF4' # Snow Storm - brightest
local nord7='#8FBCBB' # Frost - cyan
local nord8='#88C0D0' # Frost - bright cyan
local nord9='#81A1C1' # Frost - blue
local nord10='#5E81AC' # Frost - dark blue
local nord11='#BF616A' # Aurora - red
local nord12='#D08770' # Aurora - orange
local nord13='#EBCB8B' # Aurora - yellow
local nord14='#A3BE8C' # Aurora - green
local nord15='#B48EAD' # Aurora - purple
# ═══ OS Icon ═══════════════════════════════════════════════
typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=$nord8
typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=$nord1
# ═══ Prompt Character ══════════════════════════════════════
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$nord14
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$nord11
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION=''
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION=''
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V'
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶'
typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true
typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=''
# ═══ Directory ═════════════════════════════════════════════
typeset -g POWERLEVEL9K_DIR_FOREGROUND=$nord4
typeset -g POWERLEVEL9K_DIR_BACKGROUND=$nord2
typeset -g POWERLEVEL9K_DIR_SHORTENED=true
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_SHORTEN_DELIMITER=''
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=$nord3
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=$nord4
typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
# Special directories
typeset -g POWERLEVEL9K_DIR_CLASSES=(
'~/Documents(|/*)' DOCUMENTS
'~/Downloads(|/*)' DOWNLOADS
'~(|/*)' HOME
'*' DEFAULT
)
typeset -g POWERLEVEL9K_DIR_DOCUMENTS_FOREGROUND=$nord13
typeset -g POWERLEVEL9K_DIR_DOWNLOADS_FOREGROUND=$nord12
typeset -g POWERLEVEL9K_DIR_HOME_FOREGROUND=$nord8
typeset -g POWERLEVEL9K_DIR_DEFAULT_FOREGROUND=$nord4
# ═══ Git ═══════════════════════════════════════════════════
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=$nord14
typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=$nord8
typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=$nord13
typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_VCS_CONFLICTED_FOREGROUND=$nord11
typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON=''
typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@'
typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
typeset -g POWERLEVEL9K_VCS_UNSTAGED_ICON='!'
typeset -g POWERLEVEL9K_VCS_STAGED_ICON='+'
typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='⇣'
typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='⇡'
typeset -g POWERLEVEL9K_VCS_STASH_ICON='*'
typeset -g POWERLEVEL9K_VCS_TAG_ICON='#'
# ═══ Status ════════════════════════════════════════════════
typeset -g POWERLEVEL9K_STATUS_OK=false
typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=$nord11
typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=$nord1
# ═══ Command Execution Time ════════════════════════════════
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=1
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$nord13
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=$nord1
# ═══ Background Jobs ═══════════════════════════════════════
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=$nord12
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=$nord1
# ═══ Context (user@host) ═══════════════════════════════════
typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=$nord4
typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=$nord2
typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=$nord11
typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=$nord13
typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m'
# Don't show context unless running with privileges or in SSH.
typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION=
# ═══ Virtualenv ════════════════════════════════════════════
typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$nord9
typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
# ═══ Node Version ══════════════════════════════════════════
typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=$nord14
typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true
# ═══ Go Version ════════════════════════════════════════════
typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=$nord8
typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true
# ═══ Rust Version ══════════════════════════════════════════
typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=$nord12
typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true
# ═══ Kubernetes ════════════════════════════════════════════
typeset -g POWERLEVEL9K_KUBECONTEXT_FOREGROUND=$nord9
typeset -g POWERLEVEL9K_KUBECONTEXT_BACKGROUND=$nord1
typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE=true
# ═══ Terraform ═════════════════════════════════════════════
typeset -g POWERLEVEL9K_TERRAFORM_FOREGROUND=$nord15
typeset -g POWERLEVEL9K_TERRAFORM_BACKGROUND=$nord1
# ═══ Time ══════════════════════════════════════════════════
typeset -g POWERLEVEL9K_TIME_FOREGROUND=$nord4
typeset -g POWERLEVEL9K_TIME_BACKGROUND=$nord2
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'
# ═══ Transient Prompt ══════════════════════════════════════
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always
typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose
# ═══ Другие настройки ══════════════════════════════════════
typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=false
typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true
# ═══ Finalization ══════════════════════════════════════════
(( ! $+functions[p10k] )) || p10k reload
}
# Применить временные опции обратно
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
'builtin' 'unset' 'p10k_config_opts'

View File

@@ -0,0 +1,174 @@
# ════════════════════════════════════════════════════════════
# Aliases
# ════════════════════════════════════════════════════════════
# ═══ Навигация ═════════════════════════════════════════════
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
# Быстрый переход в часто используемые директории
alias dl='cd ~/Downloads'
alias dt='cd ~/Desktop'
alias doc='cd ~/Documents'
alias dev='cd ~/dev'
# zoxide - умная навигация (если установлен)
if command -v zoxide &>/dev/null; then
alias cd='z' # заменить cd на z
alias cdi='zi' # интерактивный выбор через fzf
alias cdq='zoxide query'
alias cdr='zoxide remove'
fi
# ═══ Списки файлов ═════════════════════════════════════════
# Использовать eza если доступен, иначе ls с цветами
if command -v eza &>/dev/null; then
alias ls='eza --icons --group-directories-first'
alias ll='eza -l --icons --group-directories-first --git'
alias la='eza -la --icons --group-directories-first --git'
alias lt='eza --tree --level=2 --icons'
alias l='eza -lah --icons --group-directories-first --git'
else
alias ls='ls --color=auto --group-directories-first'
alias ll='ls -lh --color=auto --group-directories-first'
alias la='ls -lAh --color=auto --group-directories-first'
alias l='ls -lah --color=auto --group-directories-first'
fi
# ═══ Безопасность ══════════════════════════════════════════
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# ═══ Системные команды ═════════════════════════════════════
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias df='df -h'
alias du='du -h'
alias free='free -h'
# Быстрый доступ к редактору
alias v='${EDITOR}'
alias vim='nvim'
alias vi='nvim'
# ═══ Сеть ══════════════════════════════════════════════════
alias ping='ping -c 5'
alias ports='netstat -tulanp'
# myip определена как функция в functions.zsh (более полная версия)
alias localip="ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127.0.0.1"
# Proxy
alias proxy-on='export http_proxy="http://127.0.0.1:8118" https_proxy="http://127.0.0.1:8118" HTTP_PROXY="http://127.0.0.1:8118" HTTPS_PROXY="http://127.0.0.1:8118" && echo "Proxy enabled"'
alias proxy-off='unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY && echo "Proxy disabled"'
alias proxy-status='env | grep -i proxy'
# ═══ Git ═══════════════════════════════════════════════════
alias g='git'
alias gs='git status'
alias gst='git --no-pager status' # без пейджера
alias ga='git add'
alias gaa='git add .'
alias gc='git commit'
alias gcm='git commit -m'
alias gp='git push'
alias gpl='git pull'
alias gd='git diff'
alias gco='git checkout'
alias gb='git branch'
alias gl='git log --oneline --graph --decorate'
alias glog='git log --oneline --graph --decorate --all'
# ═══ Docker ════════════════════════════════════════════════
if command -v docker &>/dev/null; then
alias d='docker'
alias dc='docker-compose'
alias dps='docker ps'
alias dpsa='docker ps -a'
alias di='docker images'
alias dex='docker exec -it'
alias dlog='docker logs -f'
alias dstop='docker stop $(docker ps -aq)'
alias drm='docker rm $(docker ps -aq)'
alias drmi='docker rmi $(docker images -q)'
alias dclean='docker system prune -af --volumes'
fi
# ═══ Kubectl ═══════════════════════════════════════════════
if command -v kubectl &>/dev/null; then
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kgd='kubectl get deployments'
alias kdp='kubectl describe pod'
alias kds='kubectl describe service'
alias kdd='kubectl describe deployment'
alias kl='kubectl logs -f'
alias kex='kubectl exec -it'
fi
# ═══ Ruby (rbenv) ══════════════════════════════════════════
if command -v rbenv &>/dev/null; then
alias rb='ruby'
alias be='bundle exec'
alias bi='bundle install'
alias bu='bundle update'
fi
# ═══ Python ════════════════════════════════════════════════
alias py='python3'
alias pip='pip3'
alias venv='python3 -m venv'
alias activate='source venv/bin/activate'
# ═══ Node.js ═══════════════════════════════════════════════
alias ni='npm install'
alias nid='npm install --save-dev'
alias nig='npm install -g'
alias nr='npm run'
alias ns='npm start'
alias nt='npm test'
# ═══ Утилиты ═══════════════════════════════════════════════
alias zshrc='${EDITOR} ~/.config/zsh/.zshrc'
alias reload='source ~/.config/zsh/.zshrc'
alias path='echo $PATH | tr ":" "\n"'
alias h='history'
alias c='clear'
alias x='exit'
alias rsend='sudo rsync -avhP --stats'
alias wakemac='ssh vps "wakeonlan -i 192.168.1.255 FC:34:97:E1:08:E9"'
# Быстрое обновление системы (для разных дистрибутивов)
if command -v apt &>/dev/null; then
alias update='sudo apt update && sudo apt upgrade -y'
elif command -v pacman &>/dev/null; then
alias update='sudo pacman -Syu'
elif command -v dnf &>/dev/null; then
alias update='sudo dnf upgrade -y'
elif command -v zypper &>/dev/null; then
alias update='sudo zypper refresh && sudo zypper update -y'
fi
# Универсальная установка пакетов (для разных дистрибутивов)
if command -v apt &>/dev/null; then
alias install='sudo apt install -y'
elif command -v pacman &>/dev/null; then
alias install='sudo pacman -S --noconfirm'
elif command -v dnf &>/dev/null; then
alias install='sudo dnf install -y'
elif command -v zypper &>/dev/null; then
alias install='sudo zypper install -y'
fi
# ═══ Прочее ════════════════════════════════════════════════
# weather определена как функция в functions.zsh (более полная версия)
alias cheat='curl cheat.sh'
alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date'
alias lidon='sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target'
alias lidoff='sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target'

View File

@@ -0,0 +1,94 @@
# ════════════════════════════════════════════════════════════
# Completion Settings
# ════════════════════════════════════════════════════════════
# ═══ Инициализация ═════════════════════════════════════════
autoload -Uz compinit
# Проверять новые автодополнения раз в день
if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+24) ]]; then
compinit
touch ${ZDOTDIR}/.zcompdump
else
compinit -C
fi
# ═══ Кэш дополнений ════════════════════════════════════════
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path "${XDG_CACHE_HOME}/zsh/zcompcache"
# Создать директорию для кэша если не существует
[[ ! -d "${XDG_CACHE_HOME}/zsh" ]] && mkdir -p "${XDG_CACHE_HOME}/zsh"
# ═══ Меню выбора ═══════════════════════════════════════════
zstyle ':completion:*' menu select
zstyle ':completion:*' group-name ''
zstyle ':completion:*' verbose yes
# ═══ Форматирование ════════════════════════════════════════
zstyle ':completion:*:descriptions' format '%F{blue}-- %d --%f'
zstyle ':completion:*:messages' format '%F{purple}-- %d --%f'
zstyle ':completion:*:warnings' format '%F{red}-- no matches found --%f'
zstyle ':completion:*:corrections' format '%F{yellow}-- %d (errors: %e) --%f'
# ═══ Сопоставление ═════════════════════════════════════════
zstyle ':completion:*' matcher-list \
'm:{a-zA-Z}={A-Za-z}' \
'r:|[._-]=* r:|=*' \
'l:|=* r:|=*'
# ═══ Цвета ═════════════════════════════════════════════════
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-colors ''
# ═══ Процессы ══════════════════════════════════════════════
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w"
# Не предлагать уже использованные опции
zstyle ':completion:*:*:kill:*' ignore-line yes
# ═══ Команды ═══════════════════════════════════════════════
# Игнорировать внутренние функции (начинающиеся с _)
zstyle ':completion:*:functions' ignored-patterns '_*'
# ═══ Директории ════════════════════════════════════════════
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' list-dirs-first true
# Игнорировать родительскую директорию
zstyle ':completion:*:cd:*' ignore-parents parent pwd
# ═══ Хосты ═════════════════════════════════════════════════
zstyle ':completion:*:ssh:*' hosts off
zstyle ':completion:*:scp:*' hosts off
# Читать хосты из ~/.ssh/config
if [[ -f ~/.ssh/config ]]; then
h=()
if [[ -r ~/.ssh/config ]]; then
h=(${${${(@M)${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*})
fi
zstyle ':completion:*:ssh:*' hosts $h
zstyle ':completion:*:scp:*' hosts $h
fi
# ═══ Man страницы ══════════════════════════════════════════
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*:manuals.(^1*)' insert-sections true
# ═══ Автодополнение для sudo ═══════════════════════════════
zstyle ':completion:*:sudo:*' command-path \
/usr/local/sbin \
/usr/local/bin \
/usr/sbin \
/usr/bin \
/sbin \
/bin
# ═══ Массивы ═══════════════════════════════════════════════
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
# ═══ Расширения ════════════════════════════════════════════
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*' expand yes

View File

@@ -0,0 +1,79 @@
# ════════════════════════════════════════════════════════════
# Environment Variables
# ════════════════════════════════════════════════════════════
# ═══ Основные пути ═════════════════════════════════════════
export EDITOR="${EDITOR:-nvim}"
export VISUAL="${VISUAL:-nvim}"
export PAGER="less"
# ═══ XDG Base Directories ══════════════════════════════════
export XDG_CONFIG_HOME="${HOME}/.config"
export XDG_DATA_HOME="${HOME}/.local/share"
export XDG_CACHE_HOME="${HOME}/.cache"
export XDG_STATE_HOME="${HOME}/.local/state"
# ═══ История команд ════════════════════════════════════════
export HISTFILE="${XDG_STATE_HOME}/zsh/history"
export HISTSIZE=50000
export SAVEHIST=50000
# Создать директорию для истории если не существует
[[ ! -d "$(dirname $HISTFILE)" ]] && mkdir -p "$(dirname $HISTFILE)"
# ═══ Less ══════════════════════════════════════════════════
export LESS='-R -M -i -j10'
export LESSHISTFILE="${XDG_CACHE_HOME}/less/history"
# ═══ Ruby (rbenv) ══════════════════════════════════════════
if [[ -d "${HOME}/.rbenv" ]]; then
export PATH="${HOME}/.rbenv/bin:${PATH}"
command -v rbenv &>/dev/null && eval "$(rbenv init - zsh)"
fi
# ═══ Node.js ═══════════════════════════════════════════════
# Если используете nvm
export NVM_DIR="${XDG_CONFIG_HOME}/nvm"
[[ -s "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh" --no-use # Ленивая загрузка
# ═══ Python ════════════════════════════════════════════════
# Отключить создание .pyc файлов
export PYTHONDONTWRITEBYTECODE=1
# export PYENV_ROOT="$HOME/.pyenv"
# export PATH="$PYENV_ROOT/bin:$PATH"
# ═══ Go ════════════════════════════════════════════════════
export GOPATH="${HOME}/go"
export PATH="${GOPATH}/bin:${PATH}"
# ═══ Rust ══════════════════════════════════════════════════
export CARGO_HOME="${HOME}/.cargo"
export PATH="${CARGO_HOME}/bin:${PATH}"
# ═══ Локальные бинарники ═══════════════════════════════════
export PATH="${HOME}/.local/bin:${PATH}"
# ═══ Цвета ═════════════════════════════════════════════════
export CLICOLOR=1
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43'
# ═══ FZF ═══════════════════════════════════════════════════
export FZF_DEFAULT_OPTS="
--height 40%
--layout=reverse
--border
--inline-info
--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8
--color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc
--color=marker:#f5e0dc,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8
"
# Использовать fd вместо find если доступен
if command -v fd &>/dev/null; then
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
fi
if command -v zoxide &>/dev/null; then
eval "$(zoxide init zsh)"
fi

View File

@@ -0,0 +1,181 @@
# ════════════════════════════════════════════════════════════
# Custom Functions
# ════════════════════════════════════════════════════════════
# ═══ Навигация ═════════════════════════════════════════════
# mkcd - создать директорию и перейти в неё
mkcd() {
mkdir -p "$1" && cd "$1"
}
# up - подняться на N уровней вверх
up() {
local d=""
local limit="${1:-1}"
for ((i=1; i<=limit; i++)); do
d="../$d"
done
if [[ -z "$d" ]]; then
d=..
fi
cd "$d" || return
}
# ═══ Поиск ═════════════════════════════════════════════════
# ff - быстрый поиск файлов
ff() {
if command -v fd &>/dev/null; then
fd "$@"
else
find . -iname "*$1*"
fi
}
# fh - поиск в истории команд с fzf
fh() {
if command -v fzf &>/dev/null; then
print -z $(history -n 1 | fzf --tac --no-sort)
else
history | grep "$1"
fi
}
# ═══ Файлы и директории ════════════════════════════════════
# extract - универсальная распаковка (если плагин не загружен)
if ! command -v extract &>/dev/null; then
extract() {
if [[ -f $1 ]]; then
case $1 in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.tar.xz) tar xJf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar 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
}
fi
# backup - создать резервную копию файла
backup() {
if [[ -f $1 ]]; then
cp "$1"{,.backup-$(date +%Y%m%d-%H%M%S)}
echo "Backup created: $1.backup-$(date +%Y%m%d-%H%M%S)"
else
echo "File not found: $1"
fi
}
# ═══ Размер файлов ═════════════════════════════════════════
# dirsize - показать размер директории
dirsize() {
du -sh "${1:-.}" 2>/dev/null || echo "Directory not found"
}
# largest - показать N самых больших файлов в директории
largest() {
local num=${1:-10}
du -ah "${2:-.}" | sort -rh | head -n "$num"
}
# ═══ Процессы ══════════════════════════════════════════════
# psgrep - поиск процессов
psgrep() {
ps aux | grep -v grep | grep -i -e VSZ -e "$1"
}
# kill процесс по имени
killp() {
local pid
pid=$(ps aux | grep -v grep | grep "$1" | awk '{print $2}')
if [[ -n $pid ]]; then
echo "Killing process: $1 (PID: $pid)"
kill -9 "$pid"
else
echo "Process not found: $1"
fi
}
# ═══ Сеть ══════════════════════════════════════════════════
# myip - показать все IP адреса
myip() {
echo "External IP: $(curl -s ifconfig.me)"
echo "Local IPs:"
ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127.0.0.1
}
# ports - показать открытые порты
openports() {
sudo netstat -tulanp | grep LISTEN
}
# ═══ Git ═══════════════════════════════════════════════════
# gitignore - скачать .gitignore для языка
gitignore() {
if [[ -z $1 ]]; then
echo "Usage: gitignore <language>"
return 1
fi
curl -sL "https://www.toptal.com/developers/gitignore/api/$1" -o .gitignore
echo ".gitignore created for: $1"
}
# gclone - клонировать репозиторий и перейти в него
gclone() {
if [[ -z $1 ]]; then
echo "Usage: gclone <repository>"
return 1
fi
local repo_name=$(basename "$1" .git)
git clone "$1" && cd "$repo_name" || return
}
# ═══ Разработка ════════════════════════════════════════════
# serve - быстрый HTTP сервер
serve() {
local port="${1:-8000}"
if command -v python3 &>/dev/null; then
echo "Starting server on http://localhost:$port"
python3 -m http.server "$port"
else
echo "Python3 not found"
fi
}
# json - форматировать JSON
json() {
if [[ -f $1 ]]; then
python3 -m json.tool "$1"
else
echo "$1" | python3 -m json.tool
fi
}
# ═══ Утилиты ═══════════════════════════════════════════════
# weather - погода для города
weather() {
local city="${1:-Moscow}"
curl -s "wttr.in/$city?format=3"
}

View File

@@ -0,0 +1,87 @@
# ════════════════════════════════════════════════════════════
# Keybindings
# ════════════════════════════════════════════════════════════
# ═══ Режим редактирования ══════════════════════════════════
# Использовать emacs режим (можно переключить на vi)
bindkey -e
# Для vi режима раскомментируйте:
# bindkey -v
# ═══ Навигация по строке ═══════════════════════════════════
bindkey '^A' beginning-of-line # Ctrl+A - начало строки
bindkey '^E' end-of-line # Ctrl+E - конец строки
bindkey '^[[H' beginning-of-line # Home - начало строки
bindkey '^[[F' end-of-line # End - конец строки
# ═══ Редактирование ════════════════════════════════════════
bindkey '^K' kill-line # Ctrl+K - удалить до конца
bindkey '^U' backward-kill-line # Ctrl+U - удалить до начала
bindkey '^W' backward-kill-word # Ctrl+W - удалить слово назад
bindkey '^Y' yank # Ctrl+Y - вставить
# ═══ Навигация по словам ═══════════════════════════════════
bindkey '^[[1;5C' forward-word # Ctrl+Right - вперёд на слово
bindkey '^[[1;5D' backward-word # Ctrl+Left - назад на слово
bindkey '^[^[[C' forward-word # Alt+Right - вперёд на слово
bindkey '^[^[[D' backward-word # Alt+Left - назад на слово
# ═══ История команд ════════════════════════════════════════
# Обычная навигация по истории (без фильтрации)
bindkey '^P' up-history # Ctrl+P - предыдущая команда (без фильтра)
bindkey '^N' down-history # Ctrl+N - следующая команда (без фильтра)
# Стрелки вверх/вниз - с фильтрацией по началу строки
bindkey '^[[A' up-line-or-search # Up - предыдущая команда (с фильтром)
bindkey '^[[B' down-line-or-search # Down - следующая команда (с фильтром)
# Поиск в истории (если загружен history-substring-search)
if (( $+functions[history-substring-search-up] )); then
# Alt+Up/Down для поиска подстроки в истории
bindkey '^[[1;3A' history-substring-search-up # Alt+Up
bindkey '^[[1;3B' history-substring-search-down # Alt+Down
fi
# ═══ Автодополнение ════════════════════════════════════════
bindkey '^I' complete-word # Tab - автодополнение
bindkey '^[[Z' reverse-menu-complete # Shift+Tab - назад по меню
# Принять автопредложение (если загружен autosuggestions)
if (( $+widgets[autosuggest-accept] )); then
bindkey '^F' autosuggest-accept # Ctrl+F - принять предложение
bindkey '^[[C' forward-char # Right - вперёд на символ (не принимая)
bindkey '^ ' autosuggest-accept # Ctrl+Space - принять предложение
fi
# ═══ FZF ═══════════════════════════════════════════════════
# FZF key-bindings загружаются в plugins.zsh
# Здесь можно переопределить привязки если нужно
if command -v fzf &>/dev/null; then
# Привязки уже установлены в plugins.zsh через key-bindings.zsh
# Можно добавить дополнительные кастомные привязки здесь
:
fi
# ═══ Полезные команды ══════════════════════════════════════
bindkey '^L' clear-screen # Ctrl+L - очистить экран
bindkey '^X^E' edit-command-line # Ctrl+X Ctrl+E - редактировать в $EDITOR
# Загрузить edit-command-line если нужно
autoload -Uz edit-command-line
zle -N edit-command-line
# ═══ Дополнительные привязки ═══════════════════════════════
bindkey '^D' delete-char-or-list # Ctrl+D - удалить символ или показать список
bindkey '^H' backward-delete-char # Ctrl+H - удалить символ назад
bindkey '^?' backward-delete-char # Backspace - удалить символ назад
# ═══ Копирование/вставка (xclip) ══════════════════════════
if command -v xclip &>/dev/null; then
# Скопировать текущую команду в буфер обмена
function _copy_command_to_clipboard() {
echo -n "$BUFFER" | xclip -selection clipboard
zle -M "Copied to clipboard"
}
zle -N _copy_command_to_clipboard
bindkey '^X^C' _copy_command_to_clipboard # Ctrl+X Ctrl+C
fi

View File

@@ -0,0 +1,48 @@
# ════════════════════════════════════════════════════════════
# Shell Options
# ════════════════════════════════════════════════════════════
# ═══ История ═══════════════════════════════════════════════
setopt EXTENDED_HISTORY # Записывать timestamp в историю
setopt HIST_EXPIRE_DUPS_FIRST # Удалять дубликаты в первую очередь
setopt HIST_IGNORE_DUPS # Не записывать дубликаты подряд
setopt HIST_IGNORE_ALL_DUPS # Удалить старую запись если новая - дубликат
setopt HIST_FIND_NO_DUPS # Не показывать дубликаты при поиске
setopt HIST_IGNORE_SPACE # Не записывать команды начинающиеся с пробела
setopt HIST_SAVE_NO_DUPS # Не сохранять дубликаты
setopt HIST_REDUCE_BLANKS # Убирать лишние пробелы
setopt HIST_VERIFY # Показывать команду перед выполнением из истории
setopt SHARE_HISTORY # Делиться историей между сессиями
# ═══ Навигация ═════════════════════════════════════════════
setopt AUTO_CD # cd в директорию просто набрав её имя
setopt AUTO_PUSHD # Автоматически делать pushd
setopt PUSHD_IGNORE_DUPS # Не добавлять дубликаты в стек директорий
setopt PUSHD_SILENT # Не печатать стек после pushd/popd
setopt PUSHD_TO_HOME # pushd без аргументов = pushd $HOME
# ═══ Дополнение ════════════════════════════════════════════
setopt ALWAYS_TO_END # Курсор в конец при автодополнении
setopt AUTO_MENU # Показывать меню при повторном tab
setopt AUTO_LIST # Автоматически показывать список вариантов
setopt COMPLETE_IN_WORD # Дополнять внутри слова
unsetopt MENU_COMPLETE # Не вставлять первый вариант автоматически
# ═══ Глобы и расширения ════════════════════════════════════
setopt EXTENDED_GLOB # Расширенный синтаксис глобов
setopt GLOB_DOTS # Включать скрытые файлы в глобы
setopt NOMATCH # Ошибка если паттерн не совпал
setopt NUMERIC_GLOB_SORT # Сортировать числовые имена файлов численно
# ═══ Работа с командами ════════════════════════════════════
setopt CORRECT # Исправлять опечатки в командах
setopt CORRECT_ALL # Исправлять опечатки в аргументах
setopt INTERACTIVE_COMMENTS # Разрешить комментарии в интерактивном режиме
setopt MULTIOS # Множественные перенаправления
setopt LONG_LIST_JOBS # Подробный вывод jobs
# ═══ Другое ════════════════════════════════════════════════
setopt NOTIFY # Сообщать о завершении фоновых задач немедленно
setopt NO_BEEP # Отключить звуковые сигналы
setopt NO_HUP # Не убивать фоновые задачи при выходе
setopt PROMPT_SUBST # Разрешить подстановки в промпте

View File

@@ -0,0 +1,100 @@
# ════════════════════════════════════════════════════════════
# Plugins (via Zinit)
# ════════════════════════════════════════════════════════════
# ═══ Powerlevel10k Theme ═══════════════════════════════════
# Загружаем ПЕРВЫМ для instant prompt
zinit ice depth=1
zinit light romkatv/powerlevel10k
# ═══ Turbo Mode ════════════════════════════════════════════
# Плагины загружаются асинхронно для ускорения старта
# ═══ FZF key-bindings ══════════════════════════════════════
# Загружаем ПЕРВЫМ, чтобы виджеты были определены до syntax-highlighting
if command -v fzf &>/dev/null; then
# Попробовать разные пути установки fzf
if [[ -f /usr/share/fzf/key-bindings.zsh ]]; then
source /usr/share/fzf/key-bindings.zsh
elif [[ -f /usr/share/doc/fzf/examples/key-bindings.zsh ]]; then
source /usr/share/doc/fzf/examples/key-bindings.zsh
elif [[ -f ~/.fzf.zsh ]]; then
source ~/.fzf.zsh
fi
fi
# ═══ Автодополнение ════════════════════════════════════════
# zsh-completions - дополнительные автодополнения
zinit ice wait lucid blockf atpull'zinit creinstall -q .'
zinit light zsh-users/zsh-completions
# ═══ Автопредложения ═══════════════════════════════════════
# zsh-autosuggestions - предложения из истории
zinit ice wait lucid atload'_zsh_autosuggest_start'
zinit light zsh-users/zsh-autosuggestions
# Настройки autosuggestions
export ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#585b70'
export ZSH_AUTOSUGGEST_STRATEGY=(history completion)
export ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20
# ═══ История ═══════════════════════════════════════════════
# zsh-history-substring-search - поиск в истории
zinit ice wait lucid
zinit light zsh-users/zsh-history-substring-search
# ═══ FZF ═══════════════════════════════════════════════════
# fzf - интерактивный поиск
if command -v fzf &>/dev/null; then
# fzf-tab - fzf для автодополнения
zinit ice wait lucid
zinit light Aloxaf/fzf-tab
# Настройки fzf-tab
zstyle ':fzf-tab:*' fzf-command fzf
zstyle ':fzf-tab:*' fzf-pad 4
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -1 --color=always $realpath 2>/dev/null || ls -1 --color=always $realpath'
zstyle ':fzf-tab:complete:*:*' fzf-preview 'less ${(Q)realpath} 2>/dev/null || eza -1 --color=always ${(Q)realpath} 2>/dev/null || ls -1 --color=always ${(Q)realpath}'
fi
# ═══ Навигация ═════════════════════════════════════════════
# zoxide - умный cd с историей
if command -v zoxide &>/dev/null; then
eval "$(zoxide init zsh)"
fi
# ═══ Git ═══════════════════════════════════════════════════
# Быстрые git алиасы и функции
zinit ice wait lucid
zinit snippet OMZ::plugins/git/git.plugin.zsh
# ═══ Дополнительные инструменты ════════════════════════════
# sudo - нажать ESC дважды чтобы добавить sudo
zinit ice wait lucid
zinit snippet OMZ::plugins/sudo/sudo.plugin.zsh
# extract - универсальная распаковка архивов
zinit ice wait lucid
zinit snippet OMZ::plugins/extract/extract.plugin.zsh
# colored-man-pages - цветные man страницы
zinit ice wait lucid
zinit snippet OMZ::plugins/colored-man-pages/colored-man-pages.plugin.zsh
# docker - автодополнение для docker
if command -v docker &>/dev/null; then
zinit ice wait lucid as'completion'
zinit snippet OMZP::docker
fi
# kubectl - автодополнение для kubectl
if command -v kubectl &>/dev/null; then
zinit ice wait lucid as'completion'
zinit snippet OMZ::plugins/kubectl/kubectl.plugin.zsh
fi
# ═══ Подсветка синтаксиса (ПОСЛЕДНИЙ плагин) ═══════════════
# zsh-syntax-highlighting - ОБЯЗАТЕЛЬНО загружать последним
# Это гарантирует, что все виджеты уже определены
zinit ice wait lucid atinit'zpcompinit; zpcdreplay'
zinit light zsh-users/zsh-syntax-highlighting

View File

@@ -0,0 +1,24 @@
# ════════════════════════════════════════════════════════════
# Prompt Configuration (Powerlevel10k)
# ════════════════════════════════════════════════════════════
# ═══ Powerlevel10k Instant Prompt ══════════════════════════
# Должен быть в самом начале ~/.zshrc для мгновенного промпта
# Перенесен сюда для модульности, но в идеале должен быть раньше
# Включить Powerlevel10k instant prompt. Должно быть близко к началу ~/.config/zsh/.zshrc.
# Инициализация кода, который может требовать ввод консоли или печать, должна идти выше этого блока.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# ═══ Powerlevel10k Theme ═══════════════════════════════════
# Загрузка через zinit (будет установлена автоматически)
# Примечание: этот блок должен быть в plugins.zsh, но оставлен здесь для ясности
# zinit ice depth=1
# zinit light romkatv/powerlevel10k
# ═══ P10k Configuration ════════════════════════════════════
# Загрузка конфигурации p10k
# Для настройки запустите: p10k configure
[[ -f ~/.config/zsh/.p10k.zsh ]] && source ~/.config/zsh/.p10k.zsh