migrate: stow → chezmoi

- restructure repo to chezmoi conventions (dot_ prefix, private_dot_ssh/)
- add nvim config (was untracked)
- encrypt restic pass.txt with age
- remove stow artifacts (.stow-local-ignore, stow package dirs)
- update bootstrap.sh to use chezmoi apply
- remove runtime files from tracking (micro buffers, zed backup)
This commit is contained in:
Dmitry
2026-05-13 18:28:01 +03:00
parent 3c680e6f68
commit 7c8a4893de
56 changed files with 789 additions and 185 deletions
+206
View File
@@ -0,0 +1,206 @@
# ════════════════════════════════════════════════════════════
# 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 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
# Включение прокси (HTTP, HTTPS и SOCKS5h для DNS через прокси)
alias proxy-on='export http_proxy="http://127.0.0.1:7897" https_proxy="http://127.0.0.1:7897" ALL_PROXY="socks5://127.0.0.1:7897" all_proxy="socks5://127.0.0.1:7897" && echo "󰖟 Proxy enabled (127.0.0.1:7897)"'
# Полное отключение всех переменных прокси
alias proxy-off='unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_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'
# ═══ 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 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"'
alias zshrc='${EDITOR} ~/.config/zsh/.zshrc'
alias reload='source ~/.config/zsh/.zshrc'
alias path='echo $PATH | tr ":" "\n"'
# Использовать bat вместо cat, если установлен
if command -v bat &>/dev/null; then
alias cat='bat'
fi
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
# ═══ Прочее ════════════════════════════════════════════════
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'
# alias gemini='NODE_NO_WARNINGS=1 npx @google/gemini-cli'
alias sshvpn='sshuttle --dns -r fl-vps 0/0 -X ~/.dotfiles/configs/.exclude-ip.txt'
alias sshp-fg='ssh -D 127.0.0.1:1080 fl-vps -v sleep 9999'
alias gbackup='git add . && git commit -m "backup: $(date +"%Y-%m-%d %H:%M")" && git push && git remote get-url upstream &>/dev/null && git push upstream || true'
alias db_rev='rails db:drop && rails db:create && rails db:migrate && rails db:seed'
alias zed='zeditor'
alias dotfiles='$VISUAL ~/dotfiles'
alias ua-drop-caches='sudo paccache -rk3; paru -Sc --noconfirm'
alias ua-update-all='export TMPFILE="$(mktemp)"; \
sudo true; \
rate-mirrors --save=$TMPFILE arch --max-delay=21600 \
&& sudo mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-backup \
&& sudo mv $TMPFILE /etc/pacman.d/mirrorlist \
&& paru -Syyu --noconfirm \
&& ua-drop-caches'
+94
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
+96
View File
@@ -0,0 +1,96 @@
# ════════════════════════════════════════════════════════════
# Environment Variables
# ════════════════════════════════════════════════════════════
# ═══ Основные пути ═════════════════════════════════════════
export EDITOR="${EDITOR:-nano}"
export VISUAL="${VISUAL:-zeditor}"
export PAGER="less"
export SUDO_EDITOR="zeditor --wait"
# ═══ 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 SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
# ═══ История команд ════════════════════════════════════════
export HISTFILE="${XDG_STATE_HOME}/zsh/history"
export HISTSIZE=50000
export SAVEHIST=50000
# Создать директорию для истории если не существует
[[ ! -d "$(dirname $HISTFILE)" ]] && mkdir -p "$(dirname $HISTFILE)"
# Добавить Zed в PATH
export PATH="${HOME}/.local/bin/zed:${PATH}"
export PATH="${HOME}/.config/Code/User/globalStorage/ms-vscode-remote.remote-containers/cli-bin:${PATH}"
# ═══ 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
# ═══ asdf ══ ═════════════════════════════════════════════
if [[ -f "$HOME/.asdf/asdf.sh" ]]; then
. "$HOME/.asdf/asdf.sh"
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
if command -v direnv >/dev/null 2>&1; then
eval "$(direnv hook zsh)"
fi
export SSH_AUTH_SOCK='/home/ada/.bitwarden-ssh-agent.sock'
+287
View File
@@ -0,0 +1,287 @@
# ════════════════════════════════════════════════════════════
# 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"
}
# Функция для монтирования облаков
mount-clouds() {
mkdir -p ~/YaDisk ~/GDrive
echo "Монтирую диски..."
# Яндекс.Диск
rclone mount yadisk: ~/YaDisk \
--vfs-cache-mode writes \
--vfs-cache-max-size 10G \
--vfs-cache-max-age 2h \
--allow-non-empty \
--daemon
# Google Drive
rclone mount gdrive: ~/GDrive \
--vfs-cache-mode writes \
--vfs-cache-max-size 10G \
--vfs-cache-max-age 2h \
--allow-non-empty \
--daemon
echo "Готово! Проверяю монтирование:"
ls ~/YaDisk >/dev/null 2>&1 && echo "✅ YaDisk смонтирован" || echo "⚠️ Ошибка монтирования YaDisk"
ls ~/GDrive >/dev/null 2>&1 && echo "✅ GDrive смонтирован" || echo "⚠️ Ошибка монтирования GDrive"
}
# Функция для размонтирования
unmount-clouds() {
echo "Отключаю диски..."
fusermount -uz ~/YaDisk 2>/dev/null && echo "✅ YaDisk отключен" || echo "⚠️ YaDisk не был примонтирован"
fusermount -uz ~/GDrive 2>/dev/null && echo "✅ GDrive отключен" || echo "⚠️ GDrive не был примонтирован"
}
SSH_PROXY_PID_FILE="/tmp/ssh_proxy.pid"
# Адрес Privoxy, который слушает HTTP и перенаправляет в SOCKS5
# 1. Запуск
sshp-start() {
if [ -f "$SSH_PROXY_PID_FILE" ] && kill -0 $(cat "$SSH_PROXY_PID_FILE") 2>/dev/null; then
echo "Ошибка: Прокси уже запущен (PID: $(cat $SSH_PROXY_PID_FILE))"
return 1
fi
# Запуск SSH в фоновом режиме
ssh -fN -D 127.0.0.1:1080 fl-vps
# Сохранение PID последнего запущенного процесса
pgrep -f "ssh -fN -D 127.0.0.1:1080 fl-vps" > "$SSH_PROXY_PID_FILE"
echo "SSH прокси (SOCKS5) запущен на 127.0.0.1:1080."
}
# 2. Остановка
sshp-stop() {
if [ -f "$SSH_PROXY_PID_FILE" ]; then
PID=$(cat "$SSH_PROXY_PID_FILE")
if kill "$PID" 2>/dev/null; then
rm -f "$SSH_PROXY_PID_FILE"
echo "SSH прокси (PID $PID) остановлен."
else
echo "Процесс $PID не найден. Очистка PID-файла..."
rm -f "$SSH_PROXY_PID_FILE"
fi
else
echo "Ошибка: Прокси не запущен."
fi
}
# 3. Статус
sshp-status() {
if [ -f "$SSH_PROXY_PID_FILE" ] && kill -0 $(cat "$SSH_PROXY_PID_FILE") 2>/dev/null; then
PID=$(cat "$SSH_PROXY_PID_FILE")
echo "Статус: РАБОТАЕТ (PID: $PID)"
# Проверка прослушивания порта
lsof -i -nP | grep "$PID" | grep LISTEN
else
echo "Статус: ОСТАНОВЛЕН"
fi
}
sshp-restart() {
sshp-stop
sleep 1
sshp-start
}
activate() {
local venv_dir=""
if [[ -d ".venv" ]]; then
venv_dir=".venv"
elif [[ -d "venv" ]]; then
venv_dir="venv"
else
for venv_dir in **/.venv **/venv; do
[[ -d "$venv_dir" ]] && break
done
fi
if [[ -n "$venv_dir" && -f "$venv_dir/bin/activate" ]]; then
source "$venv_dir/bin/activate"
else
echo "venv/.venv not found"
return 1
fi
}
+79
View File
@@ -0,0 +1,79 @@
# ════════════════════════════════════════════════════════════
# 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 - просто вниз
# Оставляем Alt+Стрелки для чего-то другого или удаляем,
# если они дублируют функционал.
# ═══ Автодополнение ════════════════════════════════════════
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
+48
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 # Разрешить подстановки в промпте
+107
View File
@@ -0,0 +1,107 @@
# ════════════════════════════════════════════════════════════
# 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
# ═══ История ═══════════════════════════════════════════════
zinit ice wait"0" lucid atload'
# Привязываем стрелки к плагину (теперь они не будут глючить)
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
# Настройка цветов (по желанию)
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg=magenta,bold"
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg=red,bold"
'
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
+24
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
File diff suppressed because it is too large Load Diff
+61
View File
@@ -0,0 +1,61 @@
# ════════════════════════════════════════════════════════════
# 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
# To customize prompt, run `p10k configure` or edit /home/ada/.config/zsh/.p10k.zsh.
[[ ! -f /home/ada/.config/zsh/.p10k.zsh ]] || source /home/ada/.config/zsh/.p10k.zsh
export NVM_DIR="$HOME/.config/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
# . "$HOME/.local/share/../bin/env"
# To customize prompt, run `p10k configure` or edit ~/.dotfiles/zsh/.config/zsh/.p10k.zsh.
[[ ! -f ~/.dotfiles/zsh/.config/zsh/.p10k.zsh ]] || source ~/.dotfiles/zsh/.config/zsh/.p10k.zsh