From 7a895403cd3baf6f0a7bae78ea96d17c0cd928bb Mon Sep 17 00:00:00 2001 From: Dmitry <124861781+ada-dmitry@users.noreply.github.com> Date: Tue, 17 Feb 2026 10:53:02 +0300 Subject: [PATCH] feat(zsh): modularize Zsh configuration with environment variables, aliases, functions, and plugins - Create a new Zsh configuration structure under ~/.config/zsh - Add main .zshrc file to load configurations and plugins - Implement environment variables in env.zsh - Define aliases for common commands in aliases.zsh - Set up completion settings in completion.zsh - Add custom functions for navigation, file handling, and process management in functions.zsh - Configure keybindings in keybindings.zsh - Set shell options in options.zsh - Load plugins using Zinit in plugins.zsh - Configure prompt settings in prompt.zsh - Create a .zshenv file to set ZDOTDIR for Zsh configuration directory --- .gitignore | 34 + .stow-local-ignore | 5 + README.md | 14 + alacritty/.config/alacritty/alacritty.toml | 151 ++ git/.gitconfig | 230 +++ git/.gitignore_global | 190 ++ privoxy_config | 43 + ssh/.ssh/config | 9 + ssh/.ssh/config.d/00-globals.conf | 17 + ssh/.ssh/config.d/10-local.conf | 13 + ssh/.ssh/config.d/20-selfhost.conf | 21 + ssh/.ssh/config.d/30-corporate.conf | 51 + ssh/.ssh/config.d/40-proxy.conf | 23 + tmux/.tmux.conf | 1886 ++++++++++++++++++++ tmux/.tmux.conf.local | 663 +++++++ vim/.vimrc | 132 ++ zed/.config/zed/settings.json | 123 ++ zed/.config/zed/settings_backup.json | 123 ++ zsh/.config/zsh/.p10k.zsh | 1720 ++++++++++++++++++ zsh/.config/zsh/.zshrc | 50 + zsh/.config/zsh/config/aliases.zsh | 177 ++ zsh/.config/zsh/config/completion.zsh | 94 + zsh/.config/zsh/config/env.zsh | 93 + zsh/.config/zsh/config/functions.zsh | 266 +++ zsh/.config/zsh/config/keybindings.zsh | 79 + zsh/.config/zsh/config/options.zsh | 48 + zsh/.config/zsh/config/plugins.zsh | 107 ++ zsh/.config/zsh/config/prompt.zsh | 24 + zsh/.zshenv | 1 + 29 files changed, 6387 insertions(+) create mode 100644 .gitignore create mode 100644 .stow-local-ignore create mode 100644 README.md create mode 100644 alacritty/.config/alacritty/alacritty.toml create mode 100644 git/.gitconfig create mode 100644 git/.gitignore_global create mode 100644 privoxy_config create mode 100644 ssh/.ssh/config create mode 100644 ssh/.ssh/config.d/00-globals.conf create mode 100644 ssh/.ssh/config.d/10-local.conf create mode 100644 ssh/.ssh/config.d/20-selfhost.conf create mode 100644 ssh/.ssh/config.d/30-corporate.conf create mode 100644 ssh/.ssh/config.d/40-proxy.conf create mode 100644 tmux/.tmux.conf create mode 100644 tmux/.tmux.conf.local create mode 100644 vim/.vimrc create mode 100644 zed/.config/zed/settings.json create mode 100644 zed/.config/zed/settings_backup.json create mode 100644 zsh/.config/zsh/.p10k.zsh create mode 100644 zsh/.config/zsh/.zshrc create mode 100644 zsh/.config/zsh/config/aliases.zsh create mode 100644 zsh/.config/zsh/config/completion.zsh create mode 100644 zsh/.config/zsh/config/env.zsh create mode 100644 zsh/.config/zsh/config/functions.zsh create mode 100644 zsh/.config/zsh/config/keybindings.zsh create mode 100644 zsh/.config/zsh/config/options.zsh create mode 100644 zsh/.config/zsh/config/plugins.zsh create mode 100644 zsh/.config/zsh/config/prompt.zsh create mode 100644 zsh/.zshenv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edcbf8a --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Shell history and dumps +*/.zshdump +*/.zcompdump +*/.zsh_history +*/.bash_history +*/.history +.zsh_history +.zhistory +.zcompdump + +# Config files +*/.env +*/.env.local + +# Editor config +*/.vscode/ +*/.idea/ + +# OS files +*/.DS_Store +*/Thumbs.db +*/.zcompdump + +# SSH Keys +*/.ssh/id_* +*/.ssh/known_hosts* + +# Lock files +*/.lock +*/.pid +*/.pid.lock +*/.sock + + diff --git a/.stow-local-ignore b/.stow-local-ignore new file mode 100644 index 0000000..0a90edf --- /dev/null +++ b/.stow-local-ignore @@ -0,0 +1,5 @@ +^/README\.md +^/\.git +^/\.gitignore +^/\archive +privoxy_config \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bd7a7ca --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Dotfiles + +Мой репозиторий конфигурационных файлов. + +## Установка + +```bash +git clone ~/.dotfiles +cd ~/.dotfiles +stow -t ~ */ +``` + +Дополнение: +yandex.ru, devel.mephi.ru, mephi.ru, *.ada-dev.ru, 192.168.1.0/24, ada-dev.ru, disk.yandex.ru, sogaz.ru, gosuslugi.ru, vk.com, wifi.mephi.ru, market.yandex.ru, tbank.ru, practicum.yandex.ru, practicum.yandex, reddit.com \ No newline at end of file diff --git a/alacritty/.config/alacritty/alacritty.toml b/alacritty/.config/alacritty/alacritty.toml new file mode 100644 index 0000000..02ad887 --- /dev/null +++ b/alacritty/.config/alacritty/alacritty.toml @@ -0,0 +1,151 @@ +live_config_reload = true + +[shell] +program = "/usr/bin/zsh" +args = ["-l", "-c", "tmux new-session -A -s main"] + +[window] +decorations = "None" # без рамок и заголовка +# startup_mode = "Maximized" # просто растянутое окно +opacity = 0.70 +padding = { x = 10, y = 5 } + +[font] +size = 14.0 + +[font.normal] +family = "FiraCode Nerd Font Mono" +style = "Regular" + +[font.bold] +family = "FiraCode Nerd Font Mono" +style = "Bold" + +[font.italic] +family = "FiraCode Nerd Font Mono" +style = "Italic" + +[scrolling] +history = 10000 +multiplier = 5 + +[selection] +save_to_clipboard = true +semantic_escape_chars = "@-./_~?&=%+#" + +[mouse] +hide_when_typing = false + +[cursor] +# kitty: beam + blinking +blink_interval = 500 +thickness = 0.15 + +[cursor.style] +shape = "Beam" +blinking = "On" + +[bell] +# Disable visual bell by setting duration to 0; keep a valid easing to satisfy parser +animation = "EaseOutExpo" +duration = 0 + +# Nord color scheme +# https://www.nordtheme.com/ +[colors.primary] +background = "#2E3440" +foreground = "#D8DEE9" + +[colors.cursor] +text = "#2E3440" +cursor = "#D8DEE9" + +[colors.selection] +text = "#D8DEE9" +background = "#434C5E" + +[colors.normal] +black = "#3B4252" +red = "#BF616A" +green = "#A3BE8C" +yellow = "#EBCB8B" +blue = "#81A1C1" +magenta = "#B48EAD" +cyan = "#88C0D0" +white = "#E5E9F0" + +[colors.bright] +black = "#4C566A" +red = "#BF616A" +green = "#A3BE8C" +yellow = "#EBCB8B" +blue = "#81A1C1" +magenta = "#B48EAD" +cyan = "#8FBCBB" +white = "#ECEFF4" + +# Key bindings translated where possible +[[keyboard.bindings]] +key = "C" +mods = "Control|Shift" +action = "Copy" + +[[keyboard.bindings]] +key = "V" +mods = "Control|Shift" +action = "Paste" + +[[keyboard.bindings]] +key = "Enter" +mods = "Control|Shift" +action = "SpawnNewInstance" + +[[keyboard.bindings]] +key = "F11" +mods = "Control|Shift" +action = "ToggleFullscreen" + +[[keyboard.bindings]] +key = "Equals" +mods = "Control|Shift" +action = "IncreaseFontSize" + +[[keyboard.bindings]] +key = "Minus" +mods = "Control|Shift" +action = "DecreaseFontSize" + +[[keyboard.bindings]] +key = "Key0" +mods = "Control|Shift" +action = "ResetFontSize" + +[[keyboard.bindings]] +key = "Up" +mods = "Control|Shift" +action = "ScrollLineUp" + +[[keyboard.bindings]] +key = "Down" +mods = "Control|Shift" +action = "ScrollLineDown" + +[[keyboard.bindings]] +key = "PageUp" +mods = "Control|Shift" +action = "ScrollPageUp" + +[[keyboard.bindings]] +key = "PageDown" +mods = "Control|Shift" +action = "ScrollPageDown" + +[[keyboard.bindings]] +key = "Home" +mods = "Control|Shift" +action = "ScrollToTop" + +[[keyboard.bindings]] +key = "End" +mods = "Control|Shift" +action = "ScrollToBottom" diff --git a/git/.gitconfig b/git/.gitconfig new file mode 100644 index 0000000..e8c0bb4 --- /dev/null +++ b/git/.gitconfig @@ -0,0 +1,230 @@ +# ════════════════════════════════════════════════════════════ +# Git Configuration +# ════════════════════════════════════════════════════════════ + +[user] + # Укажите ваше имя и email + name = Dmitry + email = 124861781+ada-dmitry@users.noreply.github.com + +[core] + # Редактор по умолчанию + editor = micro + + # Игнорировать изменения прав доступа + filemode = false + + # Автоматическое преобразование CRLF в LF + autocrlf = input + + # Предупреждать о пробелах в конце строк + whitespace = trailing-space,space-before-tab + + # Использовать pager для вывода (bat если установлен) + # -F: выходить если вывод помещается на один экран + # -R: показывать цвета + # -X: не очищать экран при выходе + # -S: не переносить длинные строки + pager = less -FRXS + excludesfile = /home/ada/.gitignore_global + +[init] + # Имя основной ветки по умолчанию + defaultBranch = main + +[color] + # Включить цветной вывод + ui = auto + branch = auto + diff = auto + status = auto + +[color "branch"] + current = yellow bold + local = green + remote = cyan + +[color "diff"] + meta = yellow + frag = magenta bold + old = red bold + new = green bold + whitespace = red reverse + +[color "status"] + added = green bold + changed = yellow bold + untracked = red bold + +# ═══ Алиасы ═════════════════════════════════════════════════ + +[alias] + # Базовые сокращения + st = status + co = checkout + br = branch + ci = commit + cm = commit -m + ca = commit --amend + + # Добавление файлов + a = add + aa = add --all + ap = add --patch + + # Логи + l = log --oneline --graph --decorate + lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit + ll = log --pretty=format:'%C(yellow)%h%Cred%d %Creset%s%Cblue [%cn]' --decorate --numstat + ls = log --pretty=format:'%C(yellow)%h %Cred%ad %Cblue%an%Creset%d %s' --date=short + lol = log --graph --decorate --pretty=oneline --abbrev-commit + lola = log --graph --decorate --pretty=oneline --abbrev-commit --all + + # История файла + filelog = log -u + fl = log -u + + # Diff + d = diff + ds = diff --staged + dc = diff --cached + + # Показать последний коммит + last = log -1 HEAD --stat + + # Отменить последний коммит (сохранив изменения) + undo = reset --soft HEAD^ + + # Показать изменения в файле + blame = blame -w -M -C + + # Быстрое переключение веток + switch = checkout + sw = checkout + + # Создать и переключиться на новую ветку + cob = checkout -b + + # Удалить ветку + brd = branch -d + brD = branch -D + + # Обновить текущую ветку + up = pull --rebase --autostash + + # Отправить текущую ветку + push-current = push -u origin HEAD + pc = push -u origin HEAD + + # Stash + sl = stash list + sa = stash apply + ss = stash save + sp = stash pop + + # Показать файлы в коммите + show-files = show --pretty="" --name-only + + # Статистика коммитов + contributors = shortlog -sn + + # Удалить удаленные ветки из локального репозитория + prune-all = fetch --all --prune + + # Показать ветки с последними коммитами + branches = branch -vv + + # Показать удаленные репозитории + remotes = remote -v + + # Найти коммит по сообщению + find = log --all --oneline --grep + + # Игнорировать изменения в файле + ignore = update-index --assume-unchanged + unignore = update-index --no-assume-unchanged + ignored = !git ls-files -v | grep "^[[:lower:]]" + + # Создать архив текущей ветки + archive-branch = !git archive --format=tar --prefix=$(git symbolic-ref --short HEAD)/ HEAD | gzip > $(git symbolic-ref --short HEAD).tar.gz + + # Показать размер репозитория + repo-size = count-objects -vH + +[push] + # Отправлять только текущую ветку + default = current + + # Автоматически создавать удаленную ветку + autoSetupRemote = true + +[pull] + # Использовать rebase вместо merge при pull + rebase = true + +[fetch] + # Автоматически удалять несуществующие удаленные ветки + prune = true + +[rebase] + # Автоматически применять stash перед rebase + autoStash = true + +[merge] + # Показывать конфликты в стиле diff3 + conflictStyle = diff3 + + # Инструмент для разрешения конфликтов + tool = vimdiff + +[diff] + # Алгоритм diff для лучшего качества + algorithm = histogram + + # Показывать перемещения файлов + renames = copies + + # Инструмент для просмотра diff + tool = vimdiff + +[status] + # Показывать подмодули в статусе + submoduleSummary = true + + # Показывать непроиндексированные файлы + showUntrackedFiles = all + +[log] + # Показывать даты в относительном формате + date = relative + +[help] + # Автоматически исправлять опечатки в командах (после 0.1 сек) + autocorrect = 10 + +[credential] + # Кэшировать пароли на 1 час + helper = cache --timeout=3600 + +# ═══ URL shortcuts ══════════════════════════════════════════ + +[url "git@github.com:"] + insteadOf = gh: + +[url "https://github.com/"] + insteadOf = github: + +[url "https://gitlab.com/"] + insteadOf = gitlab: + +# ═══ Дополнительные настройки ═══════════════════════════════ + +[filter "lfs"] + # Git LFS (Large File Storage) + clean = git-lfs clean -- %f + smudge = git-lfs smudge -- %f + process = git-lfs filter-process + required = true + +# ═══ Ваши дополнительные настройки ═════════════════════════ +# Добавьте свои настройки ниже diff --git a/git/.gitignore_global b/git/.gitignore_global new file mode 100644 index 0000000..0d9560f --- /dev/null +++ b/git/.gitignore_global @@ -0,0 +1,190 @@ +# ════════════════════════════════════════════════════════════ +# Global Git Ignore +# Файлы, которые будут игнорироваться во всех репозиториях +# ════════════════════════════════════════════════════════════ + +# ═══ OS Generated ═══════════════════════════════════════════ + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# Linux +*~ +.directory +.Trash-* + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +# ═══ IDEs & Editors ═════════════════════════════════════════ + +# VS Code +.vscode/ +*.code-workspace +.history/ + +# JetBrains IDEs +.idea/ +*.iml +*.ipr +*.iws +.idea_modules/ + +# Vim +*.swp +*.swo +*~ +.*.sw? +Session.vim + +# Emacs +*~ +\#*\# +.\#* +.projectile + +# Sublime Text +*.sublime-project +*.sublime-workspace + +# ═══ Languages ══════════════════════════════════════════════ + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +ENV/ +.venv/ +pip-log.txt +pip-delete-this-directory.txt +.pytest_cache/ +.coverage +htmlcov/ +*.egg-info/ +dist/ +build/ + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.npm +.eslintcache +.node_repl_history + +# Rust +target/ +Cargo.lock +**/*.rs.bk + +# Go +*.exe +*.test +*.prof +vendor/ + +# Ruby +*.gem +*.rbc +.bundle/ +.ruby-version +.ruby-gemset + +# Java +*.class +*.jar +*.war +*.ear +.gradle/ +build/ + +# ═══ Logs & Databases ═══════════════════════════════════════ + +# Logs +*.log +logs/ +*.pid +*.seed + +# Databases +*.sql +*.sqlite +*.sqlite3 +*.db + +# ═══ Environment & Secrets ══════════════════════════════════ + +.env +.env.local +.env.*.local +*.pem +*.key +*.cert +.envrc +.tool-versions + +# ═══ Build & Dependencies ═══════════════════════════════════ + +# Compiled files +*.o +*.a +*.out +*.ko +*.obj +*.elf +*.dll +*.dylib + +# Packages +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# ═══ Temporary Files ════════════════════════════════════════ + +# Temporary +tmp/ +temp/ +*.tmp +*.bak +*.backup +*.cache + +# ═══ Project Specific ═══════════════════════════════════════ + +# Coverage reports +coverage/ +.nyc_output/ + +# Documentation builds +docs/_build/ +site/ + +# Testing +.tox/ + +# ═══ Other ══════════════════════════════════════════════════ + +# CTags +tags +TAGS + +# Local configuration +.local/ +local.properties diff --git a/privoxy_config b/privoxy_config new file mode 100644 index 0000000..178488d --- /dev/null +++ b/privoxy_config @@ -0,0 +1,43 @@ +# Privoxy Configuration +# Minimal config with only active settings + +# Configuration directories +confdir /etc/privoxy +logdir /var/log/privoxy + +# Actions and filters +actionsfile match-all.action +actionsfile default.action +actionsfile user.action + +filterfile default.filter +filterfile user.filter + +# Logging +logfile logfile + +# Network settings +listen-address 127.0.0.1:8118 + +# forward-socks5 / ada-proxy:Fk2NNUAJ#x2@o2@89.167.32.245:8443 . + +# forward-socks5 / 192.168.1.10:1080 . +forward-socks5 / 127.0.0.1:1080 . + +# Security settings +toggle 1 +enable-remote-toggle 0 +enable-remote-http-toggle 0 +enable-edit-actions 0 +enforce-blocks 0 +buffer-limit 4096 +enable-proxy-authentication-forwarding 0 + +# Connection settings +forwarded-connect-retries 0 +accept-intercepted-requests 0 +allow-cgi-request-crunching 0 +split-large-forms 0 +keep-alive-timeout 5 +tolerate-pipelining 1 +socket-timeout 300 \ No newline at end of file diff --git a/ssh/.ssh/config b/ssh/.ssh/config new file mode 100644 index 0000000..95d3155 --- /dev/null +++ b/ssh/.ssh/config @@ -0,0 +1,9 @@ +# ════════════════════════════════════════════════════════════ +# SSH Configuration (includes) +# ════════════════════════════════════════════════════════════ + +# Все настройки вынесены по секциям в config.d/*.conf +# Порядок загрузки задаётся префиксом (00-, 10-, 20- ...) + + +Include config.d/*.conf \ No newline at end of file diff --git a/ssh/.ssh/config.d/00-globals.conf b/ssh/.ssh/config.d/00-globals.conf new file mode 100644 index 0000000..c2486c6 --- /dev/null +++ b/ssh/.ssh/config.d/00-globals.conf @@ -0,0 +1,17 @@ +# 00 - Global options + +Host * + # Переиспользование соединений (быстрее) + # ControlMaster auto + # ControlPath ~/.ssh/sockets/%r@%h:%p + # ControlPersist 10m + + # Держать соединение живым + ServerAliveInterval 60 + ServerAliveCountMax 3 + + # Сжатие данных + Compression yes + + # Отключить GSSAPI (ускоряет подключение) + GSSAPIAuthentication no diff --git a/ssh/.ssh/config.d/10-local.conf b/ssh/.ssh/config.d/10-local.conf new file mode 100644 index 0000000..faa2a8c --- /dev/null +++ b/ssh/.ssh/config.d/10-local.conf @@ -0,0 +1,13 @@ +# 10 - Local network (direct IP) + +# ПК +Host ada-pc + HostName 192.168.1.100 + User ada + IdentityFile ~/.ssh/id_ed25519 + +Host ada-x1 + HostName 192.168.1.101 + User ada + IdentityFile ~/.ssh/id_ed25519 + diff --git a/ssh/.ssh/config.d/20-selfhost.conf b/ssh/.ssh/config.d/20-selfhost.conf new file mode 100644 index 0000000..c135bba --- /dev/null +++ b/ssh/.ssh/config.d/20-selfhost.conf @@ -0,0 +1,21 @@ +# 20 - SelfHost +Host vps vps-ada + HostName 157.22.231.198 + Port 22 + User root + IdentityFile ~/.ssh/id_ed25519_homelab + +# Gitea +Host git.ada-dev.ru + HostName 192.168.1.10 + User git + Port 2222 + IdentityFile ~/.ssh/id_ed25519_homelab + ProxyJump vps + +# ZimaOS +Host home zima + HostName 192.168.1.10 + User ada + IdentityFile ~/.ssh/id_ed25519_homelab + SetEnv TERM=xterm-256color diff --git a/ssh/.ssh/config.d/30-corporate.conf b/ssh/.ssh/config.d/30-corporate.conf new file mode 100644 index 0000000..118c04c --- /dev/null +++ b/ssh/.ssh/config.d/30-corporate.conf @@ -0,0 +1,51 @@ +# 40 - Corporate (PAO IL) + +Host ada-alt + HostName 127.0.0.1 + User ada-alt + Port 3322 + IdentityFile ~/.ssh/id_ed25519 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + + +Host pam + HostName 10.1.194.230 + User antipenkoda@MSK.LAN + Port 2244 + ProxyJump ada-alt + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + + +Host master-ans + HostName 10.1.194.160 + User ada + IdentityFile /home/ada/.ssh/id_ed25519_ada + ProxyJump pam + LocalForward 9000 localhost:22 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + +Host master-ans-direct + HostName localhost + Port 9000 + User ada + SetEnv TERM=xterm-256color + +Host gitea + HostName 10.1.194.243 + User gitea + IdentityFile ~/.ssh/id_ed25519_ada + ProxyJump pam + + +Host devel.mephi.ru + HostName devel.mephi.ru + IdentityFile ~/.ssh/id_ed25519_ada + KexAlgorithms +curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 + +Host github.com + HostName github.com + User git + IdentityFile ~/.ssh/id_ed25519 diff --git a/ssh/.ssh/config.d/40-proxy.conf b/ssh/.ssh/config.d/40-proxy.conf new file mode 100644 index 0000000..f17bc64 --- /dev/null +++ b/ssh/.ssh/config.d/40-proxy.conf @@ -0,0 +1,23 @@ +Host ru-vps + HostName 157.22.231.198 + User ada + IdentityFile ~/.ssh/id_ed25519 + ServerAliveInterval 30 + ServerAliveCountMax 3 + +Host nl-vps + HostName 170.168.25.171 + User ada + IdentityFile ~/.ssh/id_ed25519 + ProxyJump ru-vps + ServerAliveInterval 30 + ServerAliveCountMax 3 + +Host fl-vps + HostName 89.167.32.245 + Port 4322 + User ada + IdentityFile ~/.ssh/id_ed25519_flvpn + ProxyJump ru-vps + ServerAliveInterval 30 + ServerAliveCountMax 3 \ No newline at end of file diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf new file mode 100644 index 0000000..9d60144 --- /dev/null +++ b/tmux/.tmux.conf @@ -0,0 +1,1886 @@ +# : << 'EOF' +# Oh my tmux! +# 💛🩷💙🖤❤️🤍 +# https://github.com/gpakosz/.tmux +# (‑●‑●)> dual licensed under the WTFPL v2 license and the MIT license, +# without any warranty. +# Copyright 2012— Gregory Pakosz (@gpakosz). +# +# ------------------------------------------------------------------------------ +# 🚨 DO NOT MODIFY THIS FILE +# instead, override your .local customization file copy, see README.md +# ------------------------------------------------------------------------------ + + +# -- general ------------------------------------------------------------------- + +set -g default-terminal "screen-256color" + +%if #{>=:#{version},3.2} +%if #{||:#{m/ri:mintty|iTerm|ghostty,#{TERM_PROGRAM}},#{!=:#{XTERM_VERSION},}} +set -g extended-keys on # needed by Control + Shift bindings +%endif +%endif +set -s escape-time 10 # faster command sequences +set -sg repeat-time 600 # increase repeat timeout +set -s focus-events on + +set -g prefix2 C-a # GNU-Screen compatible prefix +bind C-a send-prefix -2 + +set -q -g status-utf8 on # expect UTF-8 (tmux < 2.2) +setw -q -g utf8 on + +set -g history-limit 5000 # boost history + +# edit configuration +bind e new-window -n "#{TMUX_CONF_LOCAL}" sh -c '_E=${VISUAL:-${EDITOR:-vim}}; case "$_E" in *vim*) $_E -c ":set syntax=tmux" "$TMUX_CONF_LOCAL";; *) $_E "$TMUX_CONF_LOCAL";; esac && "$TMUX_PROGRAM" ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} source "$TMUX_CONF" \; display "$TMUX_CONF_LOCAL sourced"' + +# reload configuration +bind r run "sh -c '\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} source \"\$TMUX_CONF\"'" \; display "#{TMUX_CONF} sourced" + + +# -- display ------------------------------------------------------------------- + +set -g base-index 1 # start windows numbering at 1 +setw -g pane-base-index 1 # make pane numbering consistent with windows + +setw -g automatic-rename on # rename window to reflect current program +set -g renumber-windows on # renumber windows when a window is closed + +set -g set-titles on # set terminal title + +set -g display-panes-time 800 # slightly longer pane indicators display time +set -g display-time 1000 # slightly longer status messages display time + +set -g status-interval 10 # redraw status line every 10 seconds + +# clear both screen and history +bind -n C-l send-keys C-l \; run 'sleep 0.2' \; clear-history + +# activity +set -g monitor-activity on +set -g visual-activity off + + +# -- navigation ---------------------------------------------------------------- + +# create session +bind C-c new-session + +# find session +bind C-f command-prompt -p find-session 'switch-client -t %%' + +# session navigation +bind BTab switch-client -l # move to last session + +# split current window horizontally +bind - split-window -v +# split current window vertically +bind _ split-window -h + +# pane navigation +bind -r h select-pane -L # move left +bind -r j select-pane -D # move down +bind -r k select-pane -U # move up +bind -r l select-pane -R # move right +bind > swap-pane -D # swap current pane with the next one +bind < swap-pane -U # swap current pane with the previous one + +# maximize current pane +bind + run "cut -c3- '#{TMUX_CONF}' | sh -s _maximize_pane '#{session_name}' '#D'" + +# pane resizing +bind -r H resize-pane -L 2 +bind -r J resize-pane -D 2 +bind -r K resize-pane -U 2 +bind -r L resize-pane -R 2 + +# window navigation +unbind n +unbind p +bind -r C-h previous-window # select previous window +bind -r C-l next-window # select next window +bind -r C-S-H swap-window -t -1 \; select-window -t -1 # swap current window with the previous one +bind -r C-S-L swap-window -t +1 \; select-window -t +1 # swap current window with the next one +bind Tab last-window # move to last active window + +# toggle mouse +bind m run "cut -c3- '#{TMUX_CONF}' | sh -s _toggle_mouse" + + +# -- facebook pathpicker ------------------------------------------------------- + +bind F run "cut -c3- '#{TMUX_CONF}' | sh -s _fpp '#{pane_id}' '#{pane_current_path}'" + + +# -- copy mode ----------------------------------------------------------------- + +bind Enter copy-mode # enter copy mode + +bind -T copy-mode-vi v send -X begin-selection +bind -T copy-mode-vi C-v send -X rectangle-toggle +bind -T copy-mode-vi y send -X copy-selection-and-cancel +bind -T copy-mode-vi Escape send -X cancel +bind -T copy-mode-vi H send -X start-of-line +bind -T copy-mode-vi L send -X end-of-line + +# copy to X11 clipboard +if -b 'command -v xsel > /dev/null 2>&1' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - | xsel -i -b"' +if -b '! command -v xsel > /dev/null 2>&1 && command -v xclip > /dev/null 2>&1' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - | xclip -i -selection clipboard >/dev/null 2>&1"' +# copy to Wayland clipboard +if -b '[ "$XDG_SESSION_TYPE" = "wayland" ] && command -v wl-copy > /dev/null 2>&1' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - | wl-copy"' +# copy to macOS clipboard +if -b 'command -v pbcopy > /dev/null 2>&1' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - | pbcopy"' +# copy to Windows clipboard +if -b 'command -v clip.exe > /dev/null 2>&1' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - | clip.exe"' +if -b '[ -c /dev/clipboard ]' 'bind y run -b "\"\$TMUX_PROGRAM\" \${TMUX_SOCKET:+-S \"\$TMUX_SOCKET\"} save-buffer - > /dev/clipboard"' + + +# -- buffers ------------------------------------------------------------------- + +bind b list-buffers # list paste buffers +bind p paste-buffer -p # paste from the top paste buffer +bind P choose-buffer # choose which buffer to paste from + + +# -- 8< ------------------------------------------------------------------------ + +%if #{==:#{TMUX_PROGRAM},} + run "exec sh -c 'TMUX_PROGRAM=\"\$(LSOF=\$(PATH=\"\$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin\" command -v lsof); \$LSOF -b -w -a -d txt -p #{pid} -Fn 2>/dev/null | perl -n -e \"if (s/^n((?:.(?!dylib\$|so\$))+)\$/\\1/g && s/(?:\s+\\([^\\s]+?\\))?\$//g) { print; exit } } exit 1; {\" 2>/dev/null || readlink \"/proc/#{pid}/exe\" 2>/dev/null)\"; [ \"\$(\"\$TMUX_PROGRAM\" display -p \"#{l:#{pid}}\" 2>/dev/null)\" = \"#{pid}\" ] || TMUX_PROGRAM=\"\$(command -v tmux || printf tmux)\"; \"\$TMUX_PROGRAM\" -S #{socket_path} set-environment -g TMUX_PROGRAM \"\$TMUX_PROGRAM\"'" +%endif +%if #{==:#{TMUX_SOCKET},} + run "exec sh -c '\"\$TMUX_PROGRAM\" -S #{socket_path} set-environment -g TMUX_SOCKET \"#{socket_path}\"'" +%endif +%if #{==:#{TMUX_CONF},} + run "exec sh -c '\"\$TMUX_PROGRAM\" set-environment -g TMUX_CONF \$(for conf in \"\$HOME/.tmux.conf\" \"\$XDG_CONFIG_HOME/tmux/tmux.conf\" \"\$HOME/.config/tmux/tmux.conf\"; do [ -f \"\$conf\" ] && printf \"%s\" \"\$conf\" && break; done)'" +%endif +%if #{==:#{TMUX_CONF_LOCAL},} + run "exec sh -c '\"\$TMUX_PROGRAM\" set-environment -g TMUX_CONF_LOCAL \"\$TMUX_CONF.local\"'" +%endif + +run '"$TMUX_PROGRAM" -S #{socket_path} source "$TMUX_CONF_LOCAL"' +run 'cut -c3- "$TMUX_CONF" | sh -s _apply_configuration' + +# EOF +# +# # exit the script if any statement returns a non-true return value +# set -e +# +# unset SHELL +# +# unset GREP_OPTIONS +# export LC_NUMERIC=C +# # shellcheck disable=SC3041 +# if (set +H 2>/dev/null); then +# set +H +# fi +# +# if ! printf '' | sed -E 's///' 2>/dev/null; then +# if printf '' | sed -r 's///' 2>/dev/null; then +# sed() { +# n=$#; while [ "$n" -gt 0 ]; do arg=$1; shift; case $arg in -E*) arg=-r${arg#-E};; esac; set -- "$@" "$arg"; n=$(( n - 1 )); done +# command sed "$@" +# } +# fi +# fi +# +# _uname_s=$(uname -s) +# +# [ -z "$TMUX" ] && exit 255 +# if [ -z "$TMUX_SOCKET" ]; then +# TMUX_SOCKET=$(printf '%s' "$TMUX" | cut -d, -f1) +# fi +# if [ -z "$TMUX_PROGRAM" ]; then +# TMUX_PID=$(printf '%s' "$TMUX" | cut -d, -f2) +# TMUX_PROGRAM=$(lsof -b -w -a -d txt -p "$TMUX_PID" -Fn 2>/dev/null | perl -n -e "if (s/^n((?:.(?!dylib$|so$))+)$/\1/g) { print; exit } } exit 1; {" 2>/dev/null || readlink "/proc/$TMUX_PID/exe" 2>/dev/null) +# [ "$("$TMUX_PROGRAM" -S "$TMUX_SOCKET" display -p '#{pid}' 2>/dev/null)" = "$TMUX_PID" ] || TMUX_PROGRAM=$(command -v tmux || printf tmux) +# fi +# if [ "$TMUX_PROGRAM" = "tmux" ]; then +# tmux() { +# command tmux ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} "$@" +# } +# else +# tmux() { +# "$TMUX_PROGRAM" ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} "$@" +# } +# fi +# +# _tmux_version=$(tmux -V | perl -n -e '($l, $r) = $_ =~ /^[^0-9]+([0-9.]+)([a-z])?(-rc.*)?$/; print $l * 1000 + ($r eq "" ? 0 : ord($r) - 96)') +# +# _is_true() { +# case "$1" in +# true|yes|1) +# return 0 +# ;; +# *) +# return 1 +# ;; +# esac +# } +# +# _is_enabled() { +# [ "$1" = "enabled" ] +# } +# +# _is_disabled() { +# [ "$1" = "disabled" ] +# } +# +# _circled() { +# circled_digits='⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳' +# if [ "$1" -le 20 ] 2>/dev/null; then +# i=$(( $1 + 1 )) +# eval set -- "$circled_digits" +# eval echo "\${$i}" +# else +# echo "$1" +# fi +# } +# +# _decode_unicode_escapes() { +# printf '%s' "$*" | perl -CS -pe 's/(\\u([0-9A-Fa-f]{1,4})|\\U([0-9A-Fa-f]{1,8}))/chr(hex($2.$3))/eg' 2>/dev/null +# } +# +# _pretty_path() { +# max_length=${1:-auto}; shift +# if [ "$max_length" = "auto" ]; then +# max_length=$(($(tmux -q display -p '#{client_width}') / 4)) +# fi +# { cd "$*" && pwd || printf '%s' "$*"; } | perl -s -p -E ' +# s|^$HOME|~|; +# /^.{0,$max_length}$/ || s|(~?/[^/]+)(/[^/]+)(?:/.+)?(/[^/]+)$|$1$2/...$3|g; +# /^.{0,$max_length}$/ || s|(~?/[^/]+)(/[^/]+)(?:/.+)(/[^/]+)$|$1/...$3|g;' -- -HOME="$HOME" -max_length="$max_length" +# } +# +# if command -v pkill > /dev/null 2>&1; then +# _pkillf() { +# pkill -f "$@" || true +# } +# else +# case "$_uname_s" in +# *CYGWIN*) +# _pkillf() { +# while IFS= read -r pid; do +# kill "$pid" || true +# done << EOF +# $(grep -Eao "$@" /proc/*/cmdline | xargs -0 | sed -E -n 's,/proc/([0-9]+)/.+$,\1,pg') +# EOF +# } +# ;; +# *) +# # shellcheck disable=SC2009 +# _pkillf() { +# while IFS= read -r pid; do +# kill "$pid" || true +# done << EOF +# $(ps -x -o pid= -o command= | grep -E "$@" | cut -d' ' -f1) +# EOF +# } +# ;; +# esac +# fi +# +# if perl -MTime::HiRes -e1; then +# _timestamp() { +# while IFS= read -r line; do +# printf '\t%s\n' "$line" | perl -MPOSIX=strftime -MTime::HiRes=gettimeofday -pe '($s, $us) = gettimeofday(); printf ("[%s.%03d]", strftime("%Y-%m-%d %H:%M:%S", localtime $s), $us / 1000)' +# done +# } +# else +# case "$_uname_s" in +# Darwin) +# _timestamp() { +# while IFS= read -r line; do +# printf '[%s]\t%s\n' "$(date +"%Y-%m-%d %H:%M:%S.000")" "$line" +# done +# } +# ;; +# *) +# _timestamp() { +# while IFS= read -r line; do +# printf '[%s]\t%s\n' "$(date +"%Y-%m-%d %H:%M:%S.%3N")" "$line" +# done +# } +# ;; +# esac +# fi +# +# _bar() { +# bar_palette=$(printf '%s' "$1" | tr ';' ',') +# bar_symbol_empty=$2 +# bar_symbol_full=$3 +# bar_length=$4 # "auto" or number of columns +# bar_value=$5 # value between 0 and 1 +# +# if [ "$bar_length" = "auto" ]; then +# columns=${6:-$(tmux -q display -p '#{client_width}' 2> /dev/null || echo 80)} +# if [ "$columns" -ge 160 ]; then +# bar_length=12 +# elif [ "$columns" -ge 130 ]; then +# bar_length=10 +# elif [ "$columns" -ge 120 ]; then +# bar_length=8 +# elif [ "$columns" -ge 100 ]; then +# bar_length=6 +# else +# bar_length=4 +# fi +# fi +# +# if printf '%s' "$bar_palette" | grep -q -E '^(heat|gradient|gradient\((\s*[#a-zA-Z0-9]{7,9},?)+\))(\s*,\s*[#a-zA-Z0-9]{7,9})?$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=', '; set -- $bar_palette; unset IFS; set +f; } +# palette_style=$1 +# shift +# +# case "$palette_style" in +# gradient) +# palette="colour196 colour202 colour208 colour214 colour220 colour226 colour190 colour154 colour118 colour82 colour46" +# ;; +# heat) +# palette="colour243 colour245 colour247 colour144 colour143 colour142 colour184 colour214 colour208 colour202 colour196" +# ;; +# gradient*) +# palette=${palette_style##gradient(} +# while [ $# -gt 0 ]; do +# palette="$palette${1+ }${1%%)}" +# [ "$1" != "${1%%)}" ] && break +# shift +# done +# ;; +# esac +# bg=${2:-none} +# +# palette=$(printf '%s' "$palette" | awk -v n="$bar_length" '{ for (i = 0; i < n - 1; ++i) printf "%s ", $(1 + i * NF / n); printf $NF }') +# # shellcheck disable=SC2086 +# set -- $palette +# +# full=$(awk "BEGIN { printf \"%.0f\", ($bar_value) * $bar_length }") +# bar="#[bg=$bg]" +# if [ "$full" -gt 0 ]; then +# # shellcheck disable=SC2046 +# bar="$bar$(printf "#[fg=%s]$bar_symbol_full" $(printf '%s' "$palette" | cut -d' ' -f1-"$full"))" +# fi +# empty=$((bar_length - full)) +# if [ "$empty" -gt 0 ]; then +# # shellcheck disable=SC2046 +# bar="$bar$(printf "#[fg=%s]$bar_symbol_empty" $(printf '%s' "$palette" | cut -d' ' -f$((full + 1))-$((full + empty))))" +# fi +# eval bar="$bar#[fg=\${$((full == 0 ? 1 : full))}]" +# elif printf '%s' "$bar_palette" | grep -q -E '^(([#a-zA-Z0-9]{7,9}|none),?){3}$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=,; set -- $bar_palette; unset IFS; set +f; } +# full_fg=$1 +# empty_fg=$2 +# bg=${3:-none} +# +# full=$(awk "BEGIN { printf \"%.0f\", ($bar_value) * $bar_length }") +# bar="#[bg=$bg]" +# if [ "$full" -gt 0 ]; then +# bar="$bar#[fg=$full_fg]$(printf "%0.s$bar_symbol_full" $(seq 1 "$full"))" +# fi +# empty=$((bar_length - full)) +# if [ "$empty" -gt 0 ]; then +# bar="$bar#[fg=$empty_fg]$(printf "%0.s$bar_symbol_empty" $(seq 1 "$empty"))#[fg=$empty_fg]" +# fi +# fi +# +# printf '%s' "$bar" +# } +# +# _hbar() { +# hbar_palette=$(printf '%s' "$1" | tr ';' ',') +# hbar_value=$2 +# +# if printf '%s' "$hbar_palette" | grep -q -E '^(heat|gradient|gradient\((\s*[#a-zA-Z0-9]{7,9},?)+\))(\s*,\s*[#a-zA-Z0-9]{7,9})?$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=', '; set -- $hbar_palette; unset IFS; set +f; } +# palette_style=$1 +# shift +# +# case "$palette_style" in +# gradient) +# palette="colour196 colour202 colour208 colour214 colour220 colour226 colour190 colour154 colour118 colour82 colour46" +# ;; +# heat) +# palette="colour243 colour245 colour247 colour144 colour143 colour142 colour184 colour214 colour208 colour202 colour196" +# ;; +# gradient*) +# palette=${palette_style##gradient(} +# while [ $# -gt 0 ]; do +# palette="$palette${1+ }${1%%)}" +# [ "$1" != "${1%%)}" ] && break +# shift +# done +# ;; +# esac +# bg=${2:-none} +# +# palette=$(printf '%s' "$palette" | awk -v n=8 '{ for (i = 0; i < n - 1; ++i) printf "%s ", $(1 + i * NF / n); printf $NF }') +# # shellcheck disable=SC2086 +# set -- $palette +# +# full=$(awk "BEGIN { printf \"%.0f\", ($hbar_value) * 8 }") +# eval hbar_fg="\${$((full == 0 ? 1 : full))}" +# elif printf '%s' "$hbar_palette" | grep -q -E '^([#a-zA-Z0-9]{7,9},?){3}$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=,; set -- $hbar_palette; unset IFS; set +f; } +# +# # shellcheck disable=SC2046 +# eval $(awk "BEGIN { printf \"hbar_fg=$%d\", (($hbar_value) - 0.001) * $# + 1 }") +# fi +# +# set -- ▏ ▎ ▍ ▌ ▋ ▊ ▉ █ +# # shellcheck disable=SC2046 +# eval $(awk "BEGIN { printf \"hbar_symbol=$%d\", ($hbar_value) * ($# - 1) + 1 }") +# hbar="#[bg=$bg]#[fg=${hbar_fg?}]${hbar_symbol?}" +# +# printf '%s' "$hbar" +# } +# +# _vbar() { +# vbar_palette=$(printf '%s' "$1" | tr ';' ',') +# vbar_value=$2 +# +# if printf '%s' "$vbar_palette" | grep -q -E '^(heat|gradient|gradient\((\s*[#a-zA-Z0-9]{7,9},?)+\))(\s*,\s*[#a-zA-Z0-9]{7,9})?$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=', '; set -- $vbar_palette; unset IFS; set +f; } +# palette_style=$1 +# shift +# +# case "$palette_style" in +# gradient) +# palette="colour196 colour202 colour208 colour214 colour220 colour226 colour190 colour154 colour118 colour82 colour46" +# ;; +# heat) +# palette="colour243 colour245 colour247 colour144 colour143 colour142 colour184 colour214 colour208 colour202 colour196" +# ;; +# gradient*) +# palette=${palette_style##gradient(} +# while [ $# -gt 0 ]; do +# palette="$palette${1+ }${1%%)}" +# [ "$1" != "${1%%)}" ] && break +# shift +# done +# ;; +# esac +# bg=${2:-none} +# +# palette=$(printf '%s' "$palette" | awk -v n=8 '{ for (i = 0; i < n - 1; ++i) printf "%s ", $(1 + i * NF / n); printf $NF }') +# # shellcheck disable=SC2086 +# set -- $palette +# +# full=$(awk "BEGIN { printf \"%.0f\", ($vbar_value) * 8 }") +# eval vbar_fg="\${$((full == 0 ? 1 : full))}" +# elif printf '%s' "$vbar_palette" | grep -q -E '^([#a-zA-Z0-9]{7,9},?){3}$'; then +# # shellcheck disable=SC2086 +# { set -f; IFS=,; set -- $vbar_palette; unset IFS; set +f; } +# +# # shellcheck disable=SC2046 +# eval $(awk "BEGIN { printf \"vbar_fg=$%d\", (($vbar_value) - 0.001) * $# + 1 }") +# fi +# +# set -- ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ +# # shellcheck disable=SC2046 +# eval $(awk "BEGIN { printf \"vbar_symbol=$%d\", ($vbar_value) * ($# - 1) + 1 }") +# vbar="#[bg=$bg]#[fg=${vbar_fg?}]${vbar_symbol?}" +# +# printf '%s' "$vbar" +# } +# +# _maximize_pane() { +# current_session=${1:-$(tmux display -p '#{session_name}')} +# current_pane=${2:-$(tmux display -p '#{pane_id}')} +# +# dead_panes=$(tmux list-panes -s -t "$current_session" -F '#{pane_dead} #{pane_id} #{pane_start_command}' | grep -E -o '^1 %.+maximized.+$' || true) +# restore=$(printf "%s" "$dead_panes" | sed -n -E -e "s/^1 $current_pane .+maximized.+'(%[0-9]+)'\"?$/tmux swap-pane -s \1 -t $current_pane \; kill-pane -t $current_pane/p"\ +# -e "s/^1 (%[0-9]+) .+maximized.+'$current_pane'\"?$/tmux swap-pane -s \1 -t $current_pane \; kill-pane -t \1/p") +# +# if [ -z "$restore" ]; then +# [ "$(tmux list-panes -t "$current_session:" | wc -l | sed 's/^ *//g')" -eq 1 ] && tmux display "Can't maximize with only one pane" && return +# info=$(tmux new-window -t "$current_session:" -F "#{session_name}:#{window_index}.#{pane_id}" -P "maximized... 2>/dev/null & \"$TMUX_PROGRAM\" ${TMUX_SOCKET:+-S \"$TMUX_SOCKET\"} setw -t \"$current_session:\" remain-on-exit on; printf \"\\033[\$(tput lines);0fPane has been maximized, press + to restore\n\" '$current_pane'") +# session_window=${info%.*} +# new_pane=${info#*.} +# +# retry=20 +# while [ "$("$TMUX_PROGRAM" ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} list-panes -t "$session_window" -F '#{session_name}:#{window_index}.#{pane_id} #{pane_dead}' 2>/dev/null)" != "$info 1" ] && [ "$retry" -ne 0 ]; do +# sleep 0.1 +# retry=$((retry - 1)) +# done +# if [ "$retry" -eq 0 ]; then +# tmux display 'Unable to maximize pane' +# fi +# +# tmux setw -t "$session_window" remain-on-exit off \; swap-pane -s "$current_pane" -t "$new_pane" +# else +# $restore || tmux kill-pane +# fi +# } +# +# _toggle_mouse() { +# old=$(tmux show -gv mouse) +# new="" +# +# if [ "$old" = "on" ]; then +# new="off" +# else +# new="on" +# fi +# +# tmux set -g mouse $new +# } +# +# _battery_info() { +# battery_count=0 +# battery_charge=0 +# case "$_uname_s" in +# *Darwin*) +# while IFS= read -r line; do +# [ -z "$line" ] && continue +# percentage=$(printf '%s' "$line" | grep -E -o '[0-9]+%' || echo "0%") +# battery_charge=$(awk -v charge="$battery_charge" -v percentage="${percentage%%%}" 'BEGIN { print charge + percentage / 100 }') +# battery_count=$((battery_count + 1)) +# done << EOF +# $(pmset -g batt | grep 'InternalBattery') +# EOF +# ;; +# *Linux*) +# while IFS= read -r batpath; do +# [ -z "$batpath" ] && continue +# grep -i -q device "$batpath/scope" 2> /dev/null && continue +# +# bat_capacity="$batpath/capacity" +# if [ -r "$bat_capacity" ]; then +# battery_charge=$(awk -v charge="$battery_charge" -v capacity="$(cat "$bat_capacity")" 'BEGIN { print charge + (capacity > 100 ? 100 : capacity) / 100 }') +# else +# bat_energy_full="$batpath/energy_full" +# bat_energy_now="$batpath/energy_now" +# if [ -r "$bat_energy_full" ] && [ -r "$bat_energy_now" ]; then +# battery_charge=$(awk -v charge="$battery_charge" -v energy_now="$(cat "$bat_energy_now")" -v energy_full="$(cat "$bat_energy_full")" 'BEGIN { print charge + energy_now / energy_full }') +# fi +# fi +# battery_count=$((battery_count + 1)) +# done << EOF +# $(find /sys/class/power_supply -maxdepth 1 -iname '*bat*') +# EOF +# ;; +# *CYGWIN*|*MSYS*|*MINGW*) +# while IFS= read -r line; do +# [ -z "$line" ] && continue +# battery_charge=$(printf '%s' "$line" | awk -v charge="$battery_charge" '{ print charge + $2 / 100 }') +# battery_count=$((battery_count + 1)) +# done << EOF +# $(wmic path Win32_Battery get BatteryStatus, EstimatedChargeRemaining 2> /dev/null | tr -d '\r' | tail -n +2 || true) +# EOF +# ;; +# *OpenBSD*) +# for batid in 0 1 2; do +# sysctl -n "hw.sensors.acpibat$batid.raw0" 2>&1 | grep -q 'not found' && continue +# if sysctl -n "hw.sensors.acpibat$batid" | grep -q amphour; then +# battery_charge=$(awk -v charge="$battery_charge" -v remaining="$(sysctl -n hw.sensors.acpibat$batid.amphour3 | cut -d' ' -f1)" -v full="$(sysctl -n hw.sensors.acpibat$batid.amphour0 | cut -d' ' -f1)" 'BEGIN { print charge + remaining / full }') +# else +# battery_charge=$(awk -v charge="$battery_charge" -v remaining="$(sysctl -n hw.sensors.acpibat$batid.watthour3 | cut -d' ' -f1)" -v full="$(sysctl -n hw.sensors.acpibat$batid.watthour0 | cut -d' ' -f1)" 'BEGIN { print charge + remaining / full }') +# fi +# battery_count=$((battery_count + 1)) +# done +# ;; +# *FreeBSD*) +# battery_charge=$(awk -v charge="$(sysctl -n 'hw.acpi.battery.life')" 'BEGIN { print charge / 100 }') +# battery_count=1 +# ;; +# esac +# if [ "$battery_count" -ne 0 ]; then +# battery_charge=$(awk -v charge="$battery_charge" -v count="$battery_count" 'BEGIN { print charge / count }') +# fi +# +# if [ "$battery_charge" = 0 ]; then +# tmux set -ug '@battery_percentage' \;\ +# set -ug '@battery_charge' +# else +# battery_percentage="$(awk "BEGIN { printf \"%.0f%%\", ($battery_charge) * 100 }")" +# +# tmux set -g '@battery_percentage' "$battery_percentage" \;\ +# set -g '@battery_charge' "$battery_charge" +# fi +# } +# +# _battery_status() { +# battery_status_charging=$1 +# battery_status_discharging=$2 +# +# case "$_uname_s" in +# *Darwin*) +# while IFS= read -r line; do +# [ -z "$line" ] && continue +# battery_discharging=$(printf '%s' "$line" | grep -qi "discharging" && echo "true" || echo "false") +# done << EOF +# $(pmset -g batt | grep 'InternalBattery') +# EOF +# ;; +# *Linux*) +# while IFS= read -r batpath; do +# [ -z "$batpath" ] && continue +# grep -i -q device "$batpath/scope" 2> /dev/null && continue +# +# battery_discharging=$(grep -qi "discharging" "$batpath/status" && echo "true" || echo "false") +# done << EOF +# $(find /sys/class/power_supply -maxdepth 1 -iname '*bat*') +# EOF +# ;; +# *CYGWIN*|*MSYS*|*MINGW*) +# while IFS= read -r line; do +# [ -z "$line" ] && continue +# battery_discharging=$(printf '%s' "$line" | awk '{ s = ($1 == 1) ? "true" : "false"; print s }') +# done << EOF +# $(wmic path Win32_Battery get BatteryStatus, EstimatedChargeRemaining 2> /dev/null | tr -d '\r' | tail -n +2 || true) +# EOF +# ;; +# *OpenBSD*) +# for batid in 0 1 2; do +# battery_discharging=$(sysctl -n "hw.sensors.acpibat$batid.raw0" | grep -q 1 && echo "true" || echo "false") +# done +# ;; +# *FreeBSD*) +# battery_discharging=$(sysctl -n 'hw.acpi.battery.state' | grep -q 1 && echo "true" || echo "false") +# ;; +# esac +# +# if [ -z "$battery_discharging" ]; then +# tmux set -ug '@battery_status' +# return +# fi +# +# if [ "$battery_discharging" = "true" ]; then +# battery_status="$battery_status_discharging" +# else +# battery_status="$battery_status_charging" +# fi +# +# tmux set -g '@battery_status' "$battery_status" >/dev/null 2>/dev/null +# } +# +# _pane_info() { +# pane_pid="$1" +# pane_tty="${2##/dev/}" +# case "$_uname_s" in +# *CYGWIN*) +# ps -al | tail -n +2 | awk -v pane_pid="$pane_pid" -v tty="$pane_tty" -v ssh="$(command -v ssh)" ' +# ((/ssh/ && !/-W/ && !/tsh proxy ssh/ && !/sss_ssh_knownhostsproxy/) || !/ssh/) && !/tee/ && $5 == tty { +# user[$1] = $6; if (!child[$2]) child[$2] = $1 +# } +# END { +# pid = pane_pid +# while (child[pid]) { +# if (match(command[pid], "^" ssh " |^ssh ")) { +# break +# } +# pid = child[pid] +# } +# +# file = "/proc/" pid "/cmdline"; getline command < file; close(file) +# gsub(/\0/, " ", command) +# "id -un " user[pid] | getline username +# print pid":"username":"command +# } +# ' +# ;; +# *Linux*) +# ps -t "$pane_tty" --sort=lstart -o user=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -o pid= -o ppid= -o command= | awk -v pane_pid="$pane_pid" -v ssh="$(command -v ssh)" ' +# ((/ssh/ && !/-W/ && !/tsh proxy ssh/ && !/sss_ssh_knownhostsproxy/) || !/ssh/) && !/tee/ { +# user[$2] = $1; if (!child[$3]) child[$3] = $2; pid=$2; $1 = $2 = $3 = ""; command[pid] = substr($0,4) +# } +# END { +# pid = pane_pid +# while (child[pid]) { +# if (match(command[pid], "^" ssh " |^ssh ")) { +# break +# } +# pid = child[pid] +# } +# +# print pid":"user[pid]":"command[pid] +# } +# ' +# ;; +# *) +# ps -t "/dev/$pane_tty" -o user=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -o pid= -o ppid= -o command= | awk -v pane_pid="$pane_pid" -v ssh="$(command -v ssh)" ' +# ((/ssh/ && !/-W/ && !/tsh proxy ssh/ && !/sss_ssh_knownhostsproxy/) || !/ssh/) && !/tee/ { +# user[$2] = $1; if (!child[$3]) child[$3] = $2; pid=$2; $1 = $2 = $3 = ""; command[pid] = substr($0,4) +# } +# END { +# pid = pane_pid +# while (child[pid]) { +# if (match(command[pid], "^" ssh " |^ssh ")) { +# break +# } +# pid = child[pid] +# } +# +# print pid":"user[pid]":"command[pid] +# } +# ' +# ;; +# esac +# } +# +# _ssh_or_mosh_args() { +# case "$1" in +# *ssh*) +# args=$(printf '%s' "$1" | perl -n -e 'print if s/.*?\bssh[\w_-]*\s*(.*)/\1/') +# ;; +# *mosh-client*) +# args=$(printf '%s' "$1" | sed -E -e 's/.*mosh-client -# (.*)\|.*$/\1/' -e 's/-[^ ]*//g' -e 's/\d:\d//g') +# ;; +# esac +# +# printf '%s' "$args" +# } +# +# _username() { +# pane_pid=${1:-$(tmux display -p '#{pane_pid}')} +# pane_tty=${2:-$(tmux display -p '#{b:pane_tty}')} +# ssh_only=$3 +# +# pane_info=$(_pane_info "$pane_pid" "$pane_tty") +# command=${pane_info#*:} +# command=${command#*:} +# +# ssh_or_mosh_args=$(_ssh_or_mosh_args "$command") +# if [ -n "$ssh_or_mosh_args" ]; then +# # shellcheck disable=SC2086 +# username=$(ssh -G $ssh_or_mosh_args 2>/dev/null | awk '/^user / { print $2; exit }') +# # shellcheck disable=SC2086 +# [ -z "$username" ] && username=$(ssh $ssh_or_mosh_args -T -o ControlPath=none -o ProxyCommand="sh -c 'echo %%username%% %r >&2'" 2>&1 | awk '/^%username% / { print $2; exit }') +# # shellcheck disable=SC2086 +# [ -z "$username" ] && username=$(ssh $ssh_or_mosh_args -v -T -o ControlPath=none -o ProxyCommand=false -o IdentityFile='%%username%%/%r' 2>&1 | awk '/%username%/ { print substr($4,12); exit }') +# else +# if ! _is_true "$ssh_only"; then +# username=${pane_info#*:} +# username=${username%%:*} +# fi +# fi +# +# printf '%s\n' "$username" +# } +# +# _hostname() { +# pane_pid=${1:-$(tmux display -p '#{pane_pid}')} +# pane_tty=${2:-$(tmux display -p '#{b:pane_tty}')} +# ssh_only=$3 +# full=$4 +# h_or_H=$5 +# +# pane_info=$(_pane_info "$pane_pid" "$pane_tty") +# command=${pane_info#*:} +# command=${command#*:} +# +# ssh_or_mosh_args=$(_ssh_or_mosh_args "$command") +# if [ -n "$ssh_or_mosh_args" ]; then +# # shellcheck disable=SC2086 +# hostname=$(ssh -G $ssh_or_mosh_args 2>/dev/null | awk '/^hostname / { print $2; exit }') +# # shellcheck disable=SC2086 +# [ -z "$hostname" ] && hostname=$(ssh -T -o ControlPath=none -o ProxyCommand="sh -c 'echo %%hostname%% %h >&2'" $ssh_or_mosh_args 2>&1 | awk '/^%hostname% / { print $2; exit }') +# +# if ! _is_true "$full"; then +# case "$hostname" in +# *[a-z-].*) +# hostname=${hostname%%.*} +# ;; +# 127.0.0.1) +# hostname="localhost" +# ;; +# esac +# fi +# else +# if ! _is_true "$ssh_only"; then +# hostname="$h_or_H" +# fi +# fi +# +# printf '%s\n' "$hostname" +# } +# +# _uptime() { +# case "$_uname_s" in +# *Darwin*|*FreeBSD*) +# boot=$(sysctl -n kern.boottime 2>/dev/null | awk -F'[ ,:]+' '{ print $4 }') +# now=$(date +%s) +# ;; +# *Linux*|*CYGWIN*|*MSYS*|*MINGW*) +# boot=0 +# now=$(cut -d' ' -f1 < /proc/uptime) +# ;; +# *OpenBSD*) +# boot=$(sysctl -n kern.boottime) +# now=$(date +%s) +# esac +# # shellcheck disable=SC1004 +# awk -v tmux="$TMUX_PROGRAM ${TMUX_SOCKET:+-S "$TMUX_SOCKET"}" -v boot="$boot" -v now="$now" ' +# BEGIN { +# uptime = now - boot +# y = int(uptime / 31536000) +# dy = int(uptime / 86400) % 365 +# d = int(uptime / 86400) +# h = int(uptime / 3600) % 24 +# m = int(uptime / 60) % 60 +# s = int(uptime) % 60 +# +# system(tmux " set -g @uptime_y " y + 0 " \\;" \ +# " set -g @uptime_dy " dy + 0 " \\;" \ +# " set -g @uptime_d " d + 0 " \\;" \ +# " set -g @uptime_h " h + 0 " \\;" \ +# " set -g @uptime_m " m + 0 " \\;" \ +# " set -g @uptime_s " s + 0) +# }' +# } +# +# _loadavg() { +# case "$_uname_s" in +# *Darwin*|*FreeBSD*) +# tmux set -g @loadavg "$(sysctl -n vm.loadavg 2>/dev/null | cut -d' ' -f2)" +# ;; +# *Linux*|*CYGWIN*) +# tmux set -g @loadavg "$(cut -d' ' -f1 < /proc/loadavg)" +# ;; +# *OpenBSD*) +# tmux set -g @loadavg "$(sysctl -n vm.loadavg 2>/dev/null | cut -d' ' -f1)" +# ;; +# esac +# } +# +# _new_window_ssh() { +# pane_pid=${1:-$(tmux display -p '#{pane_pid}')} +# pane_tty=${2:-$(tmux display -p '#{b:pane_tty}')} +# shift 2 +# +# pane_info=$(_pane_info "$pane_pid" "$pane_tty") +# command=${pane_info#*:} +# command=${command#*:} +# +# case "$command" in +# *mosh-client*) +# # shellcheck disable=SC2046 +# tmux new-window "$@" mosh $(echo "$command" | sed -E -e 's/.*mosh-client -# (.*)\|.*$/\1/') +# ;; +# *ssh*) +# # shellcheck disable=SC2046 +# tmux new-window "$@" $(echo "$command" | sed -e 's/;/\\;/g') +# ;; +# *) +# tmux new-window "$@" +# esac +# } +# +# _new_window() { +# _new_window_ssh "$@" +# } +# +# _split_window_ssh() { +# pane_pid=${1:-$(tmux display -p '#{pane_pid}')} +# pane_tty=${2:-$(tmux display -p '#{b:pane_tty}')} +# shift 2 +# +# pane_info=$(_pane_info "$pane_pid" "$pane_tty") +# command=${pane_info#*:} +# command=${command#*:} +# +# case "$command" in +# *mosh-client*) +# # shellcheck disable=SC2046 +# tmux split-window "$@" mosh $(echo "$command" | sed -E -e 's/.*mosh-client -# (.*)\|.*$/\1/') +# ;; +# *ssh*) +# # shellcheck disable=SC2046 +# tmux split-window "$@" $(echo "$command" | sed -e 's/;/\\;/g') +# ;; +# *) +# tmux split-window "$@" +# esac +# } +# +# _split_window() { +# _split_window_ssh "$@" +# } +# +# _apply_tmux_256color() { +# case "$(tmux show -gv default-terminal)" in +# tmux-256color|tmux-direct) +# return +# ;; +# esac +# +# # when tmux-256color is available, use it +# # on macOS though, make sure to use /usr/bin/infocmp to probe if it's availalbe system wide +# case "$_uname_s" in +# *Darwin*) +# if /usr/bin/infocmp -x tmux-256color > /dev/null 2>&1; then +# tmux set -g default-terminal 'tmux-256color' +# fi +# ;; +# *) +# if command infocmp -x tmux-256color > /dev/null 2>&1; then +# tmux set -g default-terminal 'tmux-256color' +# fi +# ;; +# esac +# } +# +# _apply_24b() { +# tmux_conf_theme_24b_colour=${tmux_conf_theme_24b_colour:-auto} +# tmux_conf_24b_colour=${tmux_conf_24b_colour:-$tmux_conf_theme_24b_colour} +# if [ "$tmux_conf_24b_colour" = "auto" ]; then +# case "$COLORTERM" in +# truecolor|24bit) +# apply_24b=true +# ;; +# esac +# if [ "$apply_24b" = "" ] && [ "$(tput colors)" = "16777216" ]; then +# apply_24b=true +# fi +# elif _is_true "$tmux_conf_24b_colour"; then +# apply_24b=true +# fi +# if [ "$apply_24b" = "true" ]; then +# case "$TERM" in +# screen-*|tmux-*) +# ;; +# *) +# tmux set-option -ga terminal-overrides ",*256col*:Tc" +# ;; +# esac +# fi +# } +# +# _apply_bindings() { +# cfg=$(mktemp) && trap 'rm -f $cfg*' EXIT +# +# tmux_conf_preserve_stock_bindings=${tmux_conf_preserve_stock_bindings:-false} +# tmux list-keys | grep -vF 'TMUX_CONF_LOCAL' | grep -E 'new-window|split(-|_)window|new-session|copy-selection|copy-pipe' > "$cfg" +# if _is_true "$tmux_conf_preserve_stock_bindings"; then +# probe_socket="$(dirname "$TMUX_SOCKET")/tmux-stock-bindings-$$" +# TMUX_SOCKET="$probe_socket" tmux -f /dev/null list-keys >> "$cfg" +# rm -f "$probe_socket" +# fi +# +# # tmux 3.0 doesn't include 02254d1e5c881be95fd2fc37b4c4209640b6b266 and the +# # output of list-keys can be truncated +# perl -p -i -e "s/'#\{\?window_zoomed_flag,Unzoom,Zoom\}' 'z' \{resize-pane -$/'#{?window_zoomed_flag,Unzoom,Zoom}' 'z' {resize-pane -Z}\"/g" "$cfg" +# +# tmux_conf_new_window_retain_current_path=${tmux_conf_new_window_retain_current_path:-true} +# if ! _is_disabled "$tmux_conf_new_window_retain_current_path"; then +# perl -p -i -e " +# s/\brun-shell\b\s+(\"|')cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_new_window\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^\n\1]*?)(?:\s+-c\s+((?:\\\\{1,3}\")?|\"?|'?)#\{pane_current_path\}\4)([^\n\1]*?)\1/run-shell \1cut -c3- \2 | sh -s _new_window #\{pane_pid\} #\{b:pane_tty\}\3\5\1/g +# ; +# s/\brun-shell\b\s+(\"|')cut\s+-c3-\s+.+?\s+\|\s+sh\s+-s\s+_new_window\s+#\{pane_pid\}\s+#\{b:pane_tty\}(\s+.+?)?\1/new-window\2/g +# ; +# s/\bnew-window\b([^;}\n]*?)(?:\s+-c\s+((?:\\\\\")?|\"?|'?)#\{pane_current_path\}\2)/new-window\1/g" \ +# "$cfg" +# fi +# +# perl -p -i -e " +# s,\bnew-window\b((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!\bssh\b)[^\s]+))*)?(?:\s+(\bssh\b))((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!\bssh\b)[^\s]+))*)?,run-shell 'cut -c3- \"$TMUX_CONF\" | sh -s _new_window_ssh #\{pane_pid\} #\{b:pane_tty\}\1',g if /\bnew-window\b((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!ssh)[^\s]+))*)?(?:\s+(ssh))((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!ssh)[^\s]+))*)?/"\ +# "$cfg" +# +# tmux_conf_new_window_reconnect_ssh=${tmux_conf_new_window_reconnect_ssh:-false} +# if ! _is_disabled "$tmux_conf_new_window_reconnect_ssh" && _is_true "$tmux_conf_new_window_reconnect_ssh"; then +# perl -p -i -e "s,\bnew-window\b([^;}\n\"]*),run-shell 'cut -c3- \"$TMUX_CONF\" | sh -s _new_window #\{pane_pid\} #\{b:pane_tty\}\1',g" "$cfg" +# fi +# +# tmux_conf_new_window_retain_current_path=${tmux_conf_new_window_retain_current_path:-false} +# if ! _is_disabled "$tmux_conf_new_window_retain_current_path" && _is_true "$tmux_conf_new_window_retain_current_path"; then +# perl -p -i -e " +# s/\bnew-window\b(?!\s+(?:-|}))/{$&}/g if /\bdisplay-menu\b/ +# ; +# s/\bnew-window\b/new-window -c '#{pane_current_path}'/g +# ; +# s/\brun-shell\b\s+'cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_new_window(_ssh)?\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^}\n']*)'/run-shell 'cut -c3- \1 | sh -s _new_window\2 #\{pane_pid\} #\{b:pane_tty\} -c \\\\\"#\{pane_current_path\}\\\\\"\3'/g if /\bdisplay-menu\b/ +# ; +# s/\brun-shell\b\s+'cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_new_window(_ssh)?\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^}\n']*)'/run-shell 'cut -c3- \1 | sh -s _new_window\2 #\{pane_pid\} #\{b:pane_tty\} -c \"#\{pane_current_path\}\"\3'/g" \ +# "$cfg" +# fi +# +# tmux_conf_new_pane_retain_current_path=${tmux_conf_new_pane_retain_current_path:-true} +# if ! _is_disabled "$tmux_conf_new_pane_retain_current_path"; then +# perl -p -i -e " +# s/\brun-shell\b\s+(\"|')cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_split_window\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^\n\1]*?)(?:\s+-c\s+((?:\\\\{1,3}\")?|\"?|'?)#\{pane_current_path\}\4)([^\n\1]*?)\1/run-shell \1cut -c3- \2 | sh -s _split_window #\{pane_pid\} #\{b:pane_tty\}\3\5\1/g +# ; +# s/\brun-shell\b\s+(\"|')cut\s+-c3-\s+.+?\s+\|\s+sh\s+-s\s+_split_window\s+#\{pane_pid\}\s+#\{b:pane_tty\}(\s+.+?)?\1/split-window\2/g +# ; +# s/\bsplit-window\b([^;}\n]*?)(?:\s+-c\s+((?:\\\\\")?|\"?|'?)#\{pane_current_path\}\2)/split-window\1/g" \ +# "$cfg" +# fi +# +# perl -p -i -e " +# s,\bsplit-window\b((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!\bssh\b)[^\s]+))*)?(?:\s+(\bssh\b))((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!\bssh\b)[^\s]+))*)?,run-shell 'cut -c3- \"$TMUX_CONF\" | sh -s _split_window_ssh #\{pane_pid\} #\{b:pane_tty\}\1',g if /\bsplit-window\b((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!ssh)[^\s]+))*)?(?:\s+(ssh))((?:(?:[ \t]+-[bdfhIvP])|(?:[ \t]+-[celtF][ \t]+(?!ssh)[^\s]+))*)?/"\ +# "$cfg" +# +# tmux_conf_new_pane_reconnect_ssh=${tmux_conf_new_pane_reconnect_ssh:-false} +# if ! _is_disabled "$tmux_conf_new_pane_reconnect_ssh" && _is_true "$tmux_conf_new_pane_reconnect_ssh"; then +# perl -p -i -e "s,\bsplit-window\b([^;}\n\"]*),run-shell 'cut -c3- \"$TMUX_CONF\" | sh -s _split_window #\{pane_pid\} #\{b:pane_tty\}\1',g" "$cfg" +# fi +# +# if ! _is_disabled "$tmux_conf_new_pane_retain_current_path" && _is_true "$tmux_conf_new_pane_retain_current_path"; then +# perl -p -i -e " +# s/\bsplit-window\b(?!\s+(?:-|}))/{$&}/g if /\bdisplay-menu\b/ +# ; +# s/\bsplit-window\b/split-window -c '#{pane_current_path}'\1/g +# ; +# s/\brun-shell\b\s+'cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_split_window(_ssh)?\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^}\n']*)'/run-shell 'cut -c3- \1 | sh -s _split_window\2 #\{pane_pid\} #\{b:pane_tty\} -c \\\\\"#\{pane_current_path\}\\\\\"\3'/g if /\bdisplay-menu\b/ +# ; +# s/\brun-shell\b\s+'cut\s+-c3-\s+(.+?)\s+\|\s+sh\s+-s\s+_split_window(_ssh)?\s+#\{pane_pid\}\s+#\{b:pane_tty\}([^}\n']*)'/run-shell 'cut -c3- \1 | sh -s _split_window\2 #\{pane_pid\} #\{b:pane_tty\} -c \"#\{pane_current_path\}\"\3'/g" \ +# "$cfg" +# fi +# +# tmux_conf_new_session_prompt=${tmux_conf_new_session_prompt:-false} +# if ! _is_disabled "$tmux_conf_new_session_prompt" && _is_true "$tmux_conf_new_session_prompt"; then +# perl -p -i -e " +# s/(? /dev/null 2>&1 && command='xsel -i -b' +# ! command -v xsel > /dev/null 2>&1 && command -v xclip > /dev/null 2>&1 && command='xclip -i -selection clipboard > \/dev\/null 2>\&1' +# [ "$XDG_SESSION_TYPE" = "wayland" ] && command -v wl-copy > /dev/null 2>&1 && command='wl-copy' +# command -v pbcopy > /dev/null 2>&1 && command='pbcopy' +# command -v clip.exe > /dev/null 2>&1 && command='clip\.exe' +# [ -c /dev/clipboard ] && command='cat > \/dev\/clipboard' +# +# if [ -n "$command" ]; then +# if ! _is_disabled "$tmux_conf_copy_to_os_clipboard" && _is_true "$tmux_conf_copy_to_os_clipboard"; then +# perl -p -i -e "s/(?!.*?$command)\bcopy-(?:selection|pipe)(-end-of-line|-and-cancel|-end-of-line-and-cancel|-no-clear)?\b/copy-pipe\1 '$command'/g" "$cfg" +# else +# if [ "$_tmux_version" -ge 3200 ]; then +# perl -p -i -e "s/\bcopy-pipe(-end-of-line|-and-cancel|end-of-line-and-cancel|-no-clear)?\b\s+(\"|')?$command\2?/copy-pipe\1/g" "$cfg" +# else +# perl -p -i -e "s/\bcopy-pipe(-end-of-line|-and-cancel|end-of-line-and-cancel|-no-clear)?\b\s+(\"|')?$command\2?/copy-selection\1/g" "$cfg" +# fi +# fi +# fi +# +# # until tmux >= 3.0, output of tmux list-keys can't be consumed back by tmux source-file without applying some escapings +# awk < "$cfg" \ +# '{i = $2 == "-T" ? 4 : 5; gsub(/^[;]$/, "\\\\&", $i); gsub(/^[$"#~]$/, "'"'"'&'"'"'", $i); gsub(/^['"'"']$/, "\"&\"", $i); print}' > "$cfg.in" +# +# # ignore bindings with errors +# if ! tmux source-file "$cfg.in"; then +# if tmux source-file -v /dev/null 2> /dev/null; then +# verbose_flag='-v' +# fi +# while ! out=$(tmux source-file "${verbose_flag:+$verbose_flag}" "$cfg.in"); do +# line=$(printf "%s" "$out" | tail -1 | cut -d':' -f2) +# perl -n -i -e "if ($. != $line) { print }" "$cfg.in" +# done +# fi +# +# tmux_conf_urlscan_options=${tmux_conf_urlscan_options:---compact --dedupe} +# if command -v urlscan > /dev/null 2>&1; then +# tmux bind U run "cut -c3- '#{TMUX_CONF}' | sh -s _urlscan '#{pane_id}' $tmux_conf_urlscan_options" +# elif command -v urlview > /dev/null 2>&1; then +# tmux bind U run "cut -c3- '#{TMUX_CONF}' | sh -s _urlview '#{pane_id}'" +# fi +# } +# +# _apply_theme() { +# tmux_conf_theme=${tmux_conf_theme:-enabled} +# if ! _is_disabled "$tmux_conf_theme"; then +# +# # -- default theme ------------------------------------------------------- +# +# tmux_conf_theme_colour_1=${tmux_conf_theme_colour_1:-#080808} # dark gray +# tmux_conf_theme_colour_2=${tmux_conf_theme_colour_2:-#303030} # gray +# tmux_conf_theme_colour_3=${tmux_conf_theme_colour_3:-#8a8a8a} # light gray +# tmux_conf_theme_colour_4=${tmux_conf_theme_colour_4:-#00afff} # light blue +# tmux_conf_theme_colour_5=${tmux_conf_theme_colour_5:-#ffff00} # yellow +# tmux_conf_theme_colour_6=${tmux_conf_theme_colour_6:-#080808} # dark gray +# tmux_conf_theme_colour_7=${tmux_conf_theme_colour_7:-#e4e4e4} # white +# tmux_conf_theme_colour_8=${tmux_conf_theme_colour_8:-#080808} # dark gray +# tmux_conf_theme_colour_9=${tmux_conf_theme_colour_9:-#ffff00} # yellow +# tmux_conf_theme_colour_10=${tmux_conf_theme_colour_10:-#ff00af} # pink +# tmux_conf_theme_colour_11=${tmux_conf_theme_colour_11:-#5fff00} # green +# tmux_conf_theme_colour_12=${tmux_conf_theme_colour_12:-#8a8a8a} # light gray +# tmux_conf_theme_colour_13=${tmux_conf_theme_colour_13:-#e4e4e4} # white +# tmux_conf_theme_colour_14=${tmux_conf_theme_colour_14:-#080808} # dark gray +# tmux_conf_theme_colour_15=${tmux_conf_theme_colour_15:-#080808} # dark gray +# tmux_conf_theme_colour_16=${tmux_conf_theme_colour_16:-#d70000} # red +# tmux_conf_theme_colour_17=${tmux_conf_theme_colour_17:-#e4e4e4} # white +# +# # -- panes --------------------------------------------------------------- +# +# tmux_conf_theme_window_fg=${tmux_conf_theme_window_fg:-default} +# tmux_conf_theme_window_bg=${tmux_conf_theme_window_bg:-default} +# tmux_conf_theme_highlight_focused_pane=${tmux_conf_theme_highlight_focused_pane:-false} +# tmux_conf_theme_focused_pane_fg=${tmux_conf_theme_focused_pane_fg:-default} +# tmux_conf_theme_focused_pane_bg=${tmux_conf_theme_focused_pane_bg:-$tmux_conf_theme_colour_2} +# +# window_style="fg=$tmux_conf_theme_window_fg,bg=$tmux_conf_theme_window_bg" +# if _is_true "$tmux_conf_theme_highlight_focused_pane"; then +# window_active_style="fg=$tmux_conf_theme_focused_pane_fg,bg=$tmux_conf_theme_focused_pane_bg" +# else +# window_active_style="default" +# fi +# +# tmux_conf_theme_pane_border_style=${tmux_conf_theme_pane_border_style:-thin} +# tmux_conf_theme_pane_border=${tmux_conf_theme_pane_border:-$tmux_conf_theme_colour_2} +# tmux_conf_theme_pane_active_border=${tmux_conf_theme_pane_active_border:-$tmux_conf_theme_colour_4} +# tmux_conf_theme_pane_border_fg=${tmux_conf_theme_pane_border_fg:-$tmux_conf_theme_pane_border} +# tmux_conf_theme_pane_active_border_fg=${tmux_conf_theme_pane_active_border_fg:-$tmux_conf_theme_pane_active_border} +# case "$tmux_conf_theme_pane_border_style" in +# fat) +# tmux_conf_theme_pane_border_bg=${tmux_conf_theme_pane_border_bg:-$tmux_conf_theme_pane_border_fg} +# tmux_conf_theme_pane_active_border_bg=${tmux_conf_theme_pane_active_border_bg:-$tmux_conf_theme_pane_active_border_fg} +# ;; +# thin|*) +# tmux_conf_theme_pane_border_bg=${tmux_conf_theme_pane_border_bg:-default} +# tmux_conf_theme_pane_active_border_bg=${tmux_conf_theme_pane_active_border_bg:-default} +# ;; +# esac +# +# tmux_conf_theme_pane_indicator=${tmux_conf_theme_pane_indicator:-$tmux_conf_theme_colour_4} +# tmux_conf_theme_pane_active_indicator=${tmux_conf_theme_pane_active_indicator:-$tmux_conf_theme_colour_4} +# +# # -- status line --------------------------------------------------------- +# +# tmux_conf_theme_left_separator_main=$(_decode_unicode_escapes "${tmux_conf_theme_left_separator_main-}") +# tmux_conf_theme_left_separator_sub=$(_decode_unicode_escapes "${tmux_conf_theme_left_separator_sub-|}") +# tmux_conf_theme_right_separator_main=$(_decode_unicode_escapes "${tmux_conf_theme_right_separator_main-}") +# tmux_conf_theme_right_separator_sub=$(_decode_unicode_escapes "${tmux_conf_theme_right_separator_sub-|}") +# +# tmux_conf_theme_message_fg=${tmux_conf_theme_message_fg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_message_bg=${tmux_conf_theme_message_bg:-$tmux_conf_theme_colour_5} +# tmux_conf_theme_message_attr=${tmux_conf_theme_message_attr:-bold} +# +# tmux_conf_theme_message_command_fg=${tmux_conf_theme_message_command_fg:-$tmux_conf_theme_colour_5} +# tmux_conf_theme_message_command_bg=${tmux_conf_theme_message_command_bg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_message_command_attr=${tmux_conf_theme_message_command_attr:-bold} +# +# tmux_conf_theme_mode_fg=${tmux_conf_theme_mode_fg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_mode_bg=${tmux_conf_theme_mode_bg:-$tmux_conf_theme_colour_5} +# tmux_conf_theme_mode_attr=${tmux_conf_theme_mode_attr:-bold} +# +# tmux_conf_theme_status_fg=${tmux_conf_theme_status_fg:-$tmux_conf_theme_colour_3} +# tmux_conf_theme_status_bg=${tmux_conf_theme_status_bg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_status_attr=${tmux_conf_theme_status_attr:-none} +# +# tmux_conf_theme_terminal_title=${tmux_conf_theme_terminal_title:-#h ❐ #S ● #I #W} +# +# tmux_conf_theme_window_status_fg=${tmux_conf_theme_window_status_fg:-$tmux_conf_theme_colour_3} +# tmux_conf_theme_window_status_bg=${tmux_conf_theme_window_status_bg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_window_status_attr=${tmux_conf_theme_window_status_attr:-none} +# tmux_conf_theme_window_status_format=${tmux_conf_theme_window_status_format:-'#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}'} +# +# tmux_conf_theme_window_status_current_fg=${tmux_conf_theme_window_status_current_fg:-$tmux_conf_theme_colour_1} +# tmux_conf_theme_window_status_current_bg=${tmux_conf_theme_window_status_current_bg:-$tmux_conf_theme_colour_4} +# tmux_conf_theme_window_status_current_attr=${tmux_conf_theme_window_status_current_attr:-bold} +# tmux_conf_theme_window_status_current_format=${tmux_conf_theme_window_status_current_format:-'#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}'} +# +# tmux_conf_theme_window_status_activity_fg=${tmux_conf_theme_window_status_activity_fg:-default} +# tmux_conf_theme_window_status_activity_bg=${tmux_conf_theme_window_status_activity_bg:-default} +# tmux_conf_theme_window_status_activity_attr=${tmux_conf_theme_window_status_activity_attr:-underscore} +# +# tmux_conf_theme_window_status_bell_fg=${tmux_conf_theme_window_status_bell_fg:-$tmux_conf_theme_colour_5} +# tmux_conf_theme_window_status_bell_bg=${tmux_conf_theme_window_status_bell_bg:-default} +# tmux_conf_theme_window_status_bell_attr=${tmux_conf_theme_window_status_bell_attr:-blink,bold} +# +# tmux_conf_theme_window_status_last_fg=${tmux_conf_theme_window_status_last_fg:-$tmux_conf_theme_colour_4} +# tmux_conf_theme_window_status_last_bg=${tmux_conf_theme_window_status_last_bg:-default} +# tmux_conf_theme_window_status_last_attr=${tmux_conf_theme_window_status_last_attr:-none} +# +# if [ "$tmux_conf_theme_window_status_bg" = "$tmux_conf_theme_status_bg" ] || [ "$tmux_conf_theme_window_status_bg" = "default" ]; then +# spacer='' +# spacer_current=' ' +# else +# spacer=' ' +# spacer_current=' ' +# fi +# if [ "$tmux_conf_theme_window_status_last_bg" = "$tmux_conf_theme_status_bg" ] || [ "$tmux_conf_theme_window_status_last_bg" = "default" ] ; then +# spacer_last='' +# else +# spacer_last=' ' +# fi +# if [ "$tmux_conf_theme_window_status_activity_bg" = "$tmux_conf_theme_status_bg" ] || [ "$tmux_conf_theme_window_status_activity_bg" = "default" ] ; then +# spacer_activity='' +# spacer_last_activity="$spacer_last" +# else +# spacer_activity=' ' +# spacer_last_activity=' ' +# fi +# if [ "$tmux_conf_theme_window_status_bell_bg" = "$tmux_conf_theme_status_bg" ] || [ "$tmux_conf_theme_window_status_bell_bg" = "default" ] ; then +# spacer_bell='' +# spacer_last_bell="$spacer_last" +# spacer_activity_bell="$spacer_activity" +# spacer_last_activity_bell="$spacer_last_activity" +# else +# spacer_bell=' ' +# spacer_last_bell=' ' +# spacer_activity_bell=' ' +# spacer_last_activity_bell=' ' +# fi +# spacer="#{?window_last_flag,#{?window_activity_flag,#{?window_bell_flag,$spacer_last_activity_bell,$spacer_last_activity},#{?window_bell_flag,$spacer_last_bell,$spacer_last}},#{?window_activity_flag,#{?window_bell_flag,$spacer_activity_bell,$spacer_activity},#{?window_bell_flag,$spacer_bell,$spacer}}}" +# if [ "$(tmux show -g -v status-justify)" = "right" ]; then +# if [ -z "$tmux_conf_theme_right_separator_main" ]; then +# window_status_separator=' ' +# else +# window_status_separator='' +# fi +# window_status_format="#[fg=$tmux_conf_theme_window_status_bg,bg=$tmux_conf_theme_status_bg,none]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}$tmux_conf_theme_right_separator_main#[fg=$tmux_conf_theme_window_status_fg,bg=$tmux_conf_theme_window_status_bg,$tmux_conf_theme_window_status_attr]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}$spacer$(printf '%s' "$tmux_conf_theme_window_status_last_attr" | perl -n -e 'print "#{?window_last_flag,#[none],}" if !/default/ ; s/([a-z]+),?/#{?window_last_flag,#[\1],}/g; print if !/default/')$(printf '%s' "$tmux_conf_theme_window_status_activity_attr" | perl -n -e 'print "#{?window_activity_flag?,#[none],}" if !/default/ ; s/([a-z]+),?/#{?window_activity_flag,#[\1],}/g; print if !/default/')$(printf '%s' "$tmux_conf_theme_window_status_bell_attr" | perl -n -e 'print "#{?window_bell_flag,#[none],}" if !/default/ ; s/([a-z]+),?/#{?window_bell_flag,#[\1],}/g; print if !/default/')$tmux_conf_theme_window_status_format#[none]$spacer#[fg=$tmux_conf_theme_status_bg,bg=$tmux_conf_theme_window_status_bg]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#[none]$tmux_conf_theme_right_separator_main" +# window_status_current_format="#[fg=$tmux_conf_theme_window_status_current_bg,bg=$tmux_conf_theme_status_bg,none]$tmux_conf_theme_right_separator_main#[fg=$tmux_conf_theme_window_status_current_fg,bg=$tmux_conf_theme_window_status_current_bg,$tmux_conf_theme_window_status_current_attr]$spacer_current$tmux_conf_theme_window_status_current_format$spacer_current#[fg=$tmux_conf_theme_status_bg,bg=$tmux_conf_theme_window_status_current_bg,none]$tmux_conf_theme_right_separator_main" +# else +# if [ -z "$tmux_conf_theme_left_separator_main" ]; then +# window_status_separator=' ' +# else +# window_status_separator='' +# fi +# window_status_format="#[fg=$tmux_conf_theme_status_bg,bg=$tmux_conf_theme_window_status_bg,none]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}$tmux_conf_theme_left_separator_main#[fg=$tmux_conf_theme_window_status_fg,bg=$tmux_conf_theme_window_status_bg,$tmux_conf_theme_window_status_attr]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_fg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[bg=$&]/; print if !/default/"),}$spacer$(printf '%s' "$tmux_conf_theme_window_status_last_attr" | perl -n -e 'print "#{?window_last_flag,#[none],}" if !/default/ ; s/([a-z]+),?/#{?window_last_flag,#[\1],}/g; print if !/default/')$(printf '%s' "$tmux_conf_theme_window_status_activity_attr" | perl -n -e 'print "#{?window_activity_flag,#[none],}" if !/default/ ; s/([a-z]+),?/#{?window_activity_flag,#[\1],}/g; print if !/default/')$(printf '%s' "$tmux_conf_theme_window_status_bell_attr" | perl -n -e 'print "#{?window_bell_flag,#[none],}" if /!default/ ; s/([a-z]+),?/#{?window_bell_flag,#[\1],}/g; print if !/default/')$tmux_conf_theme_window_status_format#[none]$spacer#[fg=$tmux_conf_theme_window_status_bg,bg=$tmux_conf_theme_status_bg]#{?window_last_flag,$(printf '%s' "$tmux_conf_theme_window_status_last_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_activity_flag,$(printf '%s' "$tmux_conf_theme_window_status_activity_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}#{?window_bell_flag,$(printf '%s' "$tmux_conf_theme_window_status_bell_bg" | perl -n -e "s/.+/#[fg=$&]/; print if !/default/"),}$tmux_conf_theme_left_separator_main" +# window_status_current_format="#[fg=$tmux_conf_theme_status_bg,bg=$tmux_conf_theme_window_status_current_bg,none]$tmux_conf_theme_left_separator_main#[fg=$tmux_conf_theme_window_status_current_fg,bg=$tmux_conf_theme_window_status_current_bg,$tmux_conf_theme_window_status_current_attr]$spacer_current$tmux_conf_theme_window_status_current_format$spacer_current#[fg=$tmux_conf_theme_window_status_current_bg,bg=$tmux_conf_theme_status_bg]$tmux_conf_theme_left_separator_main" +# fi +# +# # -- indicators +# +# tmux_conf_theme_pairing=${tmux_conf_theme_pairing:-⚇} # U+2687 +# tmux_conf_theme_pairing_fg=${tmux_conf_theme_pairing_fg:-none} +# tmux_conf_theme_pairing_bg=${tmux_conf_theme_pairing_bg:-none} +# tmux_conf_theme_pairing_attr=${tmux_conf_theme_pairing_attr:-none} +# +# tmux_conf_theme_prefix=${tmux_conf_theme_prefix:-⌨} # U+2328 +# tmux_conf_theme_prefix_fg=${tmux_conf_theme_prefix_fg:-none} +# tmux_conf_theme_prefix_bg=${tmux_conf_theme_prefix_bg:-none} +# tmux_conf_theme_prefix_attr=${tmux_conf_theme_prefix_attr:-none} +# +# tmux_conf_theme_mouse=${tmux_conf_theme_mouse:-↗} # U+2197 +# tmux_conf_theme_mouse_fg=${tmux_conf_theme_mouse_fg:-none} +# tmux_conf_theme_mouse_bg=${tmux_conf_theme_mouse_bg:-none} +# tmux_conf_theme_mouse_attr=${tmux_conf_theme_mouse_attr:-none} +# +# tmux_conf_theme_root=${tmux_conf_theme_root:-!} +# tmux_conf_theme_root_fg=${tmux_conf_theme_root_fg:-none} +# tmux_conf_theme_root_bg=${tmux_conf_theme_root_bg:-none} +# tmux_conf_theme_root_attr=${tmux_conf_theme_root_attr:-bold,blink} +# +# tmux_conf_theme_synchronized=${tmux_conf_theme_synchronized:-⚏} # U+268F +# tmux_conf_theme_synchronized_fg=${tmux_conf_theme_synchronized_fg:-none} +# tmux_conf_theme_synchronized_bg=${tmux_conf_theme_synchronized_bg:-none} +# tmux_conf_theme_synchronized_attr=${tmux_conf_theme_synchronized_attr:-none} +# +# # -- status-left style +# +# tmux_conf_theme_status_left=${tmux_conf_theme_status_left-' ❐ #S | ↑#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} '} +# tmux_conf_theme_status_left_fg=${tmux_conf_theme_status_left_fg:-$tmux_conf_theme_colour_6,$tmux_conf_theme_colour_7,$tmux_conf_theme_colour_8} +# tmux_conf_theme_status_left_bg=${tmux_conf_theme_status_left_bg:-$tmux_conf_theme_colour_9,$tmux_conf_theme_colour_10,$tmux_conf_theme_colour_11} +# tmux_conf_theme_status_left_attr=${tmux_conf_theme_status_left_attr:-bold,none,none} +# +# if [ -n "$tmux_conf_theme_status_left" ]; then +# status_left=$(echo "$tmux_conf_theme_status_left" | sed \ +# -e "s/#{pairing}/#[fg=$tmux_conf_theme_pairing_fg]#[bg=$tmux_conf_theme_pairing_bg]#[$tmux_conf_theme_pairing_attr]#{pairing}#[inherit]/g" \ +# -e "s/#{prefix}/#[fg=$tmux_conf_theme_prefix_fg]#[bg=$tmux_conf_theme_prefix_bg]#[$tmux_conf_theme_prefix_attr]#{prefix}#[inherit]/g" \ +# -e "s/#{mouse}/#[fg=$tmux_conf_theme_mouse_fg]#[bg=$tmux_conf_theme_mouse_bg]#[$tmux_conf_theme_mouse_attr]#{mouse}#[inherit]/g" \ +# -e "s/#{synchronized}/#[fg=$tmux_conf_theme_synchronized_fg]#[bg=$tmux_conf_theme_synchronized_bg]#[$tmux_conf_theme_synchronized_attr]#{synchronized}#[inherit]/g" \ +# -e "s/#{root}/#[fg=$tmux_conf_theme_root_fg]#[bg=$tmux_conf_theme_root_bg]#[$tmux_conf_theme_root_attr]#{root}#[inherit]/g") +# +# status_left=$(printf '%s' "$status_left" | awk \ +# -v status_bg="$tmux_conf_theme_status_bg" \ +# -v fg_="$tmux_conf_theme_status_left_fg" \ +# -v bg_="$tmux_conf_theme_status_left_bg" \ +# -v attr_="$tmux_conf_theme_status_left_attr" \ +# -v mainsep="$tmux_conf_theme_left_separator_main" \ +# -v subsep="$tmux_conf_theme_left_separator_sub" ' +# function subsplit(s, l, i, a, r) +# { +# l = split(s, a, ",") +# for (i = 1; i <= l; ++i) +# { +# o = split(a[i], _, "(") - 1 +# c = split(a[i], _, ")") - 1 +# open += o - c +# o_ = split(a[i], _, "{") - 1 +# c_ = split(a[i], _, "}") - 1 +# open_ += o_ - c_ +# o__ = split(a[i], _, "[") - 1 +# c__ = split(a[i], _, "]") - 1 +# open__ += o__ - c__ +# +# if (i == l) +# r = sprintf("%s%s", r, a[i]) +# else if (open || open_ || open__) +# r = sprintf("%s%s,", r, a[i]) +# else +# r = sprintf("%s%s#[fg=%s,bg=%s,%s]%s", r, a[i], fg[j], bg[j], attr[j], subsep) +# } +# +# gsub(/#\[inherit\]/, sprintf("#[default]#[fg=%s,bg=%s,%s]", fg[j], bg[j], attr[j]), r) +# return r +# } +# BEGIN { +# FS = "|" +# l1 = split(fg_, fg, ",") +# l2 = split(bg_, bg, ",") +# l3 = split(attr_, attr, ",") +# l = l1 < l2 ? (l1 < l3 ? l1 : l3) : (l2 < l3 ? l2 : l3) +# } +# { +# for (i = j = 1; i <= NF; ++i) +# { +# if (open || open_ || open__) +# printf "|%s", subsplit($i) +# else +# { +# if (i > 1) +# printf "#[fg=%s,bg=%s,none]%s#[fg=%s,bg=%s,%s]%s", bg[j_], bg[j], mainsep, fg[j], bg[j], attr[j], subsplit($i) +# else +# printf "#[fg=%s,bg=%s,%s]%s", fg[j], bg[j], attr[j], subsplit($i) +# } +# +# if (!open && !open_ && !open__) +# { +# j_ = j +# j = j % l + 1 +# } +# } +# printf "#[fg=%s,bg=%s,none]%s", bg[j_], status_bg, mainsep +# }') +# fi +# status_left="$status_left " +# +# # -- status-right style +# +# tmux_conf_theme_status_right=${tmux_conf_theme_status_right-' #{prefix}#{mouse}#{pairing}#{synchronized}#{?battery_status, #{battery_status},}#{?battery_bar, #{battery_bar},}#{?battery_percentage, #{battery_percentage},} , %R , %d %b | #{username}#{root} | #{hostname} '} +# tmux_conf_theme_status_right_fg=${tmux_conf_theme_status_right_fg:-$tmux_conf_theme_colour_12,$tmux_conf_theme_colour_13,$tmux_conf_theme_colour_14} +# tmux_conf_theme_status_right_bg=${tmux_conf_theme_status_right_bg:-$tmux_conf_theme_colour_15,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_17} +# tmux_conf_theme_status_right_attr=${tmux_conf_theme_status_right_attr:-none,none,bold} +# +# if [ -n "$tmux_conf_theme_status_right" ]; then +# status_right=$(echo "$tmux_conf_theme_status_right" | sed \ +# -e "s/#{pairing}/#[fg=$tmux_conf_theme_pairing_fg]#[bg=$tmux_conf_theme_pairing_bg]#[$tmux_conf_theme_pairing_attr]#{pairing}#[inherit]/g" \ +# -e "s/#{prefix}/#[fg=$tmux_conf_theme_prefix_fg]#[bg=$tmux_conf_theme_prefix_bg]#[$tmux_conf_theme_prefix_attr]#{prefix}#[inherit]/g" \ +# -e "s/#{mouse}/#[fg=$tmux_conf_theme_mouse_fg]#[bg=$tmux_conf_theme_mouse_bg]#[$tmux_conf_theme_mouse_attr]#{mouse}#[inherit]/g" \ +# -e "s/#{synchronized}/#[fg=$tmux_conf_theme_synchronized_fg]#[bg=$tmux_conf_theme_synchronized_bg]#[$tmux_conf_theme_synchronized_attr]#{synchronized}#[inherit]/g" \ +# -e "s/#{root}/#[fg=$tmux_conf_theme_root_fg]#[bg=$tmux_conf_theme_root_bg]#[$tmux_conf_theme_root_attr]#{root}#[inherit]/g") +# +# status_right=$(printf '%s' "$status_right" | awk \ +# -v status_bg="$tmux_conf_theme_status_bg" \ +# -v fg_="$tmux_conf_theme_status_right_fg" \ +# -v bg_="$tmux_conf_theme_status_right_bg" \ +# -v attr_="$tmux_conf_theme_status_right_attr" \ +# -v mainsep="$tmux_conf_theme_right_separator_main" \ +# -v subsep="$tmux_conf_theme_right_separator_sub" ' +# function subsplit(s, l, i, a, r) +# { +# l = split(s, a, ",") +# for (i = 1; i <= l; ++i) +# { +# o = split(a[i], _, "(") - 1 +# c = split(a[i], _, ")") - 1 +# open += o - c +# o_ = split(a[i], _, "{") - 1 +# c_ = split(a[i], _, "}") - 1 +# open_ += o_ - c_ +# o__ = split(a[i], _, "[") - 1 +# c__ = split(a[i], _, "]") - 1 +# open__ += o__ - c__ +# +# if (i == l) +# r = sprintf("%s%s", r, a[i]) +# else if (open || open_ || open__) +# r = sprintf("%s%s,", r, a[i]) +# else +# r = sprintf("%s%s#[fg=%s,bg=%s,%s]%s", r, a[i], fg[j], bg[j], attr[j], subsep) +# } +# +# gsub(/#\[inherit\]/, sprintf("#[default]#[fg=%s,bg=%s,%s]", fg[j], bg[j], attr[j]), r) +# return r +# } +# BEGIN { +# FS = "|" +# l1 = split(fg_, fg, ",") +# l2 = split(bg_, bg, ",") +# l3 = split(attr_, attr, ",") +# l = l1 < l2 ? (l1 < l3 ? l1 : l3) : (l2 < l3 ? l2 : l3) +# } +# { +# for (i = j = 1; i <= NF; ++i) +# { +# if (open_ || open || open__) +# printf "|%s", subsplit($i) +# else +# printf "#[fg=%s,bg=%s,none]%s#[fg=%s,bg=%s,%s]%s", bg[j], (i == 1) ? status_bg : bg[j_], mainsep, fg[j], bg[j], attr[j], subsplit($i) +# +# if (!open && !open_ && !open__) +# { +# j_ = j +# j = j % l + 1 +# } +# } +# }') +# fi +# status_right=${status_right-} +# +# # -- clock --------------------------------------------------------------- +# +# tmux_conf_theme_clock_colour=${tmux_conf_theme_clock_colour:-$tmux_conf_theme_colour_4} +# tmux_conf_theme_clock_style=${tmux_conf_theme_clock_style:-24} +# +# tmux setw -g window-style "$window_style" \; setw -g window-active-style "$window_active_style" \;\ +# setw -g pane-border-style "fg=$tmux_conf_theme_pane_border_fg,bg=$tmux_conf_theme_pane_border_bg" \; set -g pane-active-border-style "fg=$tmux_conf_theme_pane_active_border_fg,bg=$tmux_conf_theme_pane_active_border_bg" \;\ +# set -g display-panes-colour "$tmux_conf_theme_pane_indicator" \; set -g display-panes-active-colour "$tmux_conf_theme_pane_active_indicator" \;\ +# set -g message-style "fg=$tmux_conf_theme_message_fg,bg=$tmux_conf_theme_message_bg,$tmux_conf_theme_message_attr" \;\ +# set -g message-command-style "fg=$tmux_conf_theme_message_command_fg,bg=$tmux_conf_theme_message_command_bg,$tmux_conf_theme_message_command_attr" \;\ +# setw -g mode-style "fg=$tmux_conf_theme_mode_fg,bg=$tmux_conf_theme_mode_bg,$tmux_conf_theme_mode_attr" \;\ +# set -g status-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" \;\ +# set -g status-left-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" \;\ +# set -g status-right-style "fg=$tmux_conf_theme_status_fg,bg=$tmux_conf_theme_status_bg,$tmux_conf_theme_status_attr" \;\ +# setw -g window-status-style "fg=$tmux_conf_theme_window_status_fg,bg=$tmux_conf_theme_window_status_bg,$tmux_conf_theme_window_status_attr" \;\ +# setw -g window-status-current-style "fg=$tmux_conf_theme_window_status_current_fg,bg=$tmux_conf_theme_window_status_current_bg,$tmux_conf_theme_window_status_current_attr" \;\ +# setw -g window-status-activity-style "fg=$tmux_conf_theme_window_status_activity_fg,bg=$tmux_conf_theme_window_status_activity_bg,$tmux_conf_theme_window_status_activity_attr" \;\ +# setw -g window-status-bell-style "fg=$tmux_conf_theme_window_status_bell_fg,bg=$tmux_conf_theme_window_status_bell_bg,$tmux_conf_theme_window_status_bell_attr" \;\ +# setw -g window-status-last-style "fg=$tmux_conf_theme_window_status_last_fg,bg=$tmux_conf_theme_window_status_last_bg,$tmux_conf_theme_window_status_last_attr" \;\ +# setw -g window-status-separator "$window_status_separator" \;\ +# setw -g clock-mode-colour "$tmux_conf_theme_clock_colour" \;\ +# setw -g clock-mode-style "$tmux_conf_theme_clock_style" +# fi +# +# # -- variables ------------------------------------------------------------- +# +# set_titles_string=$(printf '%s' "${tmux_conf_theme_terminal_title:-$(tmux show -gv set-titles-string)}" | sed \ +# -e "s%#{circled_window_index}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#I')%g" \ +# -e "s%#{circled_session_name}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#S')%g" \ +# -e "s%#{pretty_pane_current_path}%#(cut -c3- '$TMUX_CONF' | sh -s _pretty_path auto '#{pane_current_path}')%g" \ +# -e "s%#{username}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' false '#D')%g" \ +# -e "s%#{hostname}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false false '#h' '#D')%g" \ +# -e "s%#{hostname_full}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false true '#H' '#D')%g" \ +# -e "s%#{username_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' true '#D')%g" \ +# -e "s%#{hostname_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true false '#h' '#D')%g" \ +# -e "s%#{hostname_full_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true true '#H' '#D')%g") +# +# window_status_format=$(printf '%s' "${window_status_format:-$(tmux show -gv window-status-format)}" | sed \ +# -e "s%#{circled_window_index}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#I')%g" \ +# -e "s%#{circled_session_name}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#S')%g" \ +# -e "s%#{pretty_pane_current_path}%#(cut -c3- '$TMUX_CONF' | sh -s _pretty_path auto '#{pane_current_path}')%g" \ +# -e "s%#{username}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' false '#D')%g" \ +# -e "s%#{hostname}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false false '#h' '#D')%g" \ +# -e "s%#{hostname_full}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false true '#H' '#D')%g" \ +# -e "s%#{username_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' true '#D')%g" \ +# -e "s%#{hostname_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true false '#h' '#D')%g" \ +# -e "s%#{hostname_full_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true true '#H' '#D')%g") +# +# window_status_current_format=$(printf '%s' "${window_status_current_format:-$(tmux show -gv window-status-current-format)}" | sed \ +# -e "s%#{circled_window_index}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#I')%g" \ +# -e "s%#{circled_session_name}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#S')%g" \ +# -e "s%#{pretty_pane_current_path}%#(cut -c3- '$TMUX_CONF' | sh -s _pretty_path auto '#{pane_current_path}')%g" \ +# -e "s%#{username}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' false '#D')%g" \ +# -e "s%#{hostname}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false false '#h' '#D')%g" \ +# -e "s%#{hostname_full}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false true '#H' '#D')%g" \ +# -e "s%#{username_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' true '#D')%g" \ +# -e "s%#{hostname_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true false '#h' '#D')%g" \ +# -e "s%#{hostname_full_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true true '#H' '#D')%g") +# +# status_left=$(printf '%s' "${status_left-$(tmux show -gv status-left)}" | sed \ +# -e "s/#{pairing}/#{?session_many_attached,$tmux_conf_theme_pairing ,}/g" \ +# -e "s/#{prefix}/#{?client_prefix,$tmux_conf_theme_prefix ,$(printf '%s' "$tmux_conf_theme_prefix" | sed -e 's/./ /g') }/g" \ +# -e "s/#{mouse}/#{?mouse,$tmux_conf_theme_mouse ,$(printf '%s' "$tmux_conf_theme_mouse" | sed -e 's/./ /g') }/g" \ +# -e "s%#{synchronized}%#{?pane_synchronized,$tmux_conf_theme_synchronized ,}%g" \ +# -e "s%#{circled_session_name}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#S')%g" \ +# -e "s%#{pretty_pane_current_path}%#(cut -c3- '$TMUX_CONF' | sh -s _pretty_path auto '#{pane_current_path}')%g" \ +# -e "s%#{root}%#{?#{==:#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' '#D'),root},$tmux_conf_theme_root,}%g") +# +# status_right=$(printf '%s' "${status_right-$(tmux show -gv status-right)}" | sed \ +# -e "s/#{pairing}/#{?session_many_attached,$tmux_conf_theme_pairing ,}/g" \ +# -e "s/#{prefix}/#{?client_prefix,$tmux_conf_theme_prefix ,$(printf '%s' "$tmux_conf_theme_prefix" | sed -e 's/./ /g') }/g" \ +# -e "s/#{mouse}/#{?mouse,$tmux_conf_theme_mouse ,$(printf '%s' "$tmux_conf_theme_mouse" | sed -e 's/./ /g') }/g" \ +# -e "s%#{synchronized}%#{?pane_synchronized,$tmux_conf_theme_synchronized ,}%g" \ +# -e "s%#{circled_session_name}%#(cut -c3- '$TMUX_CONF' | sh -s _circled '#S')%g" \ +# -e "s%#{pretty_pane_current_path}%#(cut -c3- '$TMUX_CONF' | sh -s _pretty_path auto '#{pane_current_path}')%g" \ +# -e "s%#{root}%#{?#{==:#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' '#D'),root},$tmux_conf_theme_root,}%g") +# +# tmux_conf_battery_bar_symbol_full=$(_decode_unicode_escapes "${tmux_conf_battery_bar_symbol_full:-◼}") +# tmux_conf_battery_bar_symbol_empty=$(_decode_unicode_escapes "${tmux_conf_battery_bar_symbol_empty:-◻}") +# tmux_conf_battery_bar_length=${tmux_conf_battery_bar_length:-auto} +# tmux_conf_battery_bar_palette=${tmux_conf_battery_bar_palette:-gradient} +# tmux_conf_battery_hbar_palette=${tmux_conf_battery_hbar_palette:-gradient} +# tmux_conf_battery_vbar_palette=${tmux_conf_battery_vbar_palette:-gradient} +# tmux_conf_battery_status_charging=$(_decode_unicode_escapes "${tmux_conf_battery_status_charging:-↑}") # U+2191 +# tmux_conf_battery_status_discharging=$(_decode_unicode_escapes "${tmux_conf_battery_status_discharging:-↓}") # U+2193 +# +# _pkillf 'sh -s _battery_info' +# _battery_info +# if [ "$battery_charge" != 0 ]; then +# case "$status_left $status_right" in +# *'#{battery_'*|*'#{?battery_'*) +# status_left=$(echo "$status_left" | sed -E \ +# -e 's%#\{\?battery_bar%#\{?@battery_percentage%g' \ +# -e 's%#\{\?battery_hbar%#\{?@battery_percentage%g' \ +# -e 's%#\{\?battery_vbar%#\{?@battery_percentage%g' \ +# -e "s%#\{battery_bar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _bar '$(printf '%s' "$tmux_conf_battery_bar_palette" | tr ',' ';')' '$tmux_conf_battery_bar_symbol_empty' '$tmux_conf_battery_bar_symbol_full' '$tmux_conf_battery_bar_length' '#{@battery_charge}' '#{client_width}')%g" \ +# -e "s%#\{battery_hbar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _hbar '$(printf '%s' "$tmux_conf_battery_hbar_palette" | tr ',' ';')' '#{@battery_charge}')%g" \ +# -e "s%#\{battery_vbar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _vbar '$(printf '%s' "$tmux_conf_battery_vbar_palette" | tr ',' ';')' '#{@battery_charge}')%g" \ +# -e 's%#\{(\?)?battery_status%#\{\1@battery_status%g' \ +# -e 's%#\{(\?)?battery_percentage%#\{\1@battery_percentage%g') +# status_right=$(echo "$status_right" | sed -E \ +# -e 's%#\{\?battery_bar%#\{?@battery_percentage%g' \ +# -e 's%#\{\?battery_hbar%#\{?@battery_percentage%g' \ +# -e 's%#\{\?battery_vbar%#\{?@battery_percentage%g' \ +# -e "s%#\{battery_bar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _bar '$(printf '%s' "$tmux_conf_battery_bar_palette" | tr ',' ';')' '$tmux_conf_battery_bar_symbol_empty' '$tmux_conf_battery_bar_symbol_full' '$tmux_conf_battery_bar_length' '#{@battery_charge}' '#{client_width}')%g" \ +# -e "s%#\{battery_hbar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _hbar '$(printf '%s' "$tmux_conf_battery_hbar_palette" | tr ',' ';')' '#{@battery_charge}')%g" \ +# -e "s%#\{battery_vbar\}%#(nice cut -c3- '$TMUX_CONF' | sh -s _vbar '$(printf '%s' "$tmux_conf_battery_vbar_palette" | tr ',' ';')' '#{@battery_charge}')%g" \ +# -e 's%#\{(\?)?battery_status%#\{\1@battery_status%g' \ +# -e 's%#\{(\?)?battery_percentage%#\{\1@battery_percentage%g') +# status_right="#(echo; nice cut -c3- '$TMUX_CONF' | sh -s _battery_status '$tmux_conf_battery_status_charging' '$tmux_conf_battery_status_discharging')$status_right" +# interval=60 +# if [ "$_tmux_version" -eq 3500 ]; then +# tmux run -b "exec sh -c 'trap \"[ -n \\\\\"\\\\\$sleep_pid\\\\\" ] && kill -9 \\\\\"\\\\\$sleep_pid\\\\\"; exit 0\" TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S \"#{socket_path}\" display -p \"#{l:#{pid}}\")\" = \"#{pid}\" ]; do nice cut -c3- \"$TMUX_CONF\" | sh -s _battery_info; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done'" +# elif [ "$_tmux_version" -ge 3200 ]; then +# tmux run -b "trap '[ -n \"\$sleep_pid\" ] && kill -9 \"\$sleep_pid\"; exit 0' TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _battery_info; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done" +# elif [ "$_tmux_version" -ge 2800 ]; then +# status_right="#(echo; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _battery_info; sleep $interval; done)$status_right" +# elif [ "$_tmux_version" -gt 2400 ]; then +# status_right="#(echo; while :; do nice cut -c3- '$TMUX_CONF' | sh -s _battery_info; sleep $interval; done)$status_right" +# else +# status_right="#(nice cut -c3- '$TMUX_CONF' | sh -s _battery_info)$status_right" +# fi +# ;; +# esac +# fi +# +# case "$status_left $status_right" in +# *'#{username}'*|*'#{hostname}'*|*'#{hostname_full}'*|*'#{username_ssh}'*|*'#{hostname_ssh}'*|*'#{hostname_full_ssh}'*) +# status_left=$(echo "$status_left" | sed \ +# -e "s%#{username}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' false '#D')%g" \ +# -e "s%#{hostname}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false false '#h' '#D')%g" \ +# -e "s%#{hostname_full}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false true '#H' '#D')%g" \ +# -e "s%#{username_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' true '#D')%g" \ +# -e "s%#{hostname_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true false '#h' '#D')%g" \ +# -e "s%#{hostname_full_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true true '#H' '#D')%g") +# status_right=$(echo "$status_right" | sed \ +# -e "s%#{username}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' false '#D')%g" \ +# -e "s%#{hostname}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false false '#h' '#D')%g" \ +# -e "s%#{hostname_full}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' false true '#H' '#D')%g" \ +# -e "s%#{username_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _username '#{pane_pid}' '#{b:pane_tty}' true '#D')%g" \ +# -e "s%#{hostname_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true false '#h' '#D')%g" \ +# -e "s%#{hostname_full_ssh}%#(cut -c3- '$TMUX_CONF' | sh -s _hostname '#{pane_pid}' '#{b:pane_tty}' true true '#H' '#D')%g") +# ;; +# esac +# +# _pkillf 'sh -s _uptime' +# case "$status_left $status_right" in +# *'#{uptime_'*|*'#{?uptime_'*) +# status_left=$(echo "$status_left" | perl -p -e ' +# ; s/#\{(\?)?uptime_y\b/#\{\1\@uptime_y/g +# ; s/#\{(\?)?uptime_d\b/#\{\1\@uptime_d/g +# ; s/\@uptime_d\b/\@uptime_dy/g if /\@uptime_y\b/ +# ; s/#\{(\?)?uptime_h\b/#\{\1\@uptime_h/g +# ; s/#\{(\?)?uptime_m\b/#\{\1\@uptime_m/g +# ; s/#\{(\?)?uptime_s\b/#\{\1\@uptime_s/g') +# status_right=$(echo "$status_right" | perl -p -e ' +# ; s/#\{(\?)?uptime_y\b/#\{\1\@uptime_y/g +# ; s/#\{(\?)?uptime_d\b/#\{\1\@uptime_d/g +# ; s/\@uptime_d\b/\@uptime_dy/g if /\@uptime_y\b/ +# ; s/#\{(\?)?uptime_h\b/#\{\1\@uptime_h/g +# ; s/#\{(\?)?uptime_m\b/#\{\1\@uptime_m/g +# ; s/#\{(\?)?uptime_s\b/#\{\1\@uptime_s/g') +# interval=60 +# case "$status_left $status_right" in +# *'#{@uptime_s}'*) +# interval=$(tmux show -gv status-interval) +# ;; +# esac +# if [ "$_tmux_version" -eq 3500 ]; then +# tmux run -b "exec sh -c 'trap \"[ -n \\\\\"\\\\\$sleep_pid\\\\\" ] && kill -9 \\\\\"\\\\\$sleep_pid\\\\\"; exit 0\" TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S \"#{socket_path}\" display -p \"#{l:#{pid}}\")\" = \"#{pid}\" ]; do nice cut -c3- \"$TMUX_CONF\" | sh -s _uptime; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done'" +# elif [ "$_tmux_version" -ge 3200 ]; then +# tmux run -b "trap '[ -n \"\$sleep_pid\" ] && kill -9 \"\$sleep_pid\"; exit 0' TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _uptime; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done" +# elif [ "$_tmux_version" -ge 2800 ]; then +# status_right="#(echo; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _uptime; sleep $interval; done)$status_right" +# elif [ "$_tmux_version" -gt 2400 ]; then +# status_right="#(echo; while :; do nice cut -c3- '$TMUX_CONF' | sh -s _uptime; sleep $interval; done)$status_right" +# else +# status_right="#(nice cut -c3- '$TMUX_CONF' | sh -s _uptime)$status_right" +# fi +# ;; +# esac +# +# _pkillf 'sh -s _loadavg' +# case "$status_left $status_right" in +# *'#{loadavg'*|*'#{?loadavg'*) +# status_left=$(echo "$status_left" | sed -E \ +# -e 's/#\{(\?)?loadavg/#\{\1@loadavg/g') +# status_right=$(echo "$status_right" | sed -E \ +# -e 's/#\{(\?)?loadavg/#\{\1@loadavg/g') +# interval=$(tmux show -gv status-interval) +# if [ "$_tmux_version" -eq 3500 ]; then +# tmux run -b "exec sh -c 'trap \"[ -n \\\\\"\\\\\$sleep_pid\\\\\" ] && kill -9 \\\\\"\\\\\$sleep_pid\\\\\"; exit 0\" TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S \"#{socket_path}\" display -p \"#{l:#{pid}}\")\" = \"#{pid}\" ]; do nice cut -c3- \"$TMUX_CONF\" | sh -s _loadavg; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done'" +# elif [ "$_tmux_version" -ge 3200 ]; then +# tmux run -b "trap '[ -n \"\$sleep_pid\" ] && kill -9 \"\$sleep_pid\"; exit 0' TERM; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _loadavg; sleep $interval & sleep_pid=\$!; wait \"\$sleep_pid\"; sleep_pid=; done" +# elif [ "$_tmux_version" -ge 2800 ]; then +# status_right="#(echo; while [ \"\$(\"$TMUX_PROGRAM\" -S '#{socket_path}' display -p '#{l:#{pid}}')\" = \"#{pid}\" ]; do nice cut -c3- '$TMUX_CONF' | sh -s _loadavg; sleep $interval; done)$status_right" +# elif [ "$_tmux_version" -gt 2400 ]; then +# status_right="#(echo; while :; do nice cut -c3- '$TMUX_CONF' | sh -s _loadavg; sleep $interval; done)$status_right" +# else +# status_right="#(nice cut -c3- '$TMUX_CONF' | sh -s _loadavg)$status_right" +# fi +# ;; +# esac +# +# # -- custom variables ------------------------------------------------------ +# +# if [ -f "$TMUX_CONF_LOCAL" ] && [ "$(cut -c3- "$TMUX_CONF_LOCAL" | sh 2>/dev/null -s printf probe)" = "probe" ]; then +# replacements=$(perl -n -e 'print if s!^#\s+([^_][^()\s]+)\s*\(\)\s*{\s*(?:#.*)?\n!s%#\\\{\1((?:\\s+(?:[^\{\}]+?|#\\{(?:[^\{\}]+?)\}))*)\\\}%#(cut -c3- '"'"$TMUX_CONF_LOCAL"'"' | sh -s \1\\1)%g; !p' "$TMUX_CONF_LOCAL") +# status_left=$(echo "$status_left" | perl -p -e "$replacements" || echo "$status_left") +# status_right=$(echo "$status_right" | perl -p -e "$replacements" || echo "$status_right") +# fi +# +# # -------------------------------------------------------------------------- +# +# tmux set -g set-titles-string "$(_decode_unicode_escapes "$set_titles_string")" \;\ +# setw -g window-status-format "$(_decode_unicode_escapes "$window_status_format")" \;\ +# setw -g window-status-current-format "$(_decode_unicode_escapes "$window_status_current_format")" \;\ +# set -g status-left-length 1000 \; set -g status-left "$(_decode_unicode_escapes "$status_left")" \;\ +# set -g status-right-length 1000 \; set -g status-right "$(_decode_unicode_escapes "$status_right")" +# } +# +# __apply_plugins() { +# TMUX_PLUGIN_MANAGER_PATH="$1" +# window_active="$2" +# tmux_conf_update_plugins_on_launch="$3" +# tmux_conf_update_plugins_on_reload="$4" +# tmux_conf_uninstall_plugins_on_reload="$5" +# +# if [ -z "$TMUX_PLUGIN_MANAGER_PATH" ]; then +# return 255 +# fi +# mkdir -p "$TMUX_PLUGIN_MANAGER_PATH" +# +# __discover_plugins() ( +# probe_socket="$(dirname "$TMUX_SOCKET")/tmux-discover-plugins-$$" +# TMUX_SOCKET="$probe_socket" tmux -f /dev/null start-server \; set-option exit-empty off +# ___discover_plugins() { +# depth=$((${depth:-0} + 1)) +# IFS=${_IFS:-$IFS} +# [ "$depth" -le 100 ] || return +# for current_file in "$@"; do +# current_file="$(cd "${current_file%/*}" 2>/dev/null && pwd)/${current_file##*/}" || continue +# while IFS= read -r line; do +# if plugin=$(printf '%s\n' "$line" | perl -s -n -E 'print if s/^set-option\s+-g\s+\@plugin\s+//g or die' 2>/dev/null); then +# discovered_plugins="${discovered_plugins}${discovered_plugins:+ }${plugin}" +# elif next_files=$(printf '%s\n' "$line" | perl -s -n -E 's/(?/dev/null); then +# next_files=$(TMUX_SOCKET="$probe_socket" tmux -f /dev/null \ +# set -g @current_file "$current_file" \; \ +# display -pF "$next_files") +# +# _IFS="$IFS" +# IFS=$(printf '\n\nx') +# IFS=${IFS%?} +# # we don't want quoting here as we want wildcard expansion +# # shellcheck disable=SC2046 +# ___discover_plugins $(printf '%s\n' "$next_files" | xargs printf '%s\n\n') +# fi +# done << EOF +# $(TMUX_SOCKET="$probe_socket" tmux -f /dev/null source -nvq "$current_file" | perl -s -n -E 'print if s/^$current_file:\d+:\s*(set-option\s+-g\s+\@plugin\s+|source-file)/\1/g' -- -current_file="$current_file") +# EOF +# done +# } +# ___discover_plugins "$@" +# TMUX_SOCKET="$probe_socket" tmux -f /dev/null kill-server +# rm -rf "$probe_socket" +# printf '%s\n' "$discovered_plugins" +# ) +# +# tpm_plugins=$(tmux show -gvq '@tpm_plugins' 2>/dev/null) +# tpm_plugins=$(cat << EOF | tr ' ' '\n' | awk '/^\s*$/ {next;}; !seen[$0]++ { gsub(/^[ \t]+/,"",$0); gsub(/[ \t]+$/,"",$0); print $0 }' +# $(__discover_plugins "$TMUX_CONF_LOCAL") +# EOF +# ) +# if [ -z "$tpm_plugins" ]; then +# if _is_true "$tmux_conf_uninstall_plugins_on_reload" && [ -d "$TMUX_PLUGIN_MANAGER_PATH/tpm" ]; then +# tmux display 'Uninstalling tpm and plugins...' +# tmux set-environment -gu TMUX_PLUGIN_MANAGER_PATH +# rm -rf "$TMUX_PLUGIN_MANAGER_PATH" +# tmux display 'Done uninstalling tpm and plugins...' +# fi +# else +# if [ "$(command tmux display -p '#{pid} #{version} #{socket_path}')" = "$("$TMUX_PROGRAM" display -p '#{pid} #{version} #{socket_path}')" ]; then +# tmux set-environment -g TMUX_PLUGIN_MANAGER_PATH "$TMUX_PLUGIN_MANAGER_PATH" +# tmux set -g '@tpm_plugins' "$tpm_plugins" +# +# if [ -d "$TMUX_PLUGIN_MANAGER_PATH/tpm" ]; then +# [ -z "$(tmux show -gqv '@tpm-install')" ] && tmux set -g '@tpm-install' 'I' +# [ -z "$(tmux show -gqv '@tpm-update')" ] && tmux set -g '@tpm-update' 'u' +# [ -z "$(tmux show -gqv '@tpm-clean')" ] && tmux set -g '@tpm-clean' 'M-u' +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/tpm" || tmux display "One or more tpm plugin(s) failed" +# fi +# +# if git ls-remote -hq https://github.com/gpakosz/.tmux.git master > /dev/null; then +# if [ ! -d "$TMUX_PLUGIN_MANAGER_PATH/tpm" ]; then +# install_tpm=true +# tmux display 'Installing tpm and plugins...' +# git clone --depth 1 https://github.com/tmux-plugins/tpm "$TMUX_PLUGIN_MANAGER_PATH/tpm" +# elif { [ -z "$window_active" ] && _is_true "$tmux_conf_update_plugins_on_launch"; } || { [ -n "$window_active" ] && _is_true "$tmux_conf_update_plugins_on_reload"; }; then +# update_tpm=true +# tmux display 'Updating tpm and plugins...' +# (cd "$TMUX_PLUGIN_MANAGER_PATH/tpm" && git fetch -q -p && git checkout -q master && git reset -q --hard origin/master) +# fi +# if [ "$install_tpm" = "true" ] || [ "$update_tpm" = "true" ]; then +# perl -0777 -p -i -e 's/git clone(?!\s+--depth\s+1)/git clone --depth 1/g +# ;s/(install_plugin(.(?!&))*)\n(\s+)done/\1&\n\3done\n\3wait/g' "$TMUX_PLUGIN_MANAGER_PATH/tpm/scripts/install_plugins.sh" +# perl -p -i -e 's/git submodule update --init --recursive(?!\s+--depth\s+1)/git submodule update --init --recursive --depth 1/g' "$TMUX_PLUGIN_MANAGER_PATH/tpm/scripts/update_plugin.sh" +# perl -p -i -e 's,\$tmux_file\s+>/dev/null\s+2>\&1,$& || { tmux display "Plugin \$(basename \${plugin_path}) failed" && false; },' "$TMUX_PLUGIN_MANAGER_PATH/tpm/scripts/source_plugins.sh" +# fi +# if [ "$update_tpm" = "true" ]; then +# { +# { +# printf 'List of discovered tpm plugins: %s\n' "$(printf '%s\n' "$tpm_plugins" | paste -s -d ' ' -)" | _timestamp +# printf '%s\n' "Invoking $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins" | _timestamp +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins" 2>&1 | _timestamp +# printf '%s\n' "Invoking $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/update_plugins all" | _timestamp +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/bin/update_plugins" all 2>&1 | _timestamp +# printf '%s\n' "Invoking $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/clean_plugins all" | _timestamp +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/bin/clean_plugins" all 2>&1 | _timestamp +# cut -c3- "$TMUX_CONF" | sh -s _apply_important +# printf 'Done.\n' | _timestamp +# printf '\n' +# } >> "$TMUX_PLUGIN_MANAGER_PATH/tpm_log.txt" +# +# tmux display 'Done updating tpm and plugins...' +# } || tmux display 'Failed updating tpm and plugins...' +# elif [ "$install_tpm" = "true" ]; then +# { +# { +# printf 'List of discovered tpm plugins: %s\n' "$(printf '%s\n' "$tpm_plugins" | paste -s -d ' ' -)" | _timestamp +# printf '%s\n' "Invoking $TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins" | _timestamp +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/bin/install_plugins" 2>&1 | _timestamp +# cut -c3- "$TMUX_CONF" | sh -s _apply_important +# printf 'Done.\n' | _timestamp +# printf '\n' >> "$TMUX_PLUGIN_MANAGER_PATH/tpm_log.txt" +# } >> "$TMUX_PLUGIN_MANAGER_PATH/tpm_log.txt" +# +# tmux display 'Done installing tpm and plugins...' +# +# [ -z "$(tmux show -gqv '@tpm-install')" ] && tmux set -g '@tpm-install' 'I' +# [ -z "$(tmux show -gqv '@tpm-update')" ] && tmux set -g '@tpm-update' 'u' +# [ -z "$(tmux show -gqv '@tpm-clean')" ] && tmux set -g '@tpm-clean' 'M-u' +# "$TMUX_PLUGIN_MANAGER_PATH/tpm/tpm" || tmux display "One or more tpm plugin(s) failed" +# } || tmux display 'Failed installing tpm and plugins...' +# fi +# else +# tmux display "GitHub doesn't seem to be reachable, skipping installing and/or updating tpm and plugins..." +# fi +# else +# if [ "$_tmux_version" -ge 3200 ]; then +# tmux run -b "exec sh -c 'sleep \$((#{display-time} / 1000)) && \"$TMUX_PROGRAM\" display -N -d 3000 \"Cannot use tpm which assumes a globally installed tmux\"'" +# else +# tmux run -b "exec sh -c 'sleep \$((#{display-time} / 1000)) && \"$TMUX_PROGRAM\" set display-time 3000 \; display \"Cannot use tpm which assumes a globally installed tmux\" \; set -u display-time'" +# fi +# fi +# +# tmux set -gu '@tpm-install' \; set -gu '@tpm-update' \; set -gu '@tpm-clean' \; set -gu '@plugin' +# fi +# } +# +# _apply_plugins() { +# tmux_conf_update_plugins_on_launch=${tmux_conf_update_plugins_on_launch:-true} +# tmux_conf_update_plugins_on_reload=${tmux_conf_update_plugins_on_reload:-true} +# tmux_conf_uninstall_plugins_on_reload=${tmux_conf_uninstall_plugins_on_reload:-true} +# +# if [ -z "$TMUX_PLUGIN_MANAGER_PATH" ]; then +# if [ "$(dirname "$TMUX_CONF")" = "$HOME" ]; then +# TMUX_PLUGIN_MANAGER_PATH="$HOME/.tmux/plugins" +# else +# TMUX_PLUGIN_MANAGER_PATH="$(dirname "$TMUX_CONF")/plugins" +# fi +# fi +# if ! ps -x | grep -q '[_]_apply_plugins'; then +# tmux run -b "cut -c3- '$TMUX_CONF' | sh -s __apply_plugins '$TMUX_PLUGIN_MANAGER_PATH' '$window_active' '$tmux_conf_update_plugins_on_launch' '$tmux_conf_update_plugins_on_reload' '$tmux_conf_uninstall_plugins_on_reload'" +# fi +# } +# +# _apply_important() { +# cfg=$(mktemp) && trap 'rm -f $cfg*' EXIT +# +# if perl -n -e 'print if /^\s*(?:set|bind|unbind).+?#!important\s*$/' "$TMUX_CONF_LOCAL" 2>/dev/null > "$cfg.local"; then +# if ! tmux source-file "$cfg.local"; then +# if tmux source-file -v /dev/null 2> /dev/null; then +# verbose_flag='-v' +# fi +# while ! out=$(tmux source-file "${verbose_flag:+$verbose_flag}" "$cfg.local"); do +# line=$(printf "%s" "$out" | tail -1 | cut -d':' -f2) +# perl -n -i -e "if ($. != $line) { print }" "$cfg.local" +# done +# fi +# fi +# } +# +# _apply_configuration() { +# window_active="$(tmux display -p '#{window_active}' 2>/dev/null || true)" +# if [ -z "$window_active" ]; then +# if [ "$_tmux_version" -lt 2600 ]; then +# tmux run -b 'tmux set display-time 3000 \; display "This configuration requires tmux 2.6+" \; set -u display-time \; run "sleep 3" \; kill-server' +# return +# fi +# if [ "$_tmux_version" -ge 3200 ]; then +# for cmd in perl sed awk; do +# if ! command -v "$cmd" > /dev/null 2>&1; then +# tmux run -b "tmux display -N -d 3000 'This configuration requires $cmd' \; run 'sleep 3' \; kill-server" +# return +# fi +# done +# else +# for cmd in perl sed awk; do +# if ! command -v "$cmd" > /dev/null 2>&1; then +# tmux run -b "tmux set display-time 3000 \; display 'This configuration requires $cmd' \; set -u display-time \; run 'sleep 3' \; kill-server" +# return +# fi +# done +# fi +# fi +# +# case "$_uname_s" in +# *CYGWIN*|*MSYS*) +# # prevent Cygwin and MSYS2 from cd-ing into home directory when evaluating /etc/profile +# tmux setenv -g CHERE_INVOKING 1 +# ;; +# esac +# +# _apply_tmux_256color +# _apply_24b& +# _apply_theme& +# _apply_bindings& +# wait +# +# _apply_plugins +# _apply_important +# +# # shellcheck disable=SC2046 +# tmux setenv -gu tmux_conf_dummy $(printenv | grep -E -o '^tmux_conf_[^=]+' | awk '{printf "; setenv -gu %s", $0}') +# } +# +# _urlview() { +# pane_id="$1"; shift +# tmux capture-pane -J -S - -E - -b "urlview-$pane_id" -t "$pane_id" +# tmux split-window "'$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} show-buffer -b 'urlview-$pane_id' | urlview || true; '$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} delete-buffer -b 'urlview-$pane_id'" +# } +# +# _urlscan() { +# pane_id="$1"; shift +# tmux capture-pane -J -S - -E - -b "urlscan-$pane_id" -t "$pane_id" +# tmux split-window "'$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} show-buffer -b 'urlscan-$pane_id' | urlscan $* || true; '$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} delete-buffer -b 'urlscan-$pane_id'" +# } +# +# _fpp() { +# tmux capture-pane -J -S - -E - -b "fpp-$1" -t "$1" +# tmux split-window -c "$2" "'$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} show-buffer -b 'fpp-$1' | fpp || true; '$TMUX_PROGRAM' ${TMUX_SOCKET:+-S "$TMUX_SOCKET"} delete-buffer -b 'fpp-$1'" +# } +# +# "$@" diff --git a/tmux/.tmux.conf.local b/tmux/.tmux.conf.local new file mode 100644 index 0000000..515412b --- /dev/null +++ b/tmux/.tmux.conf.local @@ -0,0 +1,663 @@ +# : << 'EOF' +# Oh my tmux! +# 💛🩷💙🖤❤️🤍 +# https://github.com/gpakosz/.tmux +# (‑●‑●)> dual licensed under the WTFPL v2 license and the MIT license, +# without any warranty. +# Copyright 2012— Gregory Pakosz (@gpakosz). + + +# -- bindings ------------------------------------------------------------------ + +# preserve tmux stock bindings, +# while adding bindings that don't conflict with these stock bindings +# /!\ this disables some of Oh my tmux! bindings described in README.md +# - true +# - false (default) +tmux_conf_preserve_stock_bindings=false + + +# -- session creation ---------------------------------------------------------- + +# prompt for session name when creating a new session, possible values are: +# - true +# - false (default) +# - disabled (do not modify new-session bindings) +tmux_conf_new_session_prompt=false + +# new session retains current path, possible values are: +# - true +# - false (default) +# - disabled (do not modify new-session bindings) +tmux_conf_new_session_retain_current_path=false + + +# -- windows & pane creation --------------------------------------------------- + +# new window retains current path, possible values are: +# - true +# - false (default) +# - disabled (do not modify new-window bindings) +tmux_conf_new_window_retain_current_path=false + +# new window tries to reconnect ssh sessions, possible values are: +# - true +# - false (default) +# - disabled (do not modify new-window bindings) +tmux_conf_new_window_reconnect_ssh=false + +# new pane retains current path, possible values are: +# - true (default) +# - false +# - disabled (do not modify split-window bindings) +tmux_conf_new_pane_retain_current_path=true + +# new pane tries to reconnect ssh sessions, possible values are: +# - true +# - false (default) +# - disabled (do not modify split-window bindings) +tmux_conf_new_pane_reconnect_ssh=false + + +# -- display ------------------------------------------------------------------- + +# RGB 24-bit colour support, possible values are: +# - true +# - false +# - auto (default) +# +# automatic detection relies on the COLORTERM environment variable being defined +# to 'truecolor' or '24bit' or '$ tput colors' answering '16777216' +# see https://github.com/termstandard/colors +tmux_conf_24b_colour=auto + + +# -- theming ------------------------------------------------------------------- + +# enable or disable theming: +# - enabled (default) +# - disabled +# when disabled, all tmux_conf_theme_xxx variables are ignored except: +# - tmux_conf_theme_pairing +# - tmux_conf_theme_prefix +# - tmux_conf_theme_mouse +# - tmux_conf_theme_root +# - tmux_conf_theme_synchronized +tmux_conf_theme=enabled + +# Catppuccin Frappe theme colors - cool blues +# Cool cyan and blue tones +tmux_conf_theme_colour_1="#232634" # crust - darkest +tmux_conf_theme_colour_2="#51576d" # surface1 - lighter gray +tmux_conf_theme_colour_3="#626880" # surface2 - medium gray +tmux_conf_theme_colour_4="#99d1db" # sky - bright cyan-blue (active) +tmux_conf_theme_colour_5="#8caaee" # blue - bright blue +tmux_conf_theme_colour_6="#232634" # crust - darkest +tmux_conf_theme_colour_7="#c6d0f5" # text - light text +tmux_conf_theme_colour_8="#232634" # crust - darkest +tmux_conf_theme_colour_9="#85c1dc" # sapphire - bright sapphire-blue +tmux_conf_theme_colour_10="#99d1db" # sky - bright cyan +tmux_conf_theme_colour_11="#81c8be" # teal - cool teal green +tmux_conf_theme_colour_12="#babbf1" # lavender - cool lavender +tmux_conf_theme_colour_13="#c6d0f5" # text - light text +tmux_conf_theme_colour_14="#232634" # crust - darkest +tmux_conf_theme_colour_15="#414559" # surface0 - dark background +tmux_conf_theme_colour_16="#e78284" # red - bright red +tmux_conf_theme_colour_17="#c6d0f5" # text - light text + +# window style +tmux_conf_theme_window_fg="default" +tmux_conf_theme_window_bg="default" + +# highlight focused pane, possible values are: +# - true +# - false (default) +tmux_conf_theme_highlight_focused_pane=false + +# focused pane colours: +tmux_conf_theme_focused_pane_bg="$tmux_conf_theme_colour_2" + +# pane border style, possible values are: +# - thin (default) +# - fat +tmux_conf_theme_pane_border_style=thin + +# pane borders colours: +tmux_conf_theme_pane_border="$tmux_conf_theme_colour_2" +tmux_conf_theme_pane_active_border="$tmux_conf_theme_colour_4" +%if #{>=:#{version},3.2} +tmux_conf_theme_pane_active_border="#{?pane_in_mode,$tmux_conf_theme_colour_9,#{?synchronize-panes,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_4}}" +%endif + +# pane indicator colours (when you hit + q) +tmux_conf_theme_pane_indicator="$tmux_conf_theme_colour_4" +tmux_conf_theme_pane_active_indicator="$tmux_conf_theme_colour_4" + +# status line style +tmux_conf_theme_message_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_message_bg="$tmux_conf_theme_colour_5" +tmux_conf_theme_message_attr="bold" + +# status line command style ( : Escape) +tmux_conf_theme_message_command_fg="$tmux_conf_theme_colour_5" +tmux_conf_theme_message_command_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_message_command_attr="bold" + +# window modes style +tmux_conf_theme_mode_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_mode_bg="$tmux_conf_theme_colour_5" +tmux_conf_theme_mode_attr="bold" + +# status line style +tmux_conf_theme_status_fg="$tmux_conf_theme_colour_3" +tmux_conf_theme_status_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_status_attr="none" + +# terminal title +# - built-in variables are: +# - #{circled_window_index} +# - #{circled_session_name} +# - #{hostname} +# - #{hostname_ssh} +# - #{hostname_full} +# - #{hostname_full_ssh} +# - #{username} +# - #{username_ssh} +tmux_conf_theme_terminal_title="#h ❐ #S ● #I #W" + +# window status style +# - built-in variables are: +# - #{circled_window_index} +# - #{circled_session_name} +# - #{hostname} +# - #{hostname_ssh} +# - #{hostname_full} +# - #{hostname_full_ssh} +# - #{username} +# - #{username_ssh} +tmux_conf_theme_window_status_fg="$tmux_conf_theme_colour_3" +tmux_conf_theme_window_status_bg="$tmux_conf_theme_colour_1" +tmux_conf_theme_window_status_attr="none" +tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" +#tmux_conf_theme_window_status_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" +#tmux_conf_theme_window_status_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}" + +# window current status style +# - built-in variables are: +# - #{circled_window_index} +# - #{circled_session_name} +# - #{hostname} +# - #{hostname_ssh} +# - #{hostname_full} +# - #{hostname_full_ssh} +# - #{username} +# - #{username_ssh} +tmux_conf_theme_window_status_current_fg="$tmux_conf_theme_colour_1" +tmux_conf_theme_window_status_current_bg="$tmux_conf_theme_colour_4" +tmux_conf_theme_window_status_current_attr="bold" +tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" +#tmux_conf_theme_window_status_current_format="#{circled_window_index} #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,!,}#{?window_zoomed_flag,Z,}" +#tmux_conf_theme_window_status_current_format="#I #W#{?#{||:#{window_bell_flag},#{window_zoomed_flag}}, ,}#{?window_bell_flag,🔔,}#{?window_zoomed_flag,🔍,}" + +# window activity status style +tmux_conf_theme_window_status_activity_fg="default" +tmux_conf_theme_window_status_activity_bg="default" +tmux_conf_theme_window_status_activity_attr="underscore" + +# window bell status style +tmux_conf_theme_window_status_bell_fg="$tmux_conf_theme_colour_5" +tmux_conf_theme_window_status_bell_bg="default" +tmux_conf_theme_window_status_bell_attr="blink,bold" + +# window last status style +tmux_conf_theme_window_status_last_fg="$tmux_conf_theme_colour_4" +tmux_conf_theme_window_status_last_bg="$tmux_conf_theme_colour_2" +tmux_conf_theme_window_status_last_attr="none" + +# status left/right sections separators +tmux_conf_theme_left_separator_main="" +tmux_conf_theme_left_separator_sub="|" +tmux_conf_theme_right_separator_main="" +tmux_conf_theme_right_separator_sub="|" +#tmux_conf_theme_left_separator_main='\uE0B0' # /!\ you don't need to install Powerline +#tmux_conf_theme_left_separator_sub='\uE0B1' # you only need fonts patched with +#tmux_conf_theme_right_separator_main='\uE0B2' # Powerline symbols or the standalone +#tmux_conf_theme_right_separator_sub='\uE0B3' # PowerlineSymbols.otf font, see README.md + +# status left/right content: +# - separate main sections with "|" +# - separate subsections with "," +# - built-in variables are: +# - #{battery_bar} +# - #{battery_hbar} +# - #{battery_percentage} +# - #{battery_status} +# - #{battery_vbar} +# - #{circled_session_name} +# - #{hostname_ssh} +# - #{hostname} +# - #{hostname_full} +# - #{hostname_full_ssh} +# - #{loadavg} +# - #{mouse} +# - #{pairing} +# - #{prefix} +# - #{root} +# - #{synchronized} +# - #{uptime_y} +# - #{uptime_d} (modulo 365 when #{uptime_y} is used) +# - #{uptime_h} +# - #{uptime_m} +# - #{uptime_s} +# - #{username} +# - #{username_ssh} +tmux_conf_theme_status_left=" ❐ #S | ↑#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} " +#tmux_conf_theme_status_left=" ❐ #S | ↑#{?uptime_y, #{uptime_y}y,}#{?uptime_d, #{uptime_d}d,}#{?uptime_h, #{uptime_h}h,}#{?uptime_m, #{uptime_m}m,} | #{pretty_pane_current_path} " +tmux_conf_theme_status_right=" #{prefix}#{mouse}#{pairing}#{synchronized}#{?battery_status,#{battery_status},}#{?battery_bar, #{battery_bar},}#{?battery_percentage, #{battery_percentage},} , %R , %d %b | #{username}#{root} | #{hostname} " + +# status left style +tmux_conf_theme_status_left_fg="$tmux_conf_theme_colour_1,$tmux_conf_theme_colour_1,$tmux_conf_theme_colour_1" +tmux_conf_theme_status_left_bg="$tmux_conf_theme_colour_9,$tmux_conf_theme_colour_10,$tmux_conf_theme_colour_11" +tmux_conf_theme_status_left_attr="bold,none,none" + +# status right style +tmux_conf_theme_status_right_fg="$tmux_conf_theme_colour_12,$tmux_conf_theme_colour_13,$tmux_conf_theme_colour_14" +tmux_conf_theme_status_right_bg="$tmux_conf_theme_colour_15,$tmux_conf_theme_colour_16,$tmux_conf_theme_colour_17" +tmux_conf_theme_status_right_attr="none,none,bold" + +# pairing indicator +tmux_conf_theme_pairing="⚇" # U+2687 +tmux_conf_theme_pairing_fg="none" +tmux_conf_theme_pairing_bg="none" +tmux_conf_theme_pairing_attr="none" + +# prefix indicator +tmux_conf_theme_prefix="⌨" # U+2328 +tmux_conf_theme_prefix_fg="none" +tmux_conf_theme_prefix_bg="none" +tmux_conf_theme_prefix_attr="none" + +# mouse indicator +tmux_conf_theme_mouse="↗" # U+2197 +tmux_conf_theme_mouse_fg="none" +tmux_conf_theme_mouse_bg="none" +tmux_conf_theme_mouse_attr="none" + +# root indicator +tmux_conf_theme_root="!" +tmux_conf_theme_root_fg="none" +tmux_conf_theme_root_bg="none" +tmux_conf_theme_root_attr="bold,blink" + +# synchronized indicator +tmux_conf_theme_synchronized="⚏" # U+268F +tmux_conf_theme_synchronized_fg="none" +tmux_conf_theme_synchronized_bg="none" +tmux_conf_theme_synchronized_attr="none" + +# battery bar symbols +tmux_conf_battery_bar_symbol_full="◼" +tmux_conf_battery_bar_symbol_empty="◻" +#tmux_conf_battery_bar_symbol_full="♥" +#tmux_conf_battery_bar_symbol_empty="·" + +# battery bar length (in number of symbols), possible values are: +# - auto +# - a number, e.g. 5 +tmux_conf_battery_bar_length="auto" + +# battery bar palette, possible values are: +# - gradient (default) +# - heat +# - "colour_full_fg,colour_empty_fg,colour_bg" +# - gradient(colour_fg_1,colour_fg_2,...,colour_fg_n) +tmux_conf_battery_bar_palette="gradient" +#tmux_conf_battery_bar_palette="#d70000,#e4e4e4,#000000" # red, white, black +#tmux_conf_battery_bar_palette="gradient(#00afff,#47a2ff,#7c91ff,#ac7afb,#d65be2,#e163df,#eb6cdd,#f475db,#ec9ff1,#eac3fe,#efe2ff,#ffffff)" + +# battery hbar palette, possible values are: +# - gradient (default) +# - heat +# - "colour_low,colour_half,colour_full" +# - gradient(colour_fg_1,colour_fg_2,...,colour_fg_n) +tmux_conf_battery_hbar_palette="gradient" +#tmux_conf_battery_hbar_palette="#d70000,#ff5f00,#5fff00" # red, orange, green +#tmux_conf_battery_hbar_palette="gradient(#00afff,#47a2ff,#7c91ff,#ac7afb,#d65be2,#e163df,#eb6cdd,#f475db,#ec9ff1,#eac3fe,#efe2ff,#ffffff)" + +# battery vbar palette, possible values are: +# - gradient (default) +# - heat +# - "colour_low,colour_half,colour_full" +# - gradient(colour_fg_1,colour_fg_2,...,colour_fg_n) +tmux_conf_battery_vbar_palette="gradient" +#tmux_conf_battery_vbar_palette="#d70000,#ff5f00,#5fff00" # red, orange, green +#tmux_conf_battery_vbar_palette="gradient(#00afff,#47a2ff,#7c91ff,#ac7afb,#d65be2,#e163df,#eb6cdd,#f475db,#ec9ff1,#eac3fe,#efe2ff,#ffffff)" + +# symbols used to indicate whether battery is charging or discharging +tmux_conf_battery_status_charging="↑" # U+2191 +tmux_conf_battery_status_discharging="↓" # U+2193 +#tmux_conf_battery_status_charging="🔌" # U+1F50C +#tmux_conf_battery_status_discharging="🔋" # U+1F50B + +# clock style (when you hit + t) +# you may want to use %I:%M %p in place of %R in tmux_conf_theme_status_right +tmux_conf_theme_clock_colour="$tmux_conf_theme_colour_4" +tmux_conf_theme_clock_style="24" + + +# -- clipboard ----------------------------------------------------------------- + +# in copy mode, copying selection also copies to the OS clipboard +# - true +# - false (default) +# - disabled +# on Linux, this requires xsel, xclip or wl-copy +tmux_conf_copy_to_os_clipboard=false + + +# -- urlscan ------------------------------------------------------------------- + +# options passed to urlscan +tmux_conf_urlscan_options="--compact --dedupe" + + +# -- user customizations ------------------------------------------------------- + +# this is the place to override or undo settings + +# increase history size +set -g history-limit 50000 + +# start with mouse mode enabled (для прокрутки тачпадом) +set -g mouse on + +# force Vi mode +# really you should export VISUAL or EDITOR environment variable, see manual +#set -g status-keys vi +#set -g mode-keys vi + +# replace C-b by C-a instead of using both prefixes +# set -gu prefix2 +# unbind C-a +# unbind C-b +# set -g prefix C-a +# bind C-a send-prefix + +# if you don't want Oh my tmux! to alter a binding or a setting, use #!important +# bind c new-window -c '#{pane_current_path}' #!important + +# display a message after toggling mouse support +bind m run "cut -c3- '#{TMUX_CONF}' | sh -s _toggle_mouse" \; display 'mouse #{?#{mouse},on,off}' + +# move status line to top +#set -g status-position top + +# -- custom key bindings ------------------------------------------------------- + +# Alt+стрелки для переключения между окнами (вкладками) +bind -n M-Left previous-window +bind -n M-Right next-window +bind -n M-Up switch-client -p +bind -n M-Down switch-client -n + +# Навигация между панелями - поддержка русской раскладки (р/о/л/д = h/j/k/l) +bind -r р select-pane -L # h -> р (влево) +bind -r о select-pane -D # j -> о (вниз) +bind -r л select-pane -U # k -> л (вверх) +bind -r д select-pane -R # l -> д (вправо) + +# Изменение размера панелей - поддержка русской раскладки +bind -r Р resize-pane -L 2 # H -> Р +bind -r О resize-pane -D 2 # J -> О +bind -r Л resize-pane -U 2 # K -> Л +bind -r Д resize-pane -R 2 # L -> Д + +# Навигация между окнами - русская раскладка +bind -r C-р previous-window # C-h -> C-р +bind -r C-д next-window # C-l -> C-д + +# Создание нового окна - русская раскладка +bind с new-window # c -> с + +# Поиск сессии - русская раскладка +bind C-а command-prompt -p find-session 'switch-client -t %%' # C-f -> C-а + +# Ctrl+Alt+h или Ctrl+Alt+р для показа гайда по горячим клавишам (в новом окне с прокруткой) +bind -n C-M-h new-window -n "TMUX Шпаргалка" "cat << 'EOF' | less -R +╔═══════════════════════════════════════════════════════════════════════════╗ +║ TMUX ГОРЯЧИЕ КЛАВИШИ (prefix = Ctrl+b или Ctrl+a) ║ +╚═══════════════════════════════════════════════════════════════════════════╝ + +📋 ОСНОВНЫЕ КОМАНДЫ: + prefix + ? - Показать все горячие клавиши + prefix + : - Командная строка tmux + prefix + r (к) - Перезагрузить конфигурацию + prefix + e (у) - Редактировать ~/.tmux.conf.local + Ctrl+l - Очистить экран и историю + +🪟 УПРАВЛЕНИЕ ОКНАМИ (вкладками): + prefix + c (с) - Создать новое окно + prefix + , - Переименовать текущее окно + prefix + & - Закрыть текущее окно + prefix + n (т) - Следующее окно + prefix + p (з) - Предыдущее окно + prefix + Ctrl+h (р) - Предыдущее окно + prefix + Ctrl+l (д) - Следующее окно + prefix + Tab - Последнее активное окно + prefix + 0-9 - Переключиться на окно по номеру + Alt + ←/→ - Переключение между окнами + Alt + ↑/↓ - Переключение между сессиями + +🔲 УПРАВЛЕНИЕ ПАНЕЛЯМИ: + prefix + - - Разделить по горизонтали + prefix + _ - Разделить по вертикали + prefix + h/j/k/l (р/о/л/д) - Навигация между панелями (vim-style) + prefix + H/J/K/L (Р/О/Л/Д) - Изменить размер панели + prefix + < - Поменять панели местами (влево) + prefix + > - Поменять панели местами (вправо) + prefix + + - Развернуть панель на весь экран + prefix + x (ч) - Закрыть текущую панель + prefix + ! - Превратить панель в окно + prefix + z (я) - Zoom панели (toggle) + prefix + q (й) - Показать номера панелей + +📋 КОПИРОВАНИЕ И ВСТАВКА: + prefix + Enter - Режим копирования + prefix + b (и) - Список буферов + prefix + p (з) - Вставить из буфера + prefix + P (З) - Выбрать буфер для вставки + + В режиме копирования: + v (м) - Начать выделение + y (н) - Скопировать выделенное + Escape - Выйти из режима копирования + +🔧 СЕССИИ: + prefix + Ctrl+c (с) - Создать новую сессию + prefix + Ctrl+f (а) - Найти сессию + prefix + d (в) - Отключиться от сессии + prefix + D (В) - Выбрать сессию для отключения + prefix + s (ы) - Список сессий + +🖱️ ДРУГОЕ: + prefix + m (ь) - Включить/выключить мышь + prefix + t (е) - Показать часы + prefix + U (Г) - Открыть URL (urlscan/urlview) + prefix + F (А) - Facebook PathPicker (если установлен) + Ctrl+Alt+h (р) - Показать этот гайд + +💡 Используйте стрелки ↑/↓ или j/k для прокрутки +💡 Нажмите q для выхода +💡 Русская раскладка поддерживается! (в скобках указаны русские буквы) + +EOF +" + +# Дубликат для русской раскладки Ctrl+Alt+р +bind -n C-M-р new-window -n "TMUX Шпаргалка" "cat << 'EOF' | less -R +╔═══════════════════════════════════════════════════════════════════════════╗ +║ TMUX ГОРЯЧИЕ КЛАВИШИ (prefix = Ctrl+b или Ctrl+a) ║ +╚═══════════════════════════════════════════════════════════════════════════╝ + +📋 ОСНОВНЫЕ КОМАНДЫ: + prefix + ? - Показать все горячие клавиши + prefix + : - Командная строка tmux + prefix + r (к) - Перезагрузить конфигурацию + prefix + e (у) - Редактировать ~/.tmux.conf.local + Ctrl+l - Очистить экран и историю + +🪟 УПРАВЛЕНИЕ ОКНАМИ (вкладками): + prefix + c (с) - Создать новое окно + prefix + , - Переименовать текущее окно + prefix + & - Закрыть текущее окно + prefix + n (т) - Следующее окно + prefix + p (з) - Предыдущее окно + prefix + Ctrl+h (р) - Предыдущее окно + prefix + Ctrl+l (д) - Следующее окно + prefix + Tab - Последнее активное окно + prefix + 0-9 - Переключиться на окно по номеру + Alt + ←/→ - Переключение между окнами + Alt + ↑/↓ - Переключение между сессиями + +🔲 УПРАВЛЕНИЕ ПАНЕЛЯМИ: + prefix + - - Разделить по горизонтали + prefix + _ - Разделить по вертикали + prefix + h/j/k/l (р/о/л/д) - Навигация между панелями (vim-style) + prefix + H/J/K/L (Р/О/Л/Д) - Изменить размер панели + prefix + < - Поменять панели местами (влево) + prefix + > - Поменять панели местами (вправо) + prefix + + - Развернуть панель на весь экран + prefix + x (ч) - Закрыть текущую панель + prefix + ! - Превратить панель в окно + prefix + z (я) - Zoom панели (toggle) + prefix + q (й) - Показать номера панелей + +📋 КОПИРОВАНИЕ И ВСТАВКА: + prefix + Enter - Режим копирования + prefix + b (и) - Список буферов + prefix + p (з) - Вставить из буфера + prefix + P (З) - Выбрать буфер для вставки + + В режиме копирования: + v (м) - Начать выделение + y (н) - Скопировать выделенное + Escape - Выйти из режима копирования + +🔧 СЕССИИ: + prefix + Ctrl+c (с) - Создать новую сессию + prefix + Ctrl+f (а) - Найти сессию + prefix + d (в) - Отключиться от сессии + prefix + D (В) - Выбрать сессию для отключения + prefix + s (ы) - Список сессий + +🖱️ ДРУГОЕ: + prefix + m (ь) - Включить/выключить мышь + prefix + t (е) - Показать часы + prefix + U (Г) - Открыть URL (urlscan/urlview) + prefix + F (А) - Facebook PathPicker (если установлен) + Ctrl+Alt+h (р) - Показать этот гайд + +💡 Используйте стрелки ↑/↓ или j/k для прокрутки +💡 Нажмите q для выхода +💡 Русская раскладка поддерживается! (в скобках указаны русские буквы) + +EOF +" + + +# -- tpm ----------------------------------------------------------------------- + +# while I don't use tpm myself, many people requested official support so here +# is a seamless integration that automatically installs plugins in parallel + +# whenever a plugin introduces a variable to be used in 'status-left' or +# 'status-right', you can use it in 'tmux_conf_theme_status_left' and +# 'tmux_conf_theme_status_right' variables. + +# by default, launching tmux will update tpm and all plugins +# - true (default) +# - false +tmux_conf_update_plugins_on_launch=true + +# by default, reloading the configuration will update tpm and all plugins +# - true (default) +# - false +tmux_conf_update_plugins_on_reload=true + +# by default, reloading the configuration will uninstall tpm and plugins when no +# plugins are enabled +# - true (default) +# - false +tmux_conf_uninstall_plugins_on_reload=true + +# /!\ the tpm bindings differ slightly from upstream: +# - installing plugins: + I +# - uninstalling plugins: + Alt + u +# - updating plugins: + u + +# /!\ do not add set -g @plugin 'tmux-plugins/tpm' +# /!\ do not add run '~/.tmux/plugins/tpm/tpm' + +# /!\ the 'set -g @tpm_plugins' syntax is not supported +# to enable a plugin, use the 'set -g @plugin' syntax: +# visit https://github.com/tmux-plugins for available plugins +#set -g @plugin 'tmux-plugins/tmux-copycat' +#set -g @plugin 'tmux-plugins/tmux-cpu' +#set -g @plugin 'tmux-plugins/tmux-resurrect' +#set -g @plugin 'tmux-plugins/tmux-continuum' +#set -g @continuum-restore 'on' + + +# -- custom variables ---------------------------------------------------------- + +# to define a custom #{foo} variable, define a POSIX shell function between the +# '# EOF' and the '# "$@"' lines. Please note that the opening brace { character +# must be on the same line as the function name otherwise the parse won't detect +# it. +# +# then, use #{foo} in e.g. the 'tmux_conf_theme_status_left' or the +# 'tmux_conf_theme_status_right' variables. + +# ------------------------------------------------------------------------------ + +# # /!\ do not remove the following line +# EOF +# +# # /!\ do not "uncomment" the functions: the leading "# " characters are needed +# +# # usage: #{weather} +# weather() { # see https://github.com/chubin/wttr.in#one-line-output +# curl -f -s -m 2 'wttr.in?format=3' || printf '\n' # /!\ make sure curl is installed +# sleep 900 # sleep for 15 minutes, throttle network requests whatever the value of status-interval +# } +# +# # usage: #{online} +# online() { +# ping -c 1 1.1.1.1 >/dev/null 2>&1 && printf '✔' || printf '✘' +# } +# +# # usage: #{wan_ip_v4} +# wan_ip_v4() { +# curl -f -s -m 2 -4 ifconfig.me +# sleep 300 # sleep for 5 minutes, throttle network requests whatever the value of status-interval +# } +# +# # usage: #{wan_ip_v6} +# wan_ip_v6() { +# curl -f -s -m 2 -6 ifconfig.me +# sleep 300 # sleep for 5 minutes, throttle network requests whatever the value of status-interval +# } +# +# # usage: #{github_stars}, #{github_stars tmux/tmux}, ... +# github_stars() { +# repository=${1##*https://github.com/} +# repository=${repository%% *} +# repository=${repository%%.git} +# url="https://api.github.com/repos/${repository:-gpakosz/.tmux}" +# curl -s "$url" | perl -MJSON::PP=decode_json -CO -0777 -E '$response = decode_json(readline *STDIN); say ($response->{stargazers_count})' +# sleep 300 # sleep for 5 minutes, throttle network requests whatever the value of status-interval +# } +# +# "$@" +# # /!\ do not remove the previous line +# # do not write below this line diff --git a/vim/.vimrc b/vim/.vimrc new file mode 100644 index 0000000..471e989 --- /dev/null +++ b/vim/.vimrc @@ -0,0 +1,132 @@ +" Ada's Vim config — lightweight and close to Neovim setup +" Encoding and basics +scriptencoding utf-8 +set nocompatible + +" Leader +let mapleader = " " + +" UI +set number +set relativenumber +set cursorline +set signcolumn=yes +set termguicolors + +" Indentation +set expandtab +set shiftwidth=2 +set tabstop=2 +set smartindent + +" Search +set ignorecase +set smartcase +set incsearch + +" Files +set noswapfile +set undofile + +" Performance +set updatetime=200 +set timeoutlen=400 + +" Splits +set splitbelow +set splitright + +" Clipboard (prefer system clipboard if available) +if has('unnamedplus') + set clipboard=unnamedplus +endif + +" Keymaps +nnoremap j gj +nnoremap k gk +nnoremap w :w +nnoremap q :q +nnoremap h :nohlsearch + +" Windows +nnoremap sv v +nnoremap sh s +nnoremap se = +nnoremap sx :close + +" Buffers +nnoremap :bnext +nnoremap :bprevious + +" Quickfix +nnoremap ]q :cnext +nnoremap [q :cprev + +" Autocommands +augroup AdaCore + autocmd! + " Resize splits equally on terminal resize + autocmd VimResized * tabdo wincmd = + " Disable auto comment on new line + autocmd FileType * setlocal formatoptions-=o formatoptions-=r +augroup END + +" ------------------------------ +" Plugin manager: vim-plug (auto-bootstrap) +" ------------------------------ +if empty(glob('~/.vim/autoload/plug.vim')) && !exists('$VIM_SKIP_PLUG_BOOTSTRAP') + silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif + +call plug#begin('~/.vim/plugged') + +" Theme (Nord for Vim) +Plug 'arcticicestudio/nord-vim' + +" Fuzzy finder (fzf) +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +Plug 'junegunn/fzf.vim' + +" File tree +Plug 'preservim/nerdtree' + +" Editing helpers +Plug 'tpope/vim-surround' +Plug 'tpope/vim-commentary' + +" Git signs +Plug 'airblade/vim-gitgutter' + +" Statusline +Plug 'itchyny/lightline.vim' + +" Optional: LSP-like features via coc.nvim (uncomment if needed) +" Plug 'neoclide/coc.nvim', {'branch': 'release'} + +call plug#end() + +" Colorscheme +try + colorscheme nord +catch + colorscheme default +endtry + +" Lightline theme to match colors +let g:lightline = { 'colorscheme': 'nord' } + +" NERDTree toggle +nnoremap e :NERDTreeToggle + +" FZF mappings +nnoremap ff :Files +nnoremap fg :Rg +nnoremap fb :Buffers +nnoremap fh :Helptags + +" Better terminal colors for fzf in Vim +let g:fzf_layout = { 'down': '~40%' } + +" If coc.nvim is enabled, you may want additional mappings/settings. +" See vim/vimrc comments or vim/README.md for tips. diff --git a/zed/.config/zed/settings.json b/zed/.config/zed/settings.json new file mode 100644 index 0000000..87107ad --- /dev/null +++ b/zed/.config/zed/settings.json @@ -0,0 +1,123 @@ +// Zed settings +// +// For information on how to configure Zed, see the Zed +// documentation: https://zed.dev/docs/configuring-zed +// +// To see all of Zed's default settings without changing your +// custom settings, run `zed: open default settings` from the +// command palette (cmd-shift-p / ctrl-shift-p) +{ + "edit_predictions": { + "provider": "copilot" + }, + "outline_panel": { + "auto_fold_dirs": true, + }, + "use_system_window_tabs": true, + "centered_layout": { + "left_padding": 0.2, + }, + "redact_private_values": false, + "cursor_shape": "bar", + "autosave": { + "after_delay": { + "milliseconds": 1000, + }, + }, + "preview_tabs": { + "enabled": true, + "enable_preview_from_multibuffer": true, + "enable_preview_from_file_finder": false, + }, + "pane_split_direction_vertical": "right", + "zoomed_padding": true, + "active_pane_modifiers": { + "inactive_opacity": 1.0, + "border_size": 0.0, + }, + "status_bar": { + "active_language_button": true, + "cursor_position_button": true, + }, + "terminal": { + "dock": "bottom", + "button": true, + }, + "diagnostics": { + "button": true, + }, + "search": { + "button": true, + }, + "debugger": { + "button": true, + }, + "tabs": { + "show_diagnostics": "errors", + "close_position": "right", + "file_icons": true, + "git_status": true, + }, + "tab_bar": { + "show": true, + }, + "title_bar": { + "show_menus": false, + "show_user_picture": false, + "show_onboarding_banner": true, + "show_project_items": true, + "show_branch_name": true, + "show_branch_icon": true, + }, + "project_panel": { + "sort_mode": "directories_first", + "dock": "left", + "hide_root": true, + "button": true, + "indent_size": 15.0, + "git_status": true, + "folder_icons": true, + "file_icons": true, + "hide_gitignore": false, + }, + "agent": { + "button": true, + "always_allow_tool_actions": true, + "inline_assistant_model": { + "provider": "copilot_chat", + "model": "grok-code-fast-1", + }, + "default_profile": "ask", + "default_model": { + "provider": "copilot_chat", + "model": "gpt-5.1-codex-max", + }, + "model_parameters": [], + }, + "collaboration_panel": { + "button": false, + "dock": "right", + }, + "ui_font_family": "FiraCode Nerd Font Mono", + "telemetry": { + "diagnostics": false, + "metrics": false, + }, + "buffer_font_weight": 400.0, + "ui_font_weight": 400.0, + "buffer_font_family": "FiraCode Nerd Font Mono", + "buffer_line_height": "comfortable", + "icon_theme": { + "mode": "system", + "light": "Material Icon Theme", + "dark": "Catppuccin Frappé", + }, + "ui_font_size": 16.0, + "buffer_font_size": 15.0, + "proxy": "http://127.0.0.1:8118", + "theme": { + "mode": "system", + "light": "Nord Light", + "dark": "Catppuccin Frappé", + }, +} diff --git a/zed/.config/zed/settings_backup.json b/zed/.config/zed/settings_backup.json new file mode 100644 index 0000000..33e9299 --- /dev/null +++ b/zed/.config/zed/settings_backup.json @@ -0,0 +1,123 @@ +// Zed settings +// +// For information on how to configure Zed, see the Zed +// documentation: https://zed.dev/docs/configuring-zed +// +// To see all of Zed's default settings without changing your +// custom settings, run `zed: open default settings` from the +// command palette (cmd-shift-p / ctrl-shift-p) +{ + "outline_panel": { + "auto_fold_dirs": true, + }, + "use_system_window_tabs": true, + "centered_layout": { + "left_padding": 0.2, + }, + "redact_private_values": false, + "cursor_shape": "bar", + "autosave": { + "after_delay": { + "milliseconds": 1000, + }, + }, + "preview_tabs": { + "enabled": true, + "enable_preview_from_multibuffer": true, + "enable_preview_from_file_finder": false, + }, + "pane_split_direction_vertical": "right", + "zoomed_padding": true, + "active_pane_modifiers": { + "inactive_opacity": 1.0, + "border_size": 0.0, + }, + "status_bar": { + "active_language_button": true, + "cursor_position_button": true, + }, + "terminal": { + "dock": "bottom", + "button": true, + }, + "diagnostics": { + "button": true, + }, + "search": { + "button": true, + }, + "debugger": { + "button": true, + }, + "tabs": { + "show_diagnostics": "errors", + "close_position": "right", + "file_icons": true, + "git_status": true, + }, + "tab_bar": { + "show": true, + }, + "title_bar": { + "show_menus": false, + "show_user_picture": false, + "show_onboarding_banner": true, + "show_project_items": true, + "show_branch_name": true, + "show_branch_icon": true, + }, + "project_panel": { + "sort_mode": "directories_first", + "dock": "left", + "hide_root": true, + "button": true, + "indent_size": 15.0, + "git_status": true, + "folder_icons": true, + "file_icons": true, + "hide_gitignore": false, + }, + "agent": { + "button": true, + "always_allow_tool_actions": true, + "inline_assistant_model": { + "provider": "copilot_chat", + "model": "grok-code-fast-1", + }, + "default_profile": "ask", + "default_model": { + "provider": "copilot_chat", + "model": "gpt-5.1-codex-max", + }, + "model_parameters": [], + }, + "collaboration_panel": { + "button": false, + "dock": "right", + }, + "features": { + "edit_prediction_provider": "copilot", + }, + "ui_font_family": "FiraCode Nerd Font Mono", + "telemetry": { + "diagnostics": false, + "metrics": false, + }, + "buffer_font_weight": 400.0, + "ui_font_weight": 400.0, + "buffer_font_family": "FiraCode Nerd Font Mono", + "buffer_line_height": "comfortable", + "icon_theme": { + "mode": "system", + "light": "Material Icon Theme", + "dark": "Catppuccin Frappé", + }, + "ui_font_size": 16.0, + "buffer_font_size": 15.0, + "proxy": "http://127.0.0.1:8118", + "theme": { + "mode": "system", + "light": "Nord Light", + "dark": "Catppuccin Frappé", + }, +} diff --git a/zsh/.config/zsh/.p10k.zsh b/zsh/.config/zsh/.p10k.zsh new file mode 100644 index 0000000..e2e58c2 --- /dev/null +++ b/zsh/.config/zsh/.p10k.zsh @@ -0,0 +1,1720 @@ +# Generated by Powerlevel10k configuration wizard on 2026-02-13 at 08:31 MSK. +# Based on romkatv/powerlevel10k/config/p10k-lean.zsh, checksum 02674. +# Wizard options: nerdfont-v3 + powerline, small icons, unicode, lean, 2 lines, +# disconnected, left frame, lightest-ornaments, sparse, many icons, fluent, +# transient_prompt, instant_prompt=verbose. +# Type `p10k configure` to generate another config. +# +# Config for Powerlevel10k with lean prompt style. Type `p10k configure` to generate +# your own config based on it. +# +# Tip: Looking for a nice color? Here's a one-liner to print colormap. +# +# for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done + +# Temporarily change options. +'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. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + prompt_char # prompt symbol + ) + + # The list of segments shown on the right. Fill it with less important segments. + # Right prompt on the last prompt line (where you are typing your commands) gets + # automatically hidden when the input line reaches it. Right prompt above the + # last prompt line gets hidden if it would overlap with left prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + status # exit code of the last command + command_execution_time # duration of the last command + background_jobs # presence of background jobs + direnv # direnv status (https://direnv.net/) + asdf # asdf version manager (https://github.com/asdf-vm/asdf) + virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) + anaconda # conda environment (https://conda.io/) + pyenv # python environment (https://github.com/pyenv/pyenv) + goenv # go environment (https://github.com/syndbg/goenv) + nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) + nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) + nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) + # node_version # node.js version + # go_version # go version (https://golang.org) + # rust_version # rustc version (https://www.rust-lang.org) + # dotnet_version # .NET version (https://dotnet.microsoft.com) + # php_version # php version (https://www.php.net/) + # laravel_version # laravel php framework version (https://laravel.com/) + # java_version # java version (https://www.java.com/) + # package # name@version from package.json (https://docs.npmjs.com/files/package.json) + rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) + rvm # ruby version from rvm (https://rvm.io) + fvm # flutter version management (https://github.com/leoafarias/fvm) + luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) + jenv # java version from jenv (https://github.com/jenv/jenv) + plenv # perl version from plenv (https://github.com/tokuhirom/plenv) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + phpenv # php version from phpenv (https://github.com/phpenv/phpenv) + scalaenv # scala version from scalaenv (https://github.com/scalaenv/scalaenv) + haskell_stack # haskell version from stack (https://haskellstack.org/) + kubecontext # current kubernetes context (https://kubernetes.io/) + terraform # terraform workspace (https://www.terraform.io) + # terraform_version # terraform version (https://www.terraform.io) + aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) + aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) + azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) + gcloud # google cloud cli account and project (https://cloud.google.com/) + google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) + toolbox # toolbox name (https://github.com/containers/toolbox) + context # user@hostname + nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) + ranger # ranger shell (https://github.com/ranger/ranger) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + xplr # xplr shell (https://github.com/sayanarijit/xplr) + vim_shell # vim shell indicator (:sh) + midnight_commander # midnight commander shell (https://midnight-commander.org/) + nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # vpn_ip # virtual private network indicator + # load # CPU load + # disk_usage # disk usage + # ram # free RAM + # swap # used swap + todo # todo items (https://github.com/todotxt/todo.txt-cli) + timewarrior # timewarrior tracking status (https://timewarrior.net/) + taskwarrior # taskwarrior task count (https://taskwarrior.org/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # =========================[ Line #2 ]========================= + newline + # ip # ip address and bandwidth usage for a specified network interface + # public_ip # public IP address + # proxy # system-wide http/https/ftp proxy + # battery # internal battery + # wifi # wifi speed + # example # example user-defined segment (see prompt_example function below) + ) + + # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you. + typeset -g POWERLEVEL9K_MODE=nerdfont-v3 + # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid + # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added. + typeset -g POWERLEVEL9K_ICON_PADDING=none + + # Basic style options that define the overall look of your prompt. You probably don't want to + # change them. + typeset -g POWERLEVEL9K_BACKGROUND= # transparent background + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol + + # When set to true, icons appear before content on both sides of the prompt. When set + # to false, icons go after content. If empty or not set, icons go before content in the left + # prompt and after content in the right prompt. + # + # You can also override it for a specific segment: + # + # POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false + # + # Or for a specific segment in specific state: + # + # POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false + typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%244F╭─' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%244F├─' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%244F╰─' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX= + + # The left end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL=' ' + # The right end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + # Ruler, a.k.a. the horizontal line before each prompt. If you set it to true, you'll + # probably want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false above and + # POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' below. + typeset -g POWERLEVEL9K_SHOW_RULER=false + typeset -g POWERLEVEL9K_RULER_CHAR='─' # reasonable alternative: '·' + typeset -g POWERLEVEL9K_RULER_FOREGROUND=244 + + # Filler between left and right prompt on the first prompt line. You can set it to '·' or '─' + # to make it easier to see the alignment between left and right prompt and to separate prompt + # from command output. It serves the same purpose as ruler (see above) without increasing + # the number of prompt lines. You'll probably want to set POWERLEVEL9K_SHOW_RULER=false + # if using this. You might also like POWERLEVEL9K_PROMPT_ADD_NEWLINE=false for more compact + # prompt. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=244 + # Add a space between the end of left prompt and the filler. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=' ' + # Add a space between the filler and the start of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=' ' + # Start filler from the edge of the screen if there are no left segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' + # End filler on the edge of the screen if there are no right segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' + fi + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND= + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 + # Default prompt symbol. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯' + # Prompt symbol in command vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮' + # Prompt symbol in visual vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' + # Prompt symbol in overwrite vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶' + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true + # No line terminator if prompt_char is the last segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='' + # No line introducer if prompt_char is the first segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= + + ##################################[ dir: current directory ]################################## + # Default current directory color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=31 + # If directory is too long, shorten some of its segments to the shortest possible unique + # prefix. The shortened directory can be tab-completed to the original. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique + # Replace removed segment suffixes with this symbol. + typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= + # Color of the shortened directory segments. + typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=103 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=39 + # Display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true + # Don't shorten directories that contain any of these files. They are anchors. + local anchor_files=( + .bzr + .citc + .git + .hg + .node-version + .python-version + .go-version + .ruby-version + .lua-version + .java-version + .perl-version + .php-version + .tool-versions + .mise.toml + .shorten_folder_marker + .svn + .terraform + CVS + Cargo.toml + composer.json + go.mod + package.json + stack.yaml + ) + typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" + # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains + # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is + # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first) + # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers + # and other directories don't. + # + # Optionally, "first" and "last" can be followed by ":" where is an integer. + # This moves the truncation point to the right (positive offset) or to the left (negative offset) + # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0" + # respectively. + typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false + # Don't shorten this many last directory segments. They are anchors. + typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 + # Shorten directory if it's longer than this even if there is space for it. The value can + # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, + # directory will be shortened only when prompt doesn't fit or when other parameters demand it + # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). + # If set to `0`, directory will always be shortened to its minimum length. + typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this + # many columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least + # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 + # If set to true, embed a hyperlink into the directory. Useful for quickly + # opening a directory in the file manager simply by clicking the link. + # Can also be handy when the directory is shortened, as it allows you to see + # the full directory that was used in previous commands. + typeset -g POWERLEVEL9K_DIR_HYPERLINK=false + + # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON + # and POWERLEVEL9K_DIR_CLASSES below. + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 + + # The default icon shown next to non-writable and non-existent directories when + # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3. + # typeset -g POWERLEVEL9K_LOCK_ICON='⭐' + + # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different + # directories. It must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory ($PWD) is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. An empty string. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. + # + # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories + # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=( + # '~/work(|/*)' WORK '' + # '~(|/*)' HOME '' + # '*' DEFAULT '') + # + # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one + # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or + # WORK_NON_EXISTENT. + # + # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an + # option to define custom colors and icons for different directory classes. + # + # # Styling for WORK. + # typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=39 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=39 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=39 + # + # If a styling parameter isn't explicitly defined for some class, it falls back to the classless + # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls + # back to POWERLEVEL9K_DIR_FOREGROUND. + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=() + + # Custom prefix. + # typeset -g POWERLEVEL9K_DIR_PREFIX='%fin ' + + #####################################[ vcs: git status ]###################################### + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 ' + + # Untracked files icon. It's really a question mark, your font isn't broken. + # Change the value of this parameter to show a different icon. + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' + + # Formatter for Git status. + # + # Example output: master wip ⇣42⇡42 *42 merge ~42 +42 !42 ?42. + # + # You can edit the function to customize how Git status looks. + # + # VCS_STATUS_* parameters are set by gitstatus plugin. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + function my_git_formatter() { + emulate -L zsh + + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from + # gitstatus plugin). VCS_STATUS_* parameters are not available in this case. + typeset -g my_git_format=$P9K_CONTENT + return + fi + + if (( $1 )); then + # Styling for up-to-date Git status. + local meta='%f' # default foreground + local clean='%76F' # green foreground + local modified='%178F' # yellow foreground + local untracked='%39F' # blue foreground + local conflicted='%196F' # red foreground + else + # Styling for incomplete and stale Git status. + local meta='%244F' # grey foreground + local clean='%244F' # grey foreground + local modified='%244F' # grey foreground + local untracked='%244F' # grey foreground + local conflicted='%244F' # grey foreground + fi + + local res + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=${(V)VCS_STATUS_LOCAL_BRANCH} + # If local branch name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show local branch name in full without truncation, delete the next line. + (( $#branch > 32 )) && branch[13,-13]="…" # <-- this line + res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" + fi + + if [[ -n $VCS_STATUS_TAG + # Show tag only if not on a branch. + # Tip: To always show tag, delete the next line. + && -z $VCS_STATUS_LOCAL_BRANCH # <-- this line + ]]; then + local tag=${(V)VCS_STATUS_TAG} + # If tag name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show tag name in full without truncation, delete the next line. + (( $#tag > 32 )) && tag[13,-13]="…" # <-- this line + res+="${meta}#${clean}${tag//\%/%%}" + fi + + # Display the current Git commit if there is no branch and no tag. + # Tip: To always display the current Git commit, delete the next line. + [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line + res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" + + # Show tracking branch name if it differs from local branch. + if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then + res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + + # Display "wip" if the latest commit's summary contains "wip" or "WIP". + if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then + res+=" ${modified}wip" + fi + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # ⇣42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}" + # ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42. + (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # ⇠42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " + # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. + # Remove the next line if you don't want to see untracked files at all. + (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" + # "─" if the number of unstaged files is unknown. This can happen due to + # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower + # than the number of files in the Git index, or due to bash.showDirtyState being set to false + # in the repository config. The number of staged and untracked files may also be unknown + # in this case. + (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}─" + + typeset -g my_git_format=$res + } + functions -M my_git_formatter 2>/dev/null + + # Don't count the number of unstaged, untracked and conflicted files in Git repositories with + # more than this many files in the index. Negative value means infinity. + # + # If you are working in Git repositories with tens of millions of files and seeing performance + # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output + # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's + # config: `git config bash.showDirtyState false`. + typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 + + # Don't show Git status in prompt for repositories whose workdir matches this pattern. + # For example, if set to '~', the Git repository at $HOME/.git will be ignored. + # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'. + typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' + + # Disable the default Git status formatting. + typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true + # Install our own Git status formatter. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}' + typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Icon color. + typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=76 + typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=244 + # Custom icon. + # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + typeset -g POWERLEVEL9K_VCS_PREFIX='%fon ' + + # Show status of repositories of these types. You can add svn and/or hg if you are + # using them. If you do, your prompt may become slow even when your current directory + # isn't in an svn or hg repository. + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + # These settings are used for repositories other than Git or when gitstatusd fails and + # Powerlevel10k has to fall back to using vcs_info. + typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=178 + + ##########################[ status: exit code of the last command ]########################### + # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and + # style them independently from the regular OK and ERROR state. + typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true + + # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as + # it will signify success by turning green. + typeset -g POWERLEVEL9K_STATUS_OK=false + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔' + + # Status when some part of a pipe command fails but the overall exit status is zero. It may look + # like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔' + + # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as + # it will signify error by turning red. + typeset -g POWERLEVEL9K_STATUS_ERROR=false + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=160 + # Use terse signal names: "INT" instead of "SIGINT(2)". + typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='✘' + + # Status when some part of a pipe command fails and the overall exit status is also non-zero. + # It may look like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='✘' + + ###################[ command_execution_time: duration of the last command ]################### + # Show duration of the last command if takes at least this many seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 + # Show this many fractional digits. Zero means round to seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=101 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Custom icon. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='%ftook ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=70 + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]############### + # Default asdf color. Only used to display tools for which there is no color override (see below). + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=66 + + # There are four parameters that can be used to hide asdf tools. Each parameter describes + # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at + # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to + # hide a tool, it gets shown. + # + # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and + # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands: + # + # asdf local python 3.8.1 + # asdf global python 3.8.1 + # + # After running both commands the current python version is 3.8.1 and its source is "local" as + # it takes precedence over "global". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false, + # it'll hide python version in this case because 3.8.1 is the same as the global version. + # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't + # contain "local". + + # Hide tool versions that don't come from one of these sources. + # + # Available sources: + # + # - shell `asdf current` says "set by ASDF_${TOOL}_VERSION environment variable" + # - local `asdf current` says "set by /some/not/home/directory/file" + # - global `asdf current` says "set by /home/username/file" + # + # Note: If this parameter is set to (shell local global), it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES. + typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global) + + # If set to false, hide tool versions that are the same as global. + # + # Note: The name of this parameter doesn't reflect its meaning at all. + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW. + typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false + + # If set to false, hide tool versions that are equal to "system". + # + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM. + typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true + + # If set to non-empty value, hide tools unless there is a file matching the specified file pattern + # in the current directory, or its parent directory, or its grandparent directory, and so on. + # + # Note: If this parameter is set to empty value, it won't hide tools. + # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB. + # + # Example: Hide nodejs version when there is no package.json and no *.js files in the current + # directory, in `..`, in `../..` and so on. + # + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json' + typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB= + + # Ruby version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=168 + # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Python version from asdf. + typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Go version from asdf. + typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Node.js version from asdf. + typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=70 + # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Rust version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar' + + # .NET Core version from asdf. + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=134 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=38 + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Lua version from asdf. + typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=32 + # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Java version from asdf. + typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=32 + # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Perl version from asdf. + typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=67 + # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Erlang version from asdf. + typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=125 + # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Elixir version from asdf. + typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=129 + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Postgres version from asdf. + typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=31 + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar' + + # PHP version from asdf. + typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=99 + # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Haskell version from asdf. + typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=172 + # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Julia version from asdf. + typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=70 + # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar' + + ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### + # NordVPN connection indicator color. + typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=39 + # Hide NordVPN connection indicator when not connected. + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= + # Custom icon. + # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## + # Ranger shell color. + typeset -g POWERLEVEL9K_RANGER_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_XPLR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########################[ vim_shell: vim shell indicator (:sh) ]########################### + # Vim shell indicator color. + typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=34 + # Custom icon. + # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### + # Midnight Commander shell color. + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## + # Nix shell color. + typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=74 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line. + # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=33 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=35 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=220 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=160 + # Thresholds for different levels of disk usage (percentage points). + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95 + # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent. + typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false + # Custom icon. + # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=66 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=96 + # Custom icon. + # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ load: CPU load ]###################################### + # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. + typeset -g POWERLEVEL9K_LOAD_WHICH=5 + # Load color when load is under 50%. + typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=66 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=178 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=166 + # Custom icon. + # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ + # Todo color. + typeset -g POWERLEVEL9K_TODO_FOREGROUND=110 + # Hide todo when the total number of tasks is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true + # Hide todo when the number of tasks after filtering is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false + + # Todo format. The following parameters are available within the expansion. + # + # - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. + # - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. + # + # These variables correspond to the last line of the output of `todo.sh -p ls`: + # + # TODO: 24 of 42 tasks shown + # + # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. + # + # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############ + # Timewarrior color. + typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=110 + # If the tracked task is longer than 24 characters, truncate and append "…". + # Tip: To always display tasks without truncation, delete the following parameter. + # Tip: To hide task names and display just the icon when time tracking is enabled, set the + # value of the following parameter to "". + typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+…}' + + # Custom icon. + # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]############## + # Taskwarrior color. + typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=74 + + # Taskwarrior segment format. The following parameters are available within the expansion. + # + # - P9K_TASKWARRIOR_PENDING_COUNT The number of pending tasks: `task +PENDING count`. + # - P9K_TASKWARRIOR_OVERDUE_COUNT The number of overdue tasks: `task +OVERDUE count`. + # + # Zero values are represented as empty parameters. + # + # The default format: + # + # '${P9K_TASKWARRIOR_OVERDUE_COUNT:+"!$P9K_TASKWARRIOR_OVERDUE_COUNT/"}$P9K_TASKWARRIOR_PENDING_COUNT' + # + # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=135 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=130 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=172 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=178 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=180 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=180 + + # Context format when running with privileges: bold user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%B%n@%m' + # Context format when in SSH without privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' + # Default context format (no privileges, no SSH): user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' + + # Don't show context unless running with privileges or in SSH. + # Tip: Remove the next line to always show context. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + typeset -g POWERLEVEL9K_CONTEXT_PREFIX='%fwith ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=37 + # Don't show Python version next to the virtual environment name. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + # If set to "false", won't show virtualenv if pyenv is already shown. + # If set to "if-different", won't show virtualenv if it's the same as pyenv. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false + # Separate environment name from Python version only with a space. + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ anaconda: conda environment (https://conda.io/) ]###################### + # Anaconda environment color. + typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=37 + + # Anaconda segment format. The following parameters are available within the expansion. + # + # - CONDA_PREFIX Absolute path to the active Anaconda/Miniconda environment. + # - CONDA_DEFAULT_ENV Name of the active Anaconda/Miniconda environment. + # - CONDA_PROMPT_MODIFIER Configurable prompt modifier (see below). + # - P9K_ANACONDA_PYTHON_VERSION Current python version (python --version). + # + # CONDA_PROMPT_MODIFIER can be configured with the following command: + # + # conda config --set env_prompt '({default_env}) ' + # + # The last argument is a Python format string that can use the following variables: + # + # - prefix The same as CONDA_PREFIX. + # - default_env The same as CONDA_DEFAULT_ENV. + # - name The last segment of CONDA_PREFIX. + # - stacked_env Comma-separated list of names in the environment stack. The first element is + # always the same as default_env. + # + # Note: '({default_env}) ' is the default value of env_prompt. + # + # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER + # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former + # is empty. + typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\(}% }%\)}:-${CONDA_PREFIX:t}}' + + # Custom icon. + # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ + # Pyenv color. + typeset -g POWERLEVEL9K_PYENV_FOREGROUND=37 + # Hide python version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) + # If set to false, hide python version if it's the same as global: + # $(pyenv version-name) == $(pyenv global). + typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide python version if it's equal to "system". + typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true + + # Pyenv segment format. The following parameters are available within the expansion. + # + # - P9K_CONTENT Current pyenv environment (pyenv version-name). + # - P9K_PYENV_PYTHON_VERSION Current python version (python --version). + # + # The default format has the following logic: + # + # 1. Display just "$P9K_CONTENT" if it's equal to "$P9K_PYENV_PYTHON_VERSION" or + # starts with "$P9K_PYENV_PYTHON_VERSION/". + # 2. Otherwise display "$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION". + typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_CONTENT:#$P9K_PYENV_PYTHON_VERSION(|/*)}:+ $P9K_PYENV_PYTHON_VERSION}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ + # Goenv color. + typeset -g POWERLEVEL9K_GOENV_FOREGROUND=37 + # Hide go version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global) + # If set to false, hide go version if it's the same as global: + # $(goenv version-name) == $(goenv global). + typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide go version if it's equal to "system". + typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## + # Nodenv color. + typeset -g POWERLEVEL9K_NODENV_FOREGROUND=70 + # Hide node version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global) + # If set to false, hide node version if it's the same as global: + # $(nodenv version-name) == $(nodenv global). + typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### + # Nvm color. + typeset -g POWERLEVEL9K_NVM_FOREGROUND=70 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ + # Nodeenv color. + typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=70 + # Don't show Node version next to the environment name. + typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false + # Separate environment name from Node version only with a space. + typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############################[ node_version: node.js version ]############################### + # Node version color. + typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=70 + # Show node version only when in a directory tree containing package.json. + typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ go_version: go version (https://golang.org) ]######################## + # Go version color. + typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=37 + # Show go version only when in a go project subdirectory. + typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ rust_version: rustc version (https://www.rust-lang.org) ]################## + # Rust version color. + typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=37 + # Show rust version only when in a rust project subdirectory. + typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ + # .NET version color. + typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=134 + # Show .NET version only when in a .NET project subdirectory. + typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ php_version: php version (https://www.php.net/) ]###################### + # PHP version color. + typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=99 + # Show PHP version only when in a PHP project subdirectory. + typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]########### + # Laravel version color. + typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=161 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=32 + # Show java version only when in a java project subdirectory. + typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true + # Show brief version. + typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false + # Custom icon. + # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]#### + # Package color. + typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=117 + # Package format. The following parameters are available within the expansion. + # + # - P9K_PACKAGE_NAME The value of `name` field in package.json. + # - P9K_PACKAGE_VERSION The value of `version` field in package.json. + # + # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\%/%%}@${P9K_PACKAGE_VERSION//\%/%%}' + # Custom icon. + # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=168 + # Hide ruby version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) + # If set to false, hide ruby version if it's the same as global: + # $(rbenv version-name) == $(rbenv global). + typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide ruby version if it's equal to "system". + typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=168 + # Don't show @gemset at the end. + typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false + # Don't show ruby- at the front. + typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ + # Fvm color. + typeset -g POWERLEVEL9K_FVM_FOREGROUND=38 + # Custom icon. + # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### + # Lua color. + typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=32 + # Hide lua version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) + # If set to false, hide lua version if it's the same as global: + # $(luaenv version-name) == $(luaenv global). + typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide lua version if it's equal to "system". + typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ + # Java color. + typeset -g POWERLEVEL9K_JENV_FOREGROUND=32 + # Hide java version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) + # If set to false, hide java version if it's the same as global: + # $(jenv version-name) == $(jenv global). + typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide java version if it's equal to "system". + typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ + # Perl color. + typeset -g POWERLEVEL9K_PLENV_FOREGROUND=67 + # Hide perl version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) + # If set to false, hide perl version if it's the same as global: + # $(plenv version-name) == $(plenv global). + typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide perl version if it's equal to "system". + typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=99 + # Hide php version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global) + # If set to false, hide php version if it's the same as global: + # $(phpenv version-name) == $(phpenv global). + typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide php version if it's equal to "system". + typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]####### + # Scala color. + typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=160 + # Hide scala version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global) + # If set to false, hide scala version if it's the same as global: + # $(scalaenv version-name) == $(scalaenv global). + typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide scala version if it's equal to "system". + typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]########### + # Haskell color. + typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=172 + # Hide haskell version if it doesn't come from one of these sources. + # + # shell: version is set by STACK_YAML + # local: version is set by stack.yaml up the directory tree + # global: version is set by the implicit global project (~/.stack/global-project/stack.yaml) + typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local) + # If set to false, hide haskell version if it's the same as in the implicit global project. + typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true + # Custom icon. + # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show kubecontext. + typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile|flux|fluxctl|stern|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # Kubernetes context classes for the purpose of using different colors, icons and expansions with + # different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current kubernetes context gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current kubernetes context is "deathray-testing/default", its class is TEST + # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=134 + # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext + # segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # Within the expansion the following parameters are always available: + # + # - P9K_CONTENT The content that would've been displayed if there was no content + # expansion defined. + # - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE + # in the output of `kubectl config get-contexts`. If there is no + # namespace, the parameter is set to "default". + # - P9K_KUBECONTEXT_USER The current context's user. Corresponds to column AUTHINFO in the + # output of `kubectl config get-contexts`. + # + # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), + # the following extra parameters are available: + # + # - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. + # - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. + # - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. + # + # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, + # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=gke + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + # + # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=eks + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= + # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' + # Append the current context's namespace if it's not "default". + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' + + # Custom prefix. + typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='%fat ' + + ################[ terraform: terraform workspace (https://www.terraform.io) ]################# + # Don't show terraform workspace if it's literally "default". + typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false + # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current terraform workspace gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current terraform workspace is "project_test", its class is TEST because "project_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=38 + # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ terraform_version: terraform version (https://www.terraform.io) ]############## + # Terraform version color. + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_FOREGROUND=38 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show aws. + typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|cdk|terraform|tofu|pulumi|terragrunt' + + # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current AWS profile gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current AWS profile is "company_test", its class is TEST + # because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=208 + # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # AWS segment format. The following parameters are available within the expansion. + # + # - P9K_AWS_PROFILE The name of the current AWS profile. + # - P9K_AWS_REGION The region associated with the current AWS profile. + typeset -g POWERLEVEL9K_AWS_CONTENT_EXPANSION='${P9K_AWS_PROFILE//\%/%%}${P9K_AWS_REGION:+ ${P9K_AWS_REGION//\%/%%}}' + + #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# + # AWS Elastic Beanstalk environment color. + typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=70 + # Custom icon. + # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## + # Show azure only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show azure. + typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|tofu|pulumi|terragrunt' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account is "company_test", its class is TEST because "company_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AZURE_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=32 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show gcloud. + typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=32 + + # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or + # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative + # enough. You can use the following parameters in the expansions. Each of them corresponds to the + # output of `gcloud` tool. + # + # Parameter | Source + # -------------------------|-------------------------------------------------------------------- + # P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)' + # P9K_GCLOUD_ACCOUNT | gcloud config get-value account + # P9K_GCLOUD_PROJECT_ID | gcloud config get-value project + # P9K_GCLOUD_PROJECT_NAME | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)' + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'. + # + # Obtaining project name requires sending a request to Google servers. This can take a long time + # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud + # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets + # set and gcloud prompt segment transitions to state COMPLETE. + # + # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL + # and COMPLETE. You can also hide gcloud in state PARTIAL by setting + # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and + # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty. + typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\%/%%}' + typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\%/%%}' + + # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name + # this often. Negative value disables periodic polling. In this mode project name is retrieved + # only when the current configuration, account or project id changes. + typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60 + + # Custom icon. + # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# + # Show google_app_cred only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show google_app_cred. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|tofu|pulumi|terragrunt' + + # Google application credentials classes for the purpose of using different colors, icons and + # expansions with different credentials. + # + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first + # element in each pair defines a pattern against which the current kubernetes context gets + # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion + # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION + # parameters, you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. + # The first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD + # '*:*test*:*' TEST + # '*' DEFAULT) + # + # If your current Google application credentials is "service_account deathray-testing x@y.com", + # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD # These values are examples that are unlikely + # '*:*test*:*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=32 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by + # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # You can use the following parameters in the expansion. Each of them corresponds to one of the + # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. + # + # Parameter | JSON key file field + # ---------------------------------+--------------- + # P9K_GOOGLE_APP_CRED_TYPE | type + # P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id + # P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' + + ##############[ toolbox: toolbox name (https://github.com/containers/toolbox) ]############### + # Toolbox color. + typeset -g POWERLEVEL9K_TOOLBOX_FOREGROUND=178 + # Don't display the name of the toolbox if it matches fedora-toolbox-*. + typeset -g POWERLEVEL9K_TOOLBOX_CONTENT_EXPANSION='${P9K_TOOLBOX_NAME:#fedora-toolbox-*}' + # Custom icon. + # typeset -g POWERLEVEL9K_TOOLBOX_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + typeset -g POWERLEVEL9K_TOOLBOX_PREFIX='%fin ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=94 + # Custom icon. + # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ########################[ vpn_ip: virtual private network indicator ]######################### + # VPN IP color. + typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=81 + # When on VPN, show just an icon without the IP address. + # Tip: To display the private IP address when on VPN, remove the next line. + typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= + # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN + # to see the name of the interface. + typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun)|tailscale)[0-9]*|(zt.*)' + # If set to true, show one segment per matching network interface. If set to false, show only + # one segment corresponding to the first matching network interface. + # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION. + typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false + # Custom icon. + # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ ip: ip address and bandwidth usage for a specified network interface ]########### + # IP color. + typeset -g POWERLEVEL9K_IP_FOREGROUND=38 + # The following parameters are accessible within the expansion: + # + # Parameter | Meaning + # ----------------------+------------------------------------------- + # P9K_IP_IP | IP address + # P9K_IP_INTERFACE | network interface + # P9K_IP_RX_BYTES | total number of bytes received + # P9K_IP_TX_BYTES | total number of bytes sent + # P9K_IP_RX_BYTES_DELTA | number of bytes received since last prompt + # P9K_IP_TX_BYTES_DELTA | number of bytes sent since last prompt + # P9K_IP_RX_RATE | receive rate (since last prompt) + # P9K_IP_TX_RATE | send rate (since last prompt) + typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='$P9K_IP_IP${P9K_IP_RX_RATE:+ %70F⇣$P9K_IP_RX_RATE}${P9K_IP_TX_RATE:+ %215F⇡$P9K_IP_TX_RATE}' + # Show information for the first network interface whose name matches this regular expression. + # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces. + typeset -g POWERLEVEL9K_IP_INTERFACE='[ew].*' + # Custom icon. + # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #########################[ proxy: system-wide http/https/ftp proxy ]########################## + # Proxy color. + typeset -g POWERLEVEL9K_PROXY_FOREGROUND=68 + # Custom icon. + # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ battery: internal battery ]################################# + # Show battery in red when it's below this level and not connected to power supply. + typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 + typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=160 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=70 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=178 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES='\UF008E\UF007A\UF007B\UF007C\UF007D\UF007E\UF007F\UF0080\UF0081\UF0082\UF0079' + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=68 + # Custom icon. + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS). + # + # # Wifi colors and icons for different signal strength levels (low to high). + # typeset -g my_wifi_fg=(68 68 68 68 68) # <-- change these values + # typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi') # <-- change these values + # + # typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps' + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}' + # + # The following parameters are accessible within the expansions: + # + # Parameter | Meaning + # ----------------------+--------------- + # P9K_WIFI_SSID | service set identifier, a.k.a. network name + # P9K_WIFI_LINK_AUTH | authentication protocol such as "wpa2-psk" or "none"; empty if unknown + # P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second + # P9K_WIFI_RSSI | signal strength in dBm, from -120 to 0 + # P9K_WIFI_NOISE | noise in dBm, from -120 to 0 + # P9K_WIFI_BARS | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE) + + ####################################[ time: current time ]#################################### + # Current time color. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=66 + # Format for the current time: 09:51:02. See `man 3 strftime`. + typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' + # If set to true, time will update when you hit enter. This way prompts for the past + # commands will contain the start times of their commands as opposed to the default + # behavior where they contain the end times of their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + # Custom icon. + # typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + typeset -g POWERLEVEL9K_TIME_PREFIX='%fat ' + + # Example of a user-defined prompt segment. Function prompt_example will be called on every + # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or + # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and orange text greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -f 208 -i '⭐' -t 'hello, %n' + } + + # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job + # is to generate the prompt segment for display in instant prompt. See + # https://github.com/romkatv/powerlevel10k#instant-prompt. + # + # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function + # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k + # will replay these calls without actually calling instant_prompt_*. It is imperative that + # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this + # rule is not observed, the content of instant prompt will be incorrect. + # + # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If + # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. + function instant_prompt_example() { + # Since prompt_example always makes the same `p10k segment` calls, we can call it from + # instant_prompt_example. This will give us the same `example` prompt segment in the instant + # and regular prompts. + prompt_example + } + + # User-defined prompt segments can be customized the same way as built-in segments. + # typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=208 + # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt + # when accepting a command line. Supported values: + # + # - off: Don't change prompt when accepting a command line. + # - always: Trim down prompt when accepting a command line. + # - same-dir: Trim down prompt when accepting a command line unless this is the first command + # typed after changing current working directory. + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always + + # Instant prompt mode. + # + # - off: Disable instant prompt. Choose this if you've tried instant prompt and found + # it incompatible with your zsh configuration files. + # - quiet: Enable instant prompt and don't print warnings when detecting console output + # during zsh initialization. Choose this if you've read and understood + # https://github.com/romkatv/powerlevel10k#instant-prompt. + # - verbose: Enable instant prompt and print a warning when detecting console output during + # zsh initialization. Choose this if you've never tried instant prompt, haven't + # seen the warning, or if you are unsure what this all means. + typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose + + # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. + # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload + # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you + # really need it. + typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true + + # If p10k is already loaded, reload configuration. + # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. + (( ! $+functions[p10k] )) || p10k reload +} + +# Tell `p10k configure` which file it should overwrite. +typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} + +(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} +'builtin' 'unset' 'p10k_config_opts' diff --git a/zsh/.config/zsh/.zshrc b/zsh/.config/zsh/.zshrc new file mode 100644 index 0000000..d1a483d --- /dev/null +++ b/zsh/.config/zsh/.zshrc @@ -0,0 +1,50 @@ +# ════════════════════════════════════════════════════════════ +# 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 + +. "$HOME/.local/share/../bin/env" diff --git a/zsh/.config/zsh/config/aliases.zsh b/zsh/.config/zsh/config/aliases.zsh new file mode 100644 index 0000000..fd7cd6a --- /dev/null +++ b/zsh/.config/zsh/config/aliases.zsh @@ -0,0 +1,177 @@ +# ════════════════════════════════════════════════════════════ +# 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' diff --git a/zsh/.config/zsh/config/completion.zsh b/zsh/.config/zsh/config/completion.zsh new file mode 100644 index 0000000..62e480b --- /dev/null +++ b/zsh/.config/zsh/config/completion.zsh @@ -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 diff --git a/zsh/.config/zsh/config/env.zsh b/zsh/.config/zsh/config/env.zsh new file mode 100644 index 0000000..09ccb86 --- /dev/null +++ b/zsh/.config/zsh/config/env.zsh @@ -0,0 +1,93 @@ +# ════════════════════════════════════════════════════════════ +# Environment Variables +# ════════════════════════════════════════════════════════════ + +# ═══ Основные пути ═════════════════════════════════════════ +export EDITOR="${EDITOR:-nano}" +export VISUAL="${VISUAL:-code --wait}" +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 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 diff --git a/zsh/.config/zsh/config/functions.zsh b/zsh/.config/zsh/config/functions.zsh new file mode 100644 index 0000000..ab62dd0 --- /dev/null +++ b/zsh/.config/zsh/config/functions.zsh @@ -0,0 +1,266 @@ +# ════════════════════════════════════════════════════════════ +# 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 " + 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 " + 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 +} diff --git a/zsh/.config/zsh/config/keybindings.zsh b/zsh/.config/zsh/config/keybindings.zsh new file mode 100644 index 0000000..df72c70 --- /dev/null +++ b/zsh/.config/zsh/config/keybindings.zsh @@ -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 diff --git a/zsh/.config/zsh/config/options.zsh b/zsh/.config/zsh/config/options.zsh new file mode 100644 index 0000000..4583a5a --- /dev/null +++ b/zsh/.config/zsh/config/options.zsh @@ -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 # Разрешить подстановки в промпте diff --git a/zsh/.config/zsh/config/plugins.zsh b/zsh/.config/zsh/config/plugins.zsh new file mode 100644 index 0000000..5f1a912 --- /dev/null +++ b/zsh/.config/zsh/config/plugins.zsh @@ -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 diff --git a/zsh/.config/zsh/config/prompt.zsh b/zsh/.config/zsh/config/prompt.zsh new file mode 100644 index 0000000..6acacf2 --- /dev/null +++ b/zsh/.config/zsh/config/prompt.zsh @@ -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 diff --git a/zsh/.zshenv b/zsh/.zshenv new file mode 100644 index 0000000..b5f8915 --- /dev/null +++ b/zsh/.zshenv @@ -0,0 +1 @@ +export ZDOTDIR="${HOME}/.config/zsh" \ No newline at end of file