From 6fd2b494838ad5068a026782533cbda5a44ec2cc Mon Sep 17 00:00:00 2001 From: linarphy Date: Mon, 21 Aug 2023 19:29:19 +0200 Subject: [PATCH] Update sway config & Add config - Add process manager with sway - Add oh-my-zsh config - add gtk config - Add env --- private_dot_config/alacritty/middle.toml | 7 + private_dot_config/alacritty/small.toml | 7 + .../environment.d/ssh_auth_socket.conf | 1 + .../oh-my-zsh/CODE_OF_CONDUCT.md | 76 + private_dot_config/oh-my-zsh/CONTRIBUTING.md | 245 + private_dot_config/oh-my-zsh/LICENSE.txt | 21 + private_dot_config/oh-my-zsh/README.md | 448 + private_dot_config/oh-my-zsh/SECURITY.md | 24 + .../oh-my-zsh/cache/completions/.keep | 0 .../oh-my-zsh/cache/dot_zsh-update | 1 + .../oh-my-zsh/cache/empty_dot_gitkeep | 0 private_dot_config/oh-my-zsh/cache/grep-alias | 3 + .../oh-my-zsh/custom/example.zsh | 12 + .../custom/plugins/example/example.plugin.zsh | 3 + .../oh-my-zsh/custom/themes/example.zsh-theme | 6 + .../custom/themes/powerlevel10k/LICENSE | 22 + .../custom/themes/powerlevel10k/Makefile | 14 + .../custom/themes/powerlevel10k/README.md | 2041 ++ .../powerlevel10k/config/p10k-classic.zsh | 1731 ++ .../config/p10k-lean-8colors.zsh | 1709 ++ .../themes/powerlevel10k/config/p10k-lean.zsh | 1705 ++ .../themes/powerlevel10k/config/p10k-pure.zsh | 193 + .../powerlevel10k/config/p10k-rainbow.zsh | 1825 ++ .../config/p10k-robbyrussell.zsh | 111 + .../custom/themes/powerlevel10k/dot_git/HEAD | 1 + .../powerlevel10k/dot_git/branches/.keep | 0 .../themes/powerlevel10k/dot_git/config | 11 + .../themes/powerlevel10k/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 + .../executable_fsmonitor-watchman.sample | 174 + .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 + .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 + .../hooks/executable_pre-rebase.sample | 169 + .../hooks/executable_pre-receive.sample | 24 + .../executable_prepare-commit-msg.sample | 42 + .../hooks/executable_push-to-checkout.sample | 78 + .../executable_sendemail-validate.sample | 77 + .../dot_git/hooks/executable_update.sample | 128 + .../custom/themes/powerlevel10k/dot_git/index | Bin 0 -> 7915 bytes .../themes/powerlevel10k/dot_git/info/exclude | 6 + .../themes/powerlevel10k/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../powerlevel10k/dot_git/objects/info/.keep | 0 ...53e4463205b03dd5f69e9c57dcdac65202ed00.idx | Bin 0 -> 3648 bytes ...3e4463205b03dd5f69e9c57dcdac65202ed00.pack | Bin 0 -> 354971 bytes ...53e4463205b03dd5f69e9c57dcdac65202ed00.rev | Bin 0 -> 420 bytes .../themes/powerlevel10k/dot_git/packed-refs | 2 + .../powerlevel10k/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../powerlevel10k/dot_git/refs/tags/.keep | 0 .../themes/powerlevel10k/dot_git/shallow | 1 + .../themes/powerlevel10k/dot_gitattributes | 5 + .../custom/themes/powerlevel10k/dot_gitignore | 1 + .../custom/themes/powerlevel10k/font.md | 161 + .../themes/powerlevel10k/gitstatus/LICENSE | 674 + .../themes/powerlevel10k/gitstatus/Makefile | 46 + .../themes/powerlevel10k/gitstatus/README.md | 530 + .../themes/powerlevel10k/gitstatus/build.info | 22 + .../gitstatus/deps/empty_dot_gitkeep | 0 .../powerlevel10k/gitstatus/docs/listdir.md | 330 + .../powerlevel10k/gitstatus/dot_clang-format | 4 + .../powerlevel10k/gitstatus/dot_gitattributes | 16 + .../powerlevel10k/gitstatus/dot_gitignore | 8 + .../dot_vscode/c_cpp_properties.json | 17 + .../gitstatus/dot_vscode/settings.json | 72 + .../powerlevel10k/gitstatus/executable_build | 656 + .../gitstatus/executable_install | 476 + .../powerlevel10k/gitstatus/executable_mbuild | 406 + .../gitstatus/gitstatus.plugin.sh | 474 + .../gitstatus/gitstatus.plugin.zsh | 908 + .../gitstatus/gitstatus.prompt.sh | 104 + .../gitstatus/gitstatus.prompt.zsh | 111 + .../powerlevel10k/gitstatus/install.info | 34 + .../readonly_gitstatus.plugin.zsh.zwc | Bin 0 -> 63216 bytes .../gitstatus/readonly_install.zwc | Bin 0 -> 37816 bytes .../powerlevel10k/gitstatus/src/algorithm.h | 37 + .../powerlevel10k/gitstatus/src/arena.cc | 118 + .../powerlevel10k/gitstatus/src/arena.h | 273 + .../themes/powerlevel10k/gitstatus/src/bits.h | 29 + .../powerlevel10k/gitstatus/src/check.h | 61 + .../gitstatus/src/check_dir_mtime.cc | 157 + .../gitstatus/src/check_dir_mtime.h | 31 + .../themes/powerlevel10k/gitstatus/src/dir.cc | 237 + .../themes/powerlevel10k/gitstatus/src/dir.h | 50 + .../themes/powerlevel10k/gitstatus/src/git.cc | 250 + .../themes/powerlevel10k/gitstatus/src/git.h | 115 + .../powerlevel10k/gitstatus/src/gitstatus.cc | 219 + .../powerlevel10k/gitstatus/src/index.cc | 456 + .../powerlevel10k/gitstatus/src/index.h | 84 + .../powerlevel10k/gitstatus/src/logging.cc | 139 + .../powerlevel10k/gitstatus/src/logging.h | 124 + .../powerlevel10k/gitstatus/src/options.cc | 362 + .../powerlevel10k/gitstatus/src/options.h | 78 + .../powerlevel10k/gitstatus/src/print.h | 101 + .../powerlevel10k/gitstatus/src/repo.cc | 503 + .../themes/powerlevel10k/gitstatus/src/repo.h | 126 + .../powerlevel10k/gitstatus/src/repo_cache.cc | 167 + .../powerlevel10k/gitstatus/src/repo_cache.h | 60 + .../powerlevel10k/gitstatus/src/request.cc | 130 + .../powerlevel10k/gitstatus/src/request.h | 50 + .../powerlevel10k/gitstatus/src/response.cc | 73 + .../powerlevel10k/gitstatus/src/response.h | 50 + .../powerlevel10k/gitstatus/src/scope_guard.h | 56 + .../gitstatus/src/serialization.h | 28 + .../themes/powerlevel10k/gitstatus/src/stat.h | 23 + .../powerlevel10k/gitstatus/src/string_cmp.h | 151 + .../powerlevel10k/gitstatus/src/string_view.h | 77 + .../powerlevel10k/gitstatus/src/strings.cc | 71 + .../powerlevel10k/gitstatus/src/strings.h | 37 + .../powerlevel10k/gitstatus/src/tag_db.cc | 332 + .../powerlevel10k/gitstatus/src/tag_db.h | 79 + .../gitstatus/src/thread_pool.cc | 87 + .../powerlevel10k/gitstatus/src/thread_pool.h | 74 + .../themes/powerlevel10k/gitstatus/src/time.h | 14 + .../powerlevel10k/gitstatus/src/timer.cc | 72 + .../powerlevel10k/gitstatus/src/timer.h | 36 + .../powerlevel10k/gitstatus/src/tribool.h | 27 + .../gitstatus/usrbin/empty_dot_gitkeep | 0 .../powerlevel10k/internal/configure.zsh | 84 + .../themes/powerlevel10k/internal/icons.zsh | 1057 + .../themes/powerlevel10k/internal/notes.md | 197 + .../themes/powerlevel10k/internal/p10k.zsh | 9409 +++++++ .../themes/powerlevel10k/internal/parser.zsh | 382 + .../internal/readonly_configure.zsh.zwc | Bin 0 -> 8504 bytes .../internal/readonly_icons.zsh.zwc | Bin 0 -> 58400 bytes .../internal/readonly_p10k.zsh.zwc | Bin 0 -> 812832 bytes .../internal/readonly_parser.zsh.zwc | Bin 0 -> 17536 bytes .../internal/readonly_worker.zsh.zwc | Bin 0 -> 17592 bytes .../themes/powerlevel10k/internal/wizard.zsh | 2248 ++ .../themes/powerlevel10k/internal/worker.zsh | 219 + .../themes/powerlevel10k/powerlevel10k.png | Bin 0 -> 62099 bytes .../powerlevel10k/powerlevel10k.zsh-theme | 83 + .../powerlevel10k/powerlevel9k.zsh-theme | 1 + .../powerlevel10k/prompt_powerlevel10k_setup | 1 + .../powerlevel10k/prompt_powerlevel9k_setup | 1 + .../readonly_powerlevel10k.zsh-theme.zwc | Bin 0 -> 8576 bytes .../readonly_powerlevel9k.zsh-theme.zwc | Bin 0 -> 576 bytes private_dot_config/oh-my-zsh/dot_editorconfig | 8 + .../oh-my-zsh/dot_git/FETCH_HEAD | 1 + private_dot_config/oh-my-zsh/dot_git/HEAD | 1 + .../oh-my-zsh/dot_git/ORIG_HEAD | 1 + .../oh-my-zsh/dot_git/branches/.keep | 0 private_dot_config/oh-my-zsh/dot_git/config | 23 + .../oh-my-zsh/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 + .../executable_fsmonitor-watchman.sample | 174 + .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 + .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 + .../hooks/executable_pre-rebase.sample | 169 + .../hooks/executable_pre-receive.sample | 24 + .../executable_prepare-commit-msg.sample | 42 + .../hooks/executable_push-to-checkout.sample | 78 + .../executable_sendemail-validate.sample | 77 + .../dot_git/hooks/executable_update.sample | 128 + private_dot_config/oh-my-zsh/dot_git/index | Bin 0 -> 105253 bytes .../oh-my-zsh/dot_git/info/exclude | 6 + .../oh-my-zsh/dot_git/logs/HEAD | 5 + .../oh-my-zsh/dot_git/logs/refs/heads/master | 2 + .../dot_git/logs/refs/remotes/origin/master | 2 + ...nly_71d62cbe3edd71847959a7e0f1065e47c0d978 | Bin 0 -> 648 bytes ...nly_c7887cfef4720e14428d6d8c0fb5f5a5fef3cd | Bin 0 -> 369 bytes ...nly_cf3e7ee0b44d465d85f8ca17e48327fc6dea0e | Bin 0 -> 98 bytes ...nly_71d61a99a52cb4196898c09967a71708c85b34 | 1 + ...nly_cc1e7f7ef3d011de4b628502df39949c981384 | Bin 0 -> 126 bytes ...nly_b68ea01d1a3e59e8cd72251167d746a80cb8c4 | Bin 0 -> 482 bytes ...nly_29a7800179bb7a245895fbfe6d28905e7ffb1b | Bin 0 -> 648 bytes ...nly_2aedf199d1e27b6bea8ab33212043b055b3715 | Bin 0 -> 586 bytes ...nly_954b4763c455070572c7df90fdbf6ef18e72d2 | 4 + ...nly_3c0b75d5c454073d731a52a86097c9128d733d | Bin 0 -> 8945 bytes ...nly_d38f59148cf3f1340eeeaa7190690d59e3d06f | Bin 0 -> 647 bytes ...nly_554e3aa94e58875d163b76e280afb4d0fb365b | Bin 0 -> 8946 bytes ...nly_1915d3293cc4657cec64202b9fd991b96b4ba2 | 2 + ...nly_ca5468484d4afd37b1ed74fc6eeb052065f090 | 2 + ...nly_6cd121aebf03d322266cdba948e75ea8957768 | Bin 0 -> 8945 bytes ...nly_9a9f005c0403788a97cb65d90c41e5b343034f | Bin 0 -> 605 bytes ...nly_219a94ab585fa699a0e842335a9f33dcbb613b | Bin 0 -> 869 bytes .../oh-my-zsh/dot_git/objects/info/.keep | 0 ...845062a36c32bd28a540c57e229846dca7e76e.idx | Bin 0 -> 38592 bytes ...45062a36c32bd28a540c57e229846dca7e76e.pack | Bin 0 -> 2091804 bytes ...845062a36c32bd28a540c57e229846dca7e76e.rev | Bin 0 -> 5412 bytes .../oh-my-zsh/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/master | 1 + .../oh-my-zsh/dot_git/refs/tags/.keep | 0 private_dot_config/oh-my-zsh/dot_git/shallow | 1 + .../oh-my-zsh/dot_github/CODEOWNERS | 13 + .../oh-my-zsh/dot_github/FUNDING.yml | 2 + .../dot_github/ISSUE_TEMPLATE/bug_report.yml | 68 + .../ISSUE_TEMPLATE/bug_report_omz.yml | 77 + .../dot_github/ISSUE_TEMPLATE/config.yml | 8 + .../ISSUE_TEMPLATE/feature_request.yml | 37 + .../dot_github/PULL_REQUEST_TEMPLATE.md | 20 + .../dot_github/workflows/installer.yml | 55 + .../workflows/installer/dot_gitignore | 1 + .../workflows/installer/dot_vercelignore | 2 + .../workflows/installer/vercel.json | 14 + .../oh-my-zsh/dot_github/workflows/main.yml | 42 + .../dot_github/workflows/project.yml | 140 + private_dot_config/oh-my-zsh/dot_gitignore | 12 + .../oh-my-zsh/dot_gitpod.Dockerfile | 5 + private_dot_config/oh-my-zsh/dot_gitpod.yml | 9 + private_dot_config/oh-my-zsh/dot_prettierrc | 4 + private_dot_config/oh-my-zsh/lib/bzr.zsh | 10 + private_dot_config/oh-my-zsh/lib/cli.zsh | 821 + .../oh-my-zsh/lib/clipboard.zsh | 107 + private_dot_config/oh-my-zsh/lib/compfix.zsh | 44 + .../oh-my-zsh/lib/completion.zsh | 78 + .../oh-my-zsh/lib/correction.zsh | 10 + .../oh-my-zsh/lib/diagnostics.zsh | 353 + .../oh-my-zsh/lib/directories.zsh | 40 + .../oh-my-zsh/lib/functions.zsh | 262 + private_dot_config/oh-my-zsh/lib/git.zsh | 282 + private_dot_config/oh-my-zsh/lib/grep.zsh | 41 + private_dot_config/oh-my-zsh/lib/history.zsh | 40 + .../oh-my-zsh/lib/key-bindings.zsh | 138 + private_dot_config/oh-my-zsh/lib/misc.zsh | 33 + private_dot_config/oh-my-zsh/lib/nvm.zsh | 6 + .../oh-my-zsh/lib/prompt_info_functions.zsh | 44 + private_dot_config/oh-my-zsh/lib/spectrum.zsh | 37 + .../oh-my-zsh/lib/termsupport.zsh | 163 + .../oh-my-zsh/lib/theme-and-appearance.zsh | 81 + private_dot_config/oh-my-zsh/lib/vcs_info.zsh | 53 + .../oh-my-zsh/log/empty_dot_gitkeep | 0 private_dot_config/oh-my-zsh/oh-my-zsh.sh | 229 + .../plugins/1password/1password.plugin.zsh | 9 + .../oh-my-zsh/plugins/1password/README.md | 40 + .../oh-my-zsh/plugins/1password/_opswd | 19 + .../oh-my-zsh/plugins/1password/opswd | 90 + .../oh-my-zsh/plugins/adb/README.md | 8 + private_dot_config/oh-my-zsh/plugins/adb/_adb | 67 + .../oh-my-zsh/plugins/ag/README.md | 13 + private_dot_config/oh-my-zsh/plugins/ag/_ag | 66 + .../oh-my-zsh/plugins/alias-finder/README.md | 46 + .../alias-finder/alias-finder.plugin.zsh | 47 + .../oh-my-zsh/plugins/aliases/README.md | 28 + .../plugins/aliases/aliases.plugin.zsh | 14 + .../oh-my-zsh/plugins/aliases/cheatsheet.py | 69 + .../oh-my-zsh/plugins/aliases/dot_gitignore | 1 + .../oh-my-zsh/plugins/aliases/termcolor.py | 168 + .../oh-my-zsh/plugins/ansible/README.md | 34 + .../plugins/ansible/ansible.plugin.zsh | 28 + .../oh-my-zsh/plugins/ant/README.md | 12 + private_dot_config/oh-my-zsh/plugins/ant/_ant | 22 + .../oh-my-zsh/plugins/ant/ant.plugin.zsh | 2 + .../plugins/apache2-macports/README.md | 21 + .../apache2-macports.plugin.zsh | 6 + .../oh-my-zsh/plugins/arcanist/README.md | 43 + .../plugins/arcanist/arcanist.plugin.zsh | 39 + .../oh-my-zsh/plugins/archlinux/README.md | 184 + .../plugins/archlinux/archlinux.plugin.zsh | 203 + .../oh-my-zsh/plugins/argocd/README.md | 20 + .../plugins/argocd/argocd.plugin.zsh | 14 + .../oh-my-zsh/plugins/asdf/README.md | 30 + .../oh-my-zsh/plugins/asdf/asdf.plugin.zsh | 27 + .../oh-my-zsh/plugins/autoenv/README.md | 20 + .../plugins/autoenv/autoenv.plugin.zsh | 80 + .../oh-my-zsh/plugins/autojump/README.md | 11 + .../plugins/autojump/autojump.plugin.zsh | 37 + .../oh-my-zsh/plugins/autopep8/README.md | 8 + .../oh-my-zsh/plugins/autopep8/_autopep8 | 32 + .../oh-my-zsh/plugins/aws/README.md | 91 + .../oh-my-zsh/plugins/aws/aws.plugin.zsh | 287 + .../oh-my-zsh/plugins/azure/README.md | 49 + .../oh-my-zsh/plugins/azure/azure.plugin.zsh | 60 + .../oh-my-zsh/plugins/battery/README.md | 29 + .../plugins/battery/battery.plugin.zsh | 262 + .../oh-my-zsh/plugins/bazel/README.md | 14 + .../oh-my-zsh/plugins/bazel/_bazel | 341 + .../oh-my-zsh/plugins/bbedit/README.md | 20 + .../plugins/bbedit/bbedit.plugin.zsh | 21 + .../oh-my-zsh/plugins/bedtools/README.md | 5 + .../oh-my-zsh/plugins/bedtools/_bedtools | 64 + .../oh-my-zsh/plugins/bgnotify/README.md | 54 + .../plugins/bgnotify/bgnotify.plugin.zsh | 106 + .../oh-my-zsh/plugins/bower/README.md | 17 + .../oh-my-zsh/plugins/bower/_bower | 58 + .../oh-my-zsh/plugins/bower/bower.plugin.zsh | 84 + .../oh-my-zsh/plugins/branch/README.md | 49 + .../plugins/branch/branch.plugin.zsh | 35 + .../oh-my-zsh/plugins/brew/README.md | 41 + .../oh-my-zsh/plugins/brew/brew.plugin.zsh | 56 + .../oh-my-zsh/plugins/bridgetown/README.md | 26 + .../plugins/bridgetown/bridgetown.plugin.zsh | 12 + .../oh-my-zsh/plugins/bundler/README.md | 74 + .../oh-my-zsh/plugins/bundler/_bundler | 105 + .../plugins/bundler/bundler.plugin.zsh | 127 + .../oh-my-zsh/plugins/cabal/README.md | 9 + .../oh-my-zsh/plugins/cabal/cabal.plugin.zsh | 93 + .../oh-my-zsh/plugins/cake/README.md | 15 + .../oh-my-zsh/plugins/cake/cake.plugin.zsh | 33 + .../oh-my-zsh/plugins/cakephp3/README.md | 16 + .../plugins/cakephp3/cakephp3.plugin.zsh | 38 + .../oh-my-zsh/plugins/capistrano/README.md | 14 + .../oh-my-zsh/plugins/capistrano/_capistrano | 49 + .../plugins/capistrano/capistrano.plugin.zsh | 11 + .../oh-my-zsh/plugins/cask/README.md | 15 + .../oh-my-zsh/plugins/cask/cask.plugin.zsh | 26 + .../oh-my-zsh/plugins/catimg/README.md | 23 + .../plugins/catimg/catimg.plugin.zsh | 17 + .../oh-my-zsh/plugins/catimg/catimg.sh | 88 + .../oh-my-zsh/plugins/catimg/colors.png | Bin 0 -> 353 bytes .../oh-my-zsh/plugins/celery/README.md | 9 + .../oh-my-zsh/plugins/celery/_celery | 129 + .../oh-my-zsh/plugins/charm/README.md | 9 + .../oh-my-zsh/plugins/charm/charm.plugin.zsh | 14 + .../oh-my-zsh/plugins/chruby/README.md | 21 + .../plugins/chruby/chruby.plugin.zsh | 94 + .../oh-my-zsh/plugins/chucknorris/README.md | 38 + .../chucknorris/chucknorris.plugin.zsh | 24 + .../plugins/chucknorris/dot_gitignore | 1 + .../plugins/chucknorris/fortunes/chucknorris | 568 + .../oh-my-zsh/plugins/cloudfoundry/README.md | 58 + .../cloudfoundry/cloudfoundry.plugin.zsh | 34 + .../oh-my-zsh/plugins/codeclimate/README.md | 8 + .../plugins/codeclimate/_codeclimate | 82 + .../oh-my-zsh/plugins/coffee/README.md | 31 + .../oh-my-zsh/plugins/coffee/_coffee | 81 + .../plugins/coffee/coffee.plugin.zsh | 16 + .../oh-my-zsh/plugins/colemak/README.md | 48 + .../oh-my-zsh/plugins/colemak/colemak-less | 6 + .../plugins/colemak/colemak.plugin.zsh | 38 + .../oh-my-zsh/plugins/colemak/dot_gitignore | 1 + .../plugins/colored-man-pages/README.md | 32 + .../colored-man-pages.plugin.zsh | 53 + .../colored-man-pages/executable_nroff | 12 + .../oh-my-zsh/plugins/colorize/README.md | 56 + .../plugins/colorize/colorize.plugin.zsh | 114 + .../plugins/command-not-found/README.md | 34 + .../command-not-found.plugin.zsh | 69 + .../plugins/common-aliases/README.md | 130 + .../common-aliases/common-aliases.plugin.zsh | 90 + .../oh-my-zsh/plugins/compleat/README.md | 9 + .../plugins/compleat/compleat.plugin.zsh | 20 + .../oh-my-zsh/plugins/composer/README.md | 35 + .../plugins/composer/composer.plugin.zsh | 76 + .../oh-my-zsh/plugins/copybuffer/README.md | 11 + .../plugins/copybuffer/copybuffer.plugin.zsh | 16 + .../oh-my-zsh/plugins/copyfile/README.md | 11 + .../plugins/copyfile/copyfile.plugin.zsh | 7 + .../oh-my-zsh/plugins/copypath/README.md | 15 + .../plugins/copypath/copypath.plugin.zsh | 15 + .../oh-my-zsh/plugins/cp/README.md | 32 + .../oh-my-zsh/plugins/cp/cp.plugin.zsh | 4 + .../oh-my-zsh/plugins/cpanm/README.md | 9 + .../oh-my-zsh/plugins/cpanm/_cpanm | 64 + .../oh-my-zsh/plugins/dash/README.md | 28 + .../oh-my-zsh/plugins/dash/dash.plugin.zsh | 84 + .../oh-my-zsh/plugins/dbt/README.md | 29 + .../oh-my-zsh/plugins/dbt/dbt.plugin.zsh | 23 + .../oh-my-zsh/plugins/debian/README.md | 87 + .../plugins/debian/debian.plugin.zsh | 227 + .../oh-my-zsh/plugins/deno/README.md | 20 + .../oh-my-zsh/plugins/deno/deno.plugin.zsh | 28 + .../oh-my-zsh/plugins/dircycle/README.md | 78 + .../plugins/dircycle/dircycle.plugin.zsh | 54 + .../oh-my-zsh/plugins/direnv/README.md | 15 + .../plugins/direnv/direnv.plugin.zsh | 16 + .../oh-my-zsh/plugins/dirhistory/README.md | 62 + .../plugins/dirhistory/dirhistory.plugin.zsh | 225 + .../oh-my-zsh/plugins/dirpersist/README.md | 10 + .../plugins/dirpersist/dirpersist.plugin.zsh | 21 + .../oh-my-zsh/plugins/dnf/README.md | 29 + .../oh-my-zsh/plugins/dnf/dnf.plugin.zsh | 15 + .../oh-my-zsh/plugins/dnote/README.md | 51 + .../oh-my-zsh/plugins/dnote/_dnote | 39 + .../plugins/docker-compose/README.md | 33 + .../plugins/docker-compose/_docker-compose | 421 + .../docker-compose/docker-compose.plugin.zsh | 23 + .../plugins/docker-machine/README.md | 19 + .../plugins/docker-machine/_docker-machine | 359 + .../docker-machine/docker-machine.plugin.zsh | 33 + .../oh-my-zsh/plugins/docker/README.md | 78 + .../plugins/docker/completions/_docker | 3126 +++ .../plugins/docker/docker.plugin.zsh | 62 + .../oh-my-zsh/plugins/doctl/README.md | 9 + .../oh-my-zsh/plugins/doctl/doctl.plugin.zsh | 17 + .../oh-my-zsh/plugins/dotenv/README.md | 92 + .../plugins/dotenv/dotenv.plugin.zsh | 67 + .../oh-my-zsh/plugins/dotnet/README.md | 25 + .../plugins/dotnet/dotnet.plugin.zsh | 34 + .../oh-my-zsh/plugins/droplr/README.md | 19 + .../plugins/droplr/droplr.plugin.zsh | 15 + .../oh-my-zsh/plugins/drush/README.md | 66 + .../oh-my-zsh/plugins/drush/drush.complete.sh | 50 + .../oh-my-zsh/plugins/drush/drush.plugin.zsh | 107 + .../oh-my-zsh/plugins/eecms/README.md | 11 + .../oh-my-zsh/plugins/eecms/eecms.plugin.zsh | 20 + .../oh-my-zsh/plugins/emacs/README.md | 30 + .../oh-my-zsh/plugins/emacs/emacs.plugin.zsh | 68 + .../plugins/emacs/executable_emacsclient.sh | 38 + .../oh-my-zsh/plugins/ember-cli/README.md | 33 + .../oh-my-zsh/plugins/ember-cli/_ember-cli | 189 + .../plugins/ember-cli/ember-cli.plugin.zsh | 12 + .../oh-my-zsh/plugins/emoji-clock/README.md | 14 + .../emoji-clock/emoji-clock.plugin.zsh | 33 + .../oh-my-zsh/plugins/emoji/README.md | 127 + .../plugins/emoji/emoji-char-definitions.zsh | 7274 ++++++ .../oh-my-zsh/plugins/emoji/emoji-data.txt | 4122 +++ .../oh-my-zsh/plugins/emoji/emoji.plugin.zsh | 110 + .../oh-my-zsh/plugins/emoji/gemoji_db.json | 21538 ++++++++++++++++ .../oh-my-zsh/plugins/emoji/update_emoji.py | 213 + .../oh-my-zsh/plugins/emotty/README.md | 39 + .../plugins/emotty/emotty.plugin.zsh | 55 + .../plugins/emotty/emotty_emoji_set.zsh | 24 + .../plugins/emotty/emotty_floral_set.zsh | 18 + .../plugins/emotty/emotty_love_set.zsh | 34 + .../plugins/emotty/emotty_nature_set.zsh | 58 + .../plugins/emotty/emotty_stellar_set.zsh | 25 + .../plugins/emotty/emotty_zodiac_set.zsh | 29 + .../oh-my-zsh/plugins/encode64/README.md | 73 + .../plugins/encode64/encode64.plugin.zsh | 27 + .../oh-my-zsh/plugins/extract/README.md | 65 + .../oh-my-zsh/plugins/extract/_extract | 7 + .../plugins/extract/extract.plugin.zsh | 132 + .../oh-my-zsh/plugins/fabric/README.md | 9 + .../oh-my-zsh/plugins/fabric/_fab | 69 + .../plugins/fabric/empty_fabric.plugin.zsh | 0 .../oh-my-zsh/plugins/fancy-ctrl-z/README.md | 14 + .../fancy-ctrl-z/fancy-ctrl-z.plugin.zsh | 12 + .../oh-my-zsh/plugins/fasd/README.md | 21 + .../oh-my-zsh/plugins/fasd/fasd.plugin.zsh | 16 + .../oh-my-zsh/plugins/fastfile/README.md | 85 + .../plugins/fastfile/fastfile.plugin.zsh | 128 + .../oh-my-zsh/plugins/fbterm/README.md | 10 + .../plugins/fbterm/fbterm.plugin.zsh | 7 + .../oh-my-zsh/plugins/fd/README.md | 9 + private_dot_config/oh-my-zsh/plugins/fd/_fd | 273 + .../oh-my-zsh/plugins/fig/README.md | 9 + .../oh-my-zsh/plugins/fig/fig.plugin.zsh | 13 + .../oh-my-zsh/plugins/firewalld/README.md | 22 + .../plugins/firewalld/firewalld.plugin.zsh | 17 + .../oh-my-zsh/plugins/flutter/README.md | 28 + .../plugins/flutter/flutter.plugin.zsh | 29 + .../oh-my-zsh/plugins/fluxcd/README.md | 9 + .../plugins/fluxcd/fluxcd.plugin.zsh | 14 + .../oh-my-zsh/plugins/fnm/README.md | 9 + .../oh-my-zsh/plugins/fnm/fnm.plugin.zsh | 13 + .../oh-my-zsh/plugins/forklift/README.md | 23 + .../plugins/forklift/forklift.plugin.zsh | 122 + .../oh-my-zsh/plugins/fossil/README.md | 7 + .../oh-my-zsh/plugins/fossil/_fossil | 32 + .../plugins/fossil/fossil.plugin.zsh | 56 + .../plugins/frontend-search/README.md | 75 + .../plugins/frontend-search/_frontend | 161 + .../frontend-search.plugin.zsh | 111 + .../oh-my-zsh/plugins/fzf/README.md | 52 + .../oh-my-zsh/plugins/fzf/fzf.plugin.zsh | 237 + .../oh-my-zsh/plugins/gas/README.md | 10 + private_dot_config/oh-my-zsh/plugins/gas/_gas | 39 + .../oh-my-zsh/plugins/gatsby/README.md | 7 + .../oh-my-zsh/plugins/gatsby/_gatsby | 24 + .../oh-my-zsh/plugins/gcloud/README.md | 24 + .../plugins/gcloud/gcloud.plugin.zsh | 52 + .../oh-my-zsh/plugins/geeknote/README.md | 10 + .../oh-my-zsh/plugins/geeknote/_geeknote | 157 + .../plugins/geeknote/geeknote.plugin.zsh | 2 + .../oh-my-zsh/plugins/gem/README.md | 17 + private_dot_config/oh-my-zsh/plugins/gem/_gem | 72 + .../oh-my-zsh/plugins/gem/gem.plugin.zsh | 7 + .../oh-my-zsh/plugins/genpass/README.md | 66 + .../plugins/genpass/executable_genpass-apple | 79 + .../plugins/genpass/executable_genpass-monkey | 32 + .../plugins/genpass/executable_genpass-xkcd | 68 + .../plugins/genpass/genpass.plugin.zsh | 1 + .../oh-my-zsh/plugins/gh/README.md | 23 + .../oh-my-zsh/plugins/gh/gh.plugin.zsh | 14 + .../plugins/git-auto-fetch/README.md | 50 + .../git-auto-fetch/git-auto-fetch.plugin.zsh | 65 + .../plugins/git-escape-magic/README.md | 16 + .../plugins/git-escape-magic/git-escape-magic | 135 + .../git-escape-magic.plugin.zsh | 9 + .../oh-my-zsh/plugins/git-extras/README.md | 17 + .../plugins/git-extras/git-extras.plugin.zsh | 418 + .../oh-my-zsh/plugins/git-flow-avh/README.md | 19 + .../git-flow-avh/git-flow-avh.plugin.zsh | 526 + .../oh-my-zsh/plugins/git-flow/README.md | 40 + .../oh-my-zsh/plugins/git-flow/_git-flow | 327 + .../plugins/git-flow/git-flow.plugin.zsh | 32 + .../oh-my-zsh/plugins/git-hubflow/README.md | 24 + .../git-hubflow/git-hubflow.plugin.zsh | 333 + .../oh-my-zsh/plugins/git-lfs/README.md | 24 + .../plugins/git-lfs/git-lfs.plugin.zsh | 17 + .../oh-my-zsh/plugins/git-prompt/README.md | 68 + .../plugins/git-prompt/git-prompt.plugin.zsh | 113 + .../oh-my-zsh/plugins/git-prompt/gitstatus.py | 103 + .../oh-my-zsh/plugins/git/README.md | 263 + .../oh-my-zsh/plugins/git/git.plugin.zsh | 364 + .../oh-my-zsh/plugins/gitfast/README.md | 15 + .../oh-my-zsh/plugins/gitfast/_git | 286 + .../plugins/gitfast/executable_update | 8 + .../plugins/gitfast/git-completion.bash | 3677 +++ .../oh-my-zsh/plugins/gitfast/git-prompt.sh | 589 + .../plugins/gitfast/gitfast.plugin.zsh | 11 + .../oh-my-zsh/plugins/github/README.md | 45 + .../oh-my-zsh/plugins/github/_hub | 174 + .../plugins/github/github.plugin.zsh | 77 + .../oh-my-zsh/plugins/gitignore/README.md | 17 + .../plugins/gitignore/gitignore.plugin.zsh | 12 + .../oh-my-zsh/plugins/glassfish/README.md | 9 + .../oh-my-zsh/plugins/glassfish/_asadmin | 1150 + .../glassfish/empty_glassfish.plugin.zsh | 0 .../oh-my-zsh/plugins/globalias/README.md | 79 + .../plugins/globalias/globalias.plugin.zsh | 23 + .../oh-my-zsh/plugins/gnu-utils/README.md | 38 + .../plugins/gnu-utils/gnu-utils.plugin.zsh | 74 + .../oh-my-zsh/plugins/golang/README.md | 40 + .../oh-my-zsh/plugins/golang/_golang | 249 + .../plugins/golang/golang.plugin.zsh | 37 + .../plugins/golang/templates/empty_search.txt | 0 .../plugins/golang/templates/package.txt | 29 + .../oh-my-zsh/plugins/gpg-agent/README.md | 9 + .../plugins/gpg-agent/gpg-agent.plugin.zsh | 17 + .../oh-my-zsh/plugins/gradle/README.md | 30 + .../oh-my-zsh/plugins/gradle/_gradle | 432 + .../plugins/gradle/gradle.plugin.zsh | 26 + .../oh-my-zsh/plugins/grails/README.md | 16 + .../plugins/grails/grails.plugin.zsh | 60 + .../oh-my-zsh/plugins/grc/README.md | 15 + .../oh-my-zsh/plugins/grc/grc.plugin.zsh | 17 + .../oh-my-zsh/plugins/grunt/README.md | 37 + .../oh-my-zsh/plugins/grunt/grunt.plugin.zsh | 255 + .../oh-my-zsh/plugins/gulp/README.md | 8 + .../oh-my-zsh/plugins/gulp/gulp.plugin.zsh | 29 + .../oh-my-zsh/plugins/hanami/README.md | 45 + .../plugins/hanami/hanami.plugin.zsh | 19 + .../oh-my-zsh/plugins/hasura/README.md | 9 + .../plugins/hasura/hasura.plugin.zsh | 13 + .../oh-my-zsh/plugins/helm/README.md | 18 + .../oh-my-zsh/plugins/helm/helm.plugin.zsh | 18 + .../oh-my-zsh/plugins/heroku-alias/README.md | 127 + .../plugins/heroku-alias/heroku.alias.sh | 92 + .../oh-my-zsh/plugins/heroku/README.md | 9 + .../plugins/heroku/heroku.plugin.zsh | 9 + .../history-substring-search/README.md | 198 + .../executable_update-from-upstream.zsh | 129 + .../history-substring-search.plugin.zsh | 19 + .../history-substring-search.zsh | 759 + .../oh-my-zsh/plugins/history/README.md | 17 + .../plugins/history/history.plugin.zsh | 3 + .../oh-my-zsh/plugins/hitchhiker/README.md | 44 + .../plugins/hitchhiker/dot_gitignore | 1 + .../plugins/hitchhiker/fortunes/hitchhiker | 275 + .../plugins/hitchhiker/hitchhiker.plugin.zsh | 28 + .../oh-my-zsh/plugins/hitokoto/README.md | 15 + .../plugins/hitokoto/hitokoto.plugin.zsh | 18 + .../oh-my-zsh/plugins/homestead/README.md | 9 + .../plugins/homestead/homestead.plugin.zsh | 10 + .../oh-my-zsh/plugins/httpie/README.md | 14 + .../oh-my-zsh/plugins/httpie/_httpie | 181 + .../oh-my-zsh/plugins/invoke/README.md | 10 + .../plugins/invoke/invoke.plugin.zsh | 5 + .../oh-my-zsh/plugins/ionic/README.md | 30 + .../oh-my-zsh/plugins/ionic/ionic.plugin.zsh | 15 + .../oh-my-zsh/plugins/ipfs/LICENSE | 22 + .../oh-my-zsh/plugins/ipfs/README.md | 17 + .../oh-my-zsh/plugins/ipfs/_ipfs | 791 + .../oh-my-zsh/plugins/isodate/README.md | 22 + .../plugins/isodate/isodate.plugin.zsh | 7 + .../oh-my-zsh/plugins/istioctl/README.md | 9 + .../plugins/istioctl/istioctl.plugin.zsh | 4 + .../oh-my-zsh/plugins/iterm2/README.md | 41 + .../plugins/iterm2/executable_update | 4 + .../plugins/iterm2/iterm2.plugin.zsh | 79 + .../iterm2/iterm2_shell_integration.zsh | 178 + .../oh-my-zsh/plugins/jake-node/README.md | 9 + .../plugins/jake-node/jake-node.plugin.zsh | 14 + .../oh-my-zsh/plugins/jenv/README.md | 27 + .../oh-my-zsh/plugins/jenv/jenv.plugin.zsh | 36 + .../oh-my-zsh/plugins/jfrog/README.md | 11 + .../oh-my-zsh/plugins/jfrog/jfrog.plugin.zsh | 11 + .../oh-my-zsh/plugins/jhbuild/README.md | 34 + .../plugins/jhbuild/jhbuild.plugin.zsh | 32 + .../oh-my-zsh/plugins/jira/README.md | 81 + .../oh-my-zsh/plugins/jira/_jira | 25 + .../oh-my-zsh/plugins/jira/jira.plugin.zsh | 155 + .../oh-my-zsh/plugins/jruby/README.md | 21 + .../oh-my-zsh/plugins/jruby/jruby.plugin.zsh | 4 + .../oh-my-zsh/plugins/jsontools/README.md | 79 + .../plugins/jsontools/jsontools.plugin.zsh | 113 + .../oh-my-zsh/plugins/juju/README.md | 132 + .../oh-my-zsh/plugins/juju/juju.plugin.zsh | 202 + .../oh-my-zsh/plugins/jump/README.md | 31 + .../oh-my-zsh/plugins/jump/jump.plugin.zsh | 58 + .../oh-my-zsh/plugins/kate/README.md | 20 + .../oh-my-zsh/plugins/kate/kate.plugin.zsh | 9 + .../oh-my-zsh/plugins/keychain/README.md | 45 + .../plugins/keychain/keychain.plugin.zsh | 32 + .../oh-my-zsh/plugins/kitchen/README.md | 9 + .../oh-my-zsh/plugins/kitchen/_kitchen | 85 + .../oh-my-zsh/plugins/kn/README.md | 17 + .../oh-my-zsh/plugins/kn/kn.plugin.zsh | 8 + .../oh-my-zsh/plugins/knife/README.md | 25 + .../oh-my-zsh/plugins/knife/_knife | 257 + .../oh-my-zsh/plugins/knife_ssh/README.md | 14 + .../plugins/knife_ssh/knife_ssh.plugin.zsh | 18 + .../oh-my-zsh/plugins/kops/README.md | 12 + .../oh-my-zsh/plugins/kops/kops.plugin.zsh | 3 + .../oh-my-zsh/plugins/kube-ps1/README.md | 241 + .../plugins/kube-ps1/kube-ps1.plugin.zsh | 386 + .../oh-my-zsh/plugins/kubectl/README.md | 137 + .../plugins/kubectl/kubectl.plugin.zsh | 191 + .../oh-my-zsh/plugins/kubectx/README.md | 26 + .../plugins/kubectx/kubectx.plugin.zsh | 13 + .../oh-my-zsh/plugins/kubectx/prod.png | Bin 0 -> 3834 bytes .../oh-my-zsh/plugins/kubectx/stage.png | Bin 0 -> 3829 bytes .../oh-my-zsh/plugins/lando/LICENSE | 21 + .../oh-my-zsh/plugins/lando/README.md | 38 + .../oh-my-zsh/plugins/lando/lando.plugin.zsh | 41 + .../oh-my-zsh/plugins/laravel/README.md | 57 + .../oh-my-zsh/plugins/laravel/_artisan | 40 + .../plugins/laravel/laravel.plugin.zsh | 41 + .../oh-my-zsh/plugins/laravel4/README.md | 18 + .../plugins/laravel4/laravel4.plugin.zsh | 20 + .../oh-my-zsh/plugins/laravel5/README.md | 18 + .../plugins/laravel5/laravel5.plugin.zsh | 19 + .../plugins/last-working-dir/README.md | 33 + .../last-working-dir.plugin.zsh | 28 + .../oh-my-zsh/plugins/lein/README.md | 9 + .../oh-my-zsh/plugins/lein/_lein | 69 + .../oh-my-zsh/plugins/lighthouse/README.md | 29 + .../plugins/lighthouse/lighthouse.plugin.zsh | 12 + .../oh-my-zsh/plugins/lol/README.md | 71 + .../oh-my-zsh/plugins/lol/lol.plugin.zsh | 51 + .../oh-my-zsh/plugins/lpass/README.md | 13 + .../oh-my-zsh/plugins/lpass/_lpass | 169 + .../oh-my-zsh/plugins/lxd/README.md | 9 + .../oh-my-zsh/plugins/lxd/lxd.plugin.zsh | 26 + .../oh-my-zsh/plugins/macos/README.md | 63 + .../oh-my-zsh/plugins/macos/_security | 90 + .../oh-my-zsh/plugins/macos/macos.plugin.zsh | 270 + .../oh-my-zsh/plugins/macos/music | 170 + .../oh-my-zsh/plugins/macos/spotify | 478 + .../oh-my-zsh/plugins/macports/README.md | 47 + .../oh-my-zsh/plugins/macports/_port | 92 + .../plugins/macports/macports.plugin.zsh | 44 + .../oh-my-zsh/plugins/magic-enter/README.md | 17 + .../magic-enter/magic-enter.plugin.zsh | 38 + .../oh-my-zsh/plugins/man/README.md | 13 + .../oh-my-zsh/plugins/man/man.plugin.zsh | 37 + .../oh-my-zsh/plugins/marked2/README.md | 13 + .../plugins/marked2/marked2.plugin.zsh | 7 + .../oh-my-zsh/plugins/marktext/README.md | 17 + .../plugins/marktext/marktext.plugin.zsh | 7 + .../oh-my-zsh/plugins/mercurial/README.md | 69 + .../plugins/mercurial/mercurial.plugin.zsh | 118 + .../oh-my-zsh/plugins/meteor/README.md | 46 + .../oh-my-zsh/plugins/meteor/_meteor | 67 + .../plugins/meteor/meteor.plugin.zsh | 33 + .../oh-my-zsh/plugins/microk8s/README.md | 24 + .../plugins/microk8s/microk8s.plugin.zsh | 82 + .../oh-my-zsh/plugins/minikube/README.md | 9 + .../plugins/minikube/minikube.plugin.zsh | 13 + .../oh-my-zsh/plugins/mix-fast/README.md | 28 + .../plugins/mix-fast/mix-fast.plugin.zsh | 30 + .../oh-my-zsh/plugins/mix/README.md | 19 + private_dot_config/oh-my-zsh/plugins/mix/_mix | 156 + .../oh-my-zsh/plugins/mongo-atlas/README.md | 10 + .../mongo-atlas/mongo-atlas.plugin.zsh | 14 + .../oh-my-zsh/plugins/mongocli/README.md | 19 + .../plugins/mongocli/mongocli.plugin.zsh | 4 + .../oh-my-zsh/plugins/mosh/README.md | 9 + .../oh-my-zsh/plugins/mosh/mosh.plugin.zsh | 2 + .../oh-my-zsh/plugins/multipass/README.md | 22 + .../oh-my-zsh/plugins/multipass/_multipass | 73 + .../plugins/multipass/multipass.plugin.zsh | 7 + .../oh-my-zsh/plugins/mvn/README.md | 61 + .../oh-my-zsh/plugins/mvn/mvn.plugin.zsh | 344 + .../plugins/mysql-macports/README.md | 20 + .../mysql-macports/mysql-macports.plugin.zsh | 8 + .../oh-my-zsh/plugins/n98-magerun/README.md | 21 + .../n98-magerun/n98-magerun.plugin.zsh | 42 + .../oh-my-zsh/plugins/nanoc/README.md | 20 + .../oh-my-zsh/plugins/nanoc/_nanoc | 92 + .../oh-my-zsh/plugins/nanoc/nanoc.plugin.zsh | 6 + .../oh-my-zsh/plugins/nats/README.md | 14 + .../oh-my-zsh/plugins/nats/nats.plugin.zsh | 23 + .../oh-my-zsh/plugins/ng/README.md | 10 + private_dot_config/oh-my-zsh/plugins/ng/_ng | 56 + .../oh-my-zsh/plugins/nmap/README.md | 27 + .../oh-my-zsh/plugins/nmap/nmap.plugin.zsh | 32 + .../oh-my-zsh/plugins/node/README.md | 19 + .../oh-my-zsh/plugins/node/node.plugin.zsh | 6 + .../oh-my-zsh/plugins/nodenv/README.md | 20 + .../plugins/nodenv/nodenv.plugin.zsh | 43 + .../oh-my-zsh/plugins/nomad/README.md | 15 + .../oh-my-zsh/plugins/nomad/_nomad | 153 + .../oh-my-zsh/plugins/npm/README.md | 49 + .../oh-my-zsh/plugins/npm/npm.plugin.zsh | 114 + .../oh-my-zsh/plugins/nvm/README.md | 58 + private_dot_config/oh-my-zsh/plugins/nvm/_nvm | 34 + .../oh-my-zsh/plugins/nvm/nvm.plugin.zsh | 84 + .../oh-my-zsh/plugins/oc/README.md | 13 + .../oh-my-zsh/plugins/oc/oc.plugin.zsh | 8 + .../oh-my-zsh/plugins/octozen/README.md | 12 + .../plugins/octozen/octozen.plugin.zsh | 11 + .../oh-my-zsh/plugins/operator-sdk/README.md | 11 + .../operator-sdk/operator-sdk.plugin.zsh | 4 + .../oh-my-zsh/plugins/otp/README.md | 22 + .../oh-my-zsh/plugins/otp/otp.plugin.zsh | 45 + .../oh-my-zsh/plugins/pass/README.md | 22 + .../oh-my-zsh/plugins/pass/_pass | 144 + .../oh-my-zsh/plugins/paver/README.md | 12 + .../oh-my-zsh/plugins/paver/paver.plugin.zsh | 16 + .../oh-my-zsh/plugins/pep8/README.md | 8 + .../oh-my-zsh/plugins/pep8/_pep8 | 34 + .../plugins/per-directory-history/README.md | 48 + .../per-directory-history.zsh | 175 + .../symlink_per-directory-history.plugin.zsh | 1 + .../oh-my-zsh/plugins/percol/README.md | 23 + .../plugins/percol/percol.plugin.zsh | 25 + .../oh-my-zsh/plugins/perl/README.md | 37 + .../oh-my-zsh/plugins/perl/perl.plugin.zsh | 56 + .../oh-my-zsh/plugins/perms/README.md | 25 + .../oh-my-zsh/plugins/perms/perms.plugin.zsh | 87 + .../oh-my-zsh/plugins/phing/README.md | 9 + .../oh-my-zsh/plugins/phing/phing.plugin.zsh | 7 + .../oh-my-zsh/plugins/pip/README.md | 36 + private_dot_config/oh-my-zsh/plugins/pip/_pip | 100 + .../oh-my-zsh/plugins/pip/pip.plugin.zsh | 135 + .../oh-my-zsh/plugins/pipenv/README.md | 29 + .../plugins/pipenv/pipenv.plugin.zsh | 53 + .../oh-my-zsh/plugins/pj/README.md | 45 + .../oh-my-zsh/plugins/pj/pj.plugin.zsh | 34 + .../oh-my-zsh/plugins/please/README.md | 26 + .../plugins/please/please.plugin.zsh | 7 + .../oh-my-zsh/plugins/pm2/README.md | 19 + private_dot_config/oh-my-zsh/plugins/pm2/_pm2 | 168 + .../oh-my-zsh/plugins/pm2/pm2.plugin.zsh | 6 + .../oh-my-zsh/plugins/pod/README.md | 10 + private_dot_config/oh-my-zsh/plugins/pod/_pod | 682 + .../oh-my-zsh/plugins/poetry/README.md | 9 + .../plugins/poetry/poetry.plugin.zsh | 14 + .../oh-my-zsh/plugins/postgres/README.md | 22 + .../plugins/postgres/postgres.plugin.zsh | 13 + .../oh-my-zsh/plugins/pow/README.md | 21 + .../oh-my-zsh/plugins/pow/pow.plugin.zsh | 85 + .../oh-my-zsh/plugins/powder/README.md | 8 + .../oh-my-zsh/plugins/powder/_powder | 4 + .../oh-my-zsh/plugins/powify/README.md | 10 + .../oh-my-zsh/plugins/powify/_powify | 55 + .../oh-my-zsh/plugins/pre-commit/README.md | 19 + .../plugins/pre-commit/pre-commit.plugin.zsh | 8 + .../oh-my-zsh/plugins/profiles/README.md | 25 + .../plugins/profiles/profiles.plugin.zsh | 12 + .../oh-my-zsh/plugins/pyenv/README.md | 32 + .../oh-my-zsh/plugins/pyenv/pyenv.plugin.zsh | 98 + .../oh-my-zsh/plugins/pylint/README.md | 16 + .../oh-my-zsh/plugins/pylint/_pylint | 31 + .../plugins/pylint/pylint.plugin.zsh | 1 + .../oh-my-zsh/plugins/python/README.md | 29 + .../plugins/python/python.plugin.zsh | 83 + .../oh-my-zsh/plugins/qrcode/README.md | 8 + .../plugins/qrcode/qrcode.plugin.zsh | 17 + .../oh-my-zsh/plugins/rails/README.md | 122 + .../oh-my-zsh/plugins/rails/_rails | 624 + .../oh-my-zsh/plugins/rails/rails.plugin.zsh | 120 + .../oh-my-zsh/plugins/rake-fast/README.md | 35 + .../plugins/rake-fast/rake-fast.plugin.zsh | 76 + .../oh-my-zsh/plugins/rake/README.md | 41 + .../oh-my-zsh/plugins/rake/rake.plugin.zsh | 9 + .../oh-my-zsh/plugins/rand-quote/README.md | 15 + .../plugins/rand-quote/rand-quote.plugin.zsh | 23 + .../oh-my-zsh/plugins/rbenv/README.md | 26 + .../oh-my-zsh/plugins/rbenv/rbenv.plugin.zsh | 68 + .../oh-my-zsh/plugins/rbfu/README.md | 18 + .../oh-my-zsh/plugins/rbfu/rbfu.plugin.zsh | 49 + .../oh-my-zsh/plugins/rbw/README.md | 22 + .../oh-my-zsh/plugins/rbw/rbw.plugin.zsh | 43 + .../oh-my-zsh/plugins/react-native/README.md | 88 + .../plugins/react-native/_react-native | 32 + .../react-native/react-native.plugin.zsh | 75 + .../oh-my-zsh/plugins/rebar/README.md | 9 + .../oh-my-zsh/plugins/rebar/_rebar | 79 + .../oh-my-zsh/plugins/redis-cli/README.md | 15 + .../oh-my-zsh/plugins/redis-cli/_redis-cli | 142 + .../oh-my-zsh/plugins/repo/README.md | 25 + .../oh-my-zsh/plugins/repo/_repo | 279 + .../oh-my-zsh/plugins/repo/repo.plugin.zsh | 10 + .../oh-my-zsh/plugins/ripgrep/README.md | 9 + .../oh-my-zsh/plugins/ripgrep/_ripgrep | 640 + .../oh-my-zsh/plugins/ros/README.md | 10 + private_dot_config/oh-my-zsh/plugins/ros/_ros | 64 + .../oh-my-zsh/plugins/rsync/README.md | 16 + .../oh-my-zsh/plugins/rsync/rsync.plugin.zsh | 4 + .../oh-my-zsh/plugins/ruby/README.md | 33 + .../oh-my-zsh/plugins/ruby/ruby.plugin.zsh | 26 + .../oh-my-zsh/plugins/rust/README.md | 9 + .../oh-my-zsh/plugins/rust/_rustc | 228 + .../oh-my-zsh/plugins/rust/rust.plugin.zsh | 26 + .../oh-my-zsh/plugins/rvm/README.md | 37 + .../oh-my-zsh/plugins/rvm/rvm.plugin.zsh | 56 + .../oh-my-zsh/plugins/safe-paste/README.md | 9 + .../plugins/safe-paste/safe-paste.plugin.zsh | 100 + .../oh-my-zsh/plugins/salt/README.md | 5 + .../oh-my-zsh/plugins/salt/_salt | 279 + .../oh-my-zsh/plugins/samtools/README.md | 5 + .../oh-my-zsh/plugins/samtools/_samtools | 40 + .../oh-my-zsh/plugins/sbt/README.md | 32 + private_dot_config/oh-my-zsh/plugins/sbt/_sbt | 56 + .../oh-my-zsh/plugins/sbt/sbt.plugin.zsh | 25 + .../oh-my-zsh/plugins/scala/README.md | 16 + .../oh-my-zsh/plugins/scala/_scala | 249 + .../oh-my-zsh/plugins/scd/README.md | 159 + private_dot_config/oh-my-zsh/plugins/scd/_scd | 60 + .../oh-my-zsh/plugins/scd/executable_scd | 533 + .../oh-my-zsh/plugins/scd/scd.plugin.zsh | 17 + .../oh-my-zsh/plugins/screen/README.md | 10 + .../plugins/screen/screen.plugin.zsh | 54 + .../oh-my-zsh/plugins/scw/README.md | 7 + private_dot_config/oh-my-zsh/plugins/scw/_scw | 333 + .../oh-my-zsh/plugins/sdk/README.md | 14 + .../oh-my-zsh/plugins/sdk/sdk.plugin.zsh | 58 + .../oh-my-zsh/plugins/sfdx/README.md | 11 + .../oh-my-zsh/plugins/sfdx/_sfdx | 1110 + .../oh-my-zsh/plugins/sfffe/README.md | 17 + .../oh-my-zsh/plugins/sfffe/sfffe.plugin.zsh | 28 + .../oh-my-zsh/plugins/shell-proxy/README.md | 62 + .../plugins/shell-proxy/dot_editorconfig | 3 + .../plugins/shell-proxy/executable_proxy.py | 78 + .../shell-proxy/executable_ssh-agent.py | 16 + .../shell-proxy/executable_ssh-proxy.py | 36 + .../shell-proxy/shell-proxy.plugin.zsh | 44 + .../oh-my-zsh/plugins/shrink-path/README.md | 116 + .../shrink-path/shrink-path.plugin.zsh | 182 + .../oh-my-zsh/plugins/sigstore/README.md | 13 + .../plugins/sigstore/sigstore.plugin.zsh | 22 + .../oh-my-zsh/plugins/singlechar/README.md | 118 + .../plugins/singlechar/singlechar.plugin.zsh | 123 + .../oh-my-zsh/plugins/skaffold/README.md | 9 + .../plugins/skaffold/skaffold.plugin.zsh | 14 + .../oh-my-zsh/plugins/spring/README.md | 25 + .../oh-my-zsh/plugins/spring/_spring | 29 + .../oh-my-zsh/plugins/sprunge/README.md | 38 + .../plugins/sprunge/sprunge.plugin.zsh | 52 + .../oh-my-zsh/plugins/ssh-agent/README.md | 133 + .../plugins/ssh-agent/ssh-agent.plugin.zsh | 108 + .../oh-my-zsh/plugins/stack/README.md | 9 + .../oh-my-zsh/plugins/stack/stack.plugin.zsh | 4 + .../oh-my-zsh/plugins/starship/README.md | 21 + .../plugins/starship/starship.plugin.zsh | 8 + .../oh-my-zsh/plugins/sublime-merge/README.md | 17 + .../sublime-merge/sublime-merge.plugin.zsh | 55 + .../oh-my-zsh/plugins/sublime/README.md | 37 + .../plugins/sublime/sublime.plugin.zsh | 124 + .../oh-my-zsh/plugins/sudo/README.md | 75 + .../oh-my-zsh/plugins/sudo/sudo.plugin.zsh | 108 + .../oh-my-zsh/plugins/supervisor/README.md | 13 + .../plugins/supervisor/_supervisorctl | 143 + .../oh-my-zsh/plugins/supervisor/_supervisord | 33 + .../plugins/supervisor/supervisor.plugin.zsh | 14 + .../oh-my-zsh/plugins/suse/README.md | 96 + .../oh-my-zsh/plugins/suse/suse.plugin.zsh | 59 + .../oh-my-zsh/plugins/svcat/README.md | 9 + .../oh-my-zsh/plugins/svcat/svcat.plugin.zsh | 6 + .../oh-my-zsh/plugins/svn-fast-info/README.md | 56 + .../svn-fast-info/svn-fast-info.plugin.zsh | 74 + .../oh-my-zsh/plugins/svn/README.md | 67 + .../oh-my-zsh/plugins/svn/svn.plugin.zsh | 89 + .../oh-my-zsh/plugins/swiftpm/README.md | 22 + .../oh-my-zsh/plugins/swiftpm/_swift | 876 + .../plugins/swiftpm/swiftpm.plugin.zsh | 8 + .../oh-my-zsh/plugins/symfony/README.md | 9 + .../plugins/symfony/symfony.plugin.zsh | 13 + .../oh-my-zsh/plugins/symfony2/README.md | 28 + .../plugins/symfony2/symfony2.plugin.zsh | 34 + .../oh-my-zsh/plugins/systemadmin/README.md | 51 + .../systemadmin/systemadmin.plugin.zsh | 169 + .../oh-my-zsh/plugins/systemd/README.md | 97 + .../plugins/systemd/systemd.plugin.zsh | 118 + .../oh-my-zsh/plugins/taskwarrior/README.md | 18 + .../oh-my-zsh/plugins/taskwarrior/_task | 285 + .../taskwarrior/taskwarrior.plugin.zsh | 7 + .../oh-my-zsh/plugins/term_tab/README.md | 18 + .../plugins/term_tab/term_tab.plugin.zsh | 42 + .../oh-my-zsh/plugins/terminitor/README.md | 9 + .../oh-my-zsh/plugins/terminitor/_terminitor | 38 + .../oh-my-zsh/plugins/terraform/README.md | 47 + .../oh-my-zsh/plugins/terraform/_terraform | 411 + .../plugins/terraform/terraform.plugin.zsh | 26 + .../oh-my-zsh/plugins/textastic/README.md | 15 + .../plugins/textastic/textastic.plugin.zsh | 17 + .../oh-my-zsh/plugins/textmate/README.md | 17 + .../plugins/textmate/textmate.plugin.zsh | 14 + .../oh-my-zsh/plugins/thefuck/README.md | 13 + .../plugins/thefuck/thefuck.plugin.zsh | 21 + .../oh-my-zsh/plugins/themes/README.md | 18 + .../plugins/themes/themes.plugin.zsh | 35 + .../oh-my-zsh/plugins/thor/README.md | 10 + .../oh-my-zsh/plugins/thor/_thor | 4 + .../oh-my-zsh/plugins/tig/README.md | 16 + .../oh-my-zsh/plugins/tig/tig.plugin.zsh | 5 + .../oh-my-zsh/plugins/timer/README.md | 18 + .../oh-my-zsh/plugins/timer/timer.plugin.zsh | 35 + .../oh-my-zsh/plugins/tmux-cssh/README.md | 10 + .../oh-my-zsh/plugins/tmux-cssh/_tmux-cssh | 25 + .../oh-my-zsh/plugins/tmux/README.md | 43 + .../oh-my-zsh/plugins/tmux/tmux.extra.conf | 2 + .../oh-my-zsh/plugins/tmux/tmux.only.conf | 1 + .../oh-my-zsh/plugins/tmux/tmux.plugin.zsh | 113 + .../oh-my-zsh/plugins/tmuxinator/README.md | 19 + .../oh-my-zsh/plugins/tmuxinator/_tmuxinator | 23 + .../plugins/tmuxinator/tmuxinator.plugin.zsh | 5 + .../oh-my-zsh/plugins/toolbox/README.md | 26 + .../plugins/toolbox/toolbox.plugin.zsh | 6 + .../oh-my-zsh/plugins/torrent/README.md | 13 + .../plugins/torrent/torrent.plugin.zsh | 17 + .../oh-my-zsh/plugins/transfer/README.md | 41 + .../plugins/transfer/transfer.plugin.zsh | 97 + .../oh-my-zsh/plugins/tugboat/README.md | 12 + .../oh-my-zsh/plugins/tugboat/_tugboat | 106 + .../oh-my-zsh/plugins/ubuntu/README.md | 61 + .../plugins/ubuntu/ubuntu.plugin.zsh | 127 + .../oh-my-zsh/plugins/ufw/README.md | 18 + private_dot_config/oh-my-zsh/plugins/ufw/_ufw | 115 + .../plugins/universalarchive/README.md | 46 + .../universalarchive/_universalarchive | 6 + .../universalarchive.plugin.zsh | 70 + .../oh-my-zsh/plugins/urltools/README.md | 29 + .../plugins/urltools/urltools.plugin.zsh | 42 + .../plugins/vagrant-prompt/README.md | 6 + .../vagrant-prompt/vagrant-prompt.plugin.zsh | 33 + .../oh-my-zsh/plugins/vagrant/README.md | 40 + .../oh-my-zsh/plugins/vagrant/_vagrant | 133 + .../plugins/vagrant/vagrant.plugin.zsh | 33 + .../oh-my-zsh/plugins/vault/README.md | 15 + .../oh-my-zsh/plugins/vault/_vault | 400 + .../oh-my-zsh/plugins/vi-mode/README.md | 168 + .../plugins/vi-mode/vi-mode.plugin.zsh | 166 + .../plugins/vim-interaction/README.md | 82 + .../vim-interaction.plugin.zsh | 69 + .../oh-my-zsh/plugins/virtualenv/README.md | 15 + .../plugins/virtualenv/virtualenv.plugin.zsh | 7 + .../plugins/virtualenvwrapper/README.md | 38 + .../virtualenvwrapper.plugin.zsh | 91 + .../oh-my-zsh/plugins/volta/README.md | 11 + .../oh-my-zsh/plugins/volta/volta.plugin.zsh | 14 + .../oh-my-zsh/plugins/vscode/README.md | 78 + .../plugins/vscode/vscode.plugin.zsh | 41 + .../oh-my-zsh/plugins/vundle/README.md | 19 + .../plugins/vundle/vundle.plugin.zsh | 27 + .../oh-my-zsh/plugins/wakeonlan/README.md | 43 + .../oh-my-zsh/plugins/wakeonlan/_wake | 4 + .../plugins/wakeonlan/wakeonlan.plugin.zsh | 14 + .../oh-my-zsh/plugins/watson/README.md | 9 + .../oh-my-zsh/plugins/watson/_watson | 34 + .../oh-my-zsh/plugins/wd/LICENSE | 21 + .../oh-my-zsh/plugins/wd/README.md | 264 + .../oh-my-zsh/plugins/wd/_wd.sh | 98 + .../oh-my-zsh/plugins/wd/wd.plugin.zsh | 15 + private_dot_config/oh-my-zsh/plugins/wd/wd.sh | 513 + .../oh-my-zsh/plugins/web-search/README.md | 81 + .../plugins/web-search/web-search.plugin.zsh | 86 + .../oh-my-zsh/plugins/wp-cli/README.md | 109 + .../plugins/wp-cli/wp-cli.plugin.zsh | 123 + .../oh-my-zsh/plugins/xcode/README.md | 88 + .../oh-my-zsh/plugins/xcode/_xcselv | 19 + .../oh-my-zsh/plugins/xcode/xcode.plugin.zsh | 201 + .../oh-my-zsh/plugins/yarn/README.md | 58 + .../oh-my-zsh/plugins/yarn/_yarn | 502 + .../oh-my-zsh/plugins/yarn/yarn.plugin.zsh | 46 + .../oh-my-zsh/plugins/yii/README.md | 15 + .../oh-my-zsh/plugins/yii/yii.plugin.zsh | 17 + .../oh-my-zsh/plugins/yii2/README.md | 7 + .../oh-my-zsh/plugins/yii2/yii2.plugin.zsh | 29 + .../oh-my-zsh/plugins/yum/README.md | 27 + .../oh-my-zsh/plugins/yum/yum.plugin.zsh | 16 + .../oh-my-zsh/plugins/z/LICENSE | 21 + .../oh-my-zsh/plugins/z/MANUAL.md | 358 + .../oh-my-zsh/plugins/z/README.md | 24 + private_dot_config/oh-my-zsh/plugins/z/_z | 82 + .../oh-my-zsh/plugins/z/img/mit_license.svg | 1 + .../plugins/z/img/zsh_4.3.11_plus.svg | 1 + .../oh-my-zsh/plugins/z/z.plugin.zsh | 1000 + .../oh-my-zsh/plugins/zbell/README.md | 33 + .../oh-my-zsh/plugins/zbell/zbell.plugin.zsh | 96 + .../oh-my-zsh/plugins/zeus/README.md | 50 + .../oh-my-zsh/plugins/zeus/_zeus | 98 + .../oh-my-zsh/plugins/zeus/zeus.plugin.zsh | 70 + .../oh-my-zsh/plugins/zoxide/README.md | 14 + .../plugins/zoxide/zoxide.plugin.zsh | 5 + .../plugins/zsh-autosuggestions/CHANGELOG.md | 117 + .../plugins/zsh-autosuggestions/DESCRIPTION | 1 + .../plugins/zsh-autosuggestions/Dockerfile | 20 + .../plugins/zsh-autosuggestions/Gemfile | 5 + .../plugins/zsh-autosuggestions/Gemfile.lock | 41 + .../plugins/zsh-autosuggestions/INSTALL.md | 64 + .../plugins/zsh-autosuggestions/LICENSE | 23 + .../plugins/zsh-autosuggestions/Makefile | 35 + .../plugins/zsh-autosuggestions/README.md | 191 + .../oh-my-zsh/plugins/zsh-autosuggestions/URL | 1 + .../plugins/zsh-autosuggestions/VERSION | 1 + .../plugins/zsh-autosuggestions/ZSH_VERSIONS | 17 + .../dot_circleci/config.yml | 15 + .../zsh-autosuggestions/dot_editorconfig | 18 + .../plugins/zsh-autosuggestions/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../zsh-autosuggestions/dot_git/config | 11 + .../zsh-autosuggestions/dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 + .../executable_fsmonitor-watchman.sample | 174 + .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 + .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 + .../hooks/executable_pre-rebase.sample | 169 + .../hooks/executable_pre-receive.sample | 24 + .../executable_prepare-commit-msg.sample | 42 + .../hooks/executable_push-to-checkout.sample | 78 + .../executable_sendemail-validate.sample | 77 + .../dot_git/hooks/executable_update.sample | 128 + .../plugins/zsh-autosuggestions/dot_git/index | Bin 0 -> 5785 bytes .../zsh-autosuggestions/dot_git/info/exclude | 6 + .../zsh-autosuggestions/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...15f612b315ae46f4238175692f1771d3bccd8e.idx | Bin 0 -> 69952 bytes ...5f612b315ae46f4238175692f1771d3bccd8e.pack | Bin 0 -> 585553 bytes ...15f612b315ae46f4238175692f1771d3bccd8e.rev | Bin 0 -> 9892 bytes .../zsh-autosuggestions/dot_git/packed-refs | 52 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../dot_github/ISSUE_TEMPLATE/bug-report.md | 36 + .../ISSUE_TEMPLATE/feature_request.md | 20 + .../plugins/zsh-autosuggestions/dot_rspec | 3 + .../zsh-autosuggestions/dot_rubocop.yml | 30 + .../zsh-autosuggestions/dot_ruby-version | 1 + .../executable_install_test_zsh.sh | 26 + .../zsh-autosuggestions/spec/async_spec.rb | 70 + .../spec/integrations/auto_cd_spec.rb | 14 + .../bracketed_paste_magic_spec.rb | 43 + .../spec/integrations/client_zpty_spec.rb | 14 + .../spec/integrations/glob_subst_spec.rb | 12 + .../spec/integrations/rebound_bracket_spec.rb | 13 + .../spec/integrations/vi_mode_spec.rb | 80 + .../spec/integrations/wrapped_widget_spec.rb | 39 + .../spec/integrations/zle_input_stack_spec.rb | 24 + .../spec/kill_ring_spec.rb | 23 + .../spec/line_init_spec.rb | 17 + .../spec/multi_line_spec.rb | 8 + .../spec/options/buffer_max_size_spec.rb | 30 + .../spec/options/highlight_style_spec.rb | 7 + .../options/original_widget_prefix_spec.rb | 7 + .../spec/options/strategy_spec.rb | 55 + .../spec/options/widget_lists_spec.rb | 121 + .../zsh-autosuggestions/spec/spec_helper.rb | 54 + .../spec/strategies/completion_spec.rb | 72 + .../spec/strategies/history_spec.rb | 23 + .../spec/strategies/match_prev_cmd_spec.rb | 34 + .../strategies/special_characters_helper.rb | 75 + .../spec/terminal_session.rb | 99 + .../spec/widgets/disable_spec.rb | 19 + .../spec/widgets/enable_spec.rb | 42 + .../spec/widgets/fetch_spec.rb | 24 + .../spec/widgets/toggle_spec.rb | 26 + .../plugins/zsh-autosuggestions/src/async.zsh | 76 + .../plugins/zsh-autosuggestions/src/bind.zsh | 106 + .../zsh-autosuggestions/src/config.zsh | 93 + .../plugins/zsh-autosuggestions/src/fetch.zsh | 27 + .../zsh-autosuggestions/src/highlight.zsh | 26 + .../plugins/zsh-autosuggestions/src/start.zsh | 33 + .../src/strategies/completion.zsh | 137 + .../src/strategies/history.zsh | 32 + .../src/strategies/match_prev_cmd.zsh | 66 + .../plugins/zsh-autosuggestions/src/util.zsh | 11 + .../zsh-autosuggestions/src/widgets.zsh | 231 + .../zsh-autosuggestions.plugin.zsh | 1 + .../zsh-autosuggestions.zsh | 864 + .../plugins/zsh-interactive-cd/LICENSE | 375 + .../plugins/zsh-interactive-cd/README.md | 15 + .../plugins/zsh-interactive-cd/demo.gif | Bin 0 -> 1497944 bytes .../zsh-interactive-cd.plugin.zsh | 180 + .../plugins/zsh-navigation-tools/LICENSE | 700 + .../plugins/zsh-navigation-tools/Makefile | 35 + .../plugins/zsh-navigation-tools/NEWS | 17 + .../plugins/zsh-navigation-tools/README.md | 259 + .../plugins/zsh-navigation-tools/_n-kill | 41 + .../doc/executable_generate_single_file | 35 + .../doc/executable_install.sh | 70 + .../doc/executable_znt-tmux.zsh | 50 + .../doc/img/n-history2.png | Bin 0 -> 108316 bytes .../zsh-navigation-tools/doc/n-preview | 224 + .../dot_config/znt/n-aliases.conf | 33 + .../dot_config/znt/n-cd.conf | 68 + .../dot_config/znt/n-env.conf | 38 + .../dot_config/znt/n-functions.conf | 41 + .../dot_config/znt/n-history.conf | 43 + .../dot_config/znt/n-kill.conf | 46 + .../dot_config/znt/n-list.conf | 55 + .../dot_config/znt/n-options.conf | 34 + .../dot_config/znt/n-panelize.conf | 34 + .../plugins/zsh-navigation-tools/n-aliases | 47 + .../plugins/zsh-navigation-tools/n-cd | 71 + .../plugins/zsh-navigation-tools/n-env | 47 + .../plugins/zsh-navigation-tools/n-functions | 54 + .../plugins/zsh-navigation-tools/n-help | 135 + .../plugins/zsh-navigation-tools/n-history | 371 + .../plugins/zsh-navigation-tools/n-kill | 96 + .../plugins/zsh-navigation-tools/n-list | 517 + .../plugins/zsh-navigation-tools/n-list-draw | 133 + .../plugins/zsh-navigation-tools/n-list-input | 377 + .../plugins/zsh-navigation-tools/n-options | 84 + .../plugins/zsh-navigation-tools/n-panelize | 68 + .../zsh-navigation-tools/znt-cd-widget | 8 + .../zsh-navigation-tools/znt-history-widget | 22 + .../zsh-navigation-tools/znt-kill-widget | 8 + .../zsh-navigation-tools/znt-usetty-wrapper | 40 + .../zsh-navigation-tools.plugin.zsh | 77 + .../zsh-syntax-highlighting/COPYING.md | 23 + .../zsh-syntax-highlighting/HACKING.md | 99 + .../zsh-syntax-highlighting/INSTALL.md | 137 + .../plugins/zsh-syntax-highlighting/Makefile | 64 + .../plugins/zsh-syntax-highlighting/README.md | 97 + .../zsh-syntax-highlighting/changelog.md | 884 + .../docs/highlighters.md | 132 + .../docs/highlighters/brackets.md | 31 + .../docs/highlighters/cursor.md | 24 + .../docs/highlighters/line.md | 24 + .../docs/highlighters/main.md | 121 + .../docs/highlighters/pattern.md | 24 + .../docs/highlighters/regexp.md | 65 + .../docs/highlighters/root.md | 25 + .../zsh-syntax-highlighting/dot_editorconfig | 15 + .../zsh-syntax-highlighting/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../zsh-syntax-highlighting/dot_git/config | 11 + .../dot_git/description | 1 + .../hooks/executable_applypatch-msg.sample | 15 + .../hooks/executable_commit-msg.sample | 24 + .../executable_fsmonitor-watchman.sample | 174 + .../hooks/executable_post-update.sample | 8 + .../hooks/executable_pre-applypatch.sample | 14 + .../hooks/executable_pre-commit.sample | 49 + .../hooks/executable_pre-merge-commit.sample | 13 + .../dot_git/hooks/executable_pre-push.sample | 53 + .../hooks/executable_pre-rebase.sample | 169 + .../hooks/executable_pre-receive.sample | 24 + .../executable_prepare-commit-msg.sample | 42 + .../hooks/executable_push-to-checkout.sample | 78 + .../executable_sendemail-validate.sample | 77 + .../dot_git/hooks/executable_update.sample | 128 + .../zsh-syntax-highlighting/dot_git/index | Bin 0 -> 39584 bytes .../dot_git/info/exclude | 6 + .../zsh-syntax-highlighting/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...7f990e2e27aeabc7f80a8f0fd857b0823334ac.idx | Bin 0 -> 198220 bytes ...f990e2e27aeabc7f80a8f0fd857b0823334ac.pack | Bin 0 -> 1596793 bytes ...7f990e2e27aeabc7f80a8f0fd857b0823334ac.rev | Bin 0 -> 28216 bytes .../dot_git/packed-refs | 30 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../zsh-syntax-highlighting/dot_gitattributes | 1 + .../dot_github/workflows/test.yml | 75 + .../zsh-syntax-highlighting/dot_gitignore | 3 + .../zsh-syntax-highlighting/dot_revision-hash | 1 + .../zsh-syntax-highlighting/dot_version | 1 + .../highlighters/README.md | 8 + .../brackets/brackets-highlighter.zsh | 107 + .../highlighters/brackets/symlink_README.md | 1 + .../cursor-matchingbracket-line-finish.zsh | 36 + .../test-data/cursor-matchingbracket.zsh | 47 + .../brackets/test-data/empty-styles.zsh | 33 + .../brackets/test-data/loop-styles.zsh | 53 + .../test-data/mismatch-patentheses.zsh | 42 + .../brackets/test-data/near-quotes.zsh | 42 + .../brackets/test-data/nested-parentheses.zsh | 45 + .../brackets/test-data/only-error.zsh | 34 + .../brackets/test-data/quoted-patentheses.zsh | 34 + .../brackets/test-data/simple-parentheses.zsh | 42 + .../test-data/unclosed-patentheses.zsh | 41 + .../test-data/unclosed-patentheses2.zsh | 40 + .../cursor/cursor-highlighter.zsh | 47 + .../highlighters/cursor/symlink_README.md | 1 + .../highlighters/line/line-highlighter.zsh | 44 + .../highlighters/line/symlink_README.md | 1 + .../highlighters/main/main-highlighter.zsh | 1846 ++ .../highlighters/main/symlink_README.md | 1 + .../abspath-in-command-position1.zsh | 35 + .../abspath-in-command-position1b.zsh | 36 + .../abspath-in-command-position2.zsh | 35 + .../abspath-in-command-position3.zsh | 37 + .../abspath-in-command-position3b.zsh | 38 + .../abspath-in-command-position4.zsh | 35 + .../abspath-in-command-position5.zsh | 35 + .../main/test-data/alias-assignment1.zsh | 38 + .../main/test-data/alias-basic.zsh | 35 + .../main/test-data/alias-brackets.zsh | 41 + .../test-data/alias-command-substitution.zsh | 37 + .../main/test-data/alias-comment1.zsh | 37 + .../main/test-data/alias-comment2.zsh | 37 + .../main/test-data/alias-complex.zsh | 38 + .../main/test-data/alias-empty.zsh | 38 + .../main/test-data/alias-eponymous1.zsh | 36 + .../main/test-data/alias-eponymous2.zsh | 36 + .../main/test-data/alias-in-cmdsubst.zsh | 43 + .../main/test-data/alias-loop.zsh | 44 + .../main/test-data/alias-loop2.zsh | 35 + .../test-data/alias-nested-precommand.zsh | 43 + .../main/test-data/alias-nested.zsh | 40 + .../main/test-data/alias-parameter.zsh | 38 + .../alias-precommand-option-argument1.zsh | 42 + .../alias-precommand-option-argument2.zsh | 42 + .../alias-precommand-option-argument3.zsh | 42 + .../alias-precommand-option-argument4.zsh | 42 + .../main/test-data/alias-quoted.zsh | 39 + .../main/test-data/alias-redirect.zsh | 38 + .../main/test-data/alias-reuse1.zsh | 39 + .../main/test-data/alias-reuse2.zsh | 39 + .../main/test-data/alias-reuse3.zsh | 39 + .../main/test-data/alias-reuse4.zsh | 42 + .../main/test-data/alias-reuse5.zsh | 43 + .../main/test-data/alias-self.zsh | 38 + .../main/test-data/alias-self2.zsh | 37 + .../main/test-data/alias-to-dir.zsh | 36 + .../main/test-data/alias-to-dir1b.zsh | 37 + .../main/test-data/alias-unknown-token1.zsh | 37 + .../main/test-data/alias-unknown-token2.zsh | 37 + .../highlighters/main/test-data/alias.zsh | 53 + .../highlighters/main/test-data/always1.zsh | 41 + .../highlighters/main/test-data/always2.zsh | 43 + .../highlighters/main/test-data/always3.zsh | 43 + .../main/test-data/anonymous-function.zsh | 44 + .../main/test-data/arg0-colon.zsh | 35 + .../main/test-data/arith-cmdsubst-mess.zsh | 46 + .../highlighters/main/test-data/arith1.zsh | 37 + .../highlighters/main/test-data/arith2.zsh | 38 + .../arithmetic-command-substitution.zsh | 42 + .../test-data/arithmetic-doubled-parens.zsh | 37 + .../main/test-data/arithmetic-empty.zsh | 39 + .../main/test-data/arithmetic-evaluation.zsh | 40 + .../main/test-data/arithmetic-hist-expn.zsh | 38 + .../test-data/arithmetic-invalid-chars.zsh | 39 + .../test-data/arithmetic-multiplication.zsh | 39 + .../main/test-data/arithmetic-nested.zsh | 38 + .../main/test-data/arithmetic-quoted.zsh | 38 + .../main/test-data/arithmetic-unclosed.zsh | 37 + .../main/test-data/arithmetic-unfinished.zsh | 41 + .../main/test-data/array-cmdsep1.zsh | 45 + .../main/test-data/array-cmdsep2.zsh | 41 + .../main/test-data/array-cmdsep3.zsh | 41 + .../main/test-data/assign-append.zsh | 39 + .../main/test-data/assign-argv.zsh | 38 + .../main/test-data/assign-array.zsh | 41 + .../main/test-data/assign-array2.zsh | 40 + .../main/test-data/assign-array3.zsh | 41 + .../main/test-data/assign-invalid-command.zsh | 37 + .../main/test-data/assign-not-array.zsh | 36 + .../main/test-data/assign-not-array2.zsh | 36 + .../main/test-data/assign-quoted-cmdsubst.zsh | 45 + .../main/test-data/assign-semicolon.zsh | 39 + .../main/test-data/assign-subshell.zsh | 37 + .../main/test-data/assign-value-quote1.zsh | 37 + .../main/test-data/assign-value-quote2.zsh | 37 + .../highlighters/main/test-data/assign.zsh | 42 + .../test-data/assignment-before-resword1.zsh | 40 + .../test-data/assignment-before-resword2.zsh | 40 + .../test-data/assignment-before-resword3.zsh | 37 + .../test-data/assignment-before-resword4.zsh | 40 + .../test-data/assignment-before-resword5.zsh | 38 + .../main/test-data/assignment-quoted.zsh | 37 + .../main/test-data/back-quoted-argument.zsh | 58 + .../main/test-data/back-quoted-open.zsh | 41 + .../main/test-data/backslash-continuation.zsh | 35 + .../test-data/backslash-continuation2.zsh | 37 + .../main/test-data/backslash-space.zsh | 39 + .../highlighters/main/test-data/backslash.zsh | 34 + .../main/test-data/bang-assign-array.zsh | 42 + .../main/test-data/bang-assign-scalar.zsh | 38 + .../main/test-data/bang-pipeline.zsh | 39 + .../test-data/block-assignment-no-command.zsh | 38 + .../highlighters/main/test-data/braces1.zsh | 41 + .../highlighters/main/test-data/braces2.zsh | 41 + .../main/test-data/brackets-matching1.zsh | 38 + .../main/test-data/brackets-matching2.zsh | 38 + .../main/test-data/brackets-mismatch1.zsh | 39 + .../brackets-mismatch10-if-negative.zsh | 42 + .../main/test-data/brackets-mismatch2.zsh | 39 + .../main/test-data/brackets-mismatch3.zsh | 36 + .../main/test-data/brackets-mismatch4.zsh | 36 + .../main/test-data/brackets-mismatch5.zsh | 37 + .../main/test-data/brackets-mismatch6.zsh | 40 + .../main/test-data/brackets-mismatch7.zsh | 45 + .../brackets-mismatch8-if-positive.zsh | 53 + .../main/test-data/brackets-mismatch8.zsh | 38 + .../brackets-mismatch9-if-positive.zsh | 42 + .../brackets-premature-termination.zsh | 40 + .../main/test-data/cdpath-abspath.zsh | 38 + .../main/test-data/cmdpos-elision-partial.zsh | 44 + .../command-substitution-adjacent.zsh | 45 + .../command-substitution-in-assignment.zsh | 42 + .../command-substitution-unclosed.zsh | 45 + .../main/test-data/commandseparator.zsh | 38 + .../main/test-data/comment-followed.zsh | 39 + .../main/test-data/comment-leading.zsh | 36 + .../main/test-data/comment-off.zsh | 38 + .../highlighters/main/test-data/comments.zsh | 39 + .../main/test-data/commmand-parameter.zsh | 45 + .../main/test-data/control-flow.zsh | 57 + .../main/test-data/control-flow2.zsh | 40 + .../main/test-data/control-flow3.zsh | 39 + .../highlighters/main/test-data/cthulhu.zsh | 70 + .../highlighters/main/test-data/dinbrack1.zsh | 41 + .../main/test-data/dirs_blacklist.zsh | 40 + .../main/test-data/dollar-dollar.zsh | 39 + .../main/test-data/dollar-noise.zsh | 42 + .../main/test-data/dollar-paren.zsh | 49 + .../main/test-data/dollar-quoted.zsh | 38 + .../main/test-data/dollar-quoted2.zsh | 39 + .../main/test-data/dollar-quoted3.zsh | 39 + .../main/test-data/double-hyphen-option.zsh | 35 + .../main/test-data/double-quoted.zsh | 42 + .../main/test-data/double-quoted2.zsh | 39 + .../main/test-data/double-quoted3.zsh | 42 + .../main/test-data/double-quoted4.zsh | 37 + .../main/test-data/empty-command-newline.zsh | 39 + .../main/test-data/empty-command.zsh | 36 + .../main/test-data/empty-command2.zsh | 39 + .../main/test-data/empty-line.zsh | 36 + .../highlighters/main/test-data/equals1.zsh | 36 + .../highlighters/main/test-data/equals2.zsh | 38 + .../highlighters/main/test-data/equals3.zsh | 36 + .../highlighters/main/test-data/equals4.zsh | 36 + .../main/test-data/escaped-single-quote.zsh | 38 + .../main/test-data/exec-redirection1.zsh | 38 + .../main/test-data/fd-target-not-filename.zsh | 40 + .../main/test-data/function-altsyntax.zsh | 45 + .../main/test-data/function-named1.zsh | 44 + .../main/test-data/function-named2.zsh | 39 + .../highlighters/main/test-data/function.zsh | 42 + .../highlighters/main/test-data/glob.zsh | 41 + .../main/test-data/global-alias1.zsh | 38 + .../main/test-data/globs-with-quoting.zsh | 43 + .../main/test-data/hashed-command.zsh | 35 + .../history-double-quoted-escaped.zsh | 38 + .../history-double-quoted-followed.zsh | 39 + .../test-data/history-double-quoted-no.zsh | 37 + .../history-double-quoted-unescaped.zsh | 38 + .../test-data/history-double-quoted-yes.zsh | 38 + .../main/test-data/history-expansion.zsh | 39 + .../main/test-data/history-expansion2.zsh | 34 + .../main/test-data/inheritance.zsh | 40 + .../main/test-data/jobsubst-isnt-glob.zsh | 37 + .../main/test-data/jobsubst-isnt-glob2.zsh | 37 + .../main/test-data/loop-newline.zsh | 40 + .../main/test-data/meta-no-eval1.zsh | 49 + .../main/test-data/meta-no-eval2.zsh | 40 + .../test-data/multiline-array-assignment1.zsh | 41 + .../main/test-data/multiline-string.zsh | 37 + .../main/test-data/multiline-string2.zsh | 36 + .../test-data/multios-negates-globbing.zsh | 39 + .../test-data/multios-negates-globbing2.zsh | 38 + .../main/test-data/multiple-quotes.zsh | 42 + .../main/test-data/multiple-redirections.zsh | 46 + .../main/test-data/noglob-alias.zsh | 36 + .../main/test-data/noglob-always.zsh | 45 + .../highlighters/main/test-data/noglob1.zsh | 38 + .../highlighters/main/test-data/noglob2.zsh | 40 + .../highlighters/main/test-data/noglob3.zsh | 38 + .../highlighters/main/test-data/noglob4.zsh | 45 + .../highlighters/main/test-data/null-exec.zsh | 38 + .../main/test-data/null-exec2-printenv.zsh | 38 + .../main/test-data/number_range-glob.zsh | 42 + .../main/test-data/off-by-one.zsh | 40 + .../main/test-data/opt-shwordsplit1.zsh | 40 + .../test-data/optimized-cmdsubst-input.zsh | 43 + .../option-dollar-quote-isnt-filename.zsh | 39 + .../main/test-data/option-path_dirs.zsh | 44 + .../main/test-data/option-with-quotes.zsh | 37 + .../test-data/order-path-after-dollar.zsh | 38 + .../test-data/order-path-before-globbing.zsh | 39 + .../param-positional-in-array-append.zsh | 39 + .../param-precommand-option-argument1.zsh | 42 + .../param-precommand-option-argument3.zsh | 42 + .../parameter-elision-command-word.zsh | 36 + .../parameter-expansion-shwordsplit.zsh | 38 + .../parameter-expansion-untokenized1.zsh | 38 + .../parameter-expansion-untokenized2.zsh | 38 + .../main/test-data/parameter-star.zsh | 40 + .../test-data/parameter-to-global-alias.zsh | 42 + ...meter-value-contains-command-position1.zsh | 38 + ...meter-value-contains-command-position2.zsh | 38 + .../main/test-data/pasted-quotes.zsh | 38 + .../main/test-data/path-broken-symlink.zsh | 41 + .../main/test-data/path-dollared-word.zsh | 45 + .../main/test-data/path-dollared-word2.zsh | 37 + .../main/test-data/path-dollared-word3.zsh | 40 + .../main/test-data/path-dollared-word3b.zsh | 38 + .../main/test-data/path-dollared-word4.zsh | 36 + .../main/test-data/path-mixed-quoting.zsh | 39 + .../main/test-data/path-separators.zsh | 53 + .../main/test-data/path-separators2.zsh | 40 + .../main/test-data/path-space.zsh | 37 + .../main/test-data/path-tilde-home.zsh | 36 + .../main/test-data/path-tilde-home2.zsh | 37 + .../main/test-data/path-tilde-home3.zsh | 36 + .../main/test-data/path-tilde-named.zsh | 39 + .../highlighters/main/test-data/path.zsh | 37 + .../main/test-data/path_prefix.zsh | 38 + .../main/test-data/path_prefix2.zsh | 39 + .../main/test-data/path_prefix3.zsh | 38 + .../plain-file-in-command-position.zsh | 39 + .../main/test-data/precommand-killing1.zsh | 40 + .../main/test-data/precommand-killing2.zsh | 39 + .../test-data/precommand-then-assignment.zsh | 37 + .../main/test-data/precommand-type1.zsh | 61 + .../main/test-data/precommand-type2.zsh | 55 + .../main/test-data/precommand-type3.zsh | 55 + .../main/test-data/precommand-uninstalled.zsh | 44 + .../test-data/precommand-unknown-option.zsh | 43 + .../main/test-data/precommand.zsh | 36 + .../main/test-data/precommand2.zsh | 36 + .../main/test-data/precommand3.zsh | 41 + .../main/test-data/precommand4.zsh | 39 + .../main/test-data/prefix-redirection.zsh | 42 + ...process-substitution-after-redirection.zsh | 46 + ...substitution-redirection-isnt-globbing.zsh | 41 + .../main/test-data/process-substitution.zsh | 43 + .../main/test-data/process-substitution2.zsh | 51 + .../quoted-command-substitution-empty.zsh | 44 + .../quoted-redirection-in-command-word.zsh | 37 + .../highlighters/main/test-data/rc-quotes.zsh | 39 + .../main/test-data/redirection-comment.zsh | 38 + .../main/test-data/redirection-from-param.zsh | 40 + .../test-data/redirection-in-cmdsubst.zsh | 41 + .../redirection-inhibits-elision.zsh | 38 + .../test-data/redirection-is-not-option.zsh | 38 + .../test-data/redirection-special-cases.zsh | 44 + .../main/test-data/redirection.zsh | 39 + .../main/test-data/redirection2.zsh | 41 + .../main/test-data/redirection3.zsh | 42 + .../main/test-data/reserved-word.zsh | 38 + .../main/test-data/simple-command.zsh | 34 + .../main/test-data/simple-redirection.zsh | 38 + .../highlighters/main/test-data/subshell.zsh | 51 + .../main/test-data/sudo-command.zsh | 54 + .../main/test-data/sudo-comment.zsh | 39 + .../main/test-data/sudo-longopt.zsh | 38 + .../main/test-data/sudo-redirection.zsh | 48 + .../main/test-data/sudo-redirection2.zsh | 41 + .../main/test-data/sudo-redirection3.zsh | 41 + .../main/test-data/tilde-command-word.zsh | 37 + .../main/test-data/time-and-nocorrect1.zsh | 39 + .../main/test-data/time-and-nocorrect2.zsh | 40 + .../main/test-data/unbackslash.zsh | 34 + .../main/test-data/unknown-command.zsh | 34 + .../main/test-data/vanilla-newline.zsh | 39 + .../main/test-data/vi-linewise-mode.zsh | 43 + .../pattern/pattern-highlighter.zsh | 60 + .../highlighters/pattern/symlink_README.md | 1 + .../highlighters/pattern/test-data/rm-rf.zsh | 36 + .../regexp/regexp-highlighter.zsh | 62 + .../highlighters/regexp/symlink_README.md | 1 + .../highlighters/regexp/test-data/complex.zsh | 37 + .../regexp/test-data/subexpression.zsh | 36 + .../regexp/test-data/word-boundary.zsh | 42 + .../highlighters/root/root-highlighter.zsh | 44 + .../highlighters/root/symlink_README.md | 1 + .../images/after1-smaller.png | Bin 0 -> 2517 bytes .../zsh-syntax-highlighting/images/after1.png | Bin 0 -> 5842 bytes .../images/after2-smaller.png | Bin 0 -> 4386 bytes .../zsh-syntax-highlighting/images/after2.png | Bin 0 -> 10228 bytes .../images/after3-smaller.png | Bin 0 -> 1673 bytes .../zsh-syntax-highlighting/images/after3.png | Bin 0 -> 3427 bytes .../images/after4-smaller.png | Bin 0 -> 3224 bytes .../images/before1-smaller.png | Bin 0 -> 1589 bytes .../images/before1.png | Bin 0 -> 2636 bytes .../images/before2-smaller.png | Bin 0 -> 2605 bytes .../images/before2.png | Bin 0 -> 2614 bytes .../images/before3-smaller.png | Bin 0 -> 763 bytes .../images/before3.png | Bin 0 -> 1461 bytes .../images/before4-smaller.png | Bin 0 -> 2987 bytes .../images/preview-smaller.png | Bin 0 -> 5982 bytes .../images/preview.png | Bin 0 -> 14650 bytes .../zsh-syntax-highlighting/release.md | 21 + .../zsh-syntax-highlighting/tests/README.md | 124 + .../tests/executable_edit-failed-tests | 40 + .../tests/executable_generate.zsh | 117 + .../tests/executable_tap-colorizer.zsh | 71 + .../tests/executable_tap-filter | 47 + .../tests/executable_test-highlighting.zsh | 291 + .../tests/executable_test-perfs.zsh | 103 + .../tests/executable_test-zprof.zsh | 78 + .../zsh-syntax-highlighting.plugin.zsh | 2 + .../zsh-syntax-highlighting.zsh | 600 + .../oh-my-zsh/templates/zshrc.zsh-template | 101 + .../oh-my-zsh/themes/3den.zsh-theme | 7 + .../oh-my-zsh/themes/Soliah.zsh-theme | 85 + .../oh-my-zsh/themes/adben.zsh-theme | 118 + .../oh-my-zsh/themes/af-magic.zsh-theme | 47 + .../oh-my-zsh/themes/afowler.zsh-theme | 10 + .../oh-my-zsh/themes/agnoster.zsh-theme | 271 + .../oh-my-zsh/themes/alanpeabody.zsh-theme | 24 + .../oh-my-zsh/themes/amuse.zsh-theme | 24 + .../oh-my-zsh/themes/apple.zsh-theme | 24 + .../oh-my-zsh/themes/arrow.zsh-theme | 14 + .../oh-my-zsh/themes/aussiegeek.zsh-theme | 8 + .../oh-my-zsh/themes/avit.zsh-theme | 85 + .../oh-my-zsh/themes/awesomepanda.zsh-theme | 16 + .../oh-my-zsh/themes/bira.zsh-theme | 32 + .../oh-my-zsh/themes/blinks.zsh-theme | 30 + .../oh-my-zsh/themes/bureau.zsh-theme | 133 + .../oh-my-zsh/themes/candy-kingdom.zsh-theme | 34 + .../oh-my-zsh/themes/candy.zsh-theme | 7 + .../oh-my-zsh/themes/clean.zsh-theme | 14 + .../oh-my-zsh/themes/cloud.zsh-theme | 10 + .../oh-my-zsh/themes/crcandy.zsh-theme | 8 + .../oh-my-zsh/themes/crunch.zsh-theme | 39 + .../oh-my-zsh/themes/cypher.zsh-theme | 4 + .../oh-my-zsh/themes/dallas.zsh-theme | 27 + .../oh-my-zsh/themes/darkblood.zsh-theme | 9 + .../oh-my-zsh/themes/daveverwer.zsh-theme | 7 + .../oh-my-zsh/themes/dieter.zsh-theme | 56 + .../oh-my-zsh/themes/dogenpunk.zsh-theme | 77 + .../oh-my-zsh/themes/dpoggi.zsh-theme | 14 + .../oh-my-zsh/themes/dst.zsh-theme | 16 + .../oh-my-zsh/themes/dstufft.zsh-theme | 19 + .../oh-my-zsh/themes/duellj.zsh-theme | 7 + .../oh-my-zsh/themes/eastwood.zsh-theme | 23 + .../oh-my-zsh/themes/edvardm.zsh-theme | 6 + .../oh-my-zsh/themes/emotty.zsh-theme | 113 + .../oh-my-zsh/themes/essembeh.zsh-theme | 50 + .../oh-my-zsh/themes/evan.zsh-theme | 2 + .../oh-my-zsh/themes/fino-time.zsh-theme | 38 + .../oh-my-zsh/themes/fino.zsh-theme | 47 + .../oh-my-zsh/themes/fishy.zsh-theme | 35 + .../oh-my-zsh/themes/flazz.zsh-theme | 19 + .../oh-my-zsh/themes/fletcherm.zsh-theme | 12 + .../oh-my-zsh/themes/fox.zsh-theme | 9 + .../oh-my-zsh/themes/frisk.zsh-theme | 12 + .../oh-my-zsh/themes/frontcube.zsh-theme | 13 + .../oh-my-zsh/themes/funky.zsh-theme | 14 + .../oh-my-zsh/themes/fwalch.zsh-theme | 6 + .../oh-my-zsh/themes/gallifrey.zsh-theme | 11 + .../oh-my-zsh/themes/gallois.zsh-theme | 24 + .../themes/garyblessington.zsh-theme | 6 + .../oh-my-zsh/themes/gentoo.zsh-theme | 30 + .../oh-my-zsh/themes/geoffgarside.zsh-theme | 5 + .../oh-my-zsh/themes/gianu.zsh-theme | 6 + .../oh-my-zsh/themes/gnzh.zsh-theme | 43 + .../oh-my-zsh/themes/gozilla.zsh-theme | 15 + .../oh-my-zsh/themes/half-life.zsh-theme | 97 + .../oh-my-zsh/themes/humza.zsh-theme | 26 + .../oh-my-zsh/themes/imajes.zsh-theme | 5 + .../oh-my-zsh/themes/intheloop.zsh-theme | 23 + .../oh-my-zsh/themes/itchy.zsh-theme | 18 + .../oh-my-zsh/themes/jaischeema.zsh-theme | 12 + .../oh-my-zsh/themes/jbergantine.zsh-theme | 6 + .../oh-my-zsh/themes/jispwoso.zsh-theme | 10 + .../oh-my-zsh/themes/jnrowe.zsh-theme | 37 + .../oh-my-zsh/themes/jonathan.zsh-theme | 124 + .../oh-my-zsh/themes/josh.zsh-theme | 43 + .../oh-my-zsh/themes/jreese.zsh-theme | 14 + .../oh-my-zsh/themes/jtriley.zsh-theme | 2 + .../oh-my-zsh/themes/juanghurtado.zsh-theme | 41 + .../oh-my-zsh/themes/junkfood.zsh-theme | 30 + .../oh-my-zsh/themes/kafeitu.zsh-theme | 6 + .../oh-my-zsh/themes/kardan.zsh-theme | 12 + .../oh-my-zsh/themes/kennethreitz.zsh-theme | 15 + .../oh-my-zsh/themes/kiwi.zsh-theme | 10 + .../oh-my-zsh/themes/kolo.zsh-theme | 24 + .../oh-my-zsh/themes/kphoen.zsh-theme | 43 + .../oh-my-zsh/themes/lambda.zsh-theme | 4 + .../oh-my-zsh/themes/linuxonly.zsh-theme | 58 + .../oh-my-zsh/themes/lukerandall.zsh-theme | 24 + .../oh-my-zsh/themes/macovsky.zsh-theme | 12 + .../oh-my-zsh/themes/maran.zsh-theme | 6 + .../oh-my-zsh/themes/mgutz.zsh-theme | 6 + .../oh-my-zsh/themes/mh.zsh-theme | 24 + .../oh-my-zsh/themes/michelebologna.zsh-theme | 78 + .../oh-my-zsh/themes/mikeh.zsh-theme | 21 + .../oh-my-zsh/themes/miloshadzic.zsh-theme | 8 + .../oh-my-zsh/themes/minimal.zsh-theme | 26 + .../oh-my-zsh/themes/mira.zsh-theme | 23 + .../oh-my-zsh/themes/mlh.zsh-theme | 105 + .../oh-my-zsh/themes/mortalscumbag.zsh-theme | 65 + .../oh-my-zsh/themes/mrtazz.zsh-theme | 7 + .../oh-my-zsh/themes/murilasso.zsh-theme | 14 + .../oh-my-zsh/themes/muse.zsh-theme | 16 + .../oh-my-zsh/themes/nanotech.zsh-theme | 7 + .../oh-my-zsh/themes/nebirhos.zsh-theme | 21 + .../oh-my-zsh/themes/nicoulaj.zsh-theme | 43 + .../oh-my-zsh/themes/norm.zsh-theme | 7 + .../oh-my-zsh/themes/obraun.zsh-theme | 10 + .../oh-my-zsh/themes/peepcode.zsh-theme | 47 + .../oh-my-zsh/themes/philips.zsh-theme | 14 + .../oh-my-zsh/themes/pmcgee.zsh-theme | 16 + .../themes/pygmalion-virtualenv.zsh-theme | 54 + .../oh-my-zsh/themes/pygmalion.zsh-theme | 32 + .../oh-my-zsh/themes/random.zsh-theme | 47 + .../oh-my-zsh/themes/re5et.zsh-theme | 15 + .../oh-my-zsh/themes/refined.zsh-theme | 108 + .../oh-my-zsh/themes/rgm.zsh-theme | 8 + .../oh-my-zsh/themes/risto.zsh-theme | 6 + .../oh-my-zsh/themes/rixius.zsh-theme | 21 + .../oh-my-zsh/themes/rkj-repos.zsh-theme | 35 + .../oh-my-zsh/themes/rkj.zsh-theme | 9 + .../oh-my-zsh/themes/robbyrussell.zsh-theme | 7 + .../oh-my-zsh/themes/sammy.zsh-theme | 6 + .../oh-my-zsh/themes/simonoff.zsh-theme | 99 + .../oh-my-zsh/themes/simple.zsh-theme | 6 + .../oh-my-zsh/themes/skaro.zsh-theme | 7 + .../oh-my-zsh/themes/smt.zsh-theme | 83 + .../oh-my-zsh/themes/sonicradish.zsh-theme | 37 + .../oh-my-zsh/themes/sorin.zsh-theme | 42 + .../oh-my-zsh/themes/sporty_256.zsh-theme | 13 + .../oh-my-zsh/themes/steeef.zsh-theme | 103 + .../oh-my-zsh/themes/strug.zsh-theme | 25 + .../oh-my-zsh/themes/sunaku.zsh-theme | 25 + .../oh-my-zsh/themes/sunrise.zsh-theme | 93 + .../oh-my-zsh/themes/superjarin.zsh-theme | 18 + .../oh-my-zsh/themes/suvash.zsh-theme | 21 + .../themes/symlink_macovsky-ruby.zsh-theme | 1 + .../oh-my-zsh/themes/takashiyoshida.zsh-theme | 27 + .../oh-my-zsh/themes/terminalparty.zsh-theme | 8 + .../oh-my-zsh/themes/theunraveler.zsh-theme | 16 + .../oh-my-zsh/themes/tjkirch.zsh-theme | 15 + .../oh-my-zsh/themes/tjkirch_mod.zsh-theme | 13 + .../oh-my-zsh/themes/tonotdo.zsh-theme | 12 + .../oh-my-zsh/themes/trapd00r.zsh-theme | 132 + .../oh-my-zsh/themes/wedisagree.zsh-theme | 109 + .../oh-my-zsh/themes/wezm+.zsh-theme | 7 + .../oh-my-zsh/themes/wezm.zsh-theme | 7 + .../oh-my-zsh/themes/wuffers.zsh-theme | 5 + .../themes/xiong-chiamiov-plus.zsh-theme | 6 + .../oh-my-zsh/themes/xiong-chiamiov.zsh-theme | 6 + .../oh-my-zsh/themes/ys.zsh-theme | 80 + .../oh-my-zsh/themes/zhann.zsh-theme | 25 + .../oh-my-zsh/tools/check_for_upgrade.sh | 213 + .../oh-my-zsh/tools/executable_changelog.sh | 573 + .../oh-my-zsh/tools/executable_install.sh | 549 + .../tools/executable_require_tool.sh | 161 + .../tools/executable_theme_chooser.sh | 98 + .../oh-my-zsh/tools/executable_upgrade.sh | 284 + .../oh-my-zsh/tools/uninstall.sh | 41 + .../sway/config.d/general/autostart.conf | 3 + .../sway/config.d/mapping/init.conf | 2 + .../sway/config.d/mapping/launch.conf | 5 +- .../sway/config.d/mapping/multimedia.conf | 8 + .../sway/config.d/tools/init.conf | 2 + .../sway/config.d/tools/loader.conf | 20 +- .../sway/config.d/tools/socket.conf | 3 + 1655 files changed, 163633 insertions(+), 8 deletions(-) create mode 100644 private_dot_config/alacritty/middle.toml create mode 100644 private_dot_config/alacritty/small.toml create mode 100644 private_dot_config/environment.d/ssh_auth_socket.conf create mode 100644 private_dot_config/oh-my-zsh/CODE_OF_CONDUCT.md create mode 100644 private_dot_config/oh-my-zsh/CONTRIBUTING.md create mode 100644 private_dot_config/oh-my-zsh/LICENSE.txt create mode 100644 private_dot_config/oh-my-zsh/README.md create mode 100644 private_dot_config/oh-my-zsh/SECURITY.md create mode 100644 private_dot_config/oh-my-zsh/cache/completions/.keep create mode 100644 private_dot_config/oh-my-zsh/cache/dot_zsh-update create mode 100644 private_dot_config/oh-my-zsh/cache/empty_dot_gitkeep create mode 100644 private_dot_config/oh-my-zsh/cache/grep-alias create mode 100644 private_dot_config/oh-my-zsh/custom/example.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/plugins/example/example.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/example.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/LICENSE create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/Makefile create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/README.md create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-classic.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean-8colors.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-pure.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-rainbow.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-robbyrussell.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/HEAD create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/branches/.keep create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/config create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/description create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_post-update.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-commit.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-push.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-rebase.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-receive.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_update.sample create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/index create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/info/exclude create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/HEAD create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/info/.keep create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.idx create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.pack create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.rev create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/packed-refs create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/tags/.keep create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/shallow create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitattributes create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/font.md create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/LICENSE create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/Makefile create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/README.md create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/build.info create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/deps/empty_dot_gitkeep create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/docs/listdir.md create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_clang-format create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitattributes create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/c_cpp_properties.json create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/settings.json create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_build create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_install create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_mbuild create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.sh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.sh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install.info create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/readonly_gitstatus.plugin.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/readonly_install.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/algorithm.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/bits.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/check.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/check_dir_mtime.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/check_dir_mtime.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/dir.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/dir.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/git.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/git.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/gitstatus.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/index.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/index.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/logging.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/logging.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/options.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/options.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/print.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/repo.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/repo.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/repo_cache.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/repo_cache.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/request.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/request.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/response.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/response.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/scope_guard.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/serialization.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/stat.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/string_cmp.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/string_view.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/strings.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/strings.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/tag_db.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/tag_db.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/thread_pool.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/thread_pool.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/time.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/timer.cc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/timer.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/tribool.h create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/usrbin/empty_dot_gitkeep create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/configure.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/icons.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/notes.md create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/p10k.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/parser.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/readonly_configure.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/readonly_icons.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/readonly_p10k.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/readonly_parser.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/readonly_worker.zsh.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/wizard.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/internal/worker.zsh create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/powerlevel10k.png create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/powerlevel10k.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/powerlevel9k.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/prompt_powerlevel10k_setup create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/prompt_powerlevel9k_setup create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/readonly_powerlevel10k.zsh-theme.zwc create mode 100644 private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/readonly_powerlevel9k.zsh-theme.zwc create mode 100644 private_dot_config/oh-my-zsh/dot_editorconfig create mode 100644 private_dot_config/oh-my-zsh/dot_git/FETCH_HEAD create mode 100644 private_dot_config/oh-my-zsh/dot_git/HEAD create mode 100644 private_dot_config/oh-my-zsh/dot_git/ORIG_HEAD create mode 100644 private_dot_config/oh-my-zsh/dot_git/branches/.keep create mode 100644 private_dot_config/oh-my-zsh/dot_git/config create mode 100644 private_dot_config/oh-my-zsh/dot_git/description create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_post-update.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-commit.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-push.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-rebase.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_pre-receive.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/hooks/executable_update.sample create mode 100644 private_dot_config/oh-my-zsh/dot_git/index create mode 100644 private_dot_config/oh-my-zsh/dot_git/info/exclude create mode 100644 private_dot_config/oh-my-zsh/dot_git/logs/HEAD create mode 100644 private_dot_config/oh-my-zsh/dot_git/logs/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/dot_git/logs/refs/remotes/origin/master create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/12/readonly_71d62cbe3edd71847959a7e0f1065e47c0d978 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/23/readonly_c7887cfef4720e14428d6d8c0fb5f5a5fef3cd create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/25/readonly_cf3e7ee0b44d465d85f8ca17e48327fc6dea0e create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/32/readonly_71d61a99a52cb4196898c09967a71708c85b34 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/43/readonly_cc1e7f7ef3d011de4b628502df39949c981384 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/53/readonly_b68ea01d1a3e59e8cd72251167d746a80cb8c4 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/70/readonly_29a7800179bb7a245895fbfe6d28905e7ffb1b create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/7d/readonly_2aedf199d1e27b6bea8ab33212043b055b3715 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/93/readonly_954b4763c455070572c7df90fdbf6ef18e72d2 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/97/readonly_3c0b75d5c454073d731a52a86097c9128d733d create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/a9/readonly_d38f59148cf3f1340eeeaa7190690d59e3d06f create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/b3/readonly_554e3aa94e58875d163b76e280afb4d0fb365b create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/b8/readonly_1915d3293cc4657cec64202b9fd991b96b4ba2 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/cc/readonly_ca5468484d4afd37b1ed74fc6eeb052065f090 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/eb/readonly_6cd121aebf03d322266cdba948e75ea8957768 create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/fc/readonly_9a9f005c0403788a97cb65d90c41e5b343034f create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/fd/readonly_219a94ab585fa699a0e842335a9f33dcbb613b create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/info/.keep create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/pack/readonly_pack-a7845062a36c32bd28a540c57e229846dca7e76e.idx create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/pack/readonly_pack-a7845062a36c32bd28a540c57e229846dca7e76e.pack create mode 100644 private_dot_config/oh-my-zsh/dot_git/objects/pack/readonly_pack-a7845062a36c32bd28a540c57e229846dca7e76e.rev create mode 100644 private_dot_config/oh-my-zsh/dot_git/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/dot_git/refs/remotes/origin/master create mode 100644 private_dot_config/oh-my-zsh/dot_git/refs/tags/.keep create mode 100644 private_dot_config/oh-my-zsh/dot_git/shallow create mode 100644 private_dot_config/oh-my-zsh/dot_github/CODEOWNERS create mode 100644 private_dot_config/oh-my-zsh/dot_github/FUNDING.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/ISSUE_TEMPLATE/bug_report_omz.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/ISSUE_TEMPLATE/config.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/PULL_REQUEST_TEMPLATE.md create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/installer.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/installer/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/installer/dot_vercelignore create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/installer/vercel.json create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/main.yml create mode 100644 private_dot_config/oh-my-zsh/dot_github/workflows/project.yml create mode 100644 private_dot_config/oh-my-zsh/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/dot_gitpod.Dockerfile create mode 100644 private_dot_config/oh-my-zsh/dot_gitpod.yml create mode 100644 private_dot_config/oh-my-zsh/dot_prettierrc create mode 100644 private_dot_config/oh-my-zsh/lib/bzr.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/cli.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/clipboard.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/compfix.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/completion.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/correction.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/diagnostics.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/directories.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/functions.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/git.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/grep.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/history.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/key-bindings.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/misc.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/nvm.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/prompt_info_functions.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/spectrum.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/termsupport.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/theme-and-appearance.zsh create mode 100644 private_dot_config/oh-my-zsh/lib/vcs_info.zsh create mode 100644 private_dot_config/oh-my-zsh/log/empty_dot_gitkeep create mode 100644 private_dot_config/oh-my-zsh/oh-my-zsh.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/1password/1password.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/1password/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/1password/_opswd create mode 100644 private_dot_config/oh-my-zsh/plugins/1password/opswd create mode 100644 private_dot_config/oh-my-zsh/plugins/adb/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/adb/_adb create mode 100644 private_dot_config/oh-my-zsh/plugins/ag/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ag/_ag create mode 100644 private_dot_config/oh-my-zsh/plugins/alias-finder/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/alias-finder/alias-finder.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/aliases/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/aliases/aliases.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/aliases/cheatsheet.py create mode 100644 private_dot_config/oh-my-zsh/plugins/aliases/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/plugins/aliases/termcolor.py create mode 100644 private_dot_config/oh-my-zsh/plugins/ansible/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ansible/ansible.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ant/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ant/_ant create mode 100644 private_dot_config/oh-my-zsh/plugins/ant/ant.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/apache2-macports/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/apache2-macports/apache2-macports.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/arcanist/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/arcanist/arcanist.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/archlinux/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/archlinux/archlinux.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/argocd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/argocd/argocd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/asdf/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/asdf/asdf.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/autoenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/autoenv/autoenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/autojump/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/autojump/autojump.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/autopep8/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/autopep8/_autopep8 create mode 100644 private_dot_config/oh-my-zsh/plugins/aws/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/aws/aws.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/azure/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/azure/azure.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/battery/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/battery/battery.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/bazel/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bazel/_bazel create mode 100644 private_dot_config/oh-my-zsh/plugins/bbedit/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bbedit/bbedit.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/bedtools/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bedtools/_bedtools create mode 100644 private_dot_config/oh-my-zsh/plugins/bgnotify/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bgnotify/bgnotify.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/bower/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bower/_bower create mode 100644 private_dot_config/oh-my-zsh/plugins/bower/bower.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/branch/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/branch/branch.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/brew/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/brew/brew.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/bridgetown/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bridgetown/bridgetown.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/bundler/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/bundler/_bundler create mode 100644 private_dot_config/oh-my-zsh/plugins/bundler/bundler.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cabal/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cabal/cabal.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cake/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cake/cake.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cakephp3/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cakephp3/cakephp3.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/capistrano/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/capistrano/_capistrano create mode 100644 private_dot_config/oh-my-zsh/plugins/capistrano/capistrano.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cask/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cask/cask.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/catimg/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/catimg/catimg.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/catimg/catimg.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/catimg/colors.png create mode 100644 private_dot_config/oh-my-zsh/plugins/celery/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/celery/_celery create mode 100644 private_dot_config/oh-my-zsh/plugins/charm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/charm/charm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/chruby/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/chruby/chruby.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/chucknorris/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/chucknorris/chucknorris.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/chucknorris/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/plugins/chucknorris/fortunes/chucknorris create mode 100644 private_dot_config/oh-my-zsh/plugins/cloudfoundry/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cloudfoundry/cloudfoundry.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/codeclimate/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/codeclimate/_codeclimate create mode 100644 private_dot_config/oh-my-zsh/plugins/coffee/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/coffee/_coffee create mode 100644 private_dot_config/oh-my-zsh/plugins/coffee/coffee.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/colemak/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/colemak/colemak-less create mode 100644 private_dot_config/oh-my-zsh/plugins/colemak/colemak.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/colemak/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/plugins/colored-man-pages/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/colored-man-pages/colored-man-pages.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/colored-man-pages/executable_nroff create mode 100644 private_dot_config/oh-my-zsh/plugins/colorize/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/colorize/colorize.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/command-not-found/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/command-not-found/command-not-found.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/common-aliases/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/common-aliases/common-aliases.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/compleat/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/compleat/compleat.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/composer/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/composer/composer.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/copybuffer/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/copybuffer/copybuffer.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/copyfile/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/copyfile/copyfile.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/copypath/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/copypath/copypath.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cp/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cp/cp.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/cpanm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/cpanm/_cpanm create mode 100644 private_dot_config/oh-my-zsh/plugins/dash/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dash/dash.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dbt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dbt/dbt.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/debian/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/debian/debian.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/deno/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/deno/deno.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dircycle/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dircycle/dircycle.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/direnv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/direnv/direnv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dirhistory/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dirhistory/dirhistory.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dirpersist/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dirpersist/dirpersist.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dnf/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dnf/dnf.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dnote/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dnote/_dnote create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-compose/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-compose/_docker-compose create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-compose/docker-compose.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-machine/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-machine/_docker-machine create mode 100644 private_dot_config/oh-my-zsh/plugins/docker-machine/docker-machine.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/docker/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/docker/completions/_docker create mode 100644 private_dot_config/oh-my-zsh/plugins/docker/docker.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/doctl/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/doctl/doctl.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dotenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dotenv/dotenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/dotnet/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/dotnet/dotnet.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/droplr/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/droplr/droplr.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/drush/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/drush/drush.complete.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/drush/drush.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/eecms/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/eecms/eecms.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emacs/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/emacs/emacs.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emacs/executable_emacsclient.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/ember-cli/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ember-cli/_ember-cli create mode 100644 private_dot_config/oh-my-zsh/plugins/ember-cli/ember-cli.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji-clock/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji-clock/emoji-clock.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/emoji-char-definitions.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/emoji-data.txt create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/emoji.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/gemoji_db.json create mode 100644 private_dot_config/oh-my-zsh/plugins/emoji/update_emoji.py create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_emoji_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_floral_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_love_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_nature_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_stellar_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/emotty/emotty_zodiac_set.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/encode64/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/encode64/encode64.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/extract/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/extract/_extract create mode 100644 private_dot_config/oh-my-zsh/plugins/extract/extract.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fabric/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fabric/_fab create mode 100644 private_dot_config/oh-my-zsh/plugins/fabric/empty_fabric.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fancy-ctrl-z/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fasd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fasd/fasd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fastfile/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fastfile/fastfile.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fbterm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fbterm/fbterm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fd/_fd create mode 100644 private_dot_config/oh-my-zsh/plugins/fig/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fig/fig.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/firewalld/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/firewalld/firewalld.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/flutter/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/flutter/flutter.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fluxcd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fluxcd/fluxcd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fnm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fnm/fnm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/forklift/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/forklift/forklift.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fossil/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fossil/_fossil create mode 100644 private_dot_config/oh-my-zsh/plugins/fossil/fossil.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/frontend-search/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/frontend-search/_frontend create mode 100644 private_dot_config/oh-my-zsh/plugins/frontend-search/frontend-search.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/fzf/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/fzf/fzf.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gas/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gas/_gas create mode 100644 private_dot_config/oh-my-zsh/plugins/gatsby/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gatsby/_gatsby create mode 100644 private_dot_config/oh-my-zsh/plugins/gcloud/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gcloud/gcloud.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/geeknote/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/geeknote/_geeknote create mode 100644 private_dot_config/oh-my-zsh/plugins/geeknote/geeknote.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gem/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gem/_gem create mode 100644 private_dot_config/oh-my-zsh/plugins/gem/gem.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/genpass/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/genpass/executable_genpass-apple create mode 100644 private_dot_config/oh-my-zsh/plugins/genpass/executable_genpass-monkey create mode 100644 private_dot_config/oh-my-zsh/plugins/genpass/executable_genpass-xkcd create mode 100644 private_dot_config/oh-my-zsh/plugins/genpass/genpass.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gh/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gh/gh.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-auto-fetch/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-auto-fetch/git-auto-fetch.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-escape-magic/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-escape-magic/git-escape-magic create mode 100644 private_dot_config/oh-my-zsh/plugins/git-escape-magic/git-escape-magic.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-extras/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-extras/git-extras.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-flow-avh/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-flow-avh/git-flow-avh.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-flow/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-flow/_git-flow create mode 100644 private_dot_config/oh-my-zsh/plugins/git-flow/git-flow.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-hubflow/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-hubflow/git-hubflow.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-lfs/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-lfs/git-lfs.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-prompt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git-prompt/git-prompt.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/git-prompt/gitstatus.py create mode 100644 private_dot_config/oh-my-zsh/plugins/git/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/git/git.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/_git create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/executable_update create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/git-completion.bash create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/git-prompt.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/gitfast/gitfast.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/github/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/github/_hub create mode 100644 private_dot_config/oh-my-zsh/plugins/github/github.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gitignore/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gitignore/gitignore.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/glassfish/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/glassfish/_asadmin create mode 100644 private_dot_config/oh-my-zsh/plugins/glassfish/empty_glassfish.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/globalias/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/globalias/globalias.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gnu-utils/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gnu-utils/gnu-utils.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/golang/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/golang/_golang create mode 100644 private_dot_config/oh-my-zsh/plugins/golang/golang.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/golang/templates/empty_search.txt create mode 100644 private_dot_config/oh-my-zsh/plugins/golang/templates/package.txt create mode 100644 private_dot_config/oh-my-zsh/plugins/gpg-agent/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gpg-agent/gpg-agent.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gradle/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gradle/_gradle create mode 100644 private_dot_config/oh-my-zsh/plugins/gradle/gradle.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/grails/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/grails/grails.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/grc/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/grc/grc.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/grunt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/grunt/grunt.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/gulp/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/gulp/gulp.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/hanami/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/hanami/hanami.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/hasura/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/hasura/hasura.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/helm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/helm/helm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/heroku-alias/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/heroku-alias/heroku.alias.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/heroku/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/heroku/heroku.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/history-substring-search/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/history-substring-search/executable_update-from-upstream.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/history-substring-search/history-substring-search.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/history-substring-search/history-substring-search.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/history/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/history/history.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/hitchhiker/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/hitchhiker/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/plugins/hitchhiker/fortunes/hitchhiker create mode 100644 private_dot_config/oh-my-zsh/plugins/hitchhiker/hitchhiker.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/hitokoto/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/hitokoto/hitokoto.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/homestead/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/homestead/homestead.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/httpie/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/httpie/_httpie create mode 100644 private_dot_config/oh-my-zsh/plugins/invoke/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/invoke/invoke.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ionic/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ionic/ionic.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ipfs/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/ipfs/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ipfs/_ipfs create mode 100644 private_dot_config/oh-my-zsh/plugins/isodate/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/isodate/isodate.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/istioctl/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/istioctl/istioctl.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/iterm2/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/iterm2/executable_update create mode 100644 private_dot_config/oh-my-zsh/plugins/iterm2/iterm2.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/iterm2/iterm2_shell_integration.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jake-node/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jake-node/jake-node.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jenv/jenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jfrog/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jfrog/jfrog.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jhbuild/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jhbuild/jhbuild.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jira/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jira/_jira create mode 100644 private_dot_config/oh-my-zsh/plugins/jira/jira.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jruby/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jruby/jruby.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jsontools/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jsontools/jsontools.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/juju/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/juju/juju.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/jump/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/jump/jump.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kate/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kate/kate.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/keychain/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/keychain/keychain.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kitchen/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kitchen/_kitchen create mode 100644 private_dot_config/oh-my-zsh/plugins/kn/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kn/kn.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/knife/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/knife/_knife create mode 100644 private_dot_config/oh-my-zsh/plugins/knife_ssh/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/knife_ssh/knife_ssh.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kops/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kops/kops.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kube-ps1/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kube-ps1/kube-ps1.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectl/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectl/kubectl.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectx/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectx/kubectx.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectx/prod.png create mode 100644 private_dot_config/oh-my-zsh/plugins/kubectx/stage.png create mode 100644 private_dot_config/oh-my-zsh/plugins/lando/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/lando/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lando/lando.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel/_artisan create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel/laravel.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel4/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel4/laravel4.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel5/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/laravel5/laravel5.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/last-working-dir/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/last-working-dir/last-working-dir.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/lein/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lein/_lein create mode 100644 private_dot_config/oh-my-zsh/plugins/lighthouse/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lighthouse/lighthouse.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/lol/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lol/lol.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/lpass/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lpass/_lpass create mode 100644 private_dot_config/oh-my-zsh/plugins/lxd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/lxd/lxd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/macos/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/macos/_security create mode 100644 private_dot_config/oh-my-zsh/plugins/macos/macos.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/macos/music create mode 100644 private_dot_config/oh-my-zsh/plugins/macos/spotify create mode 100644 private_dot_config/oh-my-zsh/plugins/macports/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/macports/_port create mode 100644 private_dot_config/oh-my-zsh/plugins/macports/macports.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/magic-enter/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/magic-enter/magic-enter.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/man/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/man/man.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/marked2/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/marked2/marked2.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/marktext/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/marktext/marktext.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mercurial/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mercurial/mercurial.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/meteor/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/meteor/_meteor create mode 100644 private_dot_config/oh-my-zsh/plugins/meteor/meteor.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/microk8s/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/microk8s/microk8s.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/minikube/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/minikube/minikube.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mix-fast/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mix-fast/mix-fast.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mix/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mix/_mix create mode 100644 private_dot_config/oh-my-zsh/plugins/mongo-atlas/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mongo-atlas/mongo-atlas.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mongocli/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mongocli/mongocli.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mosh/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mosh/mosh.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/multipass/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/multipass/_multipass create mode 100644 private_dot_config/oh-my-zsh/plugins/multipass/multipass.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mvn/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mvn/mvn.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/mysql-macports/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/mysql-macports/mysql-macports.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/n98-magerun/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/n98-magerun/n98-magerun.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/nanoc/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nanoc/_nanoc create mode 100644 private_dot_config/oh-my-zsh/plugins/nanoc/nanoc.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/nats/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nats/nats.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ng/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ng/_ng create mode 100644 private_dot_config/oh-my-zsh/plugins/nmap/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nmap/nmap.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/node/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/node/node.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/nodenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nodenv/nodenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/nomad/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nomad/_nomad create mode 100644 private_dot_config/oh-my-zsh/plugins/npm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/npm/npm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/nvm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/nvm/_nvm create mode 100644 private_dot_config/oh-my-zsh/plugins/nvm/nvm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/oc/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/oc/oc.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/octozen/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/octozen/octozen.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/operator-sdk/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/operator-sdk/operator-sdk.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/otp/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/otp/otp.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pass/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pass/_pass create mode 100644 private_dot_config/oh-my-zsh/plugins/paver/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/paver/paver.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pep8/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pep8/_pep8 create mode 100644 private_dot_config/oh-my-zsh/plugins/per-directory-history/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/per-directory-history/per-directory-history.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/per-directory-history/symlink_per-directory-history.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/percol/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/percol/percol.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/perl/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/perl/perl.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/perms/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/perms/perms.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/phing/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/phing/phing.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pip/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pip/_pip create mode 100644 private_dot_config/oh-my-zsh/plugins/pip/pip.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pipenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pipenv/pipenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pj/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pj/pj.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/please/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/please/please.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pm2/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pm2/_pm2 create mode 100644 private_dot_config/oh-my-zsh/plugins/pm2/pm2.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pod/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pod/_pod create mode 100644 private_dot_config/oh-my-zsh/plugins/poetry/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/poetry/poetry.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/postgres/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/postgres/postgres.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pow/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pow/pow.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/powder/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/powder/_powder create mode 100644 private_dot_config/oh-my-zsh/plugins/powify/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/powify/_powify create mode 100644 private_dot_config/oh-my-zsh/plugins/pre-commit/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pre-commit/pre-commit.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/profiles/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/profiles/profiles.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pyenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pyenv/pyenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/pylint/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/pylint/_pylint create mode 100644 private_dot_config/oh-my-zsh/plugins/pylint/pylint.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/python/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/python/python.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/qrcode/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/qrcode/qrcode.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rails/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rails/_rails create mode 100644 private_dot_config/oh-my-zsh/plugins/rails/rails.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rake-fast/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rake-fast/rake-fast.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rake/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rake/rake.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rand-quote/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rand-quote/rand-quote.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rbenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rbenv/rbenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rbfu/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rbfu/rbfu.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rbw/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rbw/rbw.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/react-native/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/react-native/_react-native create mode 100644 private_dot_config/oh-my-zsh/plugins/react-native/react-native.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rebar/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rebar/_rebar create mode 100644 private_dot_config/oh-my-zsh/plugins/redis-cli/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/redis-cli/_redis-cli create mode 100644 private_dot_config/oh-my-zsh/plugins/repo/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/repo/_repo create mode 100644 private_dot_config/oh-my-zsh/plugins/repo/repo.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ripgrep/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ripgrep/_ripgrep create mode 100644 private_dot_config/oh-my-zsh/plugins/ros/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ros/_ros create mode 100644 private_dot_config/oh-my-zsh/plugins/rsync/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rsync/rsync.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ruby/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ruby/ruby.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rust/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rust/_rustc create mode 100644 private_dot_config/oh-my-zsh/plugins/rust/rust.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/rvm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/rvm/rvm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/safe-paste/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/safe-paste/safe-paste.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/salt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/salt/_salt create mode 100644 private_dot_config/oh-my-zsh/plugins/samtools/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/samtools/_samtools create mode 100644 private_dot_config/oh-my-zsh/plugins/sbt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sbt/_sbt create mode 100644 private_dot_config/oh-my-zsh/plugins/sbt/sbt.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/scala/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/scala/_scala create mode 100644 private_dot_config/oh-my-zsh/plugins/scd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/scd/_scd create mode 100644 private_dot_config/oh-my-zsh/plugins/scd/executable_scd create mode 100644 private_dot_config/oh-my-zsh/plugins/scd/scd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/screen/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/screen/screen.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/scw/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/scw/_scw create mode 100644 private_dot_config/oh-my-zsh/plugins/sdk/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sdk/sdk.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/sfdx/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sfdx/_sfdx create mode 100644 private_dot_config/oh-my-zsh/plugins/sfffe/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sfffe/sfffe.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/dot_editorconfig create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/executable_proxy.py create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/executable_ssh-agent.py create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/executable_ssh-proxy.py create mode 100644 private_dot_config/oh-my-zsh/plugins/shell-proxy/shell-proxy.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/shrink-path/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/shrink-path/shrink-path.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/sigstore/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sigstore/sigstore.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/singlechar/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/singlechar/singlechar.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/skaffold/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/skaffold/skaffold.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/spring/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/spring/_spring create mode 100644 private_dot_config/oh-my-zsh/plugins/sprunge/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sprunge/sprunge.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ssh-agent/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ssh-agent/ssh-agent.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/stack/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/stack/stack.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/starship/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/starship/starship.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/sublime-merge/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sublime-merge/sublime-merge.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/sublime/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sublime/sublime.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/sudo/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/sudo/sudo.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/supervisor/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/supervisor/_supervisorctl create mode 100644 private_dot_config/oh-my-zsh/plugins/supervisor/_supervisord create mode 100644 private_dot_config/oh-my-zsh/plugins/supervisor/supervisor.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/suse/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/suse/suse.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/svcat/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/svcat/svcat.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/svn-fast-info/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/svn-fast-info/svn-fast-info.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/svn/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/svn/svn.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/swiftpm/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/swiftpm/_swift create mode 100644 private_dot_config/oh-my-zsh/plugins/swiftpm/swiftpm.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/symfony/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/symfony/symfony.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/symfony2/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/symfony2/symfony2.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/systemadmin/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/systemadmin/systemadmin.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/systemd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/systemd/systemd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/taskwarrior/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/taskwarrior/_task create mode 100644 private_dot_config/oh-my-zsh/plugins/taskwarrior/taskwarrior.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/term_tab/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/term_tab/term_tab.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/terminitor/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/terminitor/_terminitor create mode 100644 private_dot_config/oh-my-zsh/plugins/terraform/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/terraform/_terraform create mode 100644 private_dot_config/oh-my-zsh/plugins/terraform/terraform.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/textastic/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/textastic/textastic.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/textmate/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/textmate/textmate.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/thefuck/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/thefuck/thefuck.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/themes/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/themes/themes.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/thor/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/thor/_thor create mode 100644 private_dot_config/oh-my-zsh/plugins/tig/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/tig/tig.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/timer/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/timer/timer.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux-cssh/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux-cssh/_tmux-cssh create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux/tmux.extra.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux/tmux.only.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/tmux/tmux.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/tmuxinator/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/tmuxinator/_tmuxinator create mode 100644 private_dot_config/oh-my-zsh/plugins/tmuxinator/tmuxinator.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/toolbox/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/toolbox/toolbox.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/torrent/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/torrent/torrent.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/transfer/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/transfer/transfer.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/tugboat/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/tugboat/_tugboat create mode 100644 private_dot_config/oh-my-zsh/plugins/ubuntu/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ubuntu/ubuntu.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/ufw/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/ufw/_ufw create mode 100644 private_dot_config/oh-my-zsh/plugins/universalarchive/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/universalarchive/_universalarchive create mode 100644 private_dot_config/oh-my-zsh/plugins/universalarchive/universalarchive.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/urltools/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/urltools/urltools.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vagrant-prompt/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vagrant-prompt/vagrant-prompt.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vagrant/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vagrant/_vagrant create mode 100644 private_dot_config/oh-my-zsh/plugins/vagrant/vagrant.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vault/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vault/_vault create mode 100644 private_dot_config/oh-my-zsh/plugins/vi-mode/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vi-mode/vi-mode.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vim-interaction/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vim-interaction/vim-interaction.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/virtualenv/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/virtualenv/virtualenv.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/virtualenvwrapper/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/volta/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/volta/volta.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vscode/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vscode/vscode.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/vundle/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/vundle/vundle.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/wakeonlan/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/wakeonlan/_wake create mode 100644 private_dot_config/oh-my-zsh/plugins/wakeonlan/wakeonlan.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/watson/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/watson/_watson create mode 100644 private_dot_config/oh-my-zsh/plugins/wd/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/wd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/wd/_wd.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/wd/wd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/wd/wd.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/web-search/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/web-search/web-search.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/wp-cli/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/wp-cli/wp-cli.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/xcode/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/xcode/_xcselv create mode 100644 private_dot_config/oh-my-zsh/plugins/xcode/xcode.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/yarn/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/yarn/_yarn create mode 100644 private_dot_config/oh-my-zsh/plugins/yarn/yarn.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/yii/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/yii/yii.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/yii2/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/yii2/yii2.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/yum/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/yum/yum.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/z/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/z/MANUAL.md create mode 100644 private_dot_config/oh-my-zsh/plugins/z/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/z/_z create mode 100644 private_dot_config/oh-my-zsh/plugins/z/img/mit_license.svg create mode 100644 private_dot_config/oh-my-zsh/plugins/z/img/zsh_4.3.11_plus.svg create mode 100644 private_dot_config/oh-my-zsh/plugins/z/z.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zbell/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zbell/zbell.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zeus/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zeus/_zeus create mode 100644 private_dot_config/oh-my-zsh/plugins/zeus/zeus.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zoxide/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zoxide/zoxide.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/CHANGELOG.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/DESCRIPTION create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/Dockerfile create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/Gemfile create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/Gemfile.lock create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/INSTALL.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/Makefile create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/URL create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/VERSION create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/ZSH_VERSIONS create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_circleci/config.yml create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_editorconfig create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/branches/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/config create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/description create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_post-update.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-commit.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-push.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-rebase.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_pre-receive.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/hooks/executable_update.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/index create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/info/exclude create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/logs/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/logs/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/objects/info/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/objects/pack/readonly_pack-8215f612b315ae46f4238175692f1771d3bccd8e.idx create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/objects/pack/readonly_pack-8215f612b315ae46f4238175692f1771d3bccd8e.pack create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/objects/pack/readonly_pack-8215f612b315ae46f4238175692f1771d3bccd8e.rev create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/packed-refs create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_git/refs/tags/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_github/ISSUE_TEMPLATE/bug-report.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_github/ISSUE_TEMPLATE/feature_request.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_rspec create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_rubocop.yml create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/dot_ruby-version create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/executable_install_test_zsh.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/async_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/auto_cd_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/bracketed_paste_magic_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/client_zpty_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/glob_subst_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/rebound_bracket_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/vi_mode_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/wrapped_widget_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/integrations/zle_input_stack_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/kill_ring_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/line_init_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/multi_line_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/options/buffer_max_size_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/options/highlight_style_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/options/original_widget_prefix_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/options/strategy_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/options/widget_lists_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/spec_helper.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/strategies/completion_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/strategies/history_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/strategies/match_prev_cmd_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/strategies/special_characters_helper.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/terminal_session.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/widgets/disable_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/widgets/enable_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/widgets/fetch_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/spec/widgets/toggle_spec.rb create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/async.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/bind.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/config.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/fetch.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/highlight.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/start.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/strategies/completion.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/strategies/history.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/strategies/match_prev_cmd.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/util.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/src/widgets.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-interactive-cd/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-interactive-cd/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-interactive-cd/demo.gif create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-interactive-cd/zsh-interactive-cd.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/LICENSE create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/Makefile create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/NEWS create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/_n-kill create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/doc/executable_generate_single_file create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/doc/executable_install.sh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/doc/executable_znt-tmux.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/doc/img/n-history2.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/doc/n-preview create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-aliases.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-cd.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-env.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-functions.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-history.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-kill.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-list.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-options.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/dot_config/znt/n-panelize.conf create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-aliases create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-cd create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-env create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-functions create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-help create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-history create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-kill create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-list create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-list-draw create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-list-input create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-options create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/n-panelize create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/znt-cd-widget create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/znt-history-widget create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/znt-kill-widget create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/znt-usetty-wrapper create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-navigation-tools/zsh-navigation-tools.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/COPYING.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/HACKING.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/INSTALL.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/Makefile create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/changelog.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/brackets.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/cursor.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/line.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/main.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/pattern.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/regexp.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/docs/highlighters/root.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_editorconfig create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/branches/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/config create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/description create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_applypatch-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_fsmonitor-watchman.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_post-update.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-applypatch.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-commit.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-merge-commit.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-push.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-rebase.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_pre-receive.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_prepare-commit-msg.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_push-to-checkout.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_sendemail-validate.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/hooks/executable_update.sample create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/index create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/info/exclude create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/logs/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/logs/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/objects/info/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/objects/pack/readonly_pack-967f990e2e27aeabc7f80a8f0fd857b0823334ac.idx create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/objects/pack/readonly_pack-967f990e2e27aeabc7f80a8f0fd857b0823334ac.pack create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/objects/pack/readonly_pack-967f990e2e27aeabc7f80a8f0fd857b0823334ac.rev create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/packed-refs create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/refs/heads/master create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/refs/remotes/origin/HEAD create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_git/refs/tags/.keep create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_gitattributes create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_github/workflows/test.yml create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_gitignore create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_revision-hash create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/dot_version create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/brackets-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/cursor-matchingbracket-line-finish.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/cursor-matchingbracket.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/empty-styles.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/loop-styles.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/mismatch-patentheses.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/near-quotes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/nested-parentheses.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/only-error.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/quoted-patentheses.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/simple-parentheses.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/unclosed-patentheses.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/brackets/test-data/unclosed-patentheses2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/cursor/cursor-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/cursor/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/line/line-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/line/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/main-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position1b.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position3b.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/abspath-in-command-position5.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-assignment1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-basic.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-brackets.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-command-substitution.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-comment1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-comment2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-complex.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-empty.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-eponymous1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-eponymous2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-in-cmdsubst.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-loop.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-loop2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-nested-precommand.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-nested.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-parameter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-precommand-option-argument1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-precommand-option-argument2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-precommand-option-argument3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-precommand-option-argument4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-quoted.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-redirect.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-reuse1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-reuse2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-reuse3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-reuse4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-reuse5.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-self.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-self2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-to-dir.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-to-dir1b.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-unknown-token1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias-unknown-token2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/alias.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/always1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/always2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/always3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/anonymous-function.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arg0-colon.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arith-cmdsubst-mess.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arith1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arith2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-command-substitution.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-doubled-parens.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-empty.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-evaluation.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-hist-expn.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-invalid-chars.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-multiplication.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-nested.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-quoted.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-unclosed.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/arithmetic-unfinished.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/array-cmdsep1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/array-cmdsep2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/array-cmdsep3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-append.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-argv.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-array.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-array2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-array3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-invalid-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-not-array.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-not-array2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-quoted-cmdsubst.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-semicolon.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-subshell.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-value-quote1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign-value-quote2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assign.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-before-resword1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-before-resword2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-before-resword3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-before-resword4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-before-resword5.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/assignment-quoted.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/back-quoted-argument.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/back-quoted-open.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/backslash-continuation.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/backslash-continuation2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/backslash-space.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/backslash.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/bang-assign-array.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/bang-assign-scalar.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/bang-pipeline.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/block-assignment-no-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/braces1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/braces2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-matching1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-matching2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch10-if-negative.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch5.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch6.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch7.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch8-if-positive.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch8.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-mismatch9-if-positive.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/brackets-premature-termination.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/cdpath-abspath.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/cmdpos-elision-partial.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/command-substitution-adjacent.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/command-substitution-in-assignment.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/command-substitution-unclosed.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/commandseparator.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/comment-followed.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/comment-leading.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/comment-off.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/comments.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/commmand-parameter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/control-flow.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/control-flow2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/control-flow3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/cthulhu.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dinbrack1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dirs_blacklist.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-dollar.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-noise.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-paren.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-quoted.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-quoted2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/dollar-quoted3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/double-hyphen-option.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/double-quoted.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/double-quoted2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/double-quoted3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/double-quoted4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/empty-command-newline.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/empty-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/empty-command2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/empty-line.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/equals1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/equals2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/equals3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/equals4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/escaped-single-quote.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/exec-redirection1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/fd-target-not-filename.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/function-altsyntax.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/function-named1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/function-named2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/function.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/glob.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/global-alias1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/globs-with-quoting.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/hashed-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-double-quoted-escaped.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-double-quoted-followed.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-double-quoted-no.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-double-quoted-unescaped.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-double-quoted-yes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-expansion.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/history-expansion2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/inheritance.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/jobsubst-isnt-glob.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/jobsubst-isnt-glob2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/loop-newline.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/meta-no-eval1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/meta-no-eval2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multiline-array-assignment1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multiline-string.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multiline-string2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multios-negates-globbing.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multios-negates-globbing2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multiple-quotes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/multiple-redirections.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob-alias.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob-always.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/noglob4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/null-exec.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/null-exec2-printenv.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/number_range-glob.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/off-by-one.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/opt-shwordsplit1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/optimized-cmdsubst-input.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/option-dollar-quote-isnt-filename.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/option-path_dirs.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/option-with-quotes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/order-path-after-dollar.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/order-path-before-globbing.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/param-positional-in-array-append.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/param-precommand-option-argument1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/param-precommand-option-argument3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-elision-command-word.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-expansion-shwordsplit.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-expansion-untokenized1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-expansion-untokenized2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-star.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-to-global-alias.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-value-contains-command-position1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/parameter-value-contains-command-position2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/pasted-quotes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-broken-symlink.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-dollared-word.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-dollared-word2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-dollared-word3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-dollared-word3b.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-dollared-word4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-mixed-quoting.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-separators.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-separators2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-space.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-tilde-home.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-tilde-home2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-tilde-home3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path-tilde-named.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path_prefix.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path_prefix2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/path_prefix3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/plain-file-in-command-position.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-killing1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-killing2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-then-assignment.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-type1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-type2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-type3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-uninstalled.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand-unknown-option.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/precommand4.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/prefix-redirection.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/process-substitution-after-redirection.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/process-substitution-redirection-isnt-globbing.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/process-substitution.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/process-substitution2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/quoted-command-substitution-empty.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/quoted-redirection-in-command-word.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/rc-quotes.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-comment.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-from-param.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-in-cmdsubst.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-inhibits-elision.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-is-not-option.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection-special-cases.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/redirection3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/reserved-word.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/simple-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/simple-redirection.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/subshell.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-comment.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-longopt.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-redirection.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-redirection2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/sudo-redirection3.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/tilde-command-word.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/time-and-nocorrect1.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/time-and-nocorrect2.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/unbackslash.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/unknown-command.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/vanilla-newline.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/main/test-data/vi-linewise-mode.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/pattern/pattern-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/pattern/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/pattern/test-data/rm-rf.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/regexp/regexp-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/regexp/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/regexp/test-data/complex.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/regexp/test-data/subexpression.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/regexp/test-data/word-boundary.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/root/root-highlighter.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/highlighters/root/symlink_README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after1-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after1.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after2-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after2.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after3-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after3.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/after4-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before1-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before1.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before2-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before2.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before3-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before3.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/before4-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/preview-smaller.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/images/preview.png create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/release.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/README.md create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_edit-failed-tests create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_generate.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_tap-colorizer.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_tap-filter create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_test-highlighting.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_test-perfs.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/tests/executable_test-zprof.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.plugin.zsh create mode 100644 private_dot_config/oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh create mode 100644 private_dot_config/oh-my-zsh/templates/zshrc.zsh-template create mode 100644 private_dot_config/oh-my-zsh/themes/3den.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/Soliah.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/adben.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/af-magic.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/afowler.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/agnoster.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/alanpeabody.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/amuse.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/apple.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/arrow.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/aussiegeek.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/avit.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/awesomepanda.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/bira.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/blinks.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/bureau.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/candy-kingdom.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/candy.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/clean.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/cloud.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/crcandy.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/crunch.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/cypher.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dallas.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/darkblood.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/daveverwer.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dieter.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dogenpunk.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dpoggi.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dst.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/dstufft.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/duellj.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/eastwood.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/edvardm.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/emotty.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/essembeh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/evan.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fino-time.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fino.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fishy.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/flazz.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fletcherm.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fox.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/frisk.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/frontcube.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/funky.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/fwalch.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gallifrey.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gallois.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/garyblessington.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gentoo.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/geoffgarside.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gianu.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gnzh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/gozilla.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/half-life.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/humza.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/imajes.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/intheloop.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/itchy.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jaischeema.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jbergantine.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jispwoso.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jnrowe.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jonathan.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/josh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jreese.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/jtriley.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/juanghurtado.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/junkfood.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kafeitu.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kardan.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kennethreitz.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kiwi.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kolo.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/kphoen.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/lambda.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/linuxonly.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/lukerandall.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/macovsky.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/maran.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mgutz.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/michelebologna.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mikeh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/miloshadzic.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/minimal.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mira.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mlh.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mortalscumbag.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/mrtazz.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/murilasso.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/muse.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/nanotech.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/nebirhos.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/nicoulaj.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/norm.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/obraun.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/peepcode.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/philips.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/pmcgee.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/pygmalion-virtualenv.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/pygmalion.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/random.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/re5et.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/refined.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/rgm.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/risto.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/rixius.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/rkj-repos.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/rkj.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/robbyrussell.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sammy.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/simonoff.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/simple.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/skaro.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/smt.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sonicradish.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sorin.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sporty_256.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/steeef.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/strug.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sunaku.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/sunrise.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/superjarin.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/suvash.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/symlink_macovsky-ruby.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/takashiyoshida.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/terminalparty.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/theunraveler.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/tjkirch.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/tjkirch_mod.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/tonotdo.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/trapd00r.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/wedisagree.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/wezm+.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/wezm.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/wuffers.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/xiong-chiamiov-plus.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/xiong-chiamiov.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/ys.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/themes/zhann.zsh-theme create mode 100644 private_dot_config/oh-my-zsh/tools/check_for_upgrade.sh create mode 100644 private_dot_config/oh-my-zsh/tools/executable_changelog.sh create mode 100644 private_dot_config/oh-my-zsh/tools/executable_install.sh create mode 100644 private_dot_config/oh-my-zsh/tools/executable_require_tool.sh create mode 100644 private_dot_config/oh-my-zsh/tools/executable_theme_chooser.sh create mode 100644 private_dot_config/oh-my-zsh/tools/executable_upgrade.sh create mode 100644 private_dot_config/oh-my-zsh/tools/uninstall.sh create mode 100644 private_dot_config/sway/config.d/mapping/multimedia.conf create mode 100644 private_dot_config/sway/config.d/tools/socket.conf diff --git a/private_dot_config/alacritty/middle.toml b/private_dot_config/alacritty/middle.toml new file mode 100644 index 0000000..3e64e55 --- /dev/null +++ b/private_dot_config/alacritty/middle.toml @@ -0,0 +1,7 @@ +import = [ "~/.config/alacritty/alacritty.toml" ] + +[window] + title = "menu" + [window.dimensions] + columns = 60 + lines = 30 diff --git a/private_dot_config/alacritty/small.toml b/private_dot_config/alacritty/small.toml new file mode 100644 index 0000000..8057ce1 --- /dev/null +++ b/private_dot_config/alacritty/small.toml @@ -0,0 +1,7 @@ +import = [ "~/.config/alacritty/alacritty.toml" ] + +[window] + title = "menu" + [window.dimensions] + columns = 30 + lines = 15 diff --git a/private_dot_config/environment.d/ssh_auth_socket.conf b/private_dot_config/environment.d/ssh_auth_socket.conf new file mode 100644 index 0000000..59092e8 --- /dev/null +++ b/private_dot_config/environment.d/ssh_auth_socket.conf @@ -0,0 +1 @@ +SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket" diff --git a/private_dot_config/oh-my-zsh/CODE_OF_CONDUCT.md b/private_dot_config/oh-my-zsh/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..20ad1cc --- /dev/null +++ b/private_dot_config/oh-my-zsh/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ohmyzsh@planetargon.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/private_dot_config/oh-my-zsh/CONTRIBUTING.md b/private_dot_config/oh-my-zsh/CONTRIBUTING.md new file mode 100644 index 0000000..6c8b844 --- /dev/null +++ b/private_dot_config/oh-my-zsh/CONTRIBUTING.md @@ -0,0 +1,245 @@ +# CONTRIBUTING GUIDELINES + +Oh-My-Zsh is a community-driven project. Contribution is welcome, encouraged, and appreciated. +It is also essential for the development of the project. + +First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md). + +These guidelines are an attempt at better addressing the huge amount of pending +issues and pull requests. Please read them closely. + +Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution +you would make is not already covered. + + + +- [Reporting Issues](#reporting-issues) + - [You have a problem](#you-have-a-problem) + - [You have a suggestion](#you-have-a-suggestion) +- [Submitting Pull Requests](#submitting-pull-requests) + - [Getting started](#getting-started) + - [You have a solution](#you-have-a-solution) + - [You have an addition](#you-have-an-addition) +- [Use the Search, Luke](#use-the-search-luke) +- [Commit Guidelines](#commit-guidelines) + - [Format](#format) + - [Style](#style) +- [Volunteer](#volunteer) + + + +## Reporting Issues + +### You have a problem + +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering +your problem. + +If you find one, comment on it, so we know more people are experiencing it. + +If not, look at the [Troubleshooting](https://github.com/ohmyzsh/ohmyzsh/wiki/Troubleshooting) +page for instructions on how to gather data to better debug your problem. + +Then, you can go ahead and create an issue with as much detail as you can provide. +It should include the data gathered as indicated above, along with the following: + +1. How to reproduce the problem +2. What the correct behavior should be +3. What the actual behavior is + +Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle +(starting with `@`) in your message. + +We will do our very best to help you. + +### You have a suggestion + +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering +your suggestion. + +If you find one, comment on it, so we know more people are supporting it. + +If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. + +## Submitting Pull Requests + +### Getting started + +You should be familiar with the basics of +[contributing on GitHub](https://help.github.com/articles/using-pull-requests) and have a fork +[properly set up](https://github.com/ohmyzsh/ohmyzsh/wiki/Contribution-Technical-Practices). + +You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree. + +If you create your own PR, please make sure you do it right. Also be so kind as to reference +any issue that would be solved in the PR description body, +[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/) +_"Fixes #XXXX"_ for issue number XXXX. + +### You have a solution + +Please be so kind as to [search](#use-the-search-luke) for any open issue already covering +your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution. + +If the solution is already reported, try it out and +1 the pull request if the +solution works ok. On the other hand, if you think your solution is better, post +it with reference to the other one so we can have both solutions to compare. + +If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. + +### You have an addition + +Please [do not](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#dont-send-us-your-theme-for-now) +send themes for now. + +Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests +covering or related to what you want to add. + +If you find one, try it out and work with the author on a common solution. + +If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin +maintainers) by mentioning their GitHub handle (starting with `@`) in your message. + +For any extensive change, such as a new plugin, you will have to find testers to +1 your PR. + +### New plugin aliases + +We acknowledge that aliases are a core part of Oh My Zsh. There are plugins that have +100 aliases! + +This has become an issue for two opposing reasons: + +- Some users want to have their personal aliases in Oh My Zsh. +- Some users don't want any aliases at all and feel that there are too many. + +Because of this, from now on, we require that new aliases follow these conditions: + +1. They will be used by many people, not just a few. +2. The aliases will be used many times and for common tasks. +3. Prefer one generic alias over many specific ones. +4. When justifying the need for an alias, talk about workflows where you'll use it, + preferably in combination with other aliases. +5. If a command with the same name exists, look for a different alias name. + +This list is not exhaustive! Please remember that your alias will be in the machines of many people, +so it should be justified why they should have it. + +---- + +## Use the Search, Luke + +_May the Force (of past experiences) be with you_ + +GitHub offers [many search features](https://help.github.com/articles/searching-github/) +to help you check whether a similar contribution to yours already exists. Please search +before making any contribution, it avoids duplicates and eases maintenance. Trust me, +that works 90% of the time. + +You can also take a look at the [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ) +to be sure your contribution has not already come up. + +If all fails, your thing has probably not been reported yet, so you can go ahead +and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests). + +---- + +## Commit Guidelines + +Oh My Zsh uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) +specification. The automatic changelog tool uses these to automatically generate +a changelog based on the commit messages. Here's a guide to writing a commit message +to allow this: + +### Format + +``` +type(scope)!: subject +``` + +- `type`: the type of the commit is one of the following: + + - `feat`: new features. + - `fix`: bug fixes. + - `docs`: documentation changes. + - `refactor`: refactor of a particular code section without introducing + new features or bug fixes. + - `style`: code style improvements. + - `perf`: performance improvements. + - `test`: changes to the test suite. + - `ci`: changes to the CI system. + - `build`: changes to the build system (we don't yet have one so this shouldn't apply). + - `chore`: for other changes that don't match previous types. This doesn't appear + in the changelog. + +- `scope`: section of the codebase that the commit makes changes to. If it makes changes to + many sections, or if no section in particular is modified, leave blank without the parentheses. + Examples: + + - Commit that changes the `git` plugin: + ``` + feat(git): add alias for `git commit` + ``` + + - Commit that changes many plugins: + ``` + style: fix inline declaration of arrays + ``` + + For changes to plugins or themes, the scope should be the plugin or theme name: + + - ✅ `fix(agnoster): commit subject` + - ❌ `fix(theme/agnoster): commit subject` + +- `!`: this goes after the `scope` (or the `type` if scope is empty), to indicate that the commit + introduces breaking changes. + + Optionally, you can specify a message that the changelog tool will display to the user to indicate + what's changed and what they can do to deal with it. You can use multiple lines to type this message; + the changelog parser will keep reading until the end of the commit message or until it finds an empty + line. + + Example (made up): + + ``` + style(agnoster)!: change dirty git repo glyph + + BREAKING CHANGE: the glyph to indicate when a git repository is dirty has + changed from a Powerline character to a standard UTF-8 emoji. You can + change it back by setting `ZSH_THEME_DIRTY_GLYPH`. + + Fixes #420 + + Co-authored-by: Username + ``` + +- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need + to specify other details, you can use the commit body, but it won't be visible. + + Formatting tricks: the commit subject may contain: + + - Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool: + ``` + feat(archlinux): add support for aura AUR helper (#9467) + ``` + + - Formatted inline code by using backticks: the text between backticks will also be highlighted by + the changelog tool: + ``` + feat(shell-proxy): enable unexported `DEFAULT_PROXY` setting (#9774) + ``` + +### Style + +Try to keep the first commit line short. It's harder to do using this commit style but try to be +concise, and if you need more space, you can use the commit body. Try to make sure that the commit +subject is clear and precise enough that users will know what changed by just looking at the changelog. + +---- + +## Volunteer + +Very nice!! :) + +Please have a look at the [Volunteer](https://github.com/ohmyzsh/ohmyzsh/wiki/Volunteers) +page for instructions on where to start and more. diff --git a/private_dot_config/oh-my-zsh/LICENSE.txt b/private_dot_config/oh-my-zsh/LICENSE.txt new file mode 100644 index 0000000..2d7ca6f --- /dev/null +++ b/private_dot_config/oh-my-zsh/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/private_dot_config/oh-my-zsh/README.md b/private_dot_config/oh-my-zsh/README.md new file mode 100644 index 0000000..a305955 --- /dev/null +++ b/private_dot_config/oh-my-zsh/README.md @@ -0,0 +1,448 @@ +

Oh My Zsh

+ +Oh My Zsh is an open source, community-driven framework for managing your [zsh](https://www.zsh.org/) configuration. + +Sounds boring. Let's try again. + +**Oh My Zsh will not make you a 10x developer...but you may feel like one.** + +Once installed, your terminal shell will become the talk of the town _or your money back!_ With each keystroke in your command prompt, you'll take advantage of the hundreds of powerful plugins and beautiful themes. Strangers will come up to you in cafés and ask you, _"that is amazing! are you some sort of genius?"_ + +Finally, you'll begin to get the sort of attention that you have always felt you deserved. ...or maybe you'll use the time that you're saving to start flossing more often. 😬 + +To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter, and join us on [Discord](https://discord.gg/ohmyzsh). + +[![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) +[![Follow @ohmyzsh](https://img.shields.io/twitter/follow/ohmyzsh?label=Follow+@ohmyzsh&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh) +[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) +[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh) +[![huntr.dev](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh) + +
+Table of Contents + +- [Getting Started](#getting-started) + - [Prerequisites](#prerequisites) + - [Basic Installation](#basic-installation) + - [Manual inspection](#manual-inspection) +- [Using Oh My Zsh](#using-oh-my-zsh) + - [Plugins](#plugins) + - [Enabling Plugins](#enabling-plugins) + - [Using Plugins](#using-plugins) + - [Themes](#themes) + - [Selecting a Theme](#selecting-a-theme) + - [FAQ](#faq) +- [Advanced Topics](#advanced-topics) + - [Advanced Installation](#advanced-installation) + - [Custom Directory](#custom-directory) + - [Unattended install](#unattended-install) + - [Installing from a forked repository](#installing-from-a-forked-repository) + - [Manual Installation](#manual-installation) + - [Installation Problems](#installation-problems) + - [Custom Plugins and Themes](#custom-plugins-and-themes) + - [Enable GNU ls in macOS and freeBSD systems](#enable-gnu-ls) + - [Skip aliases](#skip-aliases) +- [Getting Updates](#getting-updates) + - [Updates verbosity](#updates-verbosity) + - [Manual Updates](#manual-updates) +- [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh) +- [How do I contribute to Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh) + - [Do NOT send us themes](#do-not-send-us-themes) +- [Contributors](#contributors) +- [Follow Us](#follow-us) +- [Merchandise](#merchandise) +- [License](#license) +- [About Planet Argon](#about-planet-argon) + +
+ +## Getting Started + +### Prerequisites + +- A Unix-like operating system: macOS, Linux, BSD. On Windows: WSL2 is preferred, but cygwin or msys also mostly work. +- [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here: [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH) +- `curl` or `wget` should be installed +- `git` should be installed (recommended v2.4.11 or higher) + +### Basic Installation + +Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the command-line with either `curl`, `wget` or another similar tool. + +| Method | Command | +| :-------- | :------------------------------------------------------------------------------------------------ | +| **curl** | `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | +| **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | +| **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | + +_Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move the configuration you want to preserve into the new `.zshrc`._ + +#### Manual inspection + +It's a good idea to inspect the install script from projects you don't yet know. You can do +that by downloading the install script first, looking through it so everything looks normal, +then running it: + +```sh +wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh +sh install.sh +``` + +## Using Oh My Zsh + +### Plugins + +Oh My Zsh comes with a shitload of plugins for you to take advantage of. You can take a look in the [plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins) directory and/or the [wiki](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins) to see what's currently available. + +#### Enabling Plugins + +Once you spot a plugin (or several) that you'd like to use with Oh My Zsh, you'll need to enable them in the `.zshrc` file. You'll find the zshrc file in your `$HOME` directory. Open it with your favorite text editor and you'll see a spot to list all the plugins you want to load. + +```sh +vi ~/.zshrc +``` + +For example, this might begin to look like this: + +```sh +plugins=( + git + bundler + dotenv + macos + rake + rbenv + ruby +) +``` + +_Note that the plugins are separated by whitespace (spaces, tabs, new lines...). **Do not** use commas between them or it will break._ + +#### Using Plugins + +Each built-in plugin includes a **README**, documenting it. This README should show the aliases (if the plugin adds any) and extra goodies that are included in that particular plugin. + +### Themes + +We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one hundred and fifty themes now bundled. Most of them have [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). Check them out! + +#### Selecting a Theme + +_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one (for him)._ + +Once you find a theme that you'd like to use, you will need to edit the `~/.zshrc` file. You'll see an environment variable (all caps) in there that looks like: + +```sh +ZSH_THEME="robbyrussell" +``` + +To use a different theme, simply change the value to match the name of your desired theme. For example: + +```sh +ZSH_THEME="agnoster" # (this is one of the fancy ones) +# see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster +``` + +_Note: many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. Without them, these themes will render [weird prompt symbols](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt)_ + +Open up a new terminal window and your prompt should look something like this: + +![Agnoster theme](https://cloud.githubusercontent.com/assets/2618447/6316862/70f58fb6-ba03-11e4-82c9-c083bf9a6574.png) + +In case you did not find a suitable theme for your needs, please have a look at the wiki for [more of them](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes). + +If you're feeling feisty, you can let the computer select one randomly for you each time you open a new terminal window. + +```sh +ZSH_THEME="random" # (...please let it be pie... please be some pie..) +``` + +And if you want to pick random theme from a list of your favorite themes: + +```sh +ZSH_THEME_RANDOM_CANDIDATES=( + "robbyrussell" + "agnoster" +) +``` + +If you only know which themes you don't like, you can add them similarly to an ignored list: + +```sh +ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod) +``` + +### FAQ + +If you have some more questions or issues, you might find a solution in our [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ). + +## Advanced Topics + +If you're the type that likes to get their hands dirty, these sections might resonate. + +### Advanced Installation + +Some users may want to manually install Oh My Zsh, or change the default path or other settings that +the installer accepts (these settings are also documented at the top of the install script). + +#### Custom Directory + +The default location is `~/.oh-my-zsh` (hidden in your home directory, you can access it with `cd ~/.oh-my-zsh`) + +If you'd like to change the install directory with the `ZSH` environment variable, either by running +`export ZSH=/your/path` before installing, or by setting it before the end of the install pipeline +like this: + +```sh +ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh +``` + +#### Unattended install + +If you're running the Oh My Zsh install script as part of an automated install, you can pass the `--unattended` +flag to the `install.sh` script. This will have the effect of not trying to change +the default shell, and it also won't run `zsh` when the installation has finished. + +```sh +sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended +``` + +#### Installing from a forked repository + +The install script also accepts these variables to allow installation of a different repository: + +- `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set + this variable, the installer will look for a repository at `https://github.com/{owner}/{repository}`. + +- `REMOTE` (default: `https://github.com/${REPO}.git`): this is the full URL of the git repository + clone. You can use this setting if you want to install from a fork that is not on GitHub (GitLab, + Bitbucket...) or if you want to clone with SSH instead of HTTPS (`git@github.com:user/project.git`). + + _NOTE: it's incompatible with setting the `REPO` variable. This setting will take precedence._ + +- `BRANCH` (default: `master`): you can use this setting if you want to change the default branch to be + checked out when cloning the repository. This might be useful for testing a Pull Request, or if you + want to use a branch other than `master`. + +For example: + +```sh +REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh +``` + +#### Manual Installation + +##### 1. Clone the repository + +```sh +git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh +``` + +##### 2. _Optionally_, backup your existing `~/.zshrc` file + +```sh +cp ~/.zshrc ~/.zshrc.orig +``` + +##### 3. Create a new zsh configuration file + +You can create a new zsh config file by copying the template that we have included for you. + +```sh +cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc +``` + +##### 4. Change your default shell + +```sh +chsh -s $(which zsh) +``` + +You must log out from your user session and log back in to see this change. + +##### 5. Initialize your new zsh configuration + +Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration. + +### Installation Problems + +If you have any hiccups installing, here are a few common fixes. + +- You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after switching to `oh-my-zsh`. +- If you installed manually or changed the install location, check the `ZSH` environment variable in `~/.zshrc`. + +### Custom Plugins and Themes + +If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` directory. + +If you have many functions that go well together, you can put them as a `XYZ.plugin.zsh` file in the `custom/plugins/` directory and then enable this plugin. + +If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. + +### Enable GNU ls in macOS and freeBSD systems + + + +The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD systems. If GNU `ls` is installed +(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before +sourcing `oh-my-zsh.sh`: + +```zsh +zstyle ':omz:lib:theme-and-appearance' gnu-ls yes +``` + +_Note: this is not compatible with `DISABLE_LS_COLORS=true`_ + +### Skip aliases + + + +If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases, +you can use the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that +there are many different ways to skip aliases, depending on your needs. + +```sh +# Skip all aliases, in lib files and enabled plugins +zstyle ':omz:*' aliases no + +# Skip all aliases in lib files +zstyle ':omz:lib:*' aliases no +# Skip only aliases defined in the directories.zsh lib file +zstyle ':omz:lib:directories' aliases no + +# Skip all plugin aliases +zstyle ':omz:plugins:*' aliases no +# Skip only the aliases from the git plugin +zstyle ':omz:plugins:git' aliases no +``` + +You can combine these in other ways taking into account that more specific scopes takes precedence: + +```sh +# Skip all plugin aliases, except for the git plugin +zstyle ':omz:plugins:*' aliases no +zstyle ':omz:plugins:git' aliases yes +``` + +A previous version of this feature was using the setting below, which has been removed: + +```sh +zstyle ':omz:directories' aliases no +``` + +Instead, you can now use the following: + +```sh +zstyle ':omz:lib:directories' aliases no +``` + +#### Notice + +> This feature is currently in a testing phase and it may be subject to change in the future. +> It is also not currently compatible with plugin managers such as zpm or zinit, which don't +> source the init script (`oh-my-zsh.sh`) where this feature is implemented in. + +> It is also not currently aware of "aliases" that are defined as functions. Example of such +> are `gccd`, `ggf`, or `ggl` functions from the git plugin. + +## Getting Updates + +By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**: + +1. Automatic update without confirmation prompt: + + ```sh + zstyle ':omz:update' mode auto + ``` + +2. Just offer a reminder every few days, if there are updates available: + + ```sh + zstyle ':omz:update' mode reminder + ``` + +3. To disable automatic updates entirely: + + ```sh + zstyle ':omz:update' mode disabled + ``` + +NOTE: you can control how often Oh My Zsh checks for updates with the following setting: + +```sh +# This will check for updates every 7 days +zstyle ':omz:update' frequency 7 +# This will check for updates every time you open the terminal (not recommended) +zstyle ':omz:update' frequency 0 +``` + +### Updates verbosity + +You can also limit the update verbosity with the following settings: + +```sh +zstyle ':omz:update' verbose default # default update prompt + +zstyle ':omz:update' verbose minimal # only few lines + +zstyle ':omz:update' verbose silent # only errors +``` + +### Manual Updates + +If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run: + +```sh +omz update +``` + +Magic! 🎉 + +## Uninstalling Oh My Zsh + +Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy breakup. + +If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove itself and revert your previous `bash` or `zsh` configuration. + +## How do I contribute to Oh My Zsh? + +Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md). + +I'm far from being a [Zsh](https://www.zsh.org/) expert and suspect there are many ways to improve – if you have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send pull requests! + +We also need people to test out pull requests. So take a look through [the open issues](https://github.com/ohmyzsh/ohmyzsh/issues) and help where you can. + +See [Contributing](CONTRIBUTING.md) for more details. + +### Do NOT send us themes + +We have (more than) enough themes for the time being. Please add your theme to the [external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page. + +## Contributors + +Oh My Zsh has a vibrant community of happy users and delightful contributors. Without all the time and help from our contributors, it wouldn't be so awesome. + +Thank you so much! + +## Follow Us + +We're on social media: + +- [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter. You should follow it. +- [Facebook](https://www.facebook.com/Oh-My-Zsh-296616263819290/) poke us. +- [Instagram](https://www.instagram.com/_ohmyzsh/) tag us in your post showing Oh My Zsh! +- [Discord](https://discord.gg/ohmyzsh) to chat with us! + +## Merchandise + +We have [stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github) for you to show off your love of Oh My Zsh. Again, you will become the talk of the town! + +## License + +Oh My Zsh is released under the [MIT license](LICENSE.txt). + +## About Planet Argon + +![Planet Argon](https://pa-github-assets.s3.amazonaws.com/PARGON_logo_digital_COL-small.jpg) + +Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](http://www.planetargon.com/services/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github). diff --git a/private_dot_config/oh-my-zsh/SECURITY.md b/private_dot_config/oh-my-zsh/SECURITY.md new file mode 100644 index 0000000..7e5c8ee --- /dev/null +++ b/private_dot_config/oh-my-zsh/SECURITY.md @@ -0,0 +1,24 @@ +# Security Policy + +## Supported Versions + +At the moment Oh My Zsh only considers the very latest commit to be supported. +We combine that with our fast response to incidents and the automated updates +to minimize the time between vulnerability publication and patch release. + +| Version | Supported | +|:-------------- |:------------------ | +| master | :white_check_mark: | +| other commits | :x: | + +In the near future we will introduce versioning, so expect this section to change. + +## Reporting a Vulnerability + +**Do not submit an issue or pull request**: this might reveal the vulnerability. + +Instead, you should email the maintainers directly at: [**security@ohmyz.sh**](mailto:security@ohmyz.sh). + +We will deal with the vulnerability privately and submit a patch as soon as possible. + +You can also submit your vulnerability report to [huntr.dev](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh) and see if you can get a bounty reward. diff --git a/private_dot_config/oh-my-zsh/cache/completions/.keep b/private_dot_config/oh-my-zsh/cache/completions/.keep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/cache/dot_zsh-update b/private_dot_config/oh-my-zsh/cache/dot_zsh-update new file mode 100644 index 0000000..697cd09 --- /dev/null +++ b/private_dot_config/oh-my-zsh/cache/dot_zsh-update @@ -0,0 +1 @@ +LAST_EPOCH=19587 diff --git a/private_dot_config/oh-my-zsh/cache/empty_dot_gitkeep b/private_dot_config/oh-my-zsh/cache/empty_dot_gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/cache/grep-alias b/private_dot_config/oh-my-zsh/cache/grep-alias new file mode 100644 index 0000000..d543d0b --- /dev/null +++ b/private_dot_config/oh-my-zsh/cache/grep-alias @@ -0,0 +1,3 @@ +alias grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}' +alias egrep='grep -E --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}' +alias fgrep='grep -F --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}' diff --git a/private_dot_config/oh-my-zsh/custom/example.zsh b/private_dot_config/oh-my-zsh/custom/example.zsh new file mode 100644 index 0000000..21a8d8b --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/example.zsh @@ -0,0 +1,12 @@ +# Put files in this folder to add your own custom functionality. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization +# +# Files in the custom/ directory will be: +# - loaded automatically by the init script, in alphabetical order +# - loaded last, after all built-ins in the lib/ directory, to override them +# - ignored by git by default +# +# Example: add custom/shortcuts.zsh for shortcuts to your local projects +# +# brainstormr=~/Projects/development/planetargon/brainstormr +# cd $brainstormr diff --git a/private_dot_config/oh-my-zsh/custom/plugins/example/example.plugin.zsh b/private_dot_config/oh-my-zsh/custom/plugins/example/example.plugin.zsh new file mode 100644 index 0000000..83611fe --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/plugins/example/example.plugin.zsh @@ -0,0 +1,3 @@ +# Add your own custom plugins in the custom/plugins directory. Plugins placed +# here will override ones with the same name in the main plugins directory. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-plugins diff --git a/private_dot_config/oh-my-zsh/custom/themes/example.zsh-theme b/private_dot_config/oh-my-zsh/custom/themes/example.zsh-theme new file mode 100644 index 0000000..494d029 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/example.zsh-theme @@ -0,0 +1,6 @@ +# Put your custom themes in this folder. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes +# +# Example: + +PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% " diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/LICENSE b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/LICENSE new file mode 100644 index 0000000..7986ede --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2014 Robby Russell and contributors (see https://github.com/robbyrussell/oh-my-zsh/contributors) +Copyright (c) 2014-2017 Ben Hilburn +Copyright (c) 2019 Roman Perepelitsa and contributors (see https://github.com/romkatv/powerlevel10k/contributors) + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/Makefile b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/Makefile new file mode 100644 index 0000000..86e55ee --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/Makefile @@ -0,0 +1,14 @@ +ZSH := $(shell command -v zsh 2> /dev/null) + +all: + +zwc: + $(MAKE) -C gitstatus zwc + $(or $(ZSH),:) -fc 'for f in *.zsh-theme internal/*.zsh; do zcompile -R -- $$f.zwc $$f || exit; done' + +minify: + $(MAKE) -C gitstatus minify + rm -rf -- .git .gitattributes .gitignore LICENSE Makefile README.md font.md powerlevel10k.png + +pkg: zwc + $(MAKE) -C gitstatus pkg diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/README.md b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/README.md new file mode 100644 index 0000000..f819c20 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/README.md @@ -0,0 +1,2041 @@ +# Powerlevel10k +[![Gitter](https://badges.gitter.im/powerlevel10k/community.svg)]( + https://gitter.im/powerlevel10k/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +Powerlevel10k is a theme for Zsh. It emphasizes [speed](#uncompromising-performance), +[flexibility](#extremely-customizable) and [out-of-the-box experience](#configuration-wizard). + +![Powerlevel10k]( +https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-styles-high-contrast.png) + +- [Getting started](#getting-started) +- [Features](#features) +- [Installation](#installation) +- [Configuration](#configuration) +- [Fonts](#fonts) +- [Try it in Docker](#try-it-in-docker) +- [License](#license) +- [FAQ](#faq) +- [Troubleshooting](#troubleshooting) + +## Getting started + +1. [Install the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). *Optional but highly + recommended.* +1. [Install Powerlevel10k](#installation) itself. +1. Restart Zsh with `exec zsh`. +1. Type `p10k configure` if the configuration wizard doesn't start automatically. + +## Features + +- [Configuration wizard](#configuration-wizard) +- [Uncompromising performance](#uncompromising-performance) +- [Powerlevel9k compatibility](#powerlevel9k-compatibility) +- [Pure compatibility](#pure-compatibility) +- [Instant prompt](#instant-prompt) +- [Show on command](#show-on-command) +- [Transient prompt](#transient-prompt) +- [Current directory that just works](#current-directory-that-just-works) +- [Extremely customizable](#extremely-customizable) +- [Batteries included](#batteries-included) +- [Extensible](#extensible) + +### Configuration wizard + +Type `p10k configure` to access the builtin configuration wizard right from your terminal. + +
+ Screen recording + + ![Powerlevel10k Configuration Wizard]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/configuration-wizard.gif) +
+ +All styles except [Pure](#pure-compatibility) are functionally equivalent. They display the same +information and differ only in presentation. + +Configuration wizard creates `~/.p10k.zsh` based on your preferences. Additional prompt +customization can be done by editing this file. It has plenty of comments to help you navigate +through configuration options. + +*Tip*: Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) before +running `p10k configure` to unlock all prompt styles. + +*FAQ:* + +- [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) +- [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) + +*Troubleshooting*: + +- [Some prompt styles are missing from the configuration wizard]( + #some-prompt-styles-are-missing-from-the-configuration-wizard). +- [Question mark in prompt](#question-mark-in-prompt). +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render). +- [Sub-pixel imperfections around powerline symbols]( + #sub-pixel-imperfections-around-powerline-symbols). +- [Directory is difficult to see in prompt when using Rainbow style]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style). + +### Uncompromising performance + +When you hit *ENTER*, the next prompt appears instantly. With Powerlevel10k there is no prompt lag. +If you install Cygwin on Raspberry Pi, `cd` into a Linux Git repository and activate enough prompt +segments to fill four prompt lines on both sides of the screen... wait, that's just crazy and no +one ever does that. Probably impossible, too. The point is, Powerlevel10k prompt is always fast, no +matter what you do! + +
+ Screen recording + + ![Powerlevel10k Performance]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/performance.gif) +
+ +Note how the effect of every command is instantly reflected by the very next prompt. + +| Command | Prompt Indicator | Meaning | +|-------------------------------|:----------------:|----------------------------------------------------------------------:| +| `timew start hack linux` | `⌚ hack linux` | time tracking enabled in [timewarrior](https://timewarrior.net/) | +| `touch x y` | `?2` | 2 untracked files in the Git repo | +| `rm COPYING` | `!1` | 1 unstaged change in the Git repo | +| `echo 3.7.3 >.python-version` | `🐍 3.7.3` | the current python version in [pyenv](https://github.com/pyenv/pyenv) | + +Other Zsh themes capable of displaying the same information either produce prompt lag or print +prompt that doesn't reflect the current state of the system and then refresh it later. With +Powerlevel10k you get fast prompt *and* up-to-date information. + +*FAQ*: [Is it really fast?](#is-it-really-fast) + +### Powerlevel9k compatibility + +Powerlevel10k understands all [Powerlevel9k](https://github.com/Powerlevel9k/powerlevel9k) +configuration parameters. + +
+ Screen recording + + ![Powerlevel10k Compatibility with 9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/9k-compatibility.gif) +
+ +[Migration](#installation) from Powerlevel9k to Powerlevel10k is a straightforward process. All +your `POWERLEVEL9K` configuration parameters will still work. Prompt will look the same as before +([almost]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config)) +but it will be [much faster](#uncompromising-performance) ([certainly](#is-it-really-fast)). + +*FAQ*: + +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?]( + #im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) +- [What is the relationship between Powerlevel9k and Powerlevel10k?]( + #What-is-the-relationship-between-powerlevel9k-and-powerlevel10k) + +### Pure compatibility + +Powerlevel10k can produce the same prompt as [Pure](https://github.com/sindresorhus/pure). Type +`p10k configure` and select *Pure* style. + +
+ Screen recording + + ![Powerlevel10k Pure Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/pure-style.gif) +
+ +You can still use Powerlevel10k features such as [transient prompt](#transient-prompt) or +[instant prompt](#instant-prompt) when sporting Pure style. + +To customize prompt, edit `~/.p10k.zsh`. Powerlevel10k doesn't recognize Pure configuration +parameters, so you'll need to use `POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3` instead of +`PURE_CMD_MAX_EXEC_TIME=3`, etc. All relevant parameters are in `~/.p10k.zsh`. This file has +plenty of comments to help you navigate through it. + +*FAQ:* [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) + +### Instant prompt + +If your `~/.zshrc` loads many plugins, or perhaps just a few slow ones +(for example, [pyenv](https://github.com/pyenv/pyenv) or [nvm](https://github.com/nvm-sh/nvm)), you +may have noticed that it takes some time for Zsh to start. + +
+ Screen recording + + ![Powerlevel10k No Instant Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/no-instant-prompt.gif) +
+ +Powerlevel10k can remove Zsh startup lag **even if it's not caused by a theme**. + +
+ Screen recording + + ![Powerlevel10k Instant Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/instant-prompt.gif) +
+ +This feature is called *Instant Prompt*. You need to explicitly enable it through `p10k configure` +or [manually](#how-do-i-configure-instant-prompt). It does what it says on the tin -- prints prompt +instantly upon Zsh startup allowing you to start typing while plugins are still loading. + +Other themes *increase* Zsh startup lag -- some by a lot, others by a just a little. Powerlevel10k +*removes* it outright. + +If you are curious about how *Instant Prompt* works, see +[this section in zsh-bench](https://github.com/romkatv/zsh-bench#instant-prompt). + +*FAQ:* [How do I configure instant prompt?](#how-do-i-configure-instant-prompt) + +### Show on command + +The behavior of some commands depends on global environment. For example, `kubectl run ...` runs an +image on the cluster defined by the current kubernetes context. If you frequently change context +between "prod" and "testing", you might want to display the current context in Zsh prompt. If you do +likewise for AWS, Azure and Google Cloud credentials, prompt will get pretty crowded. + +Enter *Show On Command*. This feature makes prompt segments appear only when they are relevant to +the command you are currently typing. + +
+ Screen recording + + ![Powerlevel10k Show On Command]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/show-on-command.gif) +
+ +Configs created by `p10k configure` enable show on command for several prompt segments by default. +Here's the relevant parameter for kubernetes context: + +```zsh +# Show prompt segment "kubecontext" only when the command you are typing invokes one of these tools. +typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' +``` + +To customize when different prompt segments are shown, open `~/.p10k.zsh`, search for +`SHOW_ON_COMMAND` and either remove these parameters to display affected segments unconditionally, +or change their values. + +### Transient prompt + +When *Transient Prompt* is enabled through `p10k configure`, Powerlevel10k will trim down every +prompt when accepting a command line. + +
+ Screen recording + + ![Powerlevel10k Transient Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/transient-prompt.gif) +
+ +Transient prompt makes it much easier to copy-paste series of commands from the terminal scrollback. + +*Tip*: If you enable transient prompt, take advantage of two-line prompt. You'll get the benefit of +extra space for typing commands without the usual drawback of reduced scrollback density. Sparse +prompt (with an empty line before prompt) also works great in combination with transient prompt. + +### Current directory that just works + +The current working directory is perhaps the most important prompt segment. Powerlevel10k goes to +great length to highlight its important parts and to truncate it with the least loss of information +when horizontal space gets scarce. + +
+ Screen recording + + ![Powerlevel10k Directory Truncation]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/directory-truncation.gif) +
+ +When the full directory doesn't fit, the leftmost segment gets truncated to its shortest unique +prefix. In the screencast, `~/work` becomes `~/wo`. It couldn't be truncated to `~/w` because it +would be ambiguous (there was `~/wireguard` when the session was recorded). The next segment -- +`projects` -- turns into `p` as there was nothing else that started with `p` in `~/work/`. + +Directory segments are shown in one of three colors: + +- Truncated segments are bleak. +- Important segments are bright and never truncated. These include the first and the last segment, + roots of Git repositories, etc. +- Regular segments (not truncated but can be) use in-between color. + +*Tip*: If you copy-paste a truncated directory and hit *TAB*, it'll complete to the original. + +*Troubleshooting*: [Directory is difficult to see in prompt when using Rainbow style.]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) + +### Extremely customizable + +Powerlevel10k can be configured to look like any other Zsh theme out there. + +
+ Screen recording + + ![Powerlevel10k Other Theme Emulation]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/other-theme-emulation.gif) +
+ +[Pure](#pure-compatibility), [Powerlevel9k](#powerlevel9k-compatibility) and [robbyrussell]( + #how-to-make-powerlevel10k-look-like-robbyrussell-oh-my-zsh-theme) emulations are built-in. +To emulate the appearance of other themes, you'll need to write a suitable configuration file. The +best way to go about it is to run `p10k configure`, select the style that is the closest to your +goal and then edit `~/.p10k.zsh`. + +The full range of Powerlevel10k appearance spans from spartan: + +![Powerlevel10k Spartan Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/spartan-style.png) + +To ~~ridiculous~~ extravagant: + +![Powerlevel10k Extravagant Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/extravagant-style.png) + +### Batteries included + +Powerlevel10k comes with dozens of built-in high quality segments. When you run `p10k configure` +and choose any style except [Pure](#pure-compatibility), many of these segments get enabled by +default while others can be manually enabled by opening `~/.p10k.zsh` and uncommenting them. You can +enable as many segments as you like. It won't slow down your prompt or Zsh startup. + +| Segment | Meaning | +|--------:|---------| +| `anaconda` | virtual environment from [conda](https://conda.io/) | +| `asdf` | tool versions from [asdf](https://github.com/asdf-vm/asdf) | +| `aws` | [aws profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) | +| `aws_eb_env` | [aws elastic beanstalk](https://aws.amazon.com/elasticbeanstalk/) environment | +| `azure` | [azure](https://docs.microsoft.com/en-us/cli/azure) account name | +| `background_jobs` | presence of background jobs | +| `battery` | internal battery state and charge level (yep, batteries *literally* included) | +| `command_execution_time` | duration (wall time) of the last command | +| `context` | user@hostname | +| `cpu_arch` | CPU architecture | +| `dir` | current working directory | +| `direnv` | [direnv](https://direnv.net/) status | +| `disk_usage` | disk usage | +| `dotnet_version` | [dotnet](https://dotnet.microsoft.com) version | +| `fvm` | flutter environment from [fvm](https://github.com/leoafarias/fvm) | +| `gcloud` | [google cloud](https://cloud.google.com/) cli account and project | +| `goenv` | go environment from [goenv](https://github.com/syndbg/goenv) | +| `google_app_cred` | [google application credentials](https://cloud.google.com/docs/authentication/production) | +| `go_version` | [go](https://golang.org) version | +| `haskell_stack` | haskell version from [stack](https://haskellstack.org/) | +| `ip` | IP address and bandwidth usage for a specified network interface | +| `java_version` | [java](https://www.java.com/) version | +| `jenv` | java environment from [jenv](https://github.com/jenv/jenv) | +| `kubecontext` | current [kubernetes](https://kubernetes.io/) context | +| `laravel_version` | [laravel php framework](https://laravel.com/) version | +| `load` | CPU load | +| `luaenv` | lua environment from [luaenv](https://github.com/cehoffman/luaenv) | +| `midnight_commander` | [midnight commander](https://midnight-commander.org/) shell | +| `nix_shell` | [nix shell](https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) indicator | +| `nnn` | [nnn](https://github.com/jarun/nnn) shell | +| `lf` | [lf](https://github.com/gokcehan/lf) shell | +| `chezmoi_shell` | [chezmoi](https://www.chezmoi.io/) shell | +| `nodeenv` | node.js environment from [nodeenv](https://github.com/ekalinin/nodeenv) | +| `nodenv` | node.js environment from [nodenv](https://github.com/nodenv/nodenv) | +| `node_version` | [node.js](https://nodejs.org/) version | +| `nordvpn` | [nordvpn](https://nordvpn.com/) connection status | +| `nvm` | node.js environment from [nvm](https://github.com/nvm-sh/nvm) | +| `os_icon` | your OS logo (apple for macOS, swirl for debian, etc.) | +| `package` | `name@version` from [package.json](https://docs.npmjs.com/files/package.json) | +| `perlbrew` | perl version from [perlbrew](https://github.com/gugod/App-perlbrew) | +| `phpenv` | php environment from [phpenv](https://github.com/phpenv/phpenv) | +| `php_version` | [php](https://www.php.net/) version | +| `plenv` | perl environment from [plenv](https://github.com/tokuhirom/plenv) | +| `prompt_char` | multi-functional prompt symbol; changes depending on vi mode: `❯`, `❮`, `V`, `▶` for insert, command, visual and replace mode respectively; turns red on error | +| `proxy` | system-wide http/https/ftp proxy | +| `public_ip` | public IP address | +| `pyenv` | python environment from [pyenv](https://github.com/pyenv/pyenv) | +| `ram` | free RAM | +| `ranger` | [ranger](https://github.com/ranger/ranger) shell | +| `rbenv` | ruby environment from [rbenv](https://github.com/rbenv/rbenv) | +| `rust_version` | [rustc](https://www.rust-lang.org) version | +| `rvm` | ruby environment from [rvm](https://rvm.io) | +| `scalaenv` | scala version from [scalaenv](https://github.com/scalaenv/scalaenv) | +| `status` | exit code of the last command | +| `swap` | used swap | +| `taskwarrior` | [taskwarrior](https://taskwarrior.org/) task count | +| `terraform` | [terraform](https://www.terraform.io) workspace | +| `terraform_version` | [terraform](https://www.terraform.io) version | +| `time` | current time | +| `timewarrior` | [timewarrior](https://timewarrior.net/) tracking status | +| `todo` | [todo](https://github.com/todotxt/todo.txt-cli) items | +| `toolbox` | [toolbox](https://github.com/containers/toolbox) name | +| `vcs` | Git repository status | +| `vim_shell` | [vim](https://www.vim.org/) shell (`:sh`) | +| `virtualenv` | python environment from [venv](https://docs.python.org/3/library/venv.html) | +| `vi_mode` | vi mode (you don't need this if you've enabled prompt_char) | +| `vpn_ip` | virtual private network indicator | +| `wifi` | WiFi speed | +| `xplr` | [xplr](https://github.com/sayanarijit/xplr) shell | + +### Extensible + +If there is no prompt segment that does what you need, implement your own. Powerlevel10k provides +public API for defining segments that are as fast and as flexible as built-in ones. + +
+ Screen recording + + ![Powerlevel10k Custom Segment]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/custom-segment.gif) +
+ +On Linux you can fetch current CPU temperature by reading `/sys/class/thermal/thermal_zone0/temp`. +The screencast shows how to define a prompt segment to display this value. Once the segment is +defined, you can use it like any other segment. All standard customization parameters will work for +it out of the box. + +Type `p10k help segment` for reference. + +*Tip*: Prefix names of your own segments with `my_` to avoid clashes with future versions of +Powerlevel10k. + +## Installation + +- [Manual](#manual) 👈 **choose this if confused or uncertain** +- [Oh My Zsh](#oh-my-zsh) +- [Prezto](#prezto) +- [Zim](#zim) +- [Antibody](#antibody) +- [Antidote](#antidote) +- [Antigen](#antigen) +- [Zplug](#zplug) +- [Zgen](#zgen) +- [Zplugin](#zplugin) +- [Zinit](#zinit) +- [Zi](#zi) +- [Zap](#zap) +- [Homebrew](#homebrew) +- [Arch Linux](#arch-linux) +- [Alpine Linux](#alpine-linux) +- [Fig](#fig) + +### Manual + +```zsh +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +Users in China can use the official mirror on gitee.com for faster download.
+中国用户可以使用 gitee.com 上的官方镜像加速下载. + +```zsh +git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +This is the simplest kind of installation and it works even if you are using a plugin manager. Just +make sure to disable the current theme in your plugin manager. See +[troubleshooting](#cannot-make-powerlevel10k-work-with-my-plugin-manager) for help. + +### Oh My Zsh + +1. Clone the repository: + ```zsh + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k + ``` + Users in China can use the official mirror on gitee.com for faster download.
+ 中国用户可以使用 gitee.com 上的官方镜像加速下载. + + ```zsh + git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k + ``` +2. Set `ZSH_THEME="powerlevel10k/powerlevel10k"` in `~/.zshrc`. + +### Prezto + +Add `zstyle :prezto:module:prompt theme powerlevel10k` to `~/.zpreztorc`. + +### Zim + +Add `zmodule romkatv/powerlevel10k --use degit` to `~/.zimrc` and run `zimfw install`. + +### Antibody + +Add `antibody bundle romkatv/powerlevel10k` to `~/.zshrc`. + +### Antidote + +Add `romkatv/powerlevel10k` to `~/.zsh_plugins.txt`. + +### Antigen + +Add `antigen theme romkatv/powerlevel10k` to `~/.zshrc`. Make sure you have `antigen apply` +somewhere after it. + +### Zplug + +Add `zplug romkatv/powerlevel10k, as:theme, depth:1` to `~/.zshrc`. + +### Zgen + +Add `zgen load romkatv/powerlevel10k powerlevel10k` to `~/.zshrc`. + +### Zplugin + +Add `zplugin ice depth=1; zplugin light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zinit + +Add `zinit ice depth=1; zinit light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zi + +Add `zi ice depth=1; zi light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zap + +Add `plug "romkatv/powerlevel10k"` to `~/.zshrc`. + +### Homebrew + +```zsh +brew install romkatv/powerlevel10k/powerlevel10k +echo "source $(brew --prefix)/opt/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc +``` + +### Arch Linux + +```zsh +yay -S --noconfirm zsh-theme-powerlevel10k-git +echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +[zsh-theme-powerlevel10k-git](https://aur.archlinux.org/packages/zsh-theme-powerlevel10k-git/) +referenced above is the official Powerlevel10k package. + +There is also [zsh-theme-powerlevel10k]( + https://www.archlinux.org/packages/community/x86_64/zsh-theme-powerlevel10k/) community package. +Historically, [it has been breaking often and for extended periods of time]( + https://github.com/romkatv/powerlevel10k/pull/786). **Do not use it.** + +### Alpine Linux + +```zsh +apk add zsh zsh-theme-powerlevel10k +mkdir -p ~/.local/share/zsh/plugins +ln -s /usr/share/zsh/plugins/powerlevel10k ~/.local/share/zsh/plugins/ +``` + +### Fig + +Follow the instructions on +[this page](https://fig.io/plugins/other/powerlevel10k). + +## Configuration + +- [For new users](#for-new-users) +- [For Powerlevel9k users](#for-powerlevel9k-users) + +### For new users + +On the first run, Powerlevel10k [configuration wizard](#configuration-wizard) will ask you a few +questions and configure your prompt. If it doesn't trigger automatically, type `p10k configure`. +Configuration wizard creates `~/.p10k.zsh` based on your preferences. Additional prompt +customization can be done by editing this file. It has plenty of comments to help you navigate +through configuration options. + +*FAQ*: + +- [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) +- [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) +- [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) +- [How do I add username and/or hostname to prompt?]( + #how-do-i-add-username-andor-hostname-to-prompt) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) +- [Why some prompt segments appear and disappear as I'm typing?]( + #why-some-prompt-segments-appear-and-disappear-as-im-typing) + +*Troubleshooting*: + +- [Question mark in prompt](#question-mark-in-prompt). +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render). +- [Sub-pixel imperfections around powerline symbols]( + #sub-pixel-imperfections-around-powerline-symbols). +- [Directory is difficult to see in prompt when using Rainbow style]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style). + +### For Powerlevel9k users + +If you've been using Powerlevel9k before, **do not remove the configuration options**. Powerlevel10k +will pick them up and provide you with the same prompt UI you are used to. See +[Powerlevel9k compatibility](#powerlevel9k-compatibility). + +*FAQ*: + +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?]( + #im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [What is the relationship between Powerlevel9k and Powerlevel10k?]( + #what-is-the-relationship-between-powerlevel9k-and-powerlevel10k) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) + +*Troubleshooting*: [Extra or missing spaces in prompt compared to Powerlevel9k]( + #extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k). + +## Fonts + +Powerlevel10k doesn't require custom fonts but can take advantage of them if they are available. +It works well with [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts), +[Source Code Pro](https://github.com/adobe-fonts/source-code-pro), +[Font Awesome](https://fontawesome.com/), [Powerline](https://github.com/powerline/fonts), and even +the default system fonts. The full choice of style options is available only when using +[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts). + +👇 **Recommended font**: Meslo Nerd Font patched for Powerlevel10k. 👇 + +### Meslo Nerd Font patched for Powerlevel10k + +Gorgeous monospace font designed by Jim Lyles for Bitstream, customized by the same for Apple, +further customized by André Berg, and finally patched by yours truly with customized scripts +originally developed by Ryan L McIntyre of Nerd Fonts. Contains all glyphs and symbols that +Powerlevel10k may need. Battle-tested in dozens of different terminals on all major operating +systems. + +*FAQ*: [How was the recommended font created?](#how-was-the-recommended-font-created) + +#### Automatic font installation + +If you are using iTerm2 or Termux, `p10k configure` can install the recommended font for you. +Simply answer `Yes` when asked whether to install *Meslo Nerd Font*. + +If you are using a different terminal, proceed with manual font installation. 👇 + +#### Manual font installation + +1. Download these four ttf files: + - [MesloLGS NF Regular.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf) + - [MesloLGS NF Bold.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf) + - [MesloLGS NF Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf) + - [MesloLGS NF Bold Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf) +1. Double-click on each file and click "Install". This will make `MesloLGS NF` font available to all + applications on your system. +1. Configure your terminal to use this font: + - **iTerm2**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. Alternatively, open *iTerm2 → Preferences → Profiles → Text* and set *Font* to + `MesloLGS NF`. + - **Apple Terminal**: Open *Terminal → Preferences → Profiles → Text*, click *Change* under *Font* + and select `MesloLGS NF` family. + - **Hyper**: Open *Hyper → Edit → Preferences* and change the value of `fontFamily` under + `module.exports.config` to `MesloLGS NF`. + - **Visual Studio Code**: Open *File → Preferences → Settings* (PC) or + *Code → Preferences → Settings* (Mac), enter `terminal.integrated.fontFamily` in the search box at + the top of *Settings* tab and set the value below to `MesloLGS NF`. + Consult [this screenshot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/389133fb8c9a2347929a23702ce3039aacc46c3d/visual-studio-code-font-settings.jpg) + to see how it should look like or see [this issue]( + https://github.com/romkatv/powerlevel10k/issues/671) for extra information. + - **GNOME Terminal** (the default Ubuntu terminal): Open *Terminal → Preferences* and click on the + selected profile under *Profiles*. Check *Custom font* under *Text Appearance* and select + `MesloLGS NF Regular`. + - **Konsole**: Open *Settings → Edit Current Profile → Appearance*, click *Select Font* and select + `MesloLGS NF Regular`. + - **Tilix**: Open *Tilix → Preferences* and click on the selected profile under *Profiles*. Check + *Custom font* under *Text Appearance* and select `MesloLGS NF Regular`. + - **Windows Console Host** (the old thing): Click the icon in the top left corner, then + *Properties → Font* and set *Font* to `MesloLGS NF`. + - **Windows Terminal** by Microsoft (the new thing): Open *Settings* (Ctrl+,), click + either on the selected profile under *Profiles* or on *Defaults*, click *Appearance* and set + *Font face* to `MesloLGS NF`. + - **IntelliJ** (and other IDEs by Jet Brains): Open *IDE → Edit → Preferences → Editor → + Color Scheme → Console Font*. Select *Use console font instead of the default* and set the font + name to `MesloLGS NF`. + - **Termux**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. + - **Blink**: Type `config`, go to *Appearance*, tap *Add a new font*, tap *Open Gallery*, select + *MesloLGS NF.css*, tap *import* and type `exit` in the home view to reload the font. + - **Tabby** (formerly **Terminus**): Open *Settings → Appearance* and set *Font* to `MesloLGS NF`. + - **Terminator**: Open *Preferences* using the context menu. Under *Profiles* select the *General* + tab (should be selected already), uncheck *Use the system fixed width font* (if not already) + and select `MesloLGS NF Regular`. Exit the Preferences dialog by clicking *Close*. + - **Guake**: Right Click on an open terminal and open *Preferences*. Under *Appearance* + tab, uncheck *Use the system fixed width font* (if not already) and select `MesloLGS NF Regular`. + Exit the Preferences dialog by clicking *Close*. + - **MobaXterm**: Open *Settings* → *Configuration* → *Terminal* → (under *Terminal look and feel*) + and change *Font* to `MesloLGS NF`. + - **Asbrú Connection Manager**: Open *Preferences → Local Shell Options → Look and Feel*, enable + *Use these personal options* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + To change the font for the remote host connections, go to *Preferences → Terminal Options → + Look and Feel* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + - **WSLtty**: Right click on an open terminal and then on *Options*. In the *Text* section, under + *Font*, click *"Select..."* and set Font to `MesloLGS NF Regular`. + - **Yakuake**: Click *≡* → *Manage Profiles* → *New* → *Appearance*. Click *Choose* next to the + *Font* dropdown, select `MesloLGS NF` and click *OK*. Click *OK* to save the profile. Select the + new profile and click *Set as Default*. + - **Alacritty**: Create or open `~/.config/alacritty/alacritty.yml` and add the following section + to it: + ```yaml + font: + normal: + family: "MesloLGS NF" + ``` + - **kitty**: Create or open `~/.config/kitty/kitty.conf` and add the following line to it: + ```text + font_family MesloLGS NF + ``` + Restart kitty by closing all sessions and opening a new session. + - **puTTY**: Set *Window* → *Appearance* → *Font* to `MesloLGS NF`. Requires puTTY + version >= 0.75. + - **WezTerm**: Create or open `$HOME/.config/wezterm/wezterm.lua` and add the following: + ```lua + local wezterm = require 'wezterm'; + return { + font = wezterm.font("MesloLGS NF"), + } + ``` + If the file already exists, only add the line with the font to the existing return. + Also add the first line if it is not already present. + - **urxvt**: Create or open `~/.Xresources` and add the following line to it: + ```text + URxvt.font: xft:MesloLGS NF:size=11 + ``` + You can adjust the font size to your preference. After changing the config run + `xrdb ~/.Xresources` to reload it. The new config is applied to all new terminals. + - **xterm**: Create or open `~/.Xresources` and add the following line to it: + ```text + xterm*faceName: MesloLGS NF + ``` + After changing the config run `xrdb ~/.Xresources` to reload it. The new config is applied to + all new terminals. + - **Zed**: Open `~/.config/zed/settings.json` and set `terminal.font_family` to `"MesloLGS NF"`. + ```jsonc + { + "terminal": { + "font_family": "MesloLGS NF" + }, + // Other settings. + } + ``` + - Crostini (Linux on Chrome OS): Open + chrome-untrusted://terminal/html/nassh_preferences_editor.html, set *Text font family* to + `'MesloLGS NF'` (including the quotes) and *Custom CSS (inline text)* to the following: + ```css + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Regular.ttf"); + font-weight: normal; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold.ttf"); + font-weight: bold; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Italic.ttf"); + font-weight: normal; + font-style: italic; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold%20Italic.ttf"); + font-weight: bold; + font-style: italic; + } + ``` + **_CAVEAT_**: If you open the normal terminal preferences these settings will be overwritten. +1. Run `p10k configure` to generate a new `~/.p10k.zsh`. The old config may work + incorrectly with the new font. + +_Using a different terminal and know how to set the font for it? Share your knowledge by sending a +PR to expand the list!_ + +## Try it in Docker + +Try Powerlevel10k in Docker. You can safely make any changes to the file system while trying out +the theme. Once you exit Zsh, the container is deleted. + +```zsh +docker run -e TERM -e COLORTERM -e LC_ALL=C.UTF-8 -it --rm alpine sh -uec ' + apk add git zsh nano vim + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k + echo "source ~/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc + cd ~/powerlevel10k + exec zsh' +``` + +*Tip*: Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) before +running the Docker command to get access to all prompt styles. + +*Tip*: Run `p10k configure` while in Docker to try a different prompt style. + +## License + +Powerlevel10k is released under the +[MIT license](https://github.com/romkatv/powerlevel10k/blob/master/LICENSE). + +## FAQ + +- [How do I update Powerlevel10k?](#how-do-i-update-powerlevel10k) +- [How do I uninstall Powerlevel10k?](#how-do-i-uninstall-powerlevel10k) +- [How do I install Powerlevel10k on a machine without Internet access?](#how-do-i-install-powerlevel10k-on-a-machine-without-internet-access) +- [Where can I ask for help and report bugs?](#where-can-i-ask-for-help-and-report-bugs) +- [Which aspects of shell and terminal does Powerlevel10k affect?](#which-aspects-of-shell-and-terminal-does-powerlevel10k-affect) +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?](#im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [Is it really fast?](#is-it-really-fast) +- [How do I configure instant prompt?](#how-do-i-configure-instant-prompt) +- [How do I initialize direnv when using instant prompt?](#how-do-i-initialize-direnv-when-using-instant-prompt) +- [How do I export GPG_TTY when using instant prompt?](#how-do-i-export-gpg_tty-when-using-instant-prompt) +- [What do different symbols in Git status mean?](#what-do-different-symbols-in-git-status-mean) +- [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) +- [Why is Git status from `$HOME/.git` not displayed in prompt?](#why-is-git-status-from-homegit-not-displayed-in-prompt) +- [Why does Git status sometimes appear grey and then gets colored after a short period of time?](#why-does-git-status-sometimes-appear-grey-and-then-gets-colored-after-a-short-period-of-time) +- [How do I add username and/or hostname to prompt?](#how-do-i-add-username-andor-hostname-to-prompt) +- [Why some prompt segments appear and disappear as I'm typing?](#why-some-prompt-segments-appear-and-disappear-as-im-typing) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) +- [Why does Powerlevel10k spawn extra processes?](#why-does-powerlevel10k-spawn-extra-processes) +- [Are there configuration options that make Powerlevel10k slow?](#are-there-configuration-options-that-make-powerlevel10k-slow) +- [Is Powerlevel10k fast to load?](#is-powerlevel10k-fast-to-load) +- [What is the relationship between Powerlevel9k and Powerlevel10k?](#what-is-the-relationship-between-powerlevel9k-and-powerlevel10k) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?](#does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) +- [What is the best prompt style in the configuration wizard?](#what-is-the-best-prompt-style-in-the-configuration-wizard) +- [How to make Powerlevel10k look like robbyrussell Oh My Zsh theme?](#how-to-make-powerlevel10k-look-like-robbyrussell-oh-my-zsh-theme) +- [Can prompts for completed commands display error status for *those* commands instead of the commands preceding them?](#can-prompts-for-completed-commands-display-error-status-for-those-commands-instead-of-the-commands-preceding-them) +- [What is the minimum supported Zsh version?](#what-is-the-minimum-supported-zsh-version) +- [How were these screenshots and animated gifs created?](#how-were-these-screenshots-and-animated-gifs-created) +- [How was the recommended font created?](#how-was-the-recommended-font-created) +- [How to package Powerlevel10k for distribution?](#how-to-package-powerlevel10k-for-distribution) + +### How do I update Powerlevel10k? + +The command to update Powerlevel10k depends on how it was installed. + +| Installation | Update command | +|-------------------------------|-------------------------------------------------------------| +| [Manual](#manual) | `git -C ~/powerlevel10k pull` | +| [Oh My Zsh](#oh-my-zsh) | `git -C ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k pull` | +| [Prezto](#prezto) | `zprezto-update` | +| [Zim](#zim) | `zimfw update` | +| [Antigen](#antigen) | `antigen update` | +| [Antidote](#antidote) | `antidote update` | +| [Zplug](#zplug) | `zplug update` | +| [Zgen](#zgen) | `zgen update` | +| [Zplugin](#zplugin) | `zplugin update` | +| [Zinit](#zinit) | `zinit update` | +| [Zi](#zi) | `zi update` | +| [Zap](#zap) | `zap update` | +| [Homebrew](#homebrew) | `brew update && brew upgrade` | +| [Arch Linux](#arch-linux) | `yay -S --noconfirm zsh-theme-powerlevel10k-git` | +| [Alpine Linux](#alpine-linux) | `apk update && apk upgrade` | + +**IMPORTANT**: Restart Zsh after updating Powerlevel10k. [Do not use `source ~/.zshrc`]( + #weird-things-happen-after-typing-source-zshrc). + +### How do I uninstall Powerlevel10k? + +1. Remove all references to "p10k" from `~/.zshrc`. You might have this snippet at the top: + ```zsh + 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 + ``` + And this at the bottom: + ```zsh + [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + ``` + These are added by the [configuration wizard](#configuration-wizard). Remove them. +2. Remove all references to "powerlevel10k" from `~/.zshrc`, `~/.zpreztorc` and `~/.zimrc` (some + of these files may be missing -- this is normal). These references have been added manually by + yourself when installing Powerlevel10k. Refer to the [installation instructions](#installation) + if you need a reminder. +3. Verify that all references to "p10k" and "powerlevel10k" are gone from `~/.zshrc`, `~/.zpreztorc` + and `~/.zimrc`. + ```zsh + grep -E 'p10k|powerlevel10k' ~/.zshrc ~/.zpreztorc ~/.zimrc 2>/dev/null + ``` + If this command produces output, there are still references to "p10k" or "powerlevel10k". You + need to remove them. +4. Delete Powerlevel10k configuration file. This file is created by the + [configuration wizard](#configuration-wizard) and may contain manual edits by yourself. + ```zsh + rm -f ~/.p10k.zsh + ``` +5. Delete Powerlevel10k source files. These files have been downloaded when you've installed + Powerlevel10k. The command to delete them depends on which installation method you'd chosen. + Refer to the [installation instructions](#installation) if you need a reminder. + + | Installation | Uninstall command | + |-------------------------------|------------------------------------------------------------------| + | [Manual](#manual) | `rm -rf ~/powerlevel10k` | + | [Oh My Zsh](#oh-my-zsh) | `rm -rf -- ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k` | + | [Prezto](#prezto) | n/a | + | [Zim](#zim) | `zimfw uninstall` | + | [Antigen](#antigen) | `antigen purge romkatv/powerlevel10k` | + | [Antidote](#antidote) | `antidote purge romkatv/powerlevel10k` | + | [Zplug](#zplug) | `zplug clean` | + | [Zgen](#zgen) | `zgen reset` | + | [Zplugin](#zplugin) | `zplugin delete romkatv/powerlevel10k` | + | [Zinit](#zinit) | `zinit delete romkatv/powerlevel10k` | + | [Zi](#zi) | `zi delete romkatv/powerlevel10k` | + | [Zap](#zap) | `zsh -ic 'zap clean'` | + | [Homebrew](#homebrew) | `brew uninstall powerlevel10k; brew untap romkatv/powerlevel10k` | + | [Arch Linux](#arch-linux) | `yay -R --noconfirm zsh-theme-powerlevel10k-git` | + | [Alpine Linux](#alpine-linux) | `apk del zsh-theme-powerlevel10k` | +6. Restart Zsh. [Do not use `source ~/.zshrc`](#weird-things-happen-after-typing-source-zshrc). +7. Delete Powerlevel10k cache files. + ```zsh + rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}"/p10k-*(N) "${XDG_CACHE_HOME:-$HOME/.cache}"/gitstatus + ``` + +### How do I install Powerlevel10k on a machine without Internet access? + +1. Run this command on the machine without Internet access: + ```sh + uname -sm | tr '[A-Z]' '[a-z]' + ``` +2. Run these commands on a machine connected to the Internet after replacing the value of + `target_uname` with the output of the previous command: + ```sh + target_uname="replace this with the output of the previous command" + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k + GITSTATUS_CACHE_DIR="$HOME"/powerlevel10k/gitstatus/usrbin ~/powerlevel10k/gitstatus/install -f -s "${target_uname% *}" -m "${target_uname#* }" + ``` +3. Copy `~/powerlevel10k` from the machine connected to the Internet to the one without Internet + access. +4. Add `source ~/powerlevel10k/powerlevel10k.zsh-theme` to `~/.zshrc` on the machine without + Internet access: + ```zsh + echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc + ``` +5. If `~/.zshrc` on the machine without Internet access sets `ZSH_THEME`, remove that line. + ```zsh + sed -i.bak '/^ZSH_THEME=/d' ~/.zshrc + ``` + +To update, remove `~/powerlevel10k` on both machines and repeat steps 1-3. + +### Where can I ask for help and report bugs? + +The best way to ask for help and to report bugs is to [open an issue]( + https://github.com/romkatv/powerlevel10k/issues). + +[Gitter]( + https://gitter.im/powerlevel10k/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +is another option. + +If all else fails, email roman.perepelitsa@gmail.com. + +If necessary, encrypt your communication with [this PGP key]( + https://api.github.com/users/romkatv/gpg_keys). + +### Which aspects of shell and terminal does Powerlevel10k affect? + +Powerlevel10k defines prompt and nothing else. It sets [prompt-related options]( + http://zsh.sourceforge.net/Doc/Release/Options.html#Prompting), and parameters `PS1` and `RPS1`. + +![Prompt Highlight]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-highlight.png) + +Everything within the highlighted areas on the screenshot is produced by Powerlevel10k. +Powerlevel10k has no control over the terminal content or colors outside these areas. + +Powerlevel10k does not affect: + +- Terminal window/tab title. +- Colors used by `ls`. +- The behavior of `git` command. +- The content and style of Tab completions. +- Command line colors (syntax highlighting, autosuggestions, etc.). +- Key bindings. +- Aliases. +- Prompt parameters other than `PS1` and `RPS1`. +- Zsh options other than those [related to prompt]( + http://zsh.sourceforge.net/Doc/Release/Options.html#Prompting). + +### I'm using Powerlevel9k with Oh My Zsh. How do I migrate? + +1. Run this command: +```zsh +# Add powerlevel10k to the list of Oh My Zsh themes. +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k +# Replace ZSH_THEME="powerlevel9k/powerlevel9k" with ZSH_THEME="powerlevel10k/powerlevel10k". +sed -i.bak 's/powerlevel9k/powerlevel10k/g' ~/.zshrc +# Restart Zsh. +exec zsh +``` +2. *Optional but highly recommended:* + 1. Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). + 1. Type `p10k configure` and choose your favorite prompt style. + +*Related:* + - [Powerlevel9k compatibility.](#powerlevel9k-compatibility) + - [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) + - [Extra or missing spaces in prompt compared to Powerlevel9k.]( + #extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k) + - [Configuration wizard.](#configuration-wizard) + +### Is it really fast? + +Yes. See [zsh-bench](https://github.com/romkatv/zsh-bench) or a direct comparison with +[Powerlevel9k](https://asciinema.org/a/NHRjK3BMePw66jtRVY2livHwZ) and +[Spaceship](https://asciinema.org/a/253094). + +### How do I configure instant prompt? + +See [instant prompt](#instant-prompt) to learn about instant prompt. This section explains how you +can enable and configure it and lists caveats that you should be aware of. + +Instant prompt can be enabled either through `p10k configure` or by manually adding the following +code snippet at the top of `~/.zshrc`: + +```zsh +# 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 +``` + +It's important that you copy the lines verbatim. Don't replace `source` with something else, don't +call `zcompile`, don't redirect output, etc. + +When instant prompt is enabled, for the duration of Zsh initialization standard input is redirected +to `/dev/null` and standard output with standard error are redirected to a temporary file. Once Zsh +is fully initialized, standard file descriptors are restored and the content of the temporary file +is printed out. + +When using instant prompt, you should carefully check any output that appears on Zsh startup as it +may indicate that initialization has been altered, or perhaps even broken, by instant prompt. +Initialization code that may require console input, such as asking for a keyring password or for a +*[y/n]* confirmation, must be moved above the instant prompt preamble in `~/.zshrc`. Initialization +code that merely prints to console but never reads from it will work correctly with instant prompt, +although output that normally has colors may appear uncolored. You can either leave it be, suppress +the output, or move it above the instant prompt preamble. + +Here's an example of `~/.zshrc` that breaks when instant prompt is enabled: + +```zsh +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 + +keychain id_rsa --agents ssh # asks for password +chatty-script # spams to stdout even when everything is fine +# ... +``` + +Fixed version: + +```zsh +keychain id_rsa --agents ssh # moved before instant prompt + +# OK to perform console I/O before this point. +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 +# From this point on, until zsh is fully initialized, console input won't work and +# console output may appear uncolored. + +chatty-script >/dev/null # spam output suppressed +# ... +``` + +If `POWERLEVEL9K_INSTANT_PROMPT` is unset or set to `verbose`, Powerlevel10k will print a warning +when it detects console output during initialization to bring attention to potential issues. You can +silence this warning (without suppressing console output) with `POWERLEVEL9K_INSTANT_PROMPT=quiet`. +This is recommended if some initialization code in `~/.zshrc` prints to console and it's infeasible +to move it above the instant prompt preamble or to suppress its output. You can completely disable +instant prompt with `POWERLEVEL9K_INSTANT_PROMPT=off`. Do this if instant prompt breaks Zsh +initialization and you don't know how to fix it. + +The value of `POWERLEVEL9K_INSTANT_PROMPT` can be changed by running `p10k configure` and selecting +the appropriate option on the *Instant Prompt* screen. Alternatively, you can search for +`POWERLEVEL9K_INSTANT_PROMPT` in the existing `~/.p10k.zsh` and change its value there. + +*Note*: Instant prompt requires Zsh >= 5.4. It's OK to enable it even when using an older version of +Zsh but it won't do anything. + +*FAQ*: + +- [How do I initialize direnv when using instant prompt?]( + #how-do-i-initialize-direnv-when-using-instant-prompt) +- [How do I export GPG_TTY when using instant prompt?]( + #how-do-i-export-gpg_tty-when-using-instant-prompt) + +### How do I initialize direnv when using instant prompt? + +If you've enabled [instant prompt](#instant-prompt), you should have these lines at the top of +`~/.zshrc`: + +```zsh +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 +``` + +To initialize direnv you need to add one line above that block and one line below it. + +```zsh +(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv export zsh)" + +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 + +(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv hook zsh)" +``` + +*Related*: [How do I export GPG_TTY when using instant prompt?]( + #how-do-i-export-gpg_tty-when-using-instant-prompt) + +### How do I export GPG_TTY when using instant prompt? + +You can export `GPG_TTY` like this anywhere in `~/.zshrc`: + +```zsh +export GPG_TTY=$TTY +``` + +This works whether you are using [instant prompt](#instant-prompt) or not. It works even if you +aren't using powerlevel10k. As an extra bonus, it's much faster than the commonly used +`export GPG_TTY=$(tty)`. + +*Related*: [How do I initialize direnv when using instant prompt?]( + #how-do-i-initialize-direnv-when-using-instant-prompt) + +### What do different symbols in Git status mean? + +When using Lean, Classic or Rainbow style, Git status may look like this: + +```text +feature:master wip ⇣42⇡42 ⇠42⇢42 *42 merge ~42 +42 !42 ?42 +``` + +| Symbol | Meaning | Source | +| --------- | -------------------------------------------------------------------- | ------------------------------------------------------ | +| `feature` | current branch; replaced with `#tag` or `@commit` if not on a branch | `git status --ignore-submodules=dirty` | +| `master` | remote tracking branch; only shown if different from local branch | `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}` | +| `wip` | the latest commit's summary contains "wip" or "WIP" | `git show --pretty=%s --no-patch HEAD` | +| `=` | up to date with the remote (neither ahead nor behind) | `git rev-list --count HEAD...@{upstream}` | +| `⇣42` | this many commits behind the remote | `git rev-list --right-only --count HEAD...@{upstream}` | +| `⇡42` | this many commits ahead of the remote | `git rev-list --left-only --count HEAD...@{upstream}` | +| `⇠42` | this many commits behind the push remote | `git rev-list --right-only --count HEAD...@{push}` | +| `⇢42` | this many commits ahead of the push remote | `git rev-list --left-only --count HEAD...@{push}` | +| `*42` | this many stashes | `git stash list` | +| `merge` | repository state | `git status --ignore-submodules=dirty` | +| `~42` | this many merge conflicts | `git status --ignore-submodules=dirty` | +| `+42` | this many staged changes | `git status --ignore-submodules=dirty` | +| `!42` | this many unstaged changes | `git status --ignore-submodules=dirty` | +| `?42` | this many untracked files | `git status --ignore-submodules=dirty` | +| `─` | the number of staged, unstaged or untracked files is unknown | `echo $POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY` or `git config --get bash.showDirtyState` | + +*Related*: [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) + +### How do I change the format of Git status? + +To change the format of Git status, open `~/.p10k.zsh`, search for `my_git_formatter` and edit its +source code. + +*Related*: [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) + +### Why is Git status from `$HOME/.git` not displayed in prompt? + +When using Lean, Classic or Rainbow style, `~/.p10k.zsh` contains the following parameter: + +```zsh +# 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='~' +``` + +To see Git status for `$HOME/.git` in prompt, open `~/.p10k.zsh` and remove +`POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN`. + +### Why does Git status sometimes appear grey and then gets colored after a short period of time? + +tl;dr: When Git status in prompt is greyed out, it means Powerlevel10k is currently computing +up-to-date Git status in the background. Prompt will get automatically refreshed when this +computation completes. + +When your current directory is within a Git repository, Powerlevel10k computes up-to-date Git +status after every command. If the repository is large, or the machine is slow, this computation +can take quite a bit of time. If it takes longer than 10 milliseconds (configurable via +`POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS`), Powerlevel10k displays the last known Git status in +grey and continues to compute up-to-date Git status in the background. When the computation +completes, Powerlevel10k refreshes prompt with new information, this time with colored Git status. + +When using *Rainbow* style, Git status is displayed as black on grey while it's still being +computed. Depending on the terminal color palette, this may be difficult to read. In this case you +might want to change the background color to something ligher for more contrast. To do that, open +`~/.p10k.zsh`, search for `POWERLEVEL9K_VCS_LOADING_BACKGROUND`, uncomment it if it's commented out, +and change the value. + +```zsh +typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=244 +``` + +Type `source ~/.p10k.zsh` to apply your changes to the current Zsh session. + +*Related*: [How do I change prompt colors?](#how-do-i-change-prompt-colors) + +### How do I add username and/or hostname to prompt? + +When using Lean, Classic or Rainbow style, prompt shows `username@hostname` when you are logged in +as root or via SSH. There is little value in showing `username` or `hostname` when you are logged in +to your local machine as a normal user. So the absence of `username@hostname` in your prompt is an +indication that you are working locally and that you aren't root. You can change it, however. + +Open `~/.p10k.zsh`. Close to the top you can see the most important parameters that define which +segments are shown in your prompt. All generally useful prompt segments are listed in there. Some of +them are enabled, others are commented out. One of them is of interest to you. + +```zsh +typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + ... + context # user@hostname + ... +) +``` + +Search for `context` to find the section in the config that lists parameters specific to this prompt +segment. You should see the following lines: + +```zsh +# 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= +``` + +If you follow the tip and remove (or comment out) the last line, you'll always see +`username@hostname` in prompt. You can change the format to just `username`, or change the color, by +adjusting the values of parameters nearby. There are plenty of comments to help you navigate. + +You can also move `context` to a different position in `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS` or even +to `POWERLEVEL9K_LEFT_PROMPT_ELEMENTS`. + +### Why some prompt segments appear and disappear as I'm typing? + +Prompt segments can be configured to be shown only when the current command you are typing invokes +a relevant tool. + +```zsh +# Show prompt segment "kubecontext" only when the command you are typing invokes +# invokes kubectl, helm, or kubens. +typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' +``` + +Configs created by `p10k configure` may contain parameters of this kind. To customize when different +prompt segments are shown, open `~/.p10k.zsh`, search for `SHOW_ON_COMMAND` and either remove these +parameters or change their values. + +You can also define a function in `~/.zshrc` to toggle the display of a prompt segment between +*always* and *on command*. This is similar to `kubeon`/`kubeoff` from +[kube-ps1](https://github.com/jonmosco/kube-ps1). + +```zsh +function kube-toggle() { + if (( ${+POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND} )); then + unset POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND + else + POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' + fi + p10k reload + if zle; then + zle push-input + zle accept-line + fi +} +``` + +Invoke this function by typing `kube-toggle`. You can also bind it to a key by adding two more lines +to `~/.zshrc`: + +```zsh +zle -N kube-toggle +bindkey '^]' kube-toggle # ctrl-] to toggle kubecontext in powerlevel10k prompt +``` + +### How do I change prompt colors? + +You can either [change the color palette used by your terminal]( + #change-the-color-palette-used-by-your-terminal) or +[set colors through Powerlevel10k configuration parameters]( + #set-colors-through-Powerlevel10k-configuration-parameters). + +#### Change the color palette used by your terminal + +How exactly you change the terminal color palette (a.k.a. color scheme, or theme) depends on the +kind of terminal you are using. Look around in terminal's settings/preferences or consult +documentation. + +When you change the terminal color palette, it usually affects only the first 16 colors, numbered +from 0 to 15. In order to see any effect on Powerlevel10k prompt, you need to use prompt style that +utilizes these low-numbered colors. Type `p10k configure` and select *Rainbow*, *Lean* → *8 colors* +or *Pure* → *Original*. Other styles use higher-numbered colors, so they look the same in any +terminal color palette. + +#### Set colors through Powerlevel10k configuration parameters + +Open `~/.p10k.zsh`, search for "color", "foreground" and "background" and change values of +appropriate parameters. For example, here's how you can set the foreground of `time` prompt segment +to bright red: + +```zsh +typeset -g POWERLEVEL9K_TIME_FOREGROUND=160 +``` + +Colors are specified using numbers from 0 to 255. Colors from 0 to 15 look differently in different +terminals. Many terminals also support customization of these colors through color palettes +(a.k.a. color schemes, or themes). Colors from 16 to 255 always look the same. + +Type `source ~/.p10k.zsh` to apply your changes to the current Zsh session. + +To see how different colors look in your terminal, run the following command: + +```zsh +for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done +``` + +*Related:* + - [Directory is difficult to see in prompt when using Rainbow style.]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) + +### Why does Powerlevel10k spawn extra processes? + +Powerlevel10k uses [gitstatus](https://github.com/romkatv/gitstatus) as the backend behind `vcs` +prompt; gitstatus spawns `gitstatusd` and `zsh`. See +[gitstatus](https://github.com/romkatv/gitstatus) for details. Powerlevel10k may also spawn `zsh` +to perform computation without blocking prompt. To avoid security hazard, these background processes +aren't shared by different interactive shells. They terminate automatically when the parent `zsh` +process terminates or runs `exec(3)`. + +### Are there configuration options that make Powerlevel10k slow? + +No, Powerlevel10k is always fast, with any configuration you throw at it. If you have noticeable +prompt latency when using Powerlevel10k, please +[open an issue](https://github.com/romkatv/powerlevel10k/issues). + +### Is Powerlevel10k fast to load? + +Yes. See [zsh-bench](https://github.com/romkatv/zsh-bench). + +### What is the relationship between Powerlevel9k and Powerlevel10k? + +Powerlevel10k was forked from Powerlevel9k in March 2019 after a week-long discussion in +[powerlevel9k#1170](https://github.com/Powerlevel9k/powerlevel9k/issues/1170). Powerlevel9k was +already a mature project with a large user base and a release cycle measured in months. Powerlevel10k +was spun off to iterate on performance improvements and new features at much higher pace. + +Powerlevel9k and Powerlevel10k are independent projects. When using one, you shouldn't install the +other. Issues should be filed against the project that you actually use. There are no individuals +that have commit rights in both repositories. All bug fixes and new features committed to +Powerlevel9k repository get ported to Powerlevel10k. + +Over time, virtually all code in Powerlevel10k has been rewritten. There is currently no meaningful +overlap between the implementations of Powerlevel9k and Powerlevel10k. + +Powerlevel10k is committed to maintaining backward compatibility with all configs indefinitely. This +commitment covers all configuration parameters recognized by Powerlevel9k (see +[Powerlevel9k compatibility](#powerlevel9k-compatibility)) and additional parameters that only +Powerlevel10k understands. Names of all parameters in Powerlevel10k start with `POWERLEVEL9K_` for +consistency. + +### Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config? + +Almost. There are a few differences. + +- By default only `git` vcs backend is enabled in Powerlevel10k. If you need `svn` and `hg`, add + them to `POWERLEVEL9K_VCS_BACKENDS`. These backends aren't yet optimized in Powerlevel10k, so + enabling them will make prompt *very slow*. +- Powerlevel10k doesn't support `POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY=true`. +- Powerlevel10k strives to be bug-compatible with Powerlevel9k but not when it comes to egregious + bugs. If you accidentally rely on these bugs, your prompt will differ between Powerlevel9k and + Powerlevel10k. Some examples: + - Powerlevel9k ignores some options that are set after the theme is sourced while Powerlevel10k + respects all options. If you see different icons in Powerlevel9k and Powerlevel10k, you've + probably defined `POWERLEVEL9K_MODE` before sourcing the theme. This parameter gets ignored + by Powerlevel9k but honored by Powerlevel10k. If you want your prompt to look in Powerlevel10k + the same as in Powerlevel9k, remove `POWERLEVEL9K_MODE`. + - Powerlevel9k doesn't respect `ZLE_RPROMPT_INDENT`. As a result, right prompt in Powerlevel10k + can have an extra space at the end compared to Powerlevel9k. Set `ZLE_RPROMPT_INDENT=0` if you + don't want that space. More details in + [troubleshooting](#extra-space-without-background-on-the-right-side-of-right-prompt). + - Powerlevel9k has inconsistent spacing around icons. This was fixed in Powerlevel10k. Set + `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to get the same spacing as in Powerlevel9k. More + details in [troubleshooting](#extra-or-missing-spaces-around-icons). + - There are dozens more bugs in Powerlevel9k that don't exist in Powerlevel10k. + +If you notice any other changes in prompt appearance when switching from Powerlevel9k to +Powerlevel10k, please [open an issue](https://github.com/romkatv/powerlevel10k/issues). + +### What is the best prompt style in the configuration wizard? + +There are as many opinions on what constitutes the best prompt as there are people. It mostly comes +down to personal preference. There are, however, a few hidden implications of different choices. + +Pure style is an exact replication of [Pure Zsh theme](https://github.com/sindresorhus/pure). It +exists to ease the migration for users of this theme. Unless you are one of them, choose Lean +style over Pure. + +If you want to confine prompt colors to the selected terminal color palette (say, *Solarized Dark*), +use *Rainbow*, *Lean* → *8 colors* or *Pure* → *Original*. Other styles use fixed colors and thus +look the same in any terminal color palette. + +All styles except Pure have an option to use *ASCII* charset. Prompt will look less pretty but will +render correctly with all fonts and in all locales. + +If you enable transient prompt, take advantage of two-line prompt. You'll get the benefit of +extra space for typing commands without the usual drawback of reduced scrollback density. Having +all commands start from the same offset is also nice. + +Similarly, if you enable transient prompt, sparse prompt (with an empty line before prompt) is a +great choice. + +If you are using vi keymap, choose prompt with `prompt_char` in it (shown as green `❯` in the +wizard). This symbol changes depending on vi mode: `❯`, `❮`, `V`, `▶` for insert, command, visual +and replace mode respectively. When a command fails, the symbol turns red. *Lean* style always has +`prompt_char` in it. *Rainbow* and *Classic* styles have it only in the two-line configuration +without left frame. + +If you value horizontal space or prefer minimalist aesthetics: + +- Use a monospace font, such as [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). + Non-monospace fonts require extra space after icons that are larger than a single column. +- Use Lean style. Compared to Classic and Rainbow, it saves two characters per prompt segment. +- Disable *current time* and *frame*. +- Use *few icons*. The extra icons enabled by the *many icons* option primarily serve decorative + function. Informative icons, such as background job indicator, will be shown either way. + +*Note*: You can run configuration wizard as many times as you like. Type `p10k configure` to try new +prompt style. + +### How to make Powerlevel10k look like robbyrussell Oh My Zsh theme? + +Use [this config]( + https://github.com/romkatv/powerlevel10k/blob/master/config/p10k-robbyrussell.zsh). + +You can either download it, save as `~/.p10k.zsh` and `source ~/.p10k.zsh` from `~/.zshrc`, or +source `p10k-robbyrussell.zsh` directly from your cloned `powerlevel10k` repository. + +### Can prompts for completed commands display error status for *those* commands instead of the commands preceding them? + +No. When you hit *ENTER* and the command you've typed starts running, its error status isn't yet +known, so it cannot be shown in prompt. When the command completes, the error status gets known but +it's no longer possible to update prompt for *that* command. This is why the error status for every +command is reflected in the *next* prompt. + +For details, see [this post on /r/zsh]( +https://www.reddit.com/r/zsh/comments/eg49ff/powerlevel10k_prompt_history_exit_code_colors/fc5huku). + +### What is the minimum supported Zsh version? + +Zsh 5.3 or newer should work. Fast startup requires Zsh >= 5.4. + +### How were these screenshots and animated gifs created? + +All screenshots and animated gifs were recorded in GNOME Terminal with +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) and Tango Dark color palette with +custom background color (`#171A1B` instead of `#2E3436` -- twice as dark). + +![GNOME Terminal Color Settings]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/gnome-terminal-colors.png) + +Syntax highlighting, where present, was provided by [zsh-syntax-highlighting]( + https://github.com/zsh-users/zsh-syntax-highlighting). + +### How was the recommended font created? + +[The recommended font](#meslo-nerd-font-patched-for-powerlevel10k) is the product of many +individuals. Its origin is *Bitstream Vera Sans Mono*, which has given birth to *Menlo*, which in +turn has spawned *Meslo*. Finally, extra glyphs have been added to *Meslo* with scripts forked +from Nerd Fonts. The final font is released under the terms of +[Apache License]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20License.txt). + +MesloLGS NF font can be recreated with the following command (requires `git` and `docker`): + +```zsh +git clone --depth=1 https://github.com/romkatv/nerd-fonts.git +cd nerd-fonts +./build 'Meslo/S/*' +``` + +If everything goes well, four `ttf` files will appear in `./out`. + +### How to package Powerlevel10k for distribution? + +It's currently neither easy nor recommended to package and distribute Powerlevel10k. There are no +instructions you can follow that would allow you to easily update your package when new versions of +Powerlevel10k are released. This may change in the future but not soon. + +## Troubleshooting + +- [Question mark in prompt](#question-mark-in-prompt) +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render) +- [Sub-pixel imperfections around powerline symbols](#sub-pixel-imperfections-around-powerline-symbols) +- [Error: character not in range](#error-character-not-in-range) +- [Cursor is in the wrong place](#cursor-is-in-the-wrong-place) +- [Prompt wrapping around in a weird way](#prompt-wrapping-around-in-a-weird-way) +- [Right prompt is in the wrong place](#right-prompt-is-in-the-wrong-place) +- [Configuration wizard runs automatically every time Zsh is started](#configuration-wizard-runs-automatically-every-time-zsh-is-started) +- [Some prompt styles are missing from the configuration wizard](#some-prompt-styles-are-missing-from-the-configuration-wizard) +- [Cannot install the recommended font](#cannot-install-the-recommended-font) +- [Extra or missing spaces in prompt compared to Powerlevel9k](#extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k) + - [Extra space without background on the right side of right prompt](#extra-space-without-background-on-the-right-side-of-right-prompt) + - [Extra or missing spaces around icons](#extra-or-missing-spaces-around-icons) +- [Weird things happen after typing `source ~/.zshrc`](#weird-things-happen-after-typing-source-zshrc) +- [Transient prompt stops working after some time](#transient-prompt-stops-working-after-some-time) +- [Cannot make Powerlevel10k work with my plugin manager](#cannot-make-powerlevel10k-work-with-my-plugin-manager) +- [Directory is difficult to see in prompt when using Rainbow style](#directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) +- [Horrific mess when resizing terminal window](#horrific-mess-when-resizing-terminal-window) +- [Icons cut off in Konsole](#icons-cut-off-in-konsole) +- [Arch Linux logo has a dot in the bottom right corner](#arch-linux-logo-has-a-dot-in-the-bottom-right-corner) +- [Incorrect git status in prompt](#incorrect-git-status-in-prompt) + +### Question mark in prompt + +If it looks like a regular `?`, that's normal. It means you have untracked files in the current Git +repository. Type `git status` to see these files. You can change this symbol or disable the display +of untracked files altogether. Search for `untracked files` in `~/.p10k.zsh`. + +*FAQ*: [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) + +You can also get a weird-looking question mark in your prompt if your terminal's font is missing +some glyphs. See [icons, glyphs or powerline symbols don't render]( + #icons-glyphs-or-powerline-symbols-dont-render). + +### Icons, glyphs or powerline symbols don't render + +Restart your terminal, [install the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) +and run `p10k configure`. + +### Sub-pixel imperfections around powerline symbols + +![Powerline Prompt Imperfections]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/powerline-imperfections.png) + +There are three imperfections on the screenshot. From left to right: + +1. A thin blue line (a sub-pixel gap) between the content of a prompt segment and the following +powerline connection. +1. Incorrect alignment of a powerline connection and the following prompt segment. The connection +appears shifted to the right. +1. A thin red line below a powerline connection. The connection appears shifted up. + +Zsh themes don't have down-to-pixel control over the terminal content. Everything you see on the +screen is made of monospace characters. A white powerline prompt segment is made of text on white +background followed by U+E0B0 (a right-pointing triangle). + +![Powerline Prompt Imperfections]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/powerline-anatomy.png) + +If Powerlevel10k prompt has imperfections around powerline symbols, you'll see exactly the same +imperfections with all powerline themes (Agnoster, Powerlevel9k, Powerline, etc.) + +There are several things you can try to deal with these imperfections: + +- Try [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). If you are already using + it, switching to another font may help but is unlikely. +- Change terminal font size one point up or down. For example, in iTerm2 powerline prompt looks + perfect at font sizes 11 and 13 but breaks down at 12. +- Enable builtin powerline glyphs in terminal settings if your terminal supports it (iTerm2 does). +- Change font hinting and/or anti-aliasing mode in the terminal settings. +- Shift all text one pixel up/down/left/right if your terminal has an option to do so. +- Try a different terminal. + +A more radical solution is to switch to prompt style without background. Type `p10k configure` and +select *Lean*. This style has a modern lightweight look. As a bonus, it doesn't suffer from +rendering imperfections that afflict powerline-style prompt. + +### Error: character not in range + +Type `echo '\u276F'`. If you get an error saying "zsh: character not in range", your locale +doesn't support UTF-8. You need to fix it. If you are running Zsh over SSH, see +[this](https://github.com/romkatv/powerlevel10k/issues/153#issuecomment-518347833). If you are +running Zsh locally, Google "set UTF-8 locale in *your OS*". + +### Cursor is in the wrong place + +Type `echo '\u276F'`. If you get an error saying "zsh: character not in range", see the +[previous section](#zsh-character-not-in-range). + +If the `echo` command prints `❯` but the cursor is still in the wrong place, install +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) and run +`p10k configure`. + +If this doesn't help, add `unset ZLE_RPROMPT_INDENT` at the bottom of `~/.zshrc`. + +Still having issues? Run the following command to diagnose the problem: + +```zsh +() { + emulate -L zsh + setopt err_return no_unset + local text + print -rl -- 'Select a part of your prompt from the terminal window and paste it below.' '' + read -r '?Prompt: ' text + local -i len=${(m)#text} + local frame="+-${(pl.$len..-.):-}-+" + print -lr -- $frame "| $text |" $frame +} +``` + +#### If the prompt line aligns with the frame + +```text ++------------------------------+ +| romka@adam ✓ ~/powerlevel10k | ++------------------------------+ +``` + +If the output of the command is aligned for every part of your prompt (left and right), this +indicates a bug in the theme or your config. Use this command to diagnose it: + +```zsh +print -rl -- ${(eq+)PROMPT} ${(eq+)RPROMPT} +``` + +Look for `%{...%}` and backslash escapes in the output. If there are any, they are the likely +culprits. Open an issue if you get stuck. + +#### If the prompt line is longer than the frame + +```text ++-----------------------------+ +| romka@adam ✓ ~/powerlevel10k | ++-----------------------------+ +``` + +This is usually caused by a terminal bug or misconfiguration that makes it print ambiguous-width +characters as double-width instead of single width. For example, +[this issue](https://github.com/romkatv/powerlevel10k/issues/165). + +#### If the prompt line is shorter than the frame and is mangled + +```text ++------------------------------+ +| romka@adam ✓~/powerlevel10k | ++------------------------------+ +``` + +Note that this prompt is different from the original as it's missing a space after the check mark. + +This can be caused by a low-level bug in macOS. See +[this issue](https://github.com/romkatv/powerlevel10k/issues/241). + +This can also happen if prompt contains glyphs designated as "wide" in the Unicode standard and your +terminal incorrectly displays them as non-wide. Terminals suffering from this limitation include +Konsole, Hyper and the integrated VSCode Terminal. The solution is to use a different terminal or +remove all wide glyphs from prompt. + +#### If the prompt line is shorter than the frame and is not mangled + +```text ++--------------------------------+ +| romka@adam ✓ ~/powerlevel10k | ++--------------------------------+ +``` + +This can be caused by misconfigured locale. See +[this issue](https://github.com/romkatv/powerlevel10k/issues/251). + +### Prompt wrapping around in a weird way + +See [cursor is in the wrong place](#cursor-is-in-the-wrong-place). + +### Right prompt is in the wrong place + +See [cursor is in the wrong place](#cursor-is-in-the-wrong-place). + +### Configuration wizard runs automatically every time Zsh is started + +When Powerlevel10k starts, it automatically runs `p10k configure` if no `POWERLEVEL9K_*` +parameters are defined. Based on your prompt style choices, the configuration wizard creates +`~/.p10k.zsh` with a bunch of `POWERLEVEL9K_*` parameters in it and adds a line to `~/.zshrc` to +source this file. The next time you start Zsh, the configuration wizard shouldn't run automatically. +If it does, this means the evaluation of `~/.zshrc` terminates prematurely before it reaches the +line that sources `~/.p10k.zsh`. This most often happens due to syntax errors in `~/.zshrc`. These +errors get hidden by the configuration wizard screen, so you don't notice them. When you exit +configuration wizard, look for error messages. You can also use +`POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true zsh` to start Zsh without automatically running the +configuration wizard. Once you can see the errors, fix `~/.zshrc` to get rid of them. + +### Some prompt styles are missing from the configuration wizard + +If Zsh version is below 5.7.1 or `COLORTERM` environment variable is neither `24bit` nor +`truecolor`, configuration wizard won't offer Pure style with Snazzy color scheme. *Fix*: Install +Zsh >= 5.7.1 and use a terminal with truecolor support. Verify with `print -P '%F{#ff0000}red%f'`. + +If the terminal can display fewer than 256 colors, configuration wizard preselects Lean style with +8 colors. All other styles require at least 256 colors. *Fix*: Use a terminal with 256 color support +and make sure that `TERM` environment variable is set correctly. Verify with +`print $terminfo[colors]`. + +If there is no UTF-8 locale on the system, configuration wizard won't offer prompt styles that use +Unicode characters. *Fix*: Install a UTF-8 locale. Verify with `locale -a`. + +Another case in which configuration wizard may not offer Unicode prompt styles is when the +`MULTIBYTE` shell option is disabled. *Fix*: Enable the `MULTIBYTE` option, or rather don't disable +it (this option is enabled in Zsh by default). Verify with `print -r -- ${options[MULTIBYTE]}`. + +When `MULTIBYTE` is enabled and a UTF-8 locale is available, the first few questions asked by the +configuration wizard assess capabilities of the terminal font. If your answers indicate that some +glyphs don't render correctly, configuration wizard won't offer prompt styles that use them. *Fix*: +Restart your terminal and install +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). Verify by running +`p10k configure` and checking that all glyphs render correctly. + +### Cannot install the recommended font + +Once you download [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k), +you can install it just like any other font. Google "how to install fonts on *your OS*". + +### Extra or missing spaces in prompt compared to Powerlevel9k + +tl;dr: Add `ZLE_RPROMPT_INDENT=0` and `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get +the same prompt spacing as in Powerlevel9k. + +When using Powerlevel10k with a Powerlevel9k config, you might get additional spaces in prompt here +and there. These come in two flavors. + +#### Extra space without background on the right side of right prompt + +tl;dr: Add `ZLE_RPROMPT_INDENT=0` to `~/.zshrc` to get rid of that space. + +From [Zsh documentation]( + http://zsh.sourceforge.net/Doc/Release/Parameters.html#index-ZLE_005fRPROMPT_005fINDENT): + +> `ZLE_RPROMPT_INDENT ` +> +> If set, used to give the indentation between the right hand side of the right prompt in the line +> editor as given by `RPS1` or `RPROMPT` and the right hand side of the screen. If not set, the +> value `1` is used. +> +> Typically this will be used to set the value to `0` so that the prompt appears flush with the +> right hand side of the screen. + +Powerlevel10k respects this parameter. If you set `ZLE_RPROMPT_INDENT=1` (or leave it unset, which +is the same thing as setting it to `1`), you'll get an empty space to the right of right prompt. If +you set `ZLE_RPROMPT_INDENT=0`, your prompt will go to the edge of the terminal. This is how it +works in every theme except Powerlevel9k. + +![ZLE_RPROMPT_INDENT: Powerlevel10k vs Powerlevel9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/p9k-vs-p10k-zle-rprompt-indent.png) + +Powerlevel9k issue: [powerlevel9k#1292](https://github.com/Powerlevel9k/powerlevel9k/issues/1292). +It's been fixed in the development branch of Powerlevel9k but the fix hasn't yet made it to +`master`. + +Add `ZLE_RPROMPT_INDENT=0` to `~/.zshrc` to get the same spacing on the right edge of prompt as in +Powerlevel9k. + +*Note:* Several versions of Zsh have bugs that get triggered when you set `ZLE_RPROMPT_INDENT=0`. +Powerlevel10k can work around these bugs when using powerline prompt style. If you notice visual +artifacts in prompt, or wrong cursor position, try removing `ZLE_RPROMPT_INDENT` from `~/.zshrc`. + +#### Extra or missing spaces around icons + +tl;dr: Add `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get the same spacing around +icons as in Powerlevel9k. + +Spacing around icons in Powerlevel9k is inconsistent. + +![ZLE_RPROMPT_INDENT: Powerlevel10k vs Powerlevel9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/p9k-vs-p10k-icon-spacing.png) + +This inconsistency is a constant source of annoyance, so it was fixed in Powerlevel10k. You can add +`POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get the same spacing around icons as in +Powerlevel9k. + +*Note:* It's not a good idea to define `POWERLEVEL9K_LEGACY_ICON_SPACING` when using +`p10k configure`. + +### Weird things happen after typing `source ~/.zshrc` + +It's almost always a bad idea to run `source ~/.zshrc`, whether you are using Powerlevel10k or not. +This command may result in random errors, misbehaving code and progressive slowdown of Zsh. + +If you've made changes to `~/.zshrc` or to files sourced by it, restart Zsh to apply them. The most +reliable way to do this is to type `exit` and then start a new Zsh session. You can also use +`exec zsh`. While not exactly equivalent to complete Zsh restart, this command is much more reliable +than `source ~/.zshrc`. + +### Transient prompt stops working after some time + +See [weird things happen after typing `source ~/.zshrc`]( + #weird-things-happen-after-typing-source-zshrc). + +### Cannot make Powerlevel10k work with my plugin manager + +If the [installation instructions](#installation) didn't work for you, try disabling your current +theme (so that you end up with no theme) and then installing Powerlevel10k manually. + +1. Disable the current theme in your framework / plugin manager. + +- **oh-my-zsh:** Open `~/.zshrc` and remove the line that sets `ZSH_THEME`. It might look like this: + `ZSH_THEME="powerlevel9k/powerlevel9k"`. +- **zplug:** Open `~/.zshrc` and remove the `zplug` command that refers to your current theme. For + example, if you are currently using Powerlevel9k, look for + `zplug bhilburn/powerlevel9k, use:powerlevel9k.zsh-theme`. +- **prezto:** Open `~/.zpreztorc` and put `zstyle :prezto:module:prompt theme off` in it. Remove + any other command that sets `theme` such as `zstyle :prezto:module:prompt theme powerlevel9k`. +- **antigen:** Open `~/.zshrc` and remove the line that sets `antigen theme`. It might look like + this: `antigen theme powerlevel9k/powerlevel9k`. + +2. Install Powerlevel10k manually. + +```zsh +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +This method of installation won't make anything slower or otherwise sub-par. + +### Directory is difficult to see in prompt when using Rainbow style + +In Rainbow style the current working directory is shown with bright white text on blue background. +The white is fixed and always looks the same but the appearance of "blue" is defined by your +terminal color palette. If it's very light, it may be difficult to see white text on it. + +There are several ways to fix this. + +- Type `p10k configure` and choose a more readable prompt style. +- [Change terminal color palette](#change-the-color-palette-used-by-your-terminal). Try Tango Dark + or Solarized Dark, or change just the "blue" color. +- [Change directory background and/or foreground color](#set-colors-through-Powerlevel10k-configuration-parameters). + The parameters you are looking for are called `POWERLEVEL9K_DIR_BACKGROUND`, + `POWERLEVEL9K_DIR_FOREGROUND`, `POWERLEVEL9K_DIR_SHORTENED_FOREGROUND`, + `POWERLEVEL9K_DIR_ANCHOR_FOREGROUND` and `POWERLEVEL9K_DIR_ANCHOR_BOLD`. You can find them in + `~/.p10k.zsh`. + +### Horrific mess when resizing terminal window + +When you resize a terminal window horizontally back and forth a few times, you might see this ugly +picture. + +![Powerlevel10k Resizing Mess]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resizing-mess.png) + +tl;dr: This issue arises when a terminal reflows Zsh prompt upon resizing. It isn't specific to +Powerlevel10k. See [mitigation](#mitigation). + +*Note: This section [used to say]( + https://github.com/romkatv/powerlevel10k/blob/dce00cdb5daaa8a519df234a7012ba3257b644d4/README.md#horrific-mess-when-resizing-terminal-window) +that the problem is caused by a bug in Zsh. While it's true that it's possible to avoid the problem +in many circumstances by modifying Zsh, it cannot be completely resolved this way. Thus it's unfair +to pin the blame on Zsh.* + +#### The anatomy of the problem + +The issue is manifested when the vertical distance between the start of the current prompt and the +cursor (henceforth `VD`) changes when the terminal window is resized. + +When a terminal window gets shrunk horizontally, there are two ways for a terminal to handle long +lines that no longer fit: *reflow* or *truncate*. + +Terminal content before shrinking: + +![Terminal Content Before Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-original.png) + +Terminal reflows text when shrinking: + +![Terminal Reflows Text When Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-reflow.png) + +Terminal truncates text when shrinking: + +![Terminal Truncates Text When Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-truncate.png) + +Reflowing strategy can change the height of terminal content. If such content happens to be between +the start of the current prompt and the cursor, Zsh will print prompt on the wrong line. Truncation +strategy never changes the height of terminal content, so it doesn't trigger this issue. + +Let's see how the issue plays out in slow motion. We'll start by launching `zsh -f` and pasting +the following code: + +```zsh +function pause() { read -s } +functions -M pause 0 + +reset +print -l {1..3} +setopt prompt_subst +PROMPT=$'${$((pause()))+}left>${(pl.$((COLUMNS-12))..-.)} ' +``` + +When `PROMPT` gets expanded, it calls `pause` to let us observe the state of the terminal. Here's +the initial state: + +![Terminal Resizing Bug 1]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-1.png) + +Zsh keeps track of the cursor position relative to the start of the current prompt. In this case it +knows that the cursor is one line below. When we shrink the terminal window, it looks like this: + +![Terminal Resizing Bug 2]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-2.png) + +At this point the terminal sends `SIGWINCH` to Zsh to notify it about changes in the terminal +dimensions. Note that this signal is sent *after* the content of the terminal has been reflown. + +When Zsh receives `SIGWINCH`, it attempts to erase the current prompt and print it anew. It goes to +the position where it *thinks* the current prompt is -- one line above the cursor (!) -- erases all +terminal content that follows and prints reexpanded prompt there. However, after resizing prompt is +no longer one line above the cursor. It's two lines above! Zsh ends up printing new prompt one line +too low. + +![Terminal Resizing Bug 3]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-3.png) + +In this case we ended up with unwanted junk content because `VD` has *increased*. When you make +terminal window wider, `VD` can also *decrease*, which would result in the new prompt being printed +higher than intended, potentially erasing useful content in the process. + +Here are a few more examples where shrinking terminal window increased `VD`. + +- Simple one-line left prompt with right prompt. No `prompt_subst`. Note that the cursor is below + the prompt line (hit *ESC-ENTER* to get it there). + ![Zsh Prompt That Breaks on Terminal Shrinking 1]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-breakable-1.png) +- Simple one-line left prompt. No `prompt_subst`, no right prompt. Here `VD` is bound to increase + upon terminal shrinking due to the command line wrapping around. + ![Zsh Prompt That Breaks on Terminal Shrinking 2]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-breakable-2.png) + +#### Zsh patch + +[This Zsh patch](https://github.com/romkatv/zsh/tree/fix-winchanged) fixes the issue on some +terminals. The idea behind the patch is to use `sc` (save cursor) terminal capability before +printing prompt and `rc` (restore cursor) to move cursor back to the original position when prompt +needs to be refreshed. + +The patch works only on terminals that reflow saved cursor position together with text when the +terminal window is resized. The patch has no observable effect on terminals that don't reflow text +on resize (both patched and unpatched Zsh behave correctly) and on terminals that reflow text but +not the saved cursor position (both patched and unpatched Zsh redraw prompt at the same incorrect +position). In other words, the patch fixes the resizing issue on some terminals while keeping the +behavior unchanged on others. + +There are two alternative approaches to patching Zsh that may seem to work at first glance but in +fact don't: + +- Instead of `sc`, use `u7` terminal capability to query the current cursor position and then `cup` + to go back to it. This doesn't work because the absolute position of the start of the current + prompt changes when text gets reflown. +- Recompute `VD` based on new terminal dimensions before attempting to refresh prompt. This doesn't + work because Zsh doesn't know whether terminal reflows text or truncates it. If Zsh could somehow + know that the terminal reflows text, this approach still wouldn't work on terminals that + continuously reflow text and rapid-fire `SIGWINCH` when the window is being resized. In such + environment real terminal dimensions go out of sync with what Zsh thinks the dimensions are. + +There is no ETA for the patch making its way into upstream Zsh. See [discussion]( + https://www.zsh.org/mla/workers//2019/msg00561.html). + +#### Mitigation + +There are a few mitigation options for this issue. + +- Use [kitty](https://sw.kovidgoyal.net/kitty/) terminal version >= 0.24.0 and enable terminal-shell + integration in Powerlevel10k by defining `POWERLEVEL9K_TERM_SHELL_INTEGRATION=true` in + `~/.p10k.zsh`. +- Apply [the patch](#zsh-patch) and [rebuild Zsh from source]( + https://github.com/zsh-users/zsh/blob/master/INSTALL). It won't help if you are using Alacritty, + kitty or some other terminal that reflows text on resize but doesn't reflow saved cursor position. + On such terminals the patch will have no visible effect. +- Disable text reflowing on window resize in terminal settings. If your terminal doesn't have this + setting, try a different terminal. +- Avoid long lines between the start of prompt and cursor. + 1. Disable ruler with `POWERLEVEL9K_SHOW_RULER=false`. + 2. Disable prompt connection with `POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' '`. + 3. Disable right frame with `POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX=''`, + `POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX=''` and + `POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX=''`. + 4. Set `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=()`. Right prompt on the last prompt line will cause + resizing issues only when the cursor is below it. This isn't very common, so you might want to + keep some elements in `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS` provided that none of them are + succeeded by `newline`. + +### Icons cut off in Konsole + +When using Konsole with a non-monospace font, icons may be cut off on the right side. Here +"non-monospace" refers to any font with glyphs wider than a single column, or wider than two columns +for glyphs designated as "wide" in the Unicode standard. + +![Icons cut off in Konsole]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/konsole-non-monospace-font.png) + +The last line on the screenshot shows a cut off Arch Linux logo. + +There are several mitigation options for this issue. + +1. Use a different terminal. Konsole is the only terminal that exhibits this behavior. +2. Use a monospace font. +3. Manually add an extra space after the icon that gets cut off. For example, if the content of + `os_icon` prompt segment gets cut off, open `~/.p10k.zsh`, search for + `POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION` and change it as follows: +```zsh +typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT} ' # extra space at the end +``` +4. Use a different icon that is monospace. For example, if Arch Linux logo gets cut off, add + the following parameter to `~/.p10k.zsh`: +```zsh +typeset -g POWERLEVEL9K_LINUX_ARCH_ICON='Arch' # plain "Arch" in place of a logo +``` +5. Disable the display of the icon that gets cut off. For example, if the content of + `os_icon` prompt segment gets cut off, open `~/.p10k.zsh` and remove `os_icon` from + `POWERLEVEL9K_LEFT_PROMPT_ELEMENTS` and `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS`. + +*Note*: [Non-monospace fonts are not officially supported by Konsole]( + https://bugs.kde.org/show_bug.cgi?id=418553#c5). + +### Arch Linux logo has a dot in the bottom right corner + +![Arch Linux Logo with a dot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/arch-linux-logo-dot.png) + +Some fonts have this incorrect dotted icon in bold typeface. There are two ways to fix this issue. + +1. Use a font with a correct Arch Linux logo in bold typeface. For example, + [the recommended Powerlevel10k font](#meslo-nerd-font-patched-for-powerlevel10k). +2. Display the icon in regular (non-bold) typeface. To do this, open `~/.p10k.zsh`, search for + `POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION` and remove `%B` from its value. +```zsh +typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT}' # not bold +``` + +### Incorrect git status in prompt + +Powerlevel10k uses [gitstatusd](https://github.com/romkatv/gitstatus) to inspect the state of git +repositories. The project relies on the [libgit2](https://github.com/libgit2/libgit2) library, which +has some gaps in its implementation. Under some conditions, this may result in discrepancies between +the real state of a git repository (reflected by `git status`) and what gets shown in the +Powerlevel10k prompt. + +Most notably, [libgit2 does not support `skipHash`](https://github.com/libgit2/libgit2/issues/6531). +If you see incorrect git status in prompt, run `git config -l` and check whether `skipHash` is +enabled. If it is, consider disabling it. Keep in mind that `skipHash` may be implicitly enabled +when activating ceratin git features, such as `manyFiles`. diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-classic.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-classic.zsh new file mode 100644 index 0000000..aacb22d --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-classic.zsh @@ -0,0 +1,1731 @@ +# Config for Powerlevel10k with classic powerline 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) + 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/) + # vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # 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 # \n + # 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-complete + # 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 + + # 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= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%242F╭─' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%242F├─' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%242F╰─' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX='%242F─╮' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%242F─┤' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%242F─╯' + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or + # '─'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # 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 + + # Default background color. + typeset -g POWERLEVEL9K_BACKGROUND=238 + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='%246F\uE0B1' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='%246F\uE0B3' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B0' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B2' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # 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= + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=255 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # 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= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ 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-version + .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='%248Fin ' + + #####################################[ vcs: git status ]###################################### + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= + + # 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='%248F' # grey 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='%248Fon ' + + # 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 reposotiry. + 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=true + 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=true + 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=248 + # 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='%248Ftook ' + + #######################[ 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=37 + # 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_CORE_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='⭐' + + ######################[ 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='⭐' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_FOREGROUND=106 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_FOREGROUND=68 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_FOREGROUND=172 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=66 + + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_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='%248Fwith ' + + ###[ 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='⭐' + + ################[ 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='⭐' + + #############[ 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='%248Fat ' + + #[ 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|terraform|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|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|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='%248Fin ' + + ###############################[ 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_RX_RATE:+%70F⇣$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+%215F⇡$P9K_IP_TX_RATE }%38F$P9K_IP_IP' + # 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=('%K{232}▁' '%K{232}▂' '%K{232}▃' '%K{232}▄' '%K{232}▅' '%K{232}▆' '%K{232}▇' '%K{232}█') + # 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='%248Fat ' + + # 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/blob/master/README.md#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=off + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean-8colors.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean-8colors.zsh new file mode 100644 index 0000000..9d1d300 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean-8colors.zsh @@ -0,0 +1,1709 @@ +# Config for Powerlevel10k with 8-color 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) + 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 # \n + # 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-complete + # 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= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= + # 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=7 + + # 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=7 + # 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=2 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=1 + # 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=4 + # 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=4 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=4 + # Set to true to display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=false + # 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-version + .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 directories. See POWERLEVEL9K_LOCK_ICON and + # POWERLEVEL9K_DIR_CLASSES below. + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v2 + + # 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=4 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=4 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=4# + # + # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=4 + # + # 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= + + # 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='%2F' # green foreground + local modified='%3F' # yellow foreground + local untracked='%4F' # blue foreground + local conflicted='%1F' # red foreground + else + # Styling for incomplete and stale Git status. + local meta='%f' # default foreground + local clean='%f' # default foreground + local modified='%f' # default foreground + local untracked='%f' # default foreground + local conflicted='%f' # default 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=2 + typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR= + # 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=2 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=3 + + ##########################[ 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=2 + 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=2 + 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=1 + 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=1 + # 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=1 + 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=3 + # 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=1 + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + # 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=6 + + # 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=1 + # 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=6 + # 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=6 + # 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=2 + # 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=4 + # 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=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=4 + # 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=4 + # 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=4 + # 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=6 + # 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=1 + # 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=5 + # 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=6 + # 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=5 + # 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=3 + # 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=2 + # 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=6 + # 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=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=3 + # 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=3 + # 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=3 + # 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=3 + # 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=3 + # 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=4 + + # 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=4 + # 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=2 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=1 + # 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=2 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=3 + # 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=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=1 + # 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=4 + # 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=4 + # 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=6 + + # 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=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=3 + + # 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=3 + + # 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=1 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=7 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=7 + + # 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=6 + # 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=6 + + # 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=6 + # 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=6 + # 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=2 + # 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=2 + # 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=2 + # 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=2 + # 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=6 + # 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=4 + # 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=5 + # 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=5 + # 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=1 + # 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=4 + # 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=6 + # 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=1 + # 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=1 + # 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=4 + # 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=4 + # 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=4 + # 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=6 + # 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=5 + # 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=1 + # 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=3 + # 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=3 + # 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=5 + # 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=2 + # 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=4 + # 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=4 + # 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|terraform|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=2 + # 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=3 + # 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=2 + # 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|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=2 + # 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=4 + # 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=4 + + # 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|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=3 + # 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=5 + # 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=3 + # 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=6 + # 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=3 + # 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=4 + # 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:+ %2F⇣$P9K_IP_RX_RATE}${P9K_IP_TX_RATE:+ %3F⇡$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=2 + # 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=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES=('%K{0}▁' '%K{0}▂' '%K{0}▃' '%K{0}▄' '%K{0}▅' '%K{0}▆' '%K{0}▇' '%K{0}█') + # 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=4 + # 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=(4 4 4 4 4) # <-- 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=6 + # 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 green text greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -f 2 -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/blob/master/README.md#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=off + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean.zsh new file mode 100644 index 0000000..1581c17 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-lean.zsh @@ -0,0 +1,1705 @@ +# 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) + 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-complete + # 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= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= + # 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=240 + + # 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=240 + # 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-version + .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= + + # 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='⭐' + + ######################[ 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|terraform|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|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|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=('%K{232}▁' '%K{232}▂' '%K{232}▃' '%K{232}▄' '%K{232}▅' '%K{232}▆' '%K{232}▇' '%K{232}█') + # 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/blob/master/README.md#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=off + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-pure.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-pure.zsh new file mode 100644 index 0000000..97c1a20 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-pure.zsh @@ -0,0 +1,193 @@ +# Config file for Powerlevel10k with the style of Pure (https://github.com/sindresorhus/pure). +# +# Differences from Pure: +# +# - Git: +# - `@c4d3ec2c` instead of something like `v1.4.0~11` when in detached HEAD state. +# - No automatic `git fetch` (the same as in Pure with `PURE_GIT_PULL=0`). +# +# Apart from the differences listed above, the replication of Pure prompt is exact. This includes +# even the questionable parts. For example, just like in Pure, there is no indication of Git status +# being stale; prompt symbol is the same in command, visual and overwrite vi modes; when prompt +# doesn't fit on one line, it wraps around with no attempt to shorten it. +# +# If you like the general style of Pure but not particularly attached to all its quirks, type +# `p10k configure` and pick "Lean" style. This will give you slick minimalist prompt while taking +# advantage of Powerlevel10k features that aren't present in Pure. + +# 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. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # Prompt colors. + local grey=242 + local red=1 + local yellow=3 + local blue=4 + local magenta=5 + local cyan=6 + local white=7 + + # Left prompt segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + context # user@host + dir # current directory + vcs # git status + command_execution_time # previous command duration + # =========================[ Line #2 ]========================= + newline # \n + virtualenv # python virtual environment + prompt_char # prompt symbol + ) + + # Right prompt segments. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # command_execution_time # previous command duration + # virtualenv # python virtual environment + # context # user@host + # time # current time + # =========================[ Line #2 ]========================= + newline # \n + ) + + # Basic style options that define the overall prompt look. + 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 + typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons + + # Add an empty line before each prompt except the first. This doesn't emulate the bug + # in Pure that makes prompt drift down whenever you use the Alt-C binding from fzf or similar. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Magenta prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=$magenta + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=$red + # 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 is the same as in command mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='❮' + # Prompt symbol in overwrite vi mode is the same as in command mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false + + # Grey Python Virtual Environment. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$grey + # Don't show Python version. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + + # Blue current directory. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=$blue + + # Context format when root: user@host. The first part white, the rest grey. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE="%F{$white}%n%f%F{$grey}@%m%f" + # Context format when not root: user@host. The whole thing grey. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE="%F{$grey}%n@%m%f" + # Don't show context unless root or in SSH. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION= + + # Show previous command duration only if it's >= 5s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5 + # Don't show fractional seconds. Thus, 7s rather than 7.3s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Yellow previous command duration. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$yellow + + # Grey Git prompt. This makes stale prompts indistinguishable from up-to-date ones. + typeset -g POWERLEVEL9K_VCS_FOREGROUND=$grey + + # Disable async loading indicator to make directories that aren't Git repositories + # indistinguishable from large Git repositories without known state. + typeset -g POWERLEVEL9K_VCS_LOADING_TEXT= + + # Don't wait for Git status even for a millisecond, so that prompt always updates + # asynchronously when Git state changes. + typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0 + + # Cyan ahead/behind arrows. + typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=$cyan + # Don't show remote branch, current tag or stashes. + typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind) + # Don't show the branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= + # When in detached HEAD state, show @commit where branch normally goes. + typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@' + # Don't show staged, unstaged, untracked indicators. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON= + # Show '*' when there are staged, unstaged or untracked files. + typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*' + # Show '⇣' if local branch is behind remote. + typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=':⇣' + # Show '⇡' if local branch is ahead of remote. + typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=':⇡' + # Don't show the number of commits next to the ahead/behind arrows. + typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1 + # Remove space between '⇣' and '⇡' and all trailing spaces. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${${${P9K_CONTENT/⇣* :⇡/⇣⇡}// }//:/ }' + + # Grey current time. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=$grey + # 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 rather than the end times of + # their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + + # 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=off + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-rainbow.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-rainbow.zsh new file mode 100644 index 0000000..3fe2dfa --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-rainbow.zsh @@ -0,0 +1,1825 @@ +# Config for Powerlevel10k with powerline prompt style with colorful background. +# 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) + 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/) + # vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # 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-complete + # 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 + + # 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= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%242F╭─' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%242F├─' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%242F╰─' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX='%242F─╮' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%242F─┤' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%242F─╯' + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or + # '─'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # 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 + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\uE0B1' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\uE0B3' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B0' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B2' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # 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= + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=232 + typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # 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= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ dir: current directory ]################################## + # Current directory background color. + typeset -g POWERLEVEL9K_DIR_BACKGROUND=4 + # Default current directory foreground color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=254 + # 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=250 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255 + # 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-version + .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_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=255 + # + # 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='in ' + + #####################################[ vcs: git status ]###################################### + # Version control background colors. + typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8 + + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= + + # 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 + + # Styling for different parts of Git status. + local meta='%7F' # white foreground + local clean='%0F' # black foreground + local modified='%0F' # black foreground + local untracked='%0F' # black foreground + local conflicted='%1F' # red foreground + + 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()))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Custom icon. + # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_VCS_PREFIX='on ' + + # 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) + + ##########################[ 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=true + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0 + + # 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_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0 + + # 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=true + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1 + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + # 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='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1 + + # 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_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1 + + ###################[ command_execution_time: duration of the last command ]################### + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3 + # 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 + # 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='took ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6 + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0 + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=0 + # 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 these parameters for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND and + # POWERLEVEL9K_ASDF_${TOOL}_BACKGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_BACKGROUND=7 + + # 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=0 + typeset -g POWERLEVEL9K_ASDF_RUBY_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PYTHON_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_GOLANG_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_NODEJS_BACKGROUND=2 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_RUST_BACKGROUND=208 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_FLUTTER_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_LUA_BACKGROUND=4 + # 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=1 + typeset -g POWERLEVEL9K_ASDF_JAVA_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PERL_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_ERLANG_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_ELIXIR_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_POSTGRES_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PHP_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_HASKELL_BACKGROUND=3 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_JULIA_BACKGROUND=2 + # 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=7 + typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4 + # 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=3 + typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=0 + typeset -g POWERLEVEL9K_NNN_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_LF_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_XPLR_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_VIM_SHELL_BACKGROUND=2 + # 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=3 + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4 + + # 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=0 + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_BACKGROUND=4 + # 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=3 + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=7 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=1 + # 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='⭐' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Foreground color. + typeset -g POWERLEVEL9K_VI_MODE_FOREGROUND=0 + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=4 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=3 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=8 + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RAM_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=0 + typeset -g POWERLEVEL9K_SWAP_BACKGROUND=3 + # 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=0 + typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_TODO_BACKGROUND=8 + # 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=255 + typeset -g POWERLEVEL9K_TIMEWARRIOR_BACKGROUND=8 + + # 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=0 + typeset -g POWERLEVEL9K_TASKWARRIOR_BACKGROUND=6 + + # 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=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_BACKGROUND=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_BACKGROUND=3 + + # 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=0 + typeset -g POWERLEVEL9K_CPU_ARCH_BACKGROUND=3 + + # 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=1 + typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=0 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0 + + # Context format when running with privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%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='with ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4 + + # 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=0 + typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_GOENV_BACKGROUND=4 + # 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=2 + typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_NVM_BACKGROUND=5 + # 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=2 + typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0 + # 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=7 + typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2 + # 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=255 + typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2 + # 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=0 + typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208 + # 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=7 + typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_PHP_VERSION_BACKGROUND=5 + # 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=1 + typeset -g POWERLEVEL9K_LARAVEL_VERSION_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1 + # 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='⭐' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_JAVA_VERSION_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_PACKAGE_BACKGROUND=6 + + # 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='⭐' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RVM_BACKGROUND=240 + # 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=0 + typeset -g POWERLEVEL9K_FVM_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_LUAENV_BACKGROUND=4 + # 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=1 + typeset -g POWERLEVEL9K_JENV_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_PLENV_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_PHPENV_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_SCALAENV_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_HASKELL_STACK_BACKGROUND=3 + + # 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='⭐' + + ################[ 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=2 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_BACKGROUND=0 + # 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=4 + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_BACKGROUND=0 + # 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=4 + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ terraform_version: It shows active terraform version (https://www.terraform.io) ]################# + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_SHOW_ON_COMMAND='terraform|tf' + + #############[ 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=0 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2 + # 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=7 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5 + # 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='at ' + + #[ 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|terraform|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=7 + typeset -g POWERLEVEL9K_AWS_DEFAULT_BACKGROUND=1 + # 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=2 + typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0 + # 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|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=2 + # typeset -g POWERLEVEL9K_AZURE_TEST_BACKGROUND=0 + # 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=7 + typeset -g POWERLEVEL9K_AZURE_OTHER_BACKGROUND=4 + # 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=7 + typeset -g POWERLEVEL9K_GCLOUD_BACKGROUND=4 + + # 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|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=7 + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_TOOLBOX_BACKGROUND=3 + # 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='in ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7 + typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6 + # 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_BACKGROUND=4 + typeset -g POWERLEVEL9K_IP_FOREGROUND=0 + # 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_RX_RATE:+⇣$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+⇡$P9K_IP_TX_RATE }$P9K_IP_IP' + # 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=4 + typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0 + # 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=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES=('%K{232}▁' '%K{232}▂' '%K{232}▃' '%K{232}▄' '%K{232}▅' '%K{232}▆' '%K{232}▇' '%K{232}█') + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0 + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=0 + typeset -g POWERLEVEL9K_WIFI_BACKGROUND=4 + # 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=(0 0 0 0 0) # <-- 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=0 + typeset -g POWERLEVEL9K_TIME_BACKGROUND=7 + # 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='at ' + + # 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 yellow text on red background + # greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -b 1 -f 3 -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/blob/master/README.md#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=3 + typeset -g POWERLEVEL9K_EXAMPLE_BACKGROUND=1 + # 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=off + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-robbyrussell.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-robbyrussell.zsh new file mode 100644 index 0000000..a59e222 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/config/p10k-robbyrussell.zsh @@ -0,0 +1,111 @@ +# Config file for Powerlevel10k with the style of robbyrussell theme from Oh My Zsh. +# +# Original: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#robbyrussell. +# +# Replication of robbyrussell theme is exact. The only observable difference is in +# performance. Powerlevel10k prompt is very fast everywhere, even in large Git repositories. +# +# Usage: Source this file either before or after loading Powerlevel10k. +# +# source ~/powerlevel10k/config/p10k-robbyrussell.zsh +# source ~/powerlevel10k/powerlevel10k.zsh-theme + +# 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. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # Left prompt segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(prompt_char dir vcs) + # Right prompt segments. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() + + # Basic style options that define the overall prompt look. + 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 + typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons + + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=green + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=red + # Prompt symbol: bold arrow. + typeset -g POWERLEVEL9K_PROMPT_CHAR_CONTENT_EXPANSION='%B➜ ' + + # Cyan current directory. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=cyan + # Show only the last segment of the current directory. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_last + # Bold directory. + typeset -g POWERLEVEL9K_DIR_CONTENT_EXPANSION='%B$P9K_CONTENT' + + # Git status formatter. + function my_git_formatter() { + emulate -L zsh + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, 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 + else + # Use VCS_STATUS_* parameters to assemble Git status. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + typeset -g my_git_format="${1+%B%4F}git:(${1+%1F}" + my_git_format+=${${VCS_STATUS_LOCAL_BRANCH:-${VCS_STATUS_COMMIT[1,8]}}//\%/%%} + my_git_format+="${1+%4F})" + if (( VCS_STATUS_NUM_CONFLICTED || VCS_STATUS_NUM_STAGED || + VCS_STATUS_NUM_UNSTAGED || VCS_STATUS_NUM_UNTRACKED )); then + my_git_format+=" ${1+%3F}✗" + fi + fi + } + functions -M my_git_formatter 2>/dev/null + + # 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()))+${my_git_format}}' + # Grey Git status when loading. + typeset -g POWERLEVEL9K_VCS_LOADING_FOREGROUND=246 + + # 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/blob/master/README.md#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/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/HEAD b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/branches/.keep b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/branches/.keep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/config b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/config new file mode 100644 index 0000000..317657b --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/config @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://github.com/romkatv/powerlevel10k.git + fetch = +refs/heads/master:refs/remotes/origin/master +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/description b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_applypatch-msg.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_commit-msg.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_fsmonitor-watchman.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_post-update.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-applypatch.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-commit.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-commit.sample new file mode 100644 index 0000000..e144712 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-merge-commit.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-push.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-rebase.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-receive.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_prepare-commit-msg.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_push-to-checkout.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_update.sample b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_update.sample new file mode 100644 index 0000000..c4d426b --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/hooks/executable_update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/index b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..99c75078a36da78d3b56562988bd254f27a6380b GIT binary patch literal 7915 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 Qr@ffkZ$40$(d(Q1fAIQPe*gdg literal 0 HcmV?d00001 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/info/exclude b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/HEAD b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/HEAD new file mode 100644 index 0000000..9bcec93 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 f851f41fc14d5bd66266b4b4af917d50c1c8b7fe linarphy 1690934258 +0200 clone: from https://github.com/romkatv/powerlevel10k.git diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/heads/master b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/heads/master new file mode 100644 index 0000000..9bcec93 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 f851f41fc14d5bd66266b4b4af917d50c1c8b7fe linarphy 1690934258 +0200 clone: from https://github.com/romkatv/powerlevel10k.git diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/remotes/origin/HEAD b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..9bcec93 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 f851f41fc14d5bd66266b4b4af917d50c1c8b7fe linarphy 1690934258 +0200 clone: from https://github.com/romkatv/powerlevel10k.git diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/info/.keep b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.idx b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.idx new file mode 100644 index 0000000000000000000000000000000000000000..197ccdcdf80d85a5b77d44741046b728d845a60f GIT binary patch literal 3648 zcma*qc{J4B9|!O|UtL?3sox*3bKjr)x#xbrcm9}jzgu3$4gdfILj51e>wboYb30MO zdK(qYWYjy*z`PSJtaqY=HQBBo=;64H0p@LtFmKxp^EPIff3^qCk+DFm|AGz9u|u2? z*ADw&=H7t^=54$%^ZjrDj%57M!5su(7W@}Na8CF?h`{+@5rus+F-ZIe2{`^2N!Z&a z1@o^+!@lefa&RO&^c(W9zmo#2$rN`u4D(J(uqIRa4K>(5@)LDf|BeP+L#DZdHq2x? z(9s=^!MyD_%>M=h=gIVcast-BVgUPOM!#STd)rK4Hr>GtX7k@T3HxNHez1h&w$m_g zvx0e>HOyo-|HI^mx$Ka{Bole;={ki#x`YtsCav;YPPYlOpf*rN2Wuw@rx0uc#awVL~xGJ)IBbEQ=q*v9u>=G?vSHL+Zf<%s8 znvlSq+PB>ImCVm9CtqUa7+*C#`BX(HJu0uXF7_?fbht#;CQ(5P?FQf~Yx-iXdRC(!$Xay*S(Os~=t4tha5_kXJyk@T z&-2f)OkVzW%I(||3Np=R<$8gMIE8#?m+u!9ReUq|F%5crTWGbqHJo36W<<MSAGk_VwT8X_AjlJQwA@yoUcG=sab{Z`;1S#k zU$JkO(;{?bZx~d2xQBLDk-{HQa*f(=Y7;b*2cDg62~<4p^l9yBZIQiz{!s?o%t4T& zHqq&iZl>;1ZMn~>bM%_uSj`_VhqX-M$F!TqvI+RobJl?~7ppHl@MT(!ee@bJ zt+Q(EOKG4Xx+d#!V z7BY^MX{u$hNIuk@!pK0eJE&E8FVocx{@@s8>#uf(#=%%t*O%&5X_$nx5Bi}oHp~hw zOUu+T=KM;T1|25fZH*i*V7V_D@CK|c-k?}$b90K5{rXoVaOpm7F*ZFk-xP&D;h5`F zqFvKZaAVJF4NdMGTVU~~?7oXt@K@bUd zN4LWN7MoLQ8S*v1M``h7-n0JM>7eM@6uCb)EW*ZZ$J~WxN>t5AK6Gs(3Ck8dld&T= zKC%U7DDaiV8}Ss4+^8KIvc5x|rWtN4R4${}Vr7{!{7$cQ&L=)2-c`KM)yrh_>Y(41 za*Mr25?V>sS=555Bc`8AQcpigqh2OmBm}4CEnx5_&Lzg_*Az)J$3_OaB<<5!r>H&` zS5)HIcJT#SN_8D%^Y%*Pk)haFweinIeU^L{*Sx;Gm^}B$e~uwJz(BAk4v*&UN;5cZ zM!5SZonJh?AnT^g3|=snLtRtKoY?R6c^8?{?n~+`oZ7cezw~1vZ7HXYL`oJg)w7;Vos{xB{OZ9j>MO|_?vIsn z6A^<4Yc~hfsLSlP#yvI}3dfNfT8_-dc^yrSk!9a4JijH=AUupB(GA&7INNt2R+Vm2 z8AYudOAkE;RZ`Tv_MVN}G^}jMh&TKyQP9%9s@B+`czrkr z#qiyMp2hEZr4in{DJW}5lZ1o9?!=gY!K@oH^5|E0KF^96Cca}S@F*`0A7+0-SgH#1 z>nm50I`C+*doQ+SYb2hvNNhGi)wgZBL2GE;iFaS?(zw)qe{aHHAp(EvV+1S{l|z%u zCqAW(q!K#2bxuT!=KEOn){MoN-=2ASPdB^N;n3-Gu6hI>2CoIZ5?vCmKt_M*!fVyr zyv;5PnfvAKY1Zd-R@}oH&M?nbpvUrO8HeWzG<)YFE=o$@$Eghgg+i;0mO8W6h|i0o zbsB++3$85LB4V1_HRinba)m2gHE12IomBT4mp)$U9dTxt&(MnL!v1PQ>u&7%7cUBK z2bfehmTa!wZJMNP@&!(L?@Xge($^PEcNuP2@G>uZS$RhEicDct-gHp!acz5FC`jMj zOV`yI$haPx(I4g2wvT&P+ZR=~mcA@nx+9^Fn35i!?PGt7_TCq^(0YsR;-Rx&-o|MJ zP*UNho)TQc#5K!S8iTA`aG5XQziZ)#9*ntf(Yed`Pg(Ufk&U|1E_KZ(IAk+VGM!%0 z@QeFaUp{48p+wok!4!Qj$R(53(8^=lK*VM|V!{>(c_g zsZ~kUEmTVK;1#9yq=bx41pQ@H89G##^~blAxcMcOZJ&k)bFc>Bq9#2`Xr&b&h2 zc$FWZ#$N%H8!td=830nr1CWex0Eia=%5?@Hw^#x4iV>jV;GKFC576$O0Qm0*NWw4x z-{86}G@x|h2B^SvfG~0bB=Z66uK-k64*ZKx*Lg@f85sHw;jV>i}tlciN3MfZTNhsM1b=KG+Np6B&4?8U(0nR=Dp3 zK*T%&>QE~{kPd*nf%ksO8Gw533@9DoJ}zwlj8Oov#sZMobO741aDVtMH3gsZ5RQWp z04Xj5ND&P{1U~}QH(h{oP5}s&6F~HY0YW05tpV<>2+)#J0HGfTNCgi5CdB}8Zvsd- z3Lu~0yPaACs7W7yzB~1?a|||TeMGxBnAEfjR5id literal 0 HcmV?d00001 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.pack b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.pack new file mode 100644 index 0000000000000000000000000000000000000000..328d1c51558403d1fd6cde7856c039d8ba68e581 GIT binary patch literal 354971 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

qKvO;u(30lU*zTmf1R72!M0vTH( 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

|f#1`@35hkk=K*5@K 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ýZQ{0$11-0( z>6V31I2$ep(%V9gV>@!9gKuleq!7HneMhqF*kNHGng?5+8GUn?CTnm<{f^7K4{QpY zbvJ;`#6vC#2bTm+H{q_nQ(ODRUu_L8!WoG@a!0)N_ALyi#3x9davrgcVN58WCU(mS zeIpM2TZ`WrQF%j6KpchfEg6H05+%6Z7t!n~_3R`LN^rXw+P5inra%MW$cCB4z%AkL zPlAwf62EMzZQsWUW5n}}aH{+FI)>7)z0fwcKdf(WJDcw}+V+OEZg03d&Ie~}chhNa z?(TfBH@DsKwzEYngA06SSV~_D5ps|JHUwi%CKh2Y~tHFN1zdtxRKQj+c zE<1XCUY|E#X&wF5&$P4OnWkx35e;}8DlPLGz#8<4HKxG?ScJwgunCqafsstv2rOJv zkz;NJyanf2I`ND$0{a1{6M}_JJr82yhj)uj&6SlEttHVjtvt3O)C`mX4`GIVfWToA zjKNMOOf(6WWvA$Y*=#22v=zn^!}lyhY#=c+Hrg9)!)KFrdux58HRZmSDe2Q&B8@`R zVI-8nYG-wXxLESm7(y4&ZiqY!H7Wk;NbG$YXc-{W#`JX?#7{hn6VUs@K2a-}&M9SF z{LPdrpHp@w>YSfoKF$3xl@ujRZ8TA$b z7;}p|Q!{d6f}WIeEF6sRpix-{nHA6}RM>kU1JQw#vw>Q#$|si3-&!Sa9bHd_*edkC zp9~;Hbqdo0X$1H-nP6;v48?*;;q;H*=aVxy?VTOM`NiPm?6BaT?hg)*1#$oKGn^b< zb?c3rMgwm6O>oo3FUdhzPn_;0K7JRY)p2Y zafYe~Vj?bKDOMCNE^d1hIVe*)0!G5eq_2-y8r#~vw5(8 zaNIMG&rf?D{U4*{Sk9EBMuZcYE=2YGDhpC^A!JsIwqHUMO<(xO#8s7_uM3f^w^fZT zITgi3RAlZ}7L2D_N;RRdUP3AbvdnruI4TF-_4f-$|GGLhzxFP#@OpFzgt}=L+=(#yE{er%rP)AIZ6%tZhI!R(uC1;~Tl@?hsQ?$aTg?FvUOYn?Z zV#_k}ymSx7VJ)92MMB)x!_2{kM_8h^=xo-C5m7q$vA8UA%|H^ zxn+Cg9bg8rsz*}0oPG*>1w}yWdhQ^)^?-+IB+6dDlngXY_$)ZN2@7(?;uI`zX5F)j z>7rYHR}EHChyaV7YBdgnES$1cu`OU?PDn2YL>b99VZNo&;sxN<&N*t~Z{nUw_D z5T8$MPMoh;B;cOsW-8`u)&C4>ex79e@+&`QUw;~=<$n-T{eS#H`WL_|)xNO?c$`yD zD$UF($;?w%P%q9eElN&RS5Q)^4)70m4f1gfbM>+Gj`#En4srDHaSZYF_ltM&46@Qy zsaC1hP}Q{3RjsJCa?90KL>V(f|Me literal 0 HcmV?d00001 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.rev b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/objects/pack/readonly_pack-0653e4463205b03dd5f69e9c57dcdac65202ed00.rev new file mode 100644 index 0000000000000000000000000000000000000000..08900843831a64d02da2ee388b7eb295b701aa44 GIT binary patch literal 420 zcmXZVM=k^a00q#|dmX*^&MPCj8YnCWq|=2iEv5}wVW}^CI@UWK^6rh=p>yWRWvcf6fMj% zM>gxE(ab(Wq|(kdD|E9)9(#;XoSAr!hBNMFpMS2ej$U6Lc{^RN455D0iUjP6A literal 0 HcmV?d00001 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/packed-refs b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/packed-refs new file mode 100644 index 0000000..e7ff867 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +f851f41fc14d5bd66266b4b4af917d50c1c8b7fe refs/remotes/origin/master diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/heads/master b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/heads/master new file mode 100644 index 0000000..d8f77ed --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/heads/master @@ -0,0 +1 @@ +f851f41fc14d5bd66266b4b4af917d50c1c8b7fe diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/remotes/origin/HEAD b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/remotes/origin/HEAD new file mode 100644 index 0000000..6efe28f --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +ref: refs/remotes/origin/master diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/tags/.keep b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/refs/tags/.keep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/shallow b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/shallow new file mode 100644 index 0000000..d8f77ed --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_git/shallow @@ -0,0 +1 @@ +f851f41fc14d5bd66266b4b4af917d50c1c8b7fe diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitattributes b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitattributes new file mode 100644 index 0000000..41b2d3a --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitattributes @@ -0,0 +1,5 @@ +* text=auto +*.zsh text eol=lf +*.zsh-theme text eol=lf +/prompt_powerlevel9k_setup text eol=lf +/prompt_powerlevel10k_setup text eol=lf diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitignore b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitignore new file mode 100644 index 0000000..416cfaa --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/dot_gitignore @@ -0,0 +1 @@ +*.zwc diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/font.md b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/font.md new file mode 100644 index 0000000..2fb2f8b --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/font.md @@ -0,0 +1,161 @@ +# Recommended font: Meslo Nerd Font patched for Powerlevel10k + +Gorgeous monospace font designed by Jim Lyles for Bitstream, customized by the same for Apple, +further customized by André Berg, and finally patched by yours truly with customized scripts +originally developed by Ryan L McIntyre of Nerd Fonts. Contains all glyphs and symbols that +Powerlevel10k may need. Battle-tested in dozens of different terminals on all major operating +systems. + +*FAQ*: [How was the recommended font created?](README.md#how-was-the-recommended-font-created) + +## Automatic font installation + +If you are using iTerm2 or Termux, `p10k configure` can install the recommended font for you. +Simply answer `Yes` when asked whether to install *Meslo Nerd Font*. + +If you are using a different terminal, proceed with manual font installation. 👇 + +## Manual font installation + +1. Download these four ttf files: + - [MesloLGS NF Regular.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf) + - [MesloLGS NF Bold.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf) + - [MesloLGS NF Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf) + - [MesloLGS NF Bold Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf) +1. Double-click on each file and click "Install". This will make `MesloLGS NF` font available to all + applications on your system. +1. Configure your terminal to use this font: + - **iTerm2**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. Alternatively, open *iTerm2 → Preferences → Profiles → Text* and set *Font* to + `MesloLGS NF`. + - **Apple Terminal**: Open *Terminal → Preferences → Profiles → Text*, click *Change* under *Font* + and select `MesloLGS NF` family. + - **Hyper**: Open *Hyper → Edit → Preferences* and change the value of `fontFamily` under + `module.exports.config` to `MesloLGS NF`. + - **Visual Studio Code**: Open *File → Preferences → Settings* (PC) or + *Code → Preferences → Settings* (Mac), enter `terminal.integrated.fontFamily` in the search box at + the top of *Settings* tab and set the value below to `MesloLGS NF`. + Consult [this screenshot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/389133fb8c9a2347929a23702ce3039aacc46c3d/visual-studio-code-font-settings.jpg) + to see how it should look like or see [this issue]( + https://github.com/romkatv/powerlevel10k/issues/671) for extra information. + - **GNOME Terminal** (the default Ubuntu terminal): Open *Terminal → Preferences* and click on the + selected profile under *Profiles*. Check *Custom font* under *Text Appearance* and select + `MesloLGS NF Regular`. + - **Konsole**: Open *Settings → Edit Current Profile → Appearance*, click *Select Font* and select + `MesloLGS NF Regular`. + - **Tilix**: Open *Tilix → Preferences* and click on the selected profile under *Profiles*. Check + *Custom font* under *Text Appearance* and select `MesloLGS NF Regular`. + - **Windows Console Host** (the old thing): Click the icon in the top left corner, then + *Properties → Font* and set *Font* to `MesloLGS NF`. + - **Windows Terminal** by Microsoft (the new thing): Open *Settings* (Ctrl+,), click + either on the selected profile under *Profiles* or on *Defaults*, click *Appearance* and set + *Font face* to `MesloLGS NF`. + - **IntelliJ** (and other IDEs by Jet Brains): Open *IDE → Edit → Preferences → Editor → + Color Scheme → Console Font*. Select *Use console font instead of the default* and set the font + name to `MesloLGS NF`. + - **Termux**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. + - **Blink**: Type `config`, go to *Appearance*, tap *Add a new font*, tap *Open Gallery*, select + *MesloLGS NF.css*, tap *import* and type `exit` in the home view to reload the font. + - **Tabby** (formerly **Terminus**): Open *Settings → Appearance* and set *Font* to `MesloLGS NF`. + - **Terminator**: Open *Preferences* using the context menu. Under *Profiles* select the *General* + tab (should be selected already), uncheck *Use the system fixed width font* (if not already) + and select `MesloLGS NF Regular`. Exit the Preferences dialog by clicking *Close*. + - **Guake**: Right Click on an open terminal and open *Preferences*. Under *Appearance* + tab, uncheck *Use the system fixed width font* (if not already) and select `MesloLGS NF Regular`. + Exit the Preferences dialog by clicking *Close*. + - **MobaXterm**: Open *Settings* → *Configuration* → *Terminal* → (under *Terminal look and feel*) + and change *Font* to `MesloLGS NF`. + - **Asbrú Connection Manager**: Open *Preferences → Local Shell Options → Look and Feel*, enable + *Use these personal options* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + To change the font for the remote host connections, go to *Preferences → Terminal Options → + Look and Feel* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + - **WSLtty**: Right click on an open terminal and then on *Options*. In the *Text* section, under + *Font*, click *"Select..."* and set Font to `MesloLGS NF Regular`. + - **Yakuake**: Click *≡* → *Manage Profiles* → *New* → *Appearance*. Click *Choose* next to the + *Font* dropdown, select `MesloLGS NF` and click *OK*. Click *OK* to save the profile. Select the + new profile and click *Set as Default*. + - **Alacritty**: Create or open `~/.config/alacritty/alacritty.yml` and add the following section + to it: + ```yaml + font: + normal: + family: "MesloLGS NF" + ``` + - **kitty**: Create or open `~/.config/kitty/kitty.conf` and add the following line to it: + ```text + font_family MesloLGS NF + ``` + Restart kitty by closing all sessions and opening a new session. + - **puTTY**: Set *Window* → *Appearance* → *Font* to `MesloLGS NF`. Requires puTTY + version >= 0.75. + - **WezTerm**: Create or open `$HOME/.config/wezterm/wezterm.lua` and add the following: + ```lua + local wezterm = require 'wezterm'; + return { + font = wezterm.font("MesloLGS NF"), + } + ``` + If the file already exists, only add the line with the font to the existing return. + Also add the first line if it is not already present. + - **urxvt**: Create or open `~/.Xresources` and add the following line to it: + ```text + URxvt.font: xft:MesloLGS NF:size=11 + ``` + You can adjust the font size to your preference. After changing the config run + `xrdb ~/.Xresources` to reload it. The new config is applied to all new terminals. + - **xterm**: Create or open `~/.Xresources` and add the following line to it: + ```text + xterm*faceName: MesloLGS NF + ``` + After changing the config run `xrdb ~/.Xresources` to reload it. The new config is applied to + all new terminals. + - **Zed**: Open `~/.config/zed/settings.json` and set `terminal.font_family` to `"MesloLGS NF"`. + ```jsonc + { + "terminal": { + "font_family": "MesloLGS NF" + }, + // Other settings. + } + ``` + - Crostini (Linux on Chrome OS): Open + chrome-untrusted://terminal/html/nassh_preferences_editor.html, set *Text font family* to + `'MesloLGS NF'` (including the quotes) and *Custom CSS (inline text)* to the following: + ```css + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Regular.ttf"); + font-weight: normal; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold.ttf"); + font-weight: bold; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Italic.ttf"); + font-weight: normal; + font-style: italic; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold%20Italic.ttf"); + font-weight: bold; + font-style: italic; + } + ``` + **_CAVEAT_**: If you open the normal terminal preferences these settings will be overwritten. +1. Run `p10k configure` to generate a new `~/.p10k.zsh`. The old config may work + incorrectly with the new font. + +_Using a different terminal and know how to set the font for it? Share your knowledge by sending a +PR to expand the list!_ diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/LICENSE b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/Makefile b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/Makefile new file mode 100644 index 0000000..450d5ea --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/Makefile @@ -0,0 +1,46 @@ +APPNAME ?= gitstatusd +OBJDIR ?= obj + +CXX ?= g++ +ZSH := $(shell command -v zsh 2> /dev/null) + +VERSION ?= $(shell . ./build.info && printf "%s" "$$gitstatus_version") + +# Note: -fsized-deallocation is not used to avoid binary compatibility issues on macOS. +# +# Sized delete is implemented as __ZdlPvm in /usr/lib/libc++.1.dylib but this symbol is +# missing in macOS prior to 10.13. +CXXFLAGS += -std=c++14 -funsigned-char -O3 -DNDEBUG -DGITSTATUS_VERSION=$(VERSION) -Wall -Werror # -g -fsanitize=thread +LDFLAGS += -pthread # -fsanitize=thread +LDLIBS += -lgit2 # -lprofiler -lunwind + +SRCS := $(shell find src -name "*.cc") +OBJS := $(patsubst src/%.cc, $(OBJDIR)/%.o, $(SRCS)) + +all: $(APPNAME) + +$(APPNAME): usrbin/$(APPNAME) + +usrbin/$(APPNAME): $(OBJS) + $(CXX) $(OBJS) $(LDFLAGS) $(LDLIBS) -o $@ + +$(OBJDIR): + mkdir -p -- $(OBJDIR) + +$(OBJDIR)/%.o: src/%.cc Makefile build.info | $(OBJDIR) + $(CXX) $(CXXFLAGS) -MM -MT $@ src/$*.cc >$(OBJDIR)/$*.dep + $(CXX) $(CXXFLAGS) -Wall -c -o $@ src/$*.cc + +clean: + rm -rf -- $(OBJDIR) + +zwc: + $(or $(ZSH),:) -fc 'for f in *.zsh install; do zcompile -R -- $$f.zwc $$f || exit; done' + +minify: + rm -rf -- .clang-format .git .gitattributes .gitignore .vscode deps docs src usrbin/.gitkeep LICENSE Makefile README.md build mbuild + +pkg: zwc + GITSTATUS_DAEMON= GITSTATUS_CACHE_DIR=$(shell pwd)/usrbin ./install -f + +-include $(OBJS:.o=.dep) diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/README.md b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/README.md new file mode 100644 index 0000000..82a1998 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/README.md @@ -0,0 +1,530 @@ +# gitstatus + +**gitstatus** is a 10x faster alternative to `git status` and `git describe`. Its primary use +case is to enable fast git prompt in interactive shells. + +Heavy lifting is done by **gitstatusd** -- a custom binary written in C++. It comes with Zsh and +Bash bindings for integration with shell. + +## Table of Contents + +1. [Using from Zsh](#using-from-zsh) +1. [Using from Bash](#using-from-bash) +2. [Using from other shells](#using-from-other-shells) +1. [How it works](#how-it-works) +1. [Benchmarks](#benchmarks) +1. [Why fast](#why-fast) +1. [Requirements](#requirements) +1. [Compiling](#compiling) +1. [License](#license) + +## Using from Zsh + +The easiest way to take advantage of gitstatus from Zsh is to use a theme that's already integrated +with it. For example, [Powerlevel10k](https://github.com/romkatv/powerlevel10k) is a flexible and +fast theme with first-class gitstatus integration. If you install Powerlevel10k, you don't need to +install gitstatus. + +![Powerlevel10k Zsh Theme]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-styles-high-contrast.png) + +For those who wish to use gitstatus without a theme, there is +[gitstatus.prompt.zsh](gitstatus.prompt.zsh). Install it as follows: + +```zsh +git clone --depth=1 https://github.com/romkatv/gitstatus.git ~/gitstatus +echo 'source ~/gitstatus/gitstatus.prompt.zsh' >>! ~/.zshrc +``` + +Users in China can use the official mirror on gitee.com for faster download.
+中国大陆用户可以使用 gitee.com 上的官方镜像加速下载. + +```zsh +git clone --depth=1 https://gitee.com/romkatv/gitstatus.git ~/gitstatus +echo 'source ~/gitstatus/gitstatus.prompt.zsh' >>! ~/.zshrc +``` + +Alternatively, if you have Homebrew installed: + +```zsh +brew install romkatv/gitstatus/gitstatus +echo "source $(brew --prefix)/opt/gitstatus/gitstatus.prompt.zsh" >>! ~/.zshrc +``` + +(If you choose this option, replace `~/gitstatus` with `$(brew --prefix)/opt/gitstatus/gitstatus` +in all code snippets below.) + +_Make sure to disable your current theme if you have one._ + +This will give you a basic yet functional prompt with git status in it. It's +[over 10x faster](#benchmarks) than any alternative that can give you comparable prompt. In order +to customize it, set `PROMPT` and/or `RPROMPT` at the end of `~/.zshrc` after sourcing +`gitstatus.prompt.zsh`. Insert `${GITSTATUS_PROMPT}` where you want git status to go. For example: + +```zsh +source ~/gitstatus/gitstatus.prompt.zsh + +PROMPT='%~%# ' # left prompt: directory followed by %/# (normal/root) +RPROMPT='$GITSTATUS_PROMPT' # right prompt: git status +``` + +The expansion of `${GITSTATUS_PROMPT}` can contain the following bits: + +| segment | meaning | +|-------------|-------------------------------------------------------| +| `master` | current branch | +| `#v1` | HEAD is tagged with `v1`; not shown when on a branch | +| `@5fc6fca4` | current commit; not shown when on a branch or tag | +| `⇣1` | local branch is behind the remote by 1 commit | +| `⇡2` | local branch is ahead of the remote by 2 commits | +| `⇠3` | local branch is behind the push remote by 3 commits | +| `⇢4` | local branch is ahead of the push remote by 4 commits | +| `*5` | there are 5 stashes | +| `merge` | merge is in progress (could be some other action) | +| `~6` | there are 6 merge conflicts | +| `+7` | there are 7 staged changes | +| `!8` | there are 8 unstaged changes | +| `?9` | there are 9 untracked files | + +`$GITSTATUS_PROMPT_LEN` tells you how long `$GITSTATUS_PROMPT` is when printed to the console. +[gitstatus.prompt.zsh](gitstatus.prompt.zsh) has an example of using it to truncate the current +directory. + +If you'd like to change the format of git status, or want to have greater control over the +process of assembling `PROMPT`, you can copy and modify parts of +[gitstatus.prompt.zsh](gitstatus.prompt.zsh) instead of sourcing the script. Your `~/.zshrc` +might look something like this: + +```zsh +source ~/gitstatus/gitstatus.plugin.zsh + +function my_set_prompt() { + PROMPT='%~%# ' + RPROMPT='' + + if gitstatus_query MY && [[ $VCS_STATUS_RESULT == ok-sync ]]; then + RPROMPT=${${VCS_STATUS_LOCAL_BRANCH:-@${VCS_STATUS_COMMIT}}//\%/%%} # escape % + (( VCS_STATUS_NUM_STAGED )) && RPROMPT+='+' + (( VCS_STATUS_NUM_UNSTAGED )) && RPROMPT+='!' + (( VCS_STATUS_NUM_UNTRACKED )) && RPROMPT+='?' + fi + + setopt no_prompt_{bang,subst} prompt_percent # enable/disable correct prompt expansions +} + +gitstatus_stop 'MY' && gitstatus_start -s -1 -u -1 -c -1 -d -1 'MY' +autoload -Uz add-zsh-hook +add-zsh-hook precmd my_set_prompt +``` + +This snippet is sourcing `gitstatus.plugin.zsh` rather than `gitstatus.prompt.zsh`. The former +defines low-level bindings that communicate with gitstatusd over pipes. The latter is a simple +script that uses these bindings to assemble git prompt. + +Unlike [Powerlevel10k](https://github.com/romkatv/powerlevel10k), code based on +[gitstatus.prompt.zsh](gitstatus.prompt.zsh) is communicating with gitstatusd synchronously. This +can make your prompt slow when working in a large git repository or on a slow machine. To avoid +this problem, call `gitstatus_query` asynchronously as documented in +[gitstatus.plugin.zsh](gitstatus.plugin.zsh). This can be quite challenging. + +## Using from Bash + +The easiest way to take advantage of gitstatus from Bash is via +[gitstatus.prompt.sh](gitstatus.prompt.sh). Install it as follows: + +```bash +git clone --depth=1 https://github.com/romkatv/gitstatus.git ~/gitstatus +echo 'source ~/gitstatus/gitstatus.prompt.sh' >> ~/.bashrc +``` + +Users in China can use the official mirror on gitee.com for faster download.
+中国大陆用户可以使用 gitee.com 上的官方镜像加速下载. + +```bash +git clone --depth=1 https://gitee.com/romkatv/gitstatus.git ~/gitstatus +echo 'source ~/gitstatus/gitstatus.prompt.sh' >> ~/.bashrc +``` + +Alternatively, if you have Homebrew installed: + +```zsh +brew install romkatv/gitstatus/gitstatus +echo "source $(brew --prefix)/opt/gitstatus/gitstatus.prompt.sh" >> ~/.bashrc +``` + +(If you choose this option, replace `~/gitstatus` with `$(brew --prefix)/opt/gitstatus/gitstatus` +in all code snippets below.) + +This will give you a basic yet functional prompt with git status in it. It's +[over 10x faster](#benchmarks) than any alternative that can give you comparable prompt. + +![Bash Prompt with GitStatus]( + https://raw.githubusercontent.com/romkatv/gitstatus/1ac366952366d89980b3f3484f270b4fa5ae4293/bash-prompt.png) + +In order to customize your prompt, set `PS1` at the end of `~/.bashrc` after sourcing +`gitstatus.prompt.sh`. Insert `${GITSTATUS_PROMPT}` where you want git status to go. For example: + +```bash +source ~/gitstatus/gitstatus.prompt.sh + +PS1='\w ${GITSTATUS_PROMPT}\n\$ ' # directory followed by git status and $/# (normal/root) +``` + +The expansion of `${GITSTATUS_PROMPT}` can contain the following bits: + +| segment | meaning | +|-------------|-------------------------------------------------------| +| `master` | current branch | +| `#v1` | HEAD is tagged with `v1`; not shown when on a branch | +| `@5fc6fca4` | current commit; not shown when on a branch or tag | +| `⇣1` | local branch is behind the remote by 1 commit | +| `⇡2` | local branch is ahead of the remote by 2 commits | +| `⇠3` | local branch is behind the push remote by 3 commits | +| `⇢4` | local branch is ahead of the push remote by 4 commits | +| `*5` | there are 5 stashes | +| `merge` | merge is in progress (could be some other action) | +| `~6` | there are 6 merge conflicts | +| `+7` | there are 7 staged changes | +| `!8` | there are 8 unstaged changes | +| `?9` | there are 9 untracked files | + +If you'd like to change the format of git status, or want to have greater control over the +process of assembling `PS1`, you can copy and modify parts of +[gitstatus.prompt.sh](gitstatus.prompt.sh) instead of sourcing the script. Your `~/.bashrc` might +look something like this: + +```bash +source ~/gitstatus/gitstatus.plugin.sh + +function my_set_prompt() { + PS1='\w' + + if gitstatus_query && [[ "$VCS_STATUS_RESULT" == ok-sync ]]; then + if [[ -n "$VCS_STATUS_LOCAL_BRANCH" ]]; then + PS1+=" ${VCS_STATUS_LOCAL_BRANCH//\\/\\\\}" # escape backslash + else + PS1+=" @${VCS_STATUS_COMMIT//\\/\\\\}" # escape backslash + fi + (( VCS_STATUS_HAS_STAGED" )) && PS1+='+' + (( VCS_STATUS_HAS_UNSTAGED" )) && PS1+='!' + (( VCS_STATUS_HAS_UNTRACKED" )) && PS1+='?' + fi + + PS1+='\n\$ ' + + shopt -u promptvars # disable expansion of '$(...)' and the like +} + +gitstatus_stop && gitstatus_start +PROMPT_COMMAND=my_set_prompt +``` + +This snippet is sourcing `gitstatus.plugin.sh` rather than `gitstatus.prompt.sh`. The former +defines low-level bindings that communicate with gitstatusd over pipes. The latter is a simple +script that uses these bindings to assemble git prompt. + +Note: Bash bindings, unlike Zsh bindings, don't support asynchronous calls. + +## Using from other shells + +If there are no gitstatusd bindings for your shell, you'll need to get your hands dirty. +Use the existing bindings for inspiration; run `gitstatusd --help` or read the same thing in +[options.cc](src/options.cc). + +## How it works + +gitstatusd reads requests from stdin and prints responses to stdout. Requests contain an ID and +a directory. Responses contain the same ID and machine-readable git status for the directory. +gitstatusd keeps some state in memory for the directories it has seen in order to serve future +requests faster. + +[Zsh bindings](gitstatus.plugin.zsh) and [Bash bindings](gitstatus.plugin.sh) start gitstatusd in +the background and communicate with it via pipes. Themes such as +[Powerlevel10k](https://github.com/romkatv/powerlevel10k) use these bindings to put git status in +`PROMPT`. + +Note that gitstatus cannot be used as a drop-in replacement for `git status` command as it doesn't +produce output in the same format. It does perform the same computation though. + +## Benchmarks + +The following benchmark results were obtained on Intel i9-7900X running Ubuntu 18.04 in +a clean [chromium](https://github.com/chromium/chromium) repository synced to `9394e49a`. The +repository was checked out to an ext4 filesystem on M.2 SSD. + +Three functionally equivalent tools for computing git status were benchmarked: + +* `gitstatusd` +* `git` with untracked cache enabled +* `lg2` -- a demo/example executable from [libgit2](https://github.com/romkatv/libgit2) that + implements a subset of `git` functionality on top of libgit2 API; for the purposes of this + benchmark the subset is sufficient to generate the same data as the other tools + +Every tool was benchmark in cold and hot conditions. For `git` the first run in a repository was +considered cold, with the following runs considered hot. `lg2` was patched to compute results twice +in a single invocation without freeing the repository in between; the second run was considered hot. +The same patching was not done for `git` because `git` cannot be easily modified to refresh inmemory +index state between invocations; in fact, this limitation is one of the primary reasons developers +use libgit2. `gitstatusd` was benchmarked similarly to `lg2` with two result computations in the +same invocation. + +Two commands were benchmarked: `status` and `describe`. + +### Status + +In this benchmark all tools were computing the equivalent of `git status`. Lower numbers are better. + +| Tool | Cold | Hot | +|---------------|-----------:|------------:| +| **gitstatus** | **291 ms** | **30.9 ms** | +| git | 876 ms | 295 ms | +| lg2 | 1730 ms | 1310 ms | + +gitstatusd is substantially faster than the alternatives, especially on hot runs. Note that hot runs +are of primary importance to the main use case of gitstatus in interactive shells. + +The performance of `git status` fluctuated wildly in this benchmarks for reasons unknown to the +author. Moreover, performance is sticky -- once `git status` settles around a number, it stays +there for a long time. Numbers as diverse as 295, 352, 663 and 730 had been observed on hot runs on +the same repository. The number in the table is the lowest (fastest or best) that `git status` had +shown. + +### Describe + +In this benchmark all tools were computing the equivalent of `git describe --tags --exact-match` +to find tags that resolve to the same commit as `HEAD`. Lower numbers are better. + +| Tool | Cold | Hot | +|---------------|------------:|--------------:| +| **gitstatus** | **4.04 ms** | **0.0345 ms** | +| git | 18.0 ms | 14.5 ms | +| lg2 | 185 ms | 45.2 ms | + +gitstatusd is once again faster than the alternatives, more so on hot runs. + +## Why fast + +Since gitstatusd doesn't have to print all staged/unstaged/untracked files but only report +whether there are any, it can terminate repository scan early. It can also remember which files +were dirty on the previous run and check them first on the next run to avoid the scan entirely if +the files are still dirty. However, the benchmarks above were performed in a clean repository where +these shortcuts do not trigger. All benchmarked tools had to do the same work -- check the status +of every file in the index to see if it has changed, check every directory for newly created files, +etc. And yet, gitstatusd came ahead by a large margin. This section describes what it does that +makes it so fast. + +Most of the following comparisons are done against libgit2 rather than git because of the author's +familiarity with the former but not the with latter. libgit2 has clean, well-documented APIs and an +elegant implementation, which makes it so much easier to work with and to analyze performance +bottlenecks. + +### Summary for the impatient + +Under the benchmark conditions described above, the equivalent of libgit2's +`git_diff_index_to_workdir` (the most expensive part of `status` command) is 46.3 times faster in +gitstatusd. The speedup comes from the following sources. + +* gitstatusd uses more efficient data structures and algorithms and employs performance-conscious +coding style throughout the codebase. This reduces CPU time in userspace by 32x compared to libgit2. +* gitstatusd uses less expensive system calls and makes fewer of them. This reduces CPU time spent +in kernel by 1.9x. +* gitstatusd can utilize multiple cores to scan index and workdir in parallel with almost perfect +scaling. This reduces total run time by 12.4x while having virtually no effect on total CPU time. + +### Problem statement + +The most resource-intensive part of the `status` command is finding the difference between _index_ +and _workdir_ (`git_diff_index_to_workdir` in libgit2). Index is a list of all files in the git +repository with their last modification times. This is an obvious simplification but it suffices for +this exposition. On disk, index is stored sorted by file path. Here's an example of git index: + +| File | Last modification time | +|-------------|-----------------------:| +| Makefile | 2019-04-01T14:12:32Z | +| src/hello.c | 2019-04-01T14:12:00Z | +| src/hello.h | 2019-04-01T14:12:32Z | + +This list needs to be compared to the list of files in the working directory. If any of the files +listed in the index are missing from the workdir or have different last modification time, they are +"unstaged" in gitstatusd parlance. If you run `git status`, they'll be shown as "changes not staged +for commit". Thus, any implementation of `status` command has to call `stat()` or one of its +variants on every file in the index. + +In addition, all files in the working directory for which there is no entry in the index at all are +"untracked". `git status` will show them as "untracked files". Finding untracked files requires some +form of work directory traversal. + +### Single-threaded scan + +Let's see how `git_diff_index_to_workdir` from libgit2 accomplishes these tasks. Here's its CPU +profile from 200 hot runs over chromium repository. + +![libgit2 CPU profile (hot)]( + https://raw.githubusercontent.com/romkatv/gitstatus/1ac366952366d89980b3f3484f270b4fa5ae4293/cpu-profile-libgit2.png) + +(The CPU profile was created with [gperftools](https://github.com/gperftools/gperftools) and +rendered with [pprof](https://github.com/google/pprof)). + +We can see `__GI__lxstat` taking a lot of time. This is the `stat()` call for every file in the +index. We can also identify `__opendir`, `__readdir` and `__GI___close_nocancel` -- glibc wrappers +for reading the contents of a directory. This is for finding untracked files. Out of the total 232 +seconds, 111 seconds -- or 47.7% -- was spent on these calls. The rest is computation -- comparing +strings, sorting arrays, etc. + +Now let's take a look at the CPU profile of gitstatusd on the same task. + +![gitstatusd CPU profile (hot)]( + https://raw.githubusercontent.com/romkatv/gitstatus/1ac366952366d89980b3f3484f270b4fa5ae4293/cpu-profile-gitstatusd-hot.png) + +The first impression is that this profile looks pruned. This isn't an artifact. The profile was +generated with the same tools and the same flags as the profile of libgit2. + +Since both profiles were generated from the same workload, absolute numbers can be compared. We can +see that gitstatusd took 62 seconds in total compared to libgit2's 232 seconds. System calls at the +core of the algorithm are cleary visible. `__GI___fxstatat` is a flavor of `stat()`, and the other +three calls -- `__libc_openat64`, `__libc_close` and `__GI___fxstat` are responsible for opening +directories and finding untracked files. Notice that there is almost nothing else in the profile +apart from these calls. The rest of the code accounts for 3.77 seconds of CPU time -- 32 times less +than in libgit2. + +So, one reason gitstatusd is fast is that it has efficient diffing code -- very little time is spent +outside of kernel. However, if we look closely, we can notice that system calls in gitstatusd are +_also_ faster than in libgit2. For example, libgit2 spent 72.07 seconds in `__GI__lxstat` while +gitstatusd spent only 48.82 seconds in `__GI___fxstatat`. There are two reasons for this difference. +First, libgit2 makes more `stat()` calls than is strictly required. It's not necessary to stat +directories because index only has files. There are 25k directories in chromium repository (and 300k +files) -- that's 25k `stat()` calls that could be avoided. The second reason is that libgit2 and +gitstatusd use different flavors of `stat()`. libgit2 uses `lstat()`, which takes a path to the file +as input. Its performance is linear in the number of subdirectories in the path because it needs to +perform a lookup for every one of them and to check permissions. gitstatusd uses `fstatat()`, which +takes a file descriptor to the parent directory and a name of the file. Just a single lookup, less +CPU time. + +Similarly to `lstat()` vs `fstatat()`, it's faster to open files and directories with `openat()` +from the parent directory file descriptor than with regular `open()` that accepts full file path. +gitstatusd takes advantage of `openat()` to open directories as fast as possible. It opens about 90% +of the directories (this depends on the actual directory structure of the repository) from the +immediate parent -- the most efficient way -- and the remaining 10% it opens from the repository's +root directory. The reason it's done this way is to keep the maximum number of simultaneously open +file descriptors bounded. libgit2 can have O(repository depth) simultaneously open file descriptors, +which may be OK for a single-threaded application but can balloon to a large number when scans are +done by many threads simultaneously, like in gitstatusd. + +There is no equivalent to `__opendir` or `__readdir` in the gitstatusd profile because it uses the +equivalent of [untracked cache](https://git-scm.com/docs/git-update-index#_untracked_cache) from +git. On the first scan of the workdir gitstatusd lists all files just like libgit2. But, unlike +libgit2, it remembers the last modification time of every directory along with the list of +untracked files under it. On the next scan, gitstatusd can skip listing files in directories whose +last modification time hasn't changed. + +To summarize, here's what gitstatusd was doing when the CPU profile was captured: + +1. `__libc_openat64`: Open every directory for which there are files in the index. +2. `__GI___fxstat`: Check last modification time of the directory. Since it's the same as on the + last scan, this directory has the same list of untracked files as before, which is empty (the + repository is clean). +3. `__GI___fxstatat`: Check last modification time for every file in the index that belongs to this + directory. +4. `__libc_close`: Close the file descriptor to the directory. + +Here's how the very first scan of a repository looks like in gitstatusd: + +![gitstatusd CPU profile (cold)]( + https://raw.githubusercontent.com/romkatv/gitstatus/1ac366952366d89980b3f3484f270b4fa5ae4293/cpu-profile-gitstatusd-cold.png) + +(Some glibc functions are mislabel on this profile. `explicit_bzero` and `__nss_passwd_lookup` are +in reality `strcmp` and `memcmp`.) + +This is a superset of the previous -- hot -- profile, with an extra `syscall` and string sorting for +directory listing. gitstatusd uses `getdents64` Linux system call directly, bypassing the glibc +wrapper that libgit2 uses. This is 23% faster. The details of this optimization can be found in a +[separate document](docs/listdir.md). + +### Multithreading + +The diffing algorithm in gitstatusd was designed from the ground up with the intention of using it +concurrently from multiple threads. With a fast SSD, `status` is CPU bound, so taking advantage of +all available CPU cores is an obvious way to yield results faster. + +gitstatusd exhibits almost perfect scaling from multithreading. Engaging all cores allows it to +produce results 12.4 times faster than in single-threaded execution. This is on Intel i9-7900X with +10 cores (20 with hyperthreading) with single-core frequency of 4.3GHz and all-core frequency of +4.0GHz. + +Note: `git status` also uses all available cores in some parts of its algorithm while `lg2` does +everything in a single thread. + +### Postprocessing + +Once the difference between the index and the workdir is found, we have a list of _candidates_ -- +files that may be unstaged or untracked. To make the final judgement, these files need to be checked +against `.gitignore` rules and a few other things. + +gitstatusd uses [patched libgit2](https://github.com/romkatv/libgit2) for this step. This fork +adds several optimizations that make libgit2 faster. The patched libgit2 performs more than twice +as fast in the benchmark as the original even without changes in the user code (that is, in the +code that uses the libgit2 APIs). The fork also adds several API extensions, most notable of which +is the support for multi-threaded scans. If `lg2 status` is modified to take advantage of these +extensions, it outperforms the original libgit2 by a factor of 18. Lastly, the fork fixes a score of +bugs, most of which become apparent only when using libgit2 from multiple threads. + +_WARNING: Changes to libgit2 are extensive but the testing they underwent isn't. It is +**not recommended** to use the patched libgit2 in production._ + +## Requirements + +* To compile: binutils, cmake, gcc, g++, git and GNU make. +* To run: Linux, macOS, FreeBSD, Android, WSL, Cygwin or MSYS2. + +## Compiling + +There are prebuilt `gitstatusd` binaries in [releases]( + https://github.com/romkatv/gitstatus/releases). When using the official shell bindings +provided by gitstatus, the right binary for your architecture gets downloaded automatically. + +If prebuilt binaries don't work for you, you'll need to get your hands dirty. + +### Compiling for personal use + +```zsh +git clone --depth=1 https://github.com/romkatv/gitstatus.git +cd gitstatus +./build -w -s -d docker +``` + +Users in China can use the official mirror on gitee.com for faster download.
+中国大陆用户可以使用 gitee.com 上的官方镜像加速下载. + +```zsh +git clone --depth=1 https://gitee.com/romkatv/gitstatus.git +cd gitstatus +./build -w -s -d docker +``` + +- If it says that `-d docker` is not supported on your OS, remove this flag. +- If it says that `-s` is not supported on your OS, remove this flag. +- If it tell you to install docker but you cannot or don't want to, remove `-d docker`. +- If it says that some command is missing, install it. + +If everything goes well, the newly built binary will appear in `./usrbin`. It'll be picked up +by shell bindings automatically. + +When you update shell bindings, they may refuse to work with the binary you've built earlier. In +this case you'll need to rebuild. + +If you are using gitstatus through [Powerlevel10k](https://github.com/romkatv/powerlevel10k), the +instructions are the same except that you don't need to clone gitstatus. Instead, change your +current directory to `/path/to/powerlevel10k/gitstatus` (`/path/to/powerlevel10k` is the directory +where you've installed Powerlevel10k) and run `./build -w -s -d docker` from there as described +above. + +### Compiling for distribution + +It's currently neither easy nor recommended to package and distribute gitstatus. There are no +instructions you can follow that would allow you to easily update your package when new versions of +gitstatus are released. This may change in the future but not soon. + +## License + +GNU General Public License v3.0. See [LICENSE](LICENSE). Contributions are covered by the same +license. diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/build.info b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/build.info new file mode 100644 index 0000000..baa30b0 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/build.info @@ -0,0 +1,22 @@ +# This value gets embedded in gitstatusd at build time. It is +# read by ./Makefile. `gitstatusd --version` reports it back. +# +# This value is also read by shell bindings (indirectly, through +# ./install) when using GITSTATUS_DAEMON or usrbin/gitstatusd. +gitstatus_version="v1.5.4" + +# libgit2 is a build time dependency of gitstatusd. The values of +# libgit2_version and libgit2_sha256 are read by ./build. +# +# If ./deps/libgit2-${libgit2_version}.tar.gz doesn't exist, build +# downloads it from the following location: +# +# https://github.com/romkatv/libgit2/archive/${libgit2_version}.tar.gz +# +# Once downloaded, the tarball is stored at the path indicated +# above so that repeated builds don't consume network bandwidth. +# +# If sha256 of ./deps/libgit2-${libgit2_version}.tar.gz doesn't match, +# build gets aborted. +libgit2_version="tag-0ad3d776aa86dd607dc86dcd7f77ad3ed7ebec61" +libgit2_sha256="c5d0117ae74d3ef244c26f10cce022019077dbc4563e6251fa9f56d36868ce74" diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/deps/empty_dot_gitkeep b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/deps/empty_dot_gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/docs/listdir.md b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/docs/listdir.md new file mode 100644 index 0000000..0939cc1 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/docs/listdir.md @@ -0,0 +1,330 @@ +# Fast directory listing + +In order to find untracked files in a git repository, [gitstatusd](../README.md) needs to list the +contents of every directory. gitstatusd does it 27% faster than a reasonable implementation that a +seasoned C/C++ practitioner might write. This document explains the optimizations that went into it. +As directory listing is a common operation, many other projects can benefit from applying these +optimizations. + +## v1 + +Given a path to a directory, `ListDir()` must produce the list of files in that directory. Moreover, +the list must be sorted lexicographically to enable fast comparison with Git index. + +The following C++ implementation gets the job done. For simplicity, it returns an empty list on +error. + +```c++ +vector ListDir(const char* dirname) { + vector entries; + if (DIR* dir = opendir(dirname)) { + while (struct dirent* ent = (errno = 0, readdir(dir))) { + if (!Dots(ent->d_name)) entries.push_back(ent->d_name); + } + if (errno) entries.clear(); + sort(entries.begin(), entries.end()); + closedir(dir); + } + return entries; +} +``` + +Every directory has entries `"."` and `".."`, which we aren't interested in. We filter them out with +a helper function `Dots()`. + +```c++ +bool Dots(const char* s) { return s[0] == '.' && (!s[1] || (s[1] == '.' && !s[2])); } +``` + +To check how fast `ListDir()` performs, we can run it many times on a typical directory. One million +runs on a directory with 32 files with 16-character names takes 12.7 seconds. + +## v2 + +Experienced C++ practitioners will scoff at our implementation of `ListDir()`. If it's meant to be +efficient, returning `vector` is an unaffordable convenience. To avoid heap allocations we +can use a simple arena that will allow us to reuse memory between different `ListDir()` calls. + +(Changed and added lines are marked with comments.) + +```c++ +void ListDir(const char* dirname, string& arena, vector& entries) { // + + entries.clear(); // + + if (DIR* dir = opendir(dirname)) { + arena.clear(); // + + while (struct dirent* ent = (errno = 0, readdir(dir))) { + if (!Dots(ent->d_name)) { + entries.push_back(reinterpret_cast(arena.size())); // + + arena.append(ent->d_name, strlen(ent->d_name) + 1); // + + } + } + if (errno) entries.clear(); + for (char*& p : entries) p = &arena[reinterpret_cast(p)]; // + + sort(entries.begin(), entries.end(), // + + [](const char* a, const char* b) { return strcmp(a, b) < 0; }); // + + closedir(dir); + } +} +``` + +To make performance comparison easier, we can normalize them relative to the baseline. v1 will get +performance score of 100. A twice-as-fast alternative will be 200. + +| version | optimization | score | +|---------|----------------------------|----------:| +| v1 | baseline | 100.0 | +| **v2** | **avoid heap allocations** | **112.7** | + +Avoiding heap allocations makes `ListDir()` 12.7% faster. Not bad. As an added bonus, those casts +will fend off the occasional frontend developer who accidentally wanders into the codebase. + +## v3 + +`opendir()` is an expensive call whose performance is linear in the number of subdirectories in the +path because it needs to perform a lookup for every one of them. We can replace it with `openat()`, +which takes a file descriptor to the parent directory and a name of the subdirectory. Just a single +lookup, less CPU time. This optimization assumes that callers already have a descriptor to the +parent directory, which is indeed the case for gitstatusd, and is often the case in other +applications that traverse filesystem. + +```c++ +void ListDir(int parent_fd, const char* dirname, string& arena, vector& entries) { // + + entries.clear(); + int dir_fd = openat(parent_fd, dirname, O_NOATIME | O_RDONLY | O_DIRECTORY | O_CLOEXEC); // + + if (dir_fd < 0) return; // + + if (DIR* dir = fdopendir(dir_fd)) { + arena.clear(); + while (struct dirent* ent = (errno = 0, readdir(dir))) { + if (!Dots(ent->d_name)) { + entries.push_back(reinterpret_cast(arena.size())); + arena.append(ent->d_name, strlen(ent->d_name) + 1); + } + } + if (errno) entries.clear(); + for (char*& p : entries) p = &arena[reinterpret_cast(p)]; + sort(entries.begin(), entries.end(), + [](const char* a, const char* b) { return strcmp(a, b) < 0; }); + closedir(dir); + } else { // + + close(dir_fd); // + + } // + +} +``` + +This is worth about 3.5% in speed. + +| version | optimization | score | +|---------|--------------------------------------|----------:| +| v1 | baseline | 100.0 | +| v2 | avoid heap allocations | 112.7 | +| **v3** | **open directories with `openat()`** | **116.2** | + +## v4 + +Copying file names to the arena isn't free but it doesn't seem like we can avoid it. Poking around +we can see that the POSIX API we are using is implemented on Linux on top of `getdents64` system +call. Its documentation isn't very encouraging: + +```text +These are not the interfaces you are interested in. Look at +readdir(3) for the POSIX-conforming C library interface. This page +documents the bare kernel system call interfaces. + +Note: There are no glibc wrappers for these system calls. +``` + +Hmm... The API looks like something we can take advantage of, so let's try it anyway. + +First, we'll need a simple `Arena` class that can allocate 8KB blocks of memory. + +```c++ +class Arena { + public: + enum { kBlockSize = 8 << 10 }; + + char* Alloc() { + if (cur_ == blocks_.size()) blocks_.emplace_back(kBlockSize, 0); + return blocks_[cur_++].data(); + } + + void Clear() { cur_ = 0; } + + private: + size_t cur_ = 0; + vector blocks_; +}; +``` + +Next, we need to define `struct dirent64_t` ourselves because there is no wrapper for the system +call we are about to use. + +```c++ +struct dirent64_t { + ino64_t d_ino; + off64_t d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[]; +}; +``` + +Finally we can get to the implementation of `ListDir()`. + +```c++ +void ListDir(int parent_fd, Arena& arena, vector& entries) { // + + entries.clear(); + int dir_fd = openat(parent_fd, dirname, O_NOATIME | O_RDONLY | O_DIRECTORY | O_CLOEXEC); + if (dir_fd < 0) return; + arena.Clear(); // + + while (true) { // + + char* buf = arena.Alloc(); // + + int n = syscall(SYS_getdents64, dir_fd, buf, Arena::kBlockSize); // + + if (n <= 0) { // + + if (n) entries.clear(); // + + break; // + + } // + + for (int pos = 0; pos < n;) { // + + auto* ent = reinterpret_cast(buf + pos); // + + if (!Dots(ent->d_name)) entries.push_back(ent->d_name); // + + pos += ent->d_reclen; // + + } // + + } // + + sort(entries.begin(), entries.end(), + [](const char* a, const char* b) { return strcmp(a, b) < 0; }); + close(dir_fd); +} +``` + +How are we doing with this one? + +| version | optimization | score | +|---------|----------------------------------|----------:| +| v1 | baseline | 100.0 | +| v2 | avoid heap allocations | 112.7 | +| v3 | open directories with `openat()` | 116.2 | +| **v4** | **call `getdents64()` directly** | **137.8** | + +Solid 20% speedup. Worth the trouble. Unfortunately, we now have just one `reinterpret_cast` instead +of two, and it's not nearly as scary-looking. Hopefully with the next iteration we can get back some +of that evil vibe of low-level code. + +As a bonus, every element in `entries` has `d_type` at offset -1. This can be useful to the callers +that need to distinguish between regular files and directories (gitstatusd, in fact, needs this). +Note how `ListDir()` implements this feature at zero cost, as a lucky accident of `dirent64_t` +memory layout. + +## v5 + +The CPU profile of `ListDir()` reveals that almost all userspace CPU time is spent in `strcmp()`. +Digging into the source code of `std::sort()` we can see that it uses Insertion Sort for short +collections. Our 32-element vector falls under the threshold. Insertion Sort makes `O(N^2)` +comparisons, hence a lot of CPU time in `strcmp()`. Switching to `qsort()` or +[Timsort](https://en.wikipedia.org/wiki/Timsort) is of no use as all good sorting algorithms fall +back to Insertion Sort. + +If we cannot make fewer comparisons, perhaps we can make each of them faster? `strcmp()` compares +characters one at a time. It cannot read ahead as it can be illegal to touch memory past the first +null byte. But _we_ know that it's safe to read a few extra bytes past the end of `d_name` for every +entry except the last in the buffer. And since we own the buffer, we can overallocate it so that +reading past the end of the last entry is also safe. + +Combining these ideas with the fact that file names on Linux are at most 255 bytes long, we can +invoke `getdents64()` like this: + +```c++ +int n = syscall(SYS_getdents64, dir_fd, buf, Arena::kBlockSize - 256); +``` + +And then compare entries like this: + +```c++ +[](const char* a, const char* b) { return memcmp(a, b, 255) < 0; } +``` + +This version doesn't give any speedup compared to the previous but it opens an avenue for another +optimization. The pointers we pass to `memcmp()` aren't aligned. To be more specific, their +numerical values are `N * 8 + 3` for some `N`. When given such a pointer, `memcmp()` will check the +first 5 bytes one by one, and only then switch to comparing 8 bytes at a time. If we can handle the +first 5 bytes ourselves, we can pass aligned memory to `memcmp()` and take full advantage of its +vectorized loop. + +Here's the implementation: + +```c++ +uint64_t Read64(const void* p) { // + + uint64_t x; // + + memcpy(&x, p, sizeof(x)); // + + return x; // + +} // + + +void ByteSwap64(void* p) { // + + uint64_t x = __builtin_bswap64(Read64(p)); // + + memcpy(p, &x, sizeof(x)); // + +} // + + +void ListDir(int parent_fd, Arena& arena, vector& entries) { + entries.clear(); + int dir_fd = openat(parent_fd, dirname, O_NOATIME | O_RDONLY | O_DIRECTORY | O_CLOEXEC); + if (dir_fd < 0) return; + arena.Clear(); + while (true) { + char* buf = arena.Alloc(); + int n = syscall(SYS_getdents64, dir_fd, buf, Arena::kBlockSize - 256); // + + if (n <= 0) { + if (n) entries.clear(); + break; + } + for (int pos = 0; pos < n;) { + auto* ent = reinterpret_cast(buf + pos); + if (!Dots(ent->d_name)) { + ByteSwap64(ent->d_name); // + + entries.push_back(ent->d_name); + } + pos += ent->d_reclen; + } + } + sort(entries.begin(), entries.end(), [](const char* a, const char* b) { + uint64_t x = Read64(a); // + + uint64_t y = Read64(b); // + + return x < y || (x == y && a != b && memcmp(a + 5, b + 5, 256) < 0); // + + }); + for (char* p : entries) ByteSwap64(p); // + + close(dir_fd); +} +``` + +This is for Little Endian architecture. Big Endian doesn't need `ByteSwap64()`, so it'll be a bit +faster. + +| version | optimization | score | +|---------|----------------------------------|----------:| +| v1 | baseline | 100.0 | +| v2 | avoid heap allocations | 112.7 | +| v3 | open directories with `openat()` | 116.2 | +| v4 | call `getdents64()` directly | 137.8 | +| **v5** | **hand-optimize `strcmp()`** | **143.3** | + +Fast and respectably arcane. + +## Conclusion + +Through a series of incremental improvements we've sped up directory listing by 43.3% compared to a +naive implementation (v1) and 27.2% compared to a reasonable implementation that a seasoned C/C++ +practitioner might write (v2). + +However, these numbers are based on an artificial benchmark while the real judge is always the real +code. Our goal was to speed up gitstatusd. Benchmark was just a tool. Thankfully, the different +versions of `ListDir()` have the same comparative performance within gitstatusd as in the benchmark. +In truth, the directory chosen for the benchmark wasn't arbitrary. It was picked by sampling +gitstatusd when it runs on [chromium](https://github.com/chromium/chromium) git repository. + +The final version of `ListDir()` spends 97% of its CPU time in the kernel. If we assume that it +makes the minimum possible number of system calls and these calls are optimal (true to the best +of my knowledge), it puts the upper bound on possible future performance improvements at just 3%. +There is almost nothing left in `ListDir()` to optimize. + +![ListDir() CPU profile]( + https://raw.githubusercontent.com/romkatv/gitstatus/1ac366952366d89980b3f3484f270b4fa5ae4293/cpu-profile-listdir.png) + +(The CPU profile was created with [gperftools](https://github.com/gperftools/gperftools) and +rendered with [pprof](https://github.com/google/pprof)). diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_clang-format b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_clang-format new file mode 100644 index 0000000..f5e3c53 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_clang-format @@ -0,0 +1,4 @@ +BasedOnStyle: Google +ColumnLimit: 100 +DerivePointerAlignment: false +PointerAlignment: Left diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitattributes b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitattributes new file mode 100644 index 0000000..5c1135c --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitattributes @@ -0,0 +1,16 @@ +* text=auto + +*.cc text eol=lf +*.h text eol=lf +*.info text eol=lf +*.json text eol=lf +*.md text eol=lf +*.sh text eol=lf +*.zsh text eol=lf + +/.clang-format text eol=lf +/LICENSE text eol=lf +/Makefile text eol=lf +/build text eol=lf +/install text eol=lf +/mbuild text eol=lf diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitignore b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitignore new file mode 100644 index 0000000..4915fe6 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_gitignore @@ -0,0 +1,8 @@ +*.zwc +/core +/deps/libgit2-*.tar.gz +/locks +/logs +/obj +/usrbin/gitstatusd* +/.vscode/ipch diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/c_cpp_properties.json b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/c_cpp_properties.json new file mode 100644 index 0000000..323a6cd --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/c_cpp_properties.json @@ -0,0 +1,17 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/src" + ], + "defines": [ + ], + "compilerPath": "/usr/bin/g++", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/settings.json b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/settings.json new file mode 100644 index 0000000..bec79f9 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/dot_vscode/settings.json @@ -0,0 +1,72 @@ +{ + "files.exclude": { + "*.zwc": true, + "core": true, + "locks/": true, + "logs/": true, + "obj/": true, + "usrbin/": true, + }, + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "complex": "cpp", + "condition_variable": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "fstream": "cpp", + "functional": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "memory": "cpp", + "mutex": "cpp", + "new": "cpp", + "numeric": "cpp", + "optional": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "thread": "cpp", + "type_traits": "cpp", + "tuple": "cpp", + "typeinfo": "cpp", + "utility": "cpp", + "variant": "cpp", + "cstdarg": "cpp", + "charconv": "cpp", + "algorithm": "cpp", + "cinttypes": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory_resource": "cpp", + "random": "cpp", + "string": "cpp", + "bit": "cpp", + "netfwd": "cpp" + } +} diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_build b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_build new file mode 100644 index 0000000..e116abb --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_build @@ -0,0 +1,656 @@ +#!/bin/sh +# +# Type `build -h` for help and see https://github.com/romkatv/gitstatus +# for full documentation. + +set -ue + +if [ -n "${ZSH_VERSION:-}" ]; then + emulate sh -o err_exit -o no_unset +fi + +export LC_ALL=C + +if [ -z "${ZSH_VERSION-}" ] && command -v zsh >/dev/null 2>&1; then + # Avoid bash 3.*. + case "${BASH_VERSION-}" in + [0-3].*) exec zsh "$0" "$@";; + esac +fi + +# Avoid ksh: https://github.com/romkatv/gitstatus/issues/282. +if [ -n "${KSH_VERSION-}" ]; then + if [ -z "${ZSH_VERSION-}" ] && command -v zsh >/dev/null 2>&1; then + exec zsh "$0" "$@" + elif [ -z "${BASH_VERSION-}" ] && command -v bash >/dev/null 2>&1 && + bash_version="$(bash --version 2>&1)"; then + case "$bash_version" in + *version\ [4-9]*|*version\ [1-9][0-9]*) exec bash "$0" "$@";; + esac + fi +fi + +usage="$(command cat <<\END +Usage: build [-m ARCH] [-c CPU] [-d CMD] [-i IMAGE] [-s] [-w] + +Options: + + -m ARCH `uname -m` from the target machine; defaults to `uname -m` + from the local machine + -c CPU generate machine instructions for CPU of this type; this + value gets passed as `-march` (or `-mcpu` for ppc64le) to gcc; + inferred from ARCH if not set explicitly + -d CMD build in a Docker container and use CMD as the `docker` + command; e.g., `-d docker` or `-d podman` + -i IMAGE build in this Docker image; inferred from ARCH if not set + explicitly + -s install whatever software is necessary for build to + succeed; on some operating systems this option is not + supported; on others it can have partial effect + -w automatically download tarballs for dependencies if they + do not already exist in ./deps; dependencies are described + in ./build.info +END +)" + +build="$(command cat <<\END +outdir="$(command pwd)" + +if command -v mktemp >/dev/null 2>&1; then + workdir="$(command mktemp -d "${TMPDIR:-/tmp}"/gitstatus-build.XXXXXXXXXX)" +else + workdir="${TMPDIR:-/tmp}/gitstatus-build.tmp.$$" + command mkdir -- "$workdir" +fi + +cd -- "$workdir" +workdir="$(command pwd)" + +narg() { echo $#; } + +if [ "$(narg $workdir)" != 1 -o -z "${workdir##*:*}" -o -z "${workdir##*=*}" ]; then + >&2 echo "[error] cannot build in this directory: $workdir" + exit 1 +fi + +appname=gitstatusd +libgit2_tmp="$outdir"/deps/"$appname".libgit2.tmp + +cleanup() { + trap - INT QUIT TERM ILL PIPE + cd / + if ! command rm -rf -- "$workdir" "$outdir"/usrbin/"$appname".tmp "$libgit2_tmp"; then + command sleep 5 + command rm -rf -- "$workdir" "$outdir"/usrbin/"$appname".tmp "$libgit2_tmp" + fi +} +trap cleanup INT QUIT TERM ILL PIPE + +if [ -n "$gitstatus_install_tools" ]; then + case "$gitstatus_kernel" in + linux) + if command -v apk >/dev/null 2>&1; then + command apk update + command apk add binutils cmake gcc g++ git make musl-dev perl-utils + elif command -v apt-get >/dev/null 2>&1; then + apt-get update + apt-get install -y binutils cmake gcc g++ make wget + else + >&2 echo "[error] -s is not supported on this system" + exit 1 + fi + ;; + freebsd|dragonfly) + command pkg install -y cmake gmake binutils git perl5 wget + ;; + openbsd) + command pkg_add cmake gmake gcc g++ git wget + ;; + netbsd) + command pkgin -y install cmake gmake binutils git + ;; + darwin) + if ! command -v make >/dev/null 2>&1 || ! command -v gcc >/dev/null 2>&1; then + >&2 echo "[error] please run 'xcode-select --install' and retry" + exit 1 + fi + if command -v port >/dev/null 2>&1; then + sudo port -N install libiconv cmake wget + elif command -v brew >/dev/null 2>&1; then + for formula in libiconv cmake git wget; do + if command brew ls --version "$formula" &>/dev/null; then + command brew upgrade "$formula" + else + command brew install "$formula" + fi + done + else + >&2 echo "[error] please install MacPorts or Homebrew and retry" + exit 1 + fi + ;; + msys*|mingw*) + command pacman -Syu --noconfirm + command pacman -S --needed --noconfirm binutils cmake gcc git make perl + ;; + *) + >&2 echo "[internal error] unhandled kernel: $gitstatus_kernel" + exit 1 + ;; + esac +fi + +cpus="$(command getconf _NPROCESSORS_ONLN 2>/dev/null)" || + cpus="$(command sysctl -n hw.ncpu 2>/dev/null)" || + cpus=8 + +case "$gitstatus_cpu" in + powerpc64|powerpc64le) + archflag="-mcpu" + ;; + *) + archflag="-march" + ;; +esac + +cflags="$archflag=$gitstatus_cpu -fno-plt -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fpie" +ldflags= +static_pie= + +if [ -z "${CC-}" ]; then + case "$gitstatus_kernel" in + freebsd) export CC=clang;; + *) export CC=cc;; + esac +fi + +printf 'int main() {}\n' >"$workdir"/cc-test.c +if 2>/dev/null "$CC" \ + -ffile-prefix-map=x=y \ + -Werror \ + -c "$workdir"/cc-test.c \ + -o "$workdir"/cc-test.o; then + cflags="$cflags -ffile-prefix-map=$workdir/=" +fi + +command rm -f -- "$workdir"/cc-test "$workdir"/cc-test.o +if 2>/dev/null "$CC" \ + -fstack-clash-protection \ + -Werror \ + -c "$workdir"/cc-test.c \ + -o "$workdir"/cc-test.o; then + cflags="$cflags -fstack-clash-protection" +fi + +command rm -f -- "$workdir"/cc-test "$workdir"/cc-test.o +if 2>/dev/null "$CC" \ + -fcf-protection \ + -Werror \ + -c "$workdir"/cc-test.c \ + -o "$workdir"/cc-test.o; then + cflags="$cflags -fcf-protection" +fi + +command rm -f -- "$workdir"/cc-test "$workdir"/cc-test.o +if 2>/dev/null "$CC" \ + -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now \ + -Werror \ + "$workdir"/cc-test.c \ + -o "$workdir"/cc-test; then + ldflags="$ldflags -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" +fi + +command rm -f -- "$workdir"/cc-test "$workdir"/cc-test.o +if 2>/dev/null "$CC" \ + -fpie -static-pie \ + -Werror \ + "$workdir"/cc-test.c \ + -o "$workdir"/cc-test; then + static_pie='-static-pie' +fi + +if [ "$gitstatus_cpu" = x86-64 ]; then + cflags="$cflags -mtune=generic" +fi + +libgit2_cmake_flags= +libgit2_cflags="${CFLAGS-} $cflags -O3 -DNDEBUG" + +gitstatus_cxx=g++ +gitstatus_cxxflags="${CXXFLAGS-} $cflags -I${workdir}/libgit2/include -DGITSTATUS_ZERO_NSEC -D_GNU_SOURCE -D_GLIBCXX_ASSERTIONS" +gitstatus_ldflags="${LDFLAGS-} $ldflags -L${workdir}/libgit2/build" +gitstatus_ldlibs= +gitstatus_make=make + +case "$gitstatus_kernel" in + linux) + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + freebsd) + gitstatus_cxx=clang++ + gitstatus_make=gmake + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + dragonfly) + gitstatus_cxx=clang++12 + gitstatus_make=gmake + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + openbsd) + gitstatus_cxx=eg++ + gitstatus_make=gmake + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + netbsd) + gitstatus_make=gmake + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + darwin) + command mkdir -- "$workdir"/lib + if [ -e /opt/local/lib/libiconv.a ]; then + command ln -s -- /opt/local/lib/libiconv.a "$workdir"/lib + libgit2_cflags="$libgit2_cflags -I/opt/local/include" + gitstatus_cxxflags="$gitstatus_cxxflags -I/opt/local/include" + else + brew_prefix="$(command brew --prefix)" + command ln -s -- "$brew_prefix"/opt/libiconv/lib/libiconv.a "$workdir"/lib + libgit2_cflags="$libgit2_cflags -I"$brew_prefix"/opt/libiconv/include" + gitstatus_cxxflags="$gitstatus_cxxflags -I"$brew_prefix"/opt/libiconv/include" + fi + libgit2_cmake_flags="$libgit2_cmake_flags -DUSE_ICONV=ON" + gitstatus_ldlibs="$gitstatus_ldlibs -liconv" + gitstatus_ldflags="$gitstatus_ldflags -L${workdir}/lib" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=OFF" + ;; + msys*|mingw*) + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + cygwin*) + gitstatus_ldflags="$gitstatus_ldflags ${static_pie:--static}" + libgit2_cmake_flags="$libgit2_cmake_flags -DENABLE_REPRODUCIBLE_BUILDS=ON" + ;; + *) + >&2 echo "[internal error] unhandled kernel: $gitstatus_kernel" + exit 1 + ;; +esac + +for cmd in cat cmake git ld ln mkdir rm strip tar "$gitstatus_make"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + if [ -n "$gitstatus_install_tools" ]; then + >&2 echo "[internal error] $cmd not found" + exit 1 + else + >&2 echo "[error] command not found: $cmd" + exit 1 + fi + fi +done + +. "$outdir"/build.info +if [ -z "${libgit2_version:-}" ]; then + >&2 echo "[internal error] libgit2_version not set" + exit 1 +fi +if [ -z "${libgit2_sha256:-}" ]; then + >&2 echo "[internal error] libgit2_sha256 not set" + exit 1 +fi +libgit2_tarball="$outdir"/deps/libgit2-"$libgit2_version".tar.gz +if [ ! -e "$libgit2_tarball" ]; then + if [ -n "$gitstatus_download_deps" ]; then + if ! command -v wget >/dev/null 2>&1; then + if [ -n "$gitstatus_install_tools" ]; then + >&2 echo "[internal error] wget not found" + exit 1 + else + >&2 echo "[error] command not found: wget" + exit 1 + fi + fi + libgit2_url=https://github.com/romkatv/libgit2/archive/"$libgit2_version".tar.gz + if ! >"$libgit2_tmp" command wget --no-config -qO- -- "$libgit2_url" && + ! >"$libgit2_tmp" command wget -qO- -- "$libgit2_url"; then + set -x + >&2 command which wget + >&2 command ls -lAd -- "$(command which wget)" + >&2 command ls -lAd -- "$outdir" + >&2 command ls -lA -- "$outdir" + >&2 command ls -lAd -- "$outdir"/deps + >&2 command ls -lA -- "$outdir"/deps + set +x + exit 1 + fi + command mv -f -- "$libgit2_tmp" "$libgit2_tarball" + else + >&2 echo "[error] file not found: deps/libgit2-"$libgit2_version".tar.gz" + exit 1 + fi +fi + +libgit2_actual_sha256= +if command -v shasum >/dev/null 2>/dev/null; then + libgit2_actual_sha256="$(command shasum -b -a 256 -- "$libgit2_tarball")" + libgit2_actual_sha256="${libgit2_actual_sha256%% *}" +elif command -v sha256sum >/dev/null 2>/dev/null; then + libgit2_actual_sha256="$(command sha256sum -b -- "$libgit2_tarball")" + libgit2_actual_sha256="${libgit2_actual_sha256%% *}" +elif command -v sha256 >/dev/null 2>/dev/null; then + libgit2_actual_sha256="$(command sha256 -- "$libgit2_tarball" &2 echo "[error] command not found: shasum or sha256sum" + exit 1 +fi + +if [ "$libgit2_actual_sha256" != "$libgit2_sha256" ]; then + >&2 echo "[error] sha256 mismatch" + >&2 echo "" + >&2 echo " file : deps/libgit2-$libgit2_version.tar.gz" + >&2 echo " expected: $libgit2_sha256" + >&2 echo " actual : $libgit2_actual_sha256" + exit 1 +fi + +cd -- "$workdir" +command tar -xzf "$libgit2_tarball" +command mv -- libgit2-"$libgit2_version" libgit2 +command mkdir libgit2/build +cd libgit2/build + +CFLAGS="$libgit2_cflags" command cmake \ + -DCMAKE_BUILD_TYPE=None \ + -DZERO_NSEC=ON \ + -DTHREADSAFE=ON \ + -DUSE_BUNDLED_ZLIB=ON \ + -DREGEX_BACKEND=builtin \ + -DUSE_HTTP_PARSER=builtin \ + -DUSE_SSH=OFF \ + -DUSE_HTTPS=OFF \ + -DBUILD_CLAR=OFF \ + -DUSE_GSSAPI=OFF \ + -DUSE_NTLMCLIENT=OFF \ + -DBUILD_SHARED_LIBS=OFF \ + $libgit2_cmake_flags \ + .. +command make -j "$cpus" VERBOSE=1 + +APPNAME="$appname".tmp \ + OBJDIR="$workdir"/gitstatus \ + CXX="${CXX:-$gitstatus_cxx}" \ + CXXFLAGS="$gitstatus_cxxflags" \ + LDFLAGS="$gitstatus_ldflags" \ + LDLIBS="$gitstatus_ldlibs" \ + command "$gitstatus_make" -C "$outdir" -j "$cpus" + +app="$outdir"/usrbin/"$appname" + +command strip "$app".tmp + +command mkdir -- "$workdir"/repo +printf '[init]\n defaultBranch = master\n' >"$workdir"/.gitconfig +( + cd -- "$workdir"/repo + GIT_CONFIG_NOSYSTEM=1 HOME="$workdir" command git init + GIT_CONFIG_NOSYSTEM=1 HOME="$workdir" command git config user.name "Your Name" + GIT_CONFIG_NOSYSTEM=1 HOME="$workdir" command git config user.email "you@example.com" + GIT_CONFIG_NOSYSTEM=1 HOME="$workdir" command git commit \ + --allow-empty --allow-empty-message --no-gpg-sign -m '' +) + +resp="$(printf "hello\037$workdir/repo\036" | "$app".tmp)" +case "$resp" in + hello*1*/repo*master*);; + *) + >&2 echo 'error: invalid gitstatusd response for a git repo' + exit 1 + ;; +esac + +resp="$(printf 'hello\037\036' | "$app".tmp)" +case "$resp" in + hello*0*);; + *) + >&2 echo 'error: invalid gitstatusd response for a non-repo' + exit 1 + ;; +esac + +command mv -f -- "$app".tmp "$app" + +cleanup + +command cat >&2 <<-END + ------------------------------------------------- + SUCCESS: created usrbin/$appname + END +END +)" + +docker_image= +docker_cmd= + +gitstatus_arch= +gitstatus_cpu= +gitstatus_install_tools= +gitstatus_download_deps= + +while getopts ':m:c:i:d:swh' opt "$@"; do + case "$opt" in + h) + printf '%s\n' "$usage" + exit + ;; + m) + if [ -n "$gitstatus_arch" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + exit 1 + fi + gitstatus_arch="$OPTARG" + ;; + c) + if [ -n "$gitstatus_cpu" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + exit 1 + fi + gitstatus_cpu="$OPTARG" + ;; + i) + if [ -n "$docker_image" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + exit 1 + fi + docker_image="$OPTARG" + ;; + d) + if [ -n "$docker_cmd" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + exit 1 + fi + docker_cmd="$OPTARG" + ;; + s) + if [ -n "$gitstatus_install_tools" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + gitstatus_install_tools=1 + ;; + w) + if [ -n "$gitstatus_download_deps" ]; then + >&2 echo "[error] duplicate option: -$opt" + exit 1 + fi + gitstatus_download_deps=1 + ;; + \?) >&2 echo "[error] invalid option: -$OPTARG" ; exit 1;; + :) >&2 echo "[error] missing required argument: -$OPTARG"; exit 1;; + *) >&2 echo "[internal error] unhandled option: -$opt" ; exit 1;; + esac +done + +if [ "$OPTIND" -le $# ]; then + >&2 echo "[error] unexpected positional argument" + exit 1 +fi + +if [ -n "$docker_image" -a -z "$docker_cmd" ]; then + >&2 echo "[error] cannot use -i without -d" + exit 1 +fi + +if [ -z "$gitstatus_arch" ]; then + gitstatus_arch="$(uname -m)" + gitstatus_arch="$(printf '%s' "$gitstatus_arch" | tr '[A-Z]' '[a-z]')" +fi + +if [ -z "$gitstatus_cpu" ]; then + case "$gitstatus_arch" in + armel) gitstatus_cpu=armv5;; + armv6l|armhf) gitstatus_cpu=armv6;; + armv7l) gitstatus_cpu=armv7;; + arm64|aarch64) gitstatus_cpu=armv8-a;; + ppc64|ppc64le) gitstatus_cpu=powerpc64le;; + riscv64) gitstatus_cpu=rv64imafdc;; + loongarch64) gitstatus_cpu=loongarch64;; + x86_64|amd64) gitstatus_cpu=x86-64;; + x86) gitstatus_cpu=i586;; + s390x) gitstatus_cpu=z900;; + i386|i586|i686) gitstatus_cpu="$gitstatus_arch";; + *) + >&2 echo '[error] unable to infer target CPU architecture' + >&2 echo 'Please specify explicitly with `-c CPU`.' + exit 1 + ;; + esac +fi + +gitstatus_kernel="$(uname -s)" +gitstatus_kernel="$(printf '%s' "$gitstatus_kernel" | tr '[A-Z]' '[a-z]')" + +case "$gitstatus_kernel" in + linux) + if [ -n "$docker_cmd" ]; then + if [ -z "${docker_cmd##*/*}" ]; then + if [ ! -x "$docker_cmd" ]; then + >&2 echo "[error] not an executable file: $docker_cmd" + exit 1 + fi + else + if ! command -v "$docker_cmd" >/dev/null 2>&1; then + >&2 echo "[error] command not found: $docker_cmd" + exit 1 + fi + fi + if [ -z "$docker_image" ]; then + case "$gitstatus_arch" in + x86_64) docker_image=alpine:3.11.6;; + x86|i386|i586|i686) docker_image=i386/alpine:3.11.6;; + armv6l|armhf) docker_image=arm32v6/alpine:3.11.6;; + armv7l) docker_image=arm32v7/alpine:3.11.6;; + aarch64) docker_image=arm64v8/alpine:3.11.6;; + ppc64|ppc64le) docker_image=ppc64le/alpine:3.11.6;; + s390x) docker_image=s390x/alpine:3.11.6;; + *) + >&2 echo '[error] unable to infer docker image' + >&2 echo 'Please specify explicitly with `-i IMAGE`.' + exit 1 + ;; + esac + fi + fi + ;; + freebsd|openbsd|netbsd|darwin|dragonfly) + if [ -n "$docker_cmd" ]; then + >&2 echo "[error] docker (-d) is not supported on $gitstatus_kernel" + exit 1 + fi + ;; + msys_nt-*|mingw32_nt-*|mingw64_nt-*|cygwin_nt-*) + if ! printf '%s' "$gitstatus_kernel" | grep -Eqx '[^-]+-[0-9]+\.[0-9]+(-.*)?'; then + >&2 echo '[error] unsupported kernel, sorry!' + exit 1 + fi + gitstatus_kernel="$(printf '%s' "$gitstatus_kernel" | sed 's/^\([^-]*-[0-9]*\.[0-9]*\).*/\1/')" + if [ -n "$docker_cmd" ]; then + >&2 echo '[error] docker (-d) is not supported on windows' + exit 1 + fi + if [ -n "$gitstatus_install_tools" -a -z "${gitstatus_kernel##cygwin_nt-*}" ]; then + >&2 echo '[error] -s is not supported on cygwin' + exit 1 + fi + ;; + *) + >&2 echo '[error] unsupported kernel, sorry!' + exit 1 + ;; +esac + +dir="$(dirname -- "$0")" +cd -- "$dir" +dir="$(pwd)" + +>&2 echo "Building gitstatusd..." +>&2 echo "" +>&2 echo " kernel := $gitstatus_kernel" +>&2 echo " arch := $gitstatus_arch" +>&2 echo " cpu := $gitstatus_cpu" +[ -z "$docker_cmd" ] || >&2 echo " docker command := $docker_cmd" +[ -z "$docker_image" ] || >&2 echo " docker image := $docker_image" +if [ -n "$gitstatus_install_tools" ]; then + >&2 echo " install tools := yes" +else + >&2 echo " install tools := no" +fi +if [ -n "$gitstatus_download_deps" ]; then + >&2 echo " download deps := yes" +else + >&2 echo " download deps := no" +fi + +if [ -n "$docker_cmd" ]; then + "$docker_cmd" run \ + -e docker_cmd="$docker_cmd" \ + -e docker_image="$docker_image" \ + -e gitstatus_kernel="$gitstatus_kernel" \ + -e gitstatus_arch="$gitstatus_arch" \ + -e gitstatus_cpu="$gitstatus_cpu" \ + -e gitstatus_install_tools="$gitstatus_install_tools" \ + -e gitstatus_download_deps="$gitstatus_download_deps" \ + -v "$dir":/out \ + -w /out \ + --rm \ + -- "$docker_image" /bin/sh -uexc "$build" +else + eval "$build" +fi diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_install b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_install new file mode 100644 index 0000000..76f339e --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_install @@ -0,0 +1,476 @@ +#!/bin/sh +# +# This script does not have a stable API. + +_gitstatus_install_daemon_found() { + local installed="$1" + shift + [ $# = 0 ] || "$@" "$daemon" "$version" "$installed" +} + +_gitstatus_install_main() { + if [ -n "${ZSH_VERSION:-}" ]; then + emulate -L sh -o no_unset + else + set -u + fi + + local argv1="$1" + shift + + local no_check= no_install= uname_s= uname_m= gitstatus_dir= dl_status= e= + local opt= OPTARG= OPTIND=1 + + while getopts ':s:m:d:p:e:fnh' opt "$@"; do + case "$opt" in + h) + command cat <<\END +Usage: install [-s KERNEL] [-m ARCH] [-d DIR] [-p CMD] [-e ERRFD] [-f|-n] [-- CMD [ARG]...] + +If positional arguments are specified, call this on success: + + CMD [ARG]... DAEMON VERSION INSTALLED + +DAEMON is path to gitstatusd. VERSION is a glob pattern for the +version this daemon should support; it's supposed to be passed as +-G to gitstatusd. INSTALLED is 1 if gitstatusd has just been +downloaded and 0 otherwise. + +Options: + + -s KERNEL use this instead of lowercase `uname -s` + -m ARCH use this instead of lowercase `uname -m` + -d DIR use this instead of `dirname "$0"` + -p CMD eval this every second while downloading gitstatusd + -e ERRFD write error messages to this file descriptor + -f download gitstatusd even if there is one locally + -n do not download gitstatusd (fail instead) +END + return + ;; + n) + if [ -n "$no_install" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + no_install=1 + ;; + f) + if [ -n "$no_check" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + no_check=1 + ;; + d) + if [ -n "$gitstatus_dir" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + return 1 + fi + gitstatus_dir="$OPTARG" + ;; + p) + if [ -n "$dl_status" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + return 1 + fi + dl_status="$OPTARG" + ;; + e) + if [ -n "$e" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + return 1 + fi + e="$OPTARG" + ;; + m) + if [ -n "$uname_m" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + return 1 + fi + uname_m="$OPTARG" + ;; + s) + if [ -n "$uname_s" ]; then + >&2 echo "[gitstatus] error: duplicate option: -$opt" + return 1 + fi + if [ -z "$OPTARG" ]; then + >&2 echo "[error] incorrect value of -$opt: $OPTARG" + return 1 + fi + uname_s="$OPTARG" + ;; + \?) >&2 echo "[gitstatus] error: invalid option: -$OPTARG" ; return 1;; + :) >&2 echo "[gitstatus] error: missing required argument: -$OPTARG"; return 1;; + *) >&2 echo "[gitstatus] internal error: unhandled option: -$opt" ; return 1;; + esac + done + + shift "$((OPTIND - 1))" + + : "${e:=2}" + : "${gitstatus_dir:=$argv1}" + + if [ -n "$no_check" -a -n "$no_install" ]; then + >&2 echo "[gitstatus] error: incompatible options: -f, -n" + return 1 + fi + + if [ -z "$uname_s" ]; then + uname_s="$(command uname -s)" || return + uname_s="$(printf '%s' "$uname_s" | command tr '[A-Z]' '[a-z]')" || return + fi + if [ -z "$uname_m" ]; then + uname_m="$(command uname -m)" || return + uname_m="$(printf '%s' "$uname_m" | command tr '[A-Z]' '[a-z]')" || return + fi + + local daemon="${GITSTATUS_DAEMON:-}" + local cache_dir="${GITSTATUS_CACHE_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/gitstatus}" + + if [ -z "$no_check" ]; then + if [ -n "${daemon##/*}" ]; then + >&2 echo "[gitstatus] error: GITSTATUS_DAEMON is not absolute path: $daemon" + return 1 + fi + if [ -z "$daemon" -a -e "$gitstatus_dir"/usrbin/gitstatusd ]; then + daemon="$gitstatus_dir"/usrbin/gitstatusd + fi + if [ -n "$daemon" ]; then + local gitstatus_version= libgit2_version= + if ! . "$gitstatus_dir"/build.info; then + >&2 echo "[gitstatus] internal error: failed to source build.info" + return 1 + fi + if [ -z "$gitstatus_version" ]; then + >&2 echo "[gitstatus] internal error: empty gitstatus_version in build.info" + return 1 + fi + local version="$gitstatus_version" + _gitstatus_install_daemon_found 0 "$@" + return + fi + fi + + while IFS= read -r line; do + line="${line###*}" + [ -n "$line" ] || continue + + local uname_s_glob= uname_m_glob= file= version= sha256= + eval "$line" || return + + if [ -z "$uname_s_glob" -o \ + -z "$uname_m_glob" -o \ + -z "$file" -o \ + -z "$version" -o \ + -z "$sha256" ]; then + >&2 echo "[gitstatus] internal error: invalid install.info line: $line" + return 1 + fi + + case "$uname_s" in + $uname_s_glob) ;; + *) continue;; + esac + case "$uname_m" in + $uname_m_glob) ;; + *) continue;; + esac + + # Found a match. The while loop will terminate during this iteration. + + if [ -z "$no_check" ]; then + # Check if a suitable gitstatusd already exists. + local daemon="$gitstatus_dir"/usrbin/"$file" + if [ ! -e "$daemon" ]; then + daemon="$cache_dir"/"$file" + [ -e "$daemon" ] || daemon= + fi + if [ -n "$daemon" ]; then + _gitstatus_install_daemon_found 0 "$@" + return + fi + fi + + # No suitable gitstatusd exists. Need to download. + + if [ -n "$no_install" ]; then + >&2 echo "[gitstatus] error: no gitstatusd found and installation is disabled" + return 1 + fi + + local daemon="$cache_dir"/"$file" + + if [ -n "${cache_dir##/*}" ]; then + >&2 echo "[gitstatus] error: GITSTATUS_CACHE_DIR is not absolute: $cache_dir" + return 1 + fi + if [ ! -d "$cache_dir" ] && ! mkdir -p -- "$cache_dir" || [ ! -w "$cache_dir" ]; then + local dir="$cache_dir" + while true; do + if [ -e "$dir" ]; then + if [ ! -d "$dir" ]; then + >&"$e" printf 'Not a directory: \033[4;31m%s\033[0m\n' "$dir" + >&"$e" printf '\n' + >&"$e" printf 'Delete it, then restart your shell.\n' + elif [ ! -w "$dir" ]; then + >&"$e" printf 'Directory is not writable: \033[4;31m%s\033[0m\n' "$dir" + >&"$e" printf '\n' + >&"$e" printf 'Make it writable, then restart your shell.\n' + fi + break + fi + if [ "$dir" = / ] || [ "$dir" = . ]; then + break + fi + dir="$(dirname -- "$dir")" + done + return 1 + fi + + if [ -n "${TMPDIR-}" -a '(' '(' -d "${TMPDIR-}" -a -w "${TMPDIR-}" ')' -o '!' '(' -d /tmp -a -w /tmp ')' ')' ]; then + local tmp="$TMPDIR" + else + local tmp=/tmp + fi + if ! command -v mktemp >/dev/null 2>&1 || + ! tmpdir="$(command mktemp -d "$tmp"/gitstatus-install.XXXXXXXXXX)"; then + tmpdir="$tmp/gitstatus-install.tmp.$$" + if ! mkdir -p -- "$tmpdir"; then + if [ "$tmp" = /tmp ]; then + local label='directory' + else + local label='directory (\033[1mTMPDIR\033[m)' + fi + if [ ! -e "$tmp" ]; then + >&"$e" printf 'Temporary '"$label"' does not exist: \033[4;31m%s\033[0m\n' "$tmp" + >&"$e" printf '\n' + >&"$e" printf 'Create it, then restart your shell.\n' + elif [ ! -d "$tmp" ]; then + >&"$e" printf 'Not a '"$label"': \033[4;31m%s\033[0m\n' "$tmp" + >&"$e" printf '\n' + >&"$e" printf 'Make it a directory, then restart your shell.\n' + elif [ ! -w "$tmp" ]; then + >&"$e" printf 'Temporary '"$label"' is not writable: \033[4;31m%s\033[0m\n' "$tmp" + >&"$e" printf '\n' + >&"$e" printf 'Make it writable, then restart your shell.\n' + fi + return 1 + fi + fi + + if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then + >&"$e" printf 'Please install \033[32mcurl\033[0m or \033[32mwget\033[0m, then restart your shell.\n' + return 1 + fi + + ( + run_cmd() { + command -v "$1" >/dev/null 2>/dev/null || return 127 + local trapped= pid die ret + trap 'trapped=1' $sig + # The only reason for suppressing stderr is that `curl -f` cannot be silenced: + # `-s` doesn't work despite what the docs say. + command "$@" 2>/dev/null & + ret="$?" + if [ "$ret" = 0 ]; then + pid="$!" + die="trap - $sig; kill -- $pid 2>/dev/null; wait -- $pid 2>/dev/null; exit 1" + trap "$die" $sig + [ -z "$trapped" ] || eval "$die" + wait -- "$pid" 2>/dev/null + ret="$?" + fi + trap - $sig + [ -z "$trapped" ] || exit + return "$ret" + } + + check_sha256() { + local data_file="$tmpdir"/"$1".tar.gz + local hash_file="$tmpdir"/"$1".tar.gz.sha256 + local hash= + { + command -v shasum >/dev/null 2>/dev/null && + run_cmd shasum -b -a 256 -- "$data_file" >"$hash_file" /dev/null 2>/dev/null && + run_cmd sha256sum -b -- "$data_file" >"$hash_file" /dev/null 2>/dev/null && + run_cmd sha256 -- "$data_file" >"$hash_file" /dev/null 2>/dev/null; then + if ! run_cmd sleep "$1"; then + echo -n >"$tmpdir"/"$1".status + return 1 + fi + fi + local cmd part url ret + for cmd in 'curl -kfsSL' 'wget -qO-' 'curl -q -kfsSL' 'wget --no-config -qO-'; do + part=0 + while true; do + if [ "$part" = 2 ]; then + ret=1 + break + elif [ "$part" = 0 ]; then + url="$2" + else + url="$2"."$part" + fi + run_cmd $cmd -- "$url" >>"$tmpdir"/"$1".tar.gz + ret="$?" + [ "$ret" = 0 ] || break + check_sha256 "$1" && break + part=$((part+1)) + done + [ "$ret" = 0 ] && break + run_cmd rm -f -- "$tmpdir"/"$1".tar.gz && continue + ret="$?" + break + done + echo -n >"$tmpdir"/"$1".status + return "$ret" + } + + local trapped= + trap 'trapped=1' $sig + fetch 1 "$url1" & + local pid1="$!" + fetch 2 "$url2" & + local pid2="$!" + + local die="trap - $sig; kill -- $pid1 $pid2 2>/dev/null; wait -- $pid1 $pid2 2>/dev/null; exit 1" + trap "$die" $sig + [ -z "$trapped" ] || eval "$die" + + local n= + while true; do + [ -z "$dl_status" ] || eval "$dl_status" || eval "$die" + if command -v sleep >/dev/null 2>/dev/null; then + command sleep 1 + elif command -v true >/dev/null 2>/dev/null; then + command true + fi + if [ -n "$pid1" -a -e "$tmpdir"/1.status ]; then + wait -- "$pid1" 2>/dev/null + local ret="$?" + pid1= + if [ "$ret" = 0 ]; then + if [ -n "$pid2" ]; then + kill -- "$pid2" 2>/dev/null + wait -- "$pid2" 2>/dev/null + fi + n=1 + break + elif [ -z "$pid2" ]; then + break + else + die="trap - $sig; kill -- $pid2 2>/dev/null; wait -- $pid2 2>/dev/null; exit 1" + trap "$die" $sig + fi + elif [ -n "$pid2" -a -e "$tmpdir"/2.status ]; then + wait -- "$pid2" 2>/dev/null + local ret="$?" + pid2= + if [ "$ret" = 0 ]; then + if [ -n "$pid1" ]; then + kill -- "$pid1" 2>/dev/null + wait -- "$pid1" 2>/dev/null + fi + n=2 + break + elif [ -z "$pid1" ]; then + break + else + die="trap - $sig; kill -- $pid1 2>/dev/null; wait -- $pid1 2>/dev/null; exit 1" + trap "$die" $sig + fi + fi + done + + trap - $sig + + if [ -z "$n" ]; then + >&"$e" printf 'Failed to download \033[32m%s\033[0m from any mirror:\n' "$file" + >&"$e" printf '\n' + >&"$e" printf ' 1. \033[4m%s\033[0m\n' "$url1" + >&"$e" printf ' 2. \033[4m%s\033[0m\n' "$url2" + >&"$e" printf '\n' + >&"$e" printf 'Check your internet connection, then restart your shell.\n' + exit 1 + fi + + command tar -C "$tmpdir" -xzf "$tmpdir"/"$n".tar.gz || exit + + local tmpfile + if ! command -v mktemp >/dev/null 2>&1 || + ! tmpfile="$(command mktemp "$cache_dir"/gitstatusd.XXXXXXXXXX)"; then + tmpfile="$cache_dir"/gitstatusd.tmp.$$ + fi + + command mv -f -- "$tmpdir"/"$file" "$tmpfile" || exit + command mv -f -- "$tmpfile" "$cache_dir"/"$file" && exit + command rm -f -- "$cache_dir"/"$file" + command mv -f -- "$tmpfile" "$cache_dir"/"$file" && exit + command rm -f -- "$tmpfile" + exit 1 + ) + + local ret="$?" + command rm -rf -- "$tmpdir" + [ "$ret" = 0 ] || return + + _gitstatus_install_daemon_found 1 "$@" + return + done <"$gitstatus_dir"/install.info + + >&"$e" printf 'There is no prebuilt \033[32mgitstatusd\033[0m for \033[1m%s\033[0m.\n' "$uname_s $uname_m" + >&"$e" printf '\n' + >&"$e" printf 'See: \033[4mhttps://github.com/romkatv/gitstatus#compiling\033[0m\n' + return 1 +} + +if [ -z "${0##*/*}" ]; then + _gitstatus_install_main "${0%/*}" "$@" +else + _gitstatus_install_main . "$@" +fi diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_mbuild b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_mbuild new file mode 100644 index 0000000..40316fd --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/executable_mbuild @@ -0,0 +1,406 @@ +#!/usr/bin/env zsh +# +# This script does not have a stable API. +# +# Usage: mbuild [-b git-ref] [kernel-arch]... +# +# Builds a bunch of gitstatusd-* binaries. Without arguments builds binaries +# for all platforms. git-ref defaults to master. +# +# Before using this script you need to set up build servers and list them +# in ~/.ssh/config. There should be a Host entry for every value of `assets` +# association defined below. VMs and cloud instances work as well as physical +# machines, including localhost. As long as the machine has been set up as +# described below and you can SSH to it without password, it should work. +# +# ===[ Build Server Setup ]=== +# +# Linux +# +# - Install docker. +# $ apt install docker.io # adjust appropriately if there is no `apt` +# $ usermod -aG docker $USER # not needed if going to build as root +# - Install git. +# $ apt install git # adjust appropriately if there is no `apt` +# +# macOS +# +# - Install compiler tools: +# $ xcode-select --install +# - Install homebrew: https://brew.sh/. +# $ bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" +# +# FreeBSD +# +# - Install git. +# $ pkg install git +# +# Windows +# +# - Disable Windows Defender (optional). +# ps> Set-MpPreference -DisableRealtimeMonitoring $true +# - Install 64-bit and 32-bit msys2: https://www.msys2.org/wiki/MSYS2-installation/. +# - Open each of them after installation, type `pacman -Syu --noconfirm` and close the window. +# - Then run in powershell while having no msys2 or cygwin windows open: +# ps> C:\msys32\autorebase.bat +# ps> C:\msys64\autorebase.bat +# - Install 64-bit and 32-bit cygwin: https://cygwin.com/install.html. +# - Choose to install 32-bit to c:/cygwin32 instead of the default c:/cygwin. +# - Select these packages: binutils, cmake, gcc-core, gcc-g++, git, make, perl, wget. +# +# IMPORTANT: Install msys2 and cygwin one at a time. +# +# IMPORTANT: msys2 builder can reboot the build machine. +# +# Option 1: OpenSSH for Windows +# +# - Install OpenSSH: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse. +# ps> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 +# ps> Start-Service sshd +# ps> Set-Service -Name sshd -StartupType 'Automatic' +# - Enable publickey authentication: https://stackoverflow.com/a/50502015/1095235. +# ps> cd $env:USERPROFILE +# ps> mkdir .ssh +# ps> notepad.exe .ssh/authorized_keys +# - Paste your public key, save, close. +# ps> icacls .ssh/authorized_keys /inheritance:r +# ps> notepad.exe C:\ProgramData\ssh\sshd_config +# - Comment out these two lines, save, close: +# # Match Group administrators +# # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys +# ps> Restart-Service sshd +# +# Option 2: OpenSSH from WSL +# +# - Install WSL. +# - Install Ubuntu. +# - Install sshd. +# $ apt install openssh-server +# $ dpkg-reconfigure openssh-server +# $ cat >/etc/ssh/sshd_config <<\END +# ClientAliveInterval 60 +# AcceptEnv TERM LANG LC_* +# PermitRootLogin no +# AllowTcpForwarding no +# AllowAgentForwarding no +# AllowStreamLocalForwarding no +# AuthenticationMethods publickey +# END +# service ssh --full-restart +# - Add your public ssh key to ~/.ssh/authorized_keys. +# - Make `sshd` start when Windows boots. + +'emulate' '-L' 'zsh' '-o' 'no_aliases' '-o' 'err_return' +setopt no_unset extended_glob pipe_fail prompt_percent typeset_silent \ + no_prompt_subst no_prompt_bang pushd_silent warn_create_global + +if [[ $ZSH_VERSION != (5.<1->*|<6->.*) || $ZSH_VERSION == 5.4(|.*) ]]; then + print -ru2 -- "[error] unsupported zsh version: $ZSH_VERSION" + return 1 +fi + +zmodload zsh/system + +local -r git_url='https://github.com/romkatv/gitstatus.git' + +local -rA assets=( + # target kernel-arch hostname of the build machine + cygwin_nt-10.0-i686 build-windows-x86_64 + cygwin_nt-10.0-x86_64 build-windows-x86_64 + msys_nt-10.0-i686 build-windows-x86_64 + msys_nt-10.0-x86_64 build-windows-x86_64 + darwin-arm64 build-macos-arm64 + darwin-x86_64 build-macos-x86_64 + freebsd-amd64 build-freebsd-amd64 + linux-aarch64 build-linux-aarch64 + linux-armv6l build-linux-armv7l + linux-armv7l build-linux-armv7l + linux-i686 build-linux-x86_64 + linux-ppc64le build-linux-ppc64le + linux-x86_64 build-linux-x86_64 +) + +local -rA protocol=( + 'cygwin_nt-10.0-*' windows + 'msys_nt-10.0-*' windows + 'darwin-*' unix + 'freebsd-*' unix + 'linux-*' unix +) + +local -r rootdir=${ZSH_SCRIPT:h} +local -r logs=$rootdir/logs +local -r locks=$rootdir/locks +local -r binaries=$rootdir/usrbin + +function usage() { + print -r -- 'usage: mbuild [-b REF] [KERNEL-ARCH]...' +} + +local OPTARG opt git_ref=master +local -i OPTIND +while getopts ":b:h" opt; do + case $opt in + h) usage; return 0;; + b) [[ -n $OPTARG ]]; git_ref=$OPTARG;; + \?) print -ru2 -- "mbuild: invalid option: -$OPTARG" ; return 1;; + :) print -ru2 -- "mbuild: missing required argument: -$OPTARG"; return 1;; + *) print -ru2 -- "mbuild: invalid option: -$opt" ; return 1;; + esac +done + +shift $((OPTIND - 1)) + +(( $# )) || set -- ${(ko)assets} +set -- ${(u)@} + +local platform +for platform; do + if (( ! $+assets[$platform] )); then + print -ru2 -- "mbuild: invalid platform: $platform" + return 1 + fi +done + +local build=' + rm -rf gitstatus + git clone --recursive --shallow-submodules --depth=1 -b '$git_ref' '$git_url' + cd gitstatus + if command -v zsh >/dev/null 2>&1; then + sh=zsh + elif command -v dash >/dev/null 2>&1; then + sh=dash + elif command -v ash >/dev/null 2>&1; then + sh=ash + else + sh=sh + fi + $sh -x ./build -m ' + +function build-unix() { + local intro flags=(-sw) + case $2 in + linux-ppc64le) ;; + linux-*) flags+=(-d docker);; + darwin-arm64) intro='PATH="/opt/homebrew/bin:$PATH"';; + darwin-*) intro='PATH="/usr/local/bin:$PATH"';; + esac + ssh $1 -- /bin/sh -uex <<<" + $intro + cd /tmp + $build ${2##*-} ${(j: :)${(@q)flags}}" + scp $1:/tmp/gitstatus/usrbin/gitstatusd $binaries/gitstatusd-$2 +} + +function build-windows() { + local shell=$(ssh $1 'echo $0') + if [[ $shell == '$0'* ]]; then + local c='c:' + else + local c='/mnt/c' + fi + + local tmp env bin intro flags=(-w) + case $2 in + cygwin_nt-10.0-i686) bin='cygwin32/bin' ;| + cygwin_nt-10.0-x86_64) bin='cygwin64/bin' ;| + msys_nt-10.0-i686) bin='msys32/usr/bin';| + msys_nt-10.0-x86_64) bin='msys64/usr/bin';| + cygwin_nt-10.0-*) + tmp='/cygdrive/c/tmp' + ;| + msys_nt-10.0-*) + tmp='/c/tmp' + env='MSYSTEM=MSYS' + # TODO: fix this (some errors about PGP keys). + # flags+=(-s) + # intro='pacman -S --needed --noconfirm git; ' + intro+='PATH="$PATH:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl"' + while true; do + # TODO: run autorebase only when getting an error that can be fixed by autorebasing. + break + local out + out="$(ssh $1 cmd.exe "$c/${bin%%/*}/autorebase.bat" 2>&1)" + [[ $out == *"The following DLLs couldn't be rebased"* ]] || break + # Reboot to get rid of whatever is using those DLLs. + ssh $1 powershell.exe <<<'Restart-Computer -Force' || true + sleep 30 + while ! ssh $1 <<<''; do sleep 5; done + done + () { + while true; do + # TODO: fix this (some errors about PGP keys). + break + local -i fd + exec {fd}< <( + ssh $1 $c/$bin/env.exe $env c:/$bin/bash.exe -l 2>&1 <<<" + pacman -Syu --noconfirm + exit") + { + local line + while true; do + IFS= read -u $fd -r line || return 0 + if [[ $line == *"warning: terminate MSYS2"* ]]; then + # At this point the machine is hosed. A rogue process with a corrupted name + # is eating all CPU. The top SSH connection won't terminate on its own. + ssh $1 powershell.exe <<<'Restart-Computer -Force' || true + sleep 30 + while ! ssh $1 <<<''; do sleep 5; done + break + fi + done + } always { + exec {fd}<&- + kill -- -$sysparams[procsubstpid] 2>/dev/null || true + } + done + } "$@" + ;| + esac + + ssh $1 $c/$bin/env.exe $env c:/$bin/bash.exe -l <<<" + set -uex + $intro + mkdir -p -- $tmp + cd -- $tmp + $build ${2##*-} ${(j: :)${(@q)flags}} + exit" + scp $1:$c/tmp/gitstatus/usrbin/gitstatusd $binaries/gitstatusd-$2 + chmod +x $binaries/gitstatusd-$2 +} + +if [[ -r /proc/version && "$(/dev/null + ( + trap '' TERM PIPE + local fd + while true; do + sysopen -wo create,excl -u fd -- $1 && break + sleep 1 + done + exec {fd}>&- + while true; do + print || break + done + rm -- $1 + ) &! + ) + local REPLY + IFS= read -ru $fd + } +else + function flock() { + : >>$1 + zsystem flock $1 + } +fi + +function build() ( + setopt xtrace + local platform=$1 + local machine=$assets[$platform] + flock $locks/$machine + build-${protocol[(k)$platform]} $machine $platform + local tmp=gitstatusd-$platform.tmp.$$.tar.gz + ( cd -q -- $binaries; tar --owner=0 --group=0 -I 'gzip -9' -cf $tmp gitstatusd-$platform ) + mv -f -- $binaries/$tmp $binaries/gitstatusd-$platform.tar.gz + # Make sure the last command is a built-in (important for flock). + : +) + +function mbuild() { + local platform pid pids=() + for platform; do + build $platform &>$logs/$platform & + print -r -- "starting build for $platform on $assets[$platform] (pid $!)" + pids+=($platform $!) + done + local failed=() + for platform pid in $pids; do + print -rn -- "$platform => " + if wait $pid; then + print -r -- "ok" + else + print -r -- "error" + failed+=$platform + fi + done + (( $#failed )) || return 0 + print + print -r -- "Error logs:" + print + for platform in $failed; do + print -r -- " $platform => $logs/$platform" + done + return 1 +} + +# Copied from https://github.com/romkatv/run-process-tree. +function run-process-tree() { + zmodload zsh/parameter zsh/param/private || return + local -P opt=(${(kv)options[@]}) || return + local -P pat=(${patchars[@]}) || return + local -P dis_pat=(${dis_patchars[@]}) || return + emulate -L zsh -o err_return || return + setopt monitor traps_async pipe_fail no_unset + zmodload zsh/system + + if (( $# == 0 )); then + print -ru2 -- 'usage: run-process-tree command [arg]...' + return 1 + fi + + local -P stdout REPLY + exec {stdout}>&1 + { + { + local -Pi pipe + local -P gid=$sysparams[pid] + local -P sig=(ABRT EXIT HUP ILL INT PIPE QUIT TERM ZERR) + local -P trap=(trap "trap - $sig; kill -- -$sysparams[pid]" $sig) + + exec {pipe}>&1 1>&$stdout + $trap + + { + $trap + while sleep 1 && print -u $pipe .; do; done + } 2>/dev/null & + local -Pi watchdog=$! + + { + trap - ZERR + exec {pipe}>&- + enable -p -- $pat + disable -p -- $dis_pat + options=($opt zle off monitor off) + "$@" + } & + local -Pi ret + wait $! || ret=$? + + trap "exit $ret" TERM + kill $watchdog + wait $watchdog + return ret + } | while read; do; done || return + } always { + exec {stdout}>&- + } +} + +mkdir -p -- $logs $locks $binaries + +() { + run-process-tree mbuild $@ + exit +} "$@" diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.sh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.sh new file mode 100644 index 0000000..37b78f4 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.sh @@ -0,0 +1,474 @@ +# Bash bindings for gitstatus. + +[[ $- == *i* ]] || return # non-interactive shell + +# Starts gitstatusd in the background. Does nothing and succeeds if gitstatusd +# is already running. +# +# Usage: gitstatus_start [OPTION]... +# +# -t FLOAT Fail the self-check on initialization if not getting a response from +# gitstatusd for this this many seconds. Defaults to 5. +# +# -s INT Report at most this many staged changes; negative value means infinity. +# Defaults to 1. +# +# -u INT Report at most this many unstaged changes; negative value means infinity. +# Defaults to 1. +# +# -c INT Report at most this many conflicted changes; negative value means infinity. +# Defaults to 1. +# +# -d INT Report at most this many untracked files; negative value means infinity. +# Defaults to 1. +# +# -m INT Report -1 unstaged, untracked and conflicted if there are more than this many +# files in the index. Negative value means infinity. Defaults to -1. +# +# -e Count files within untracked directories like `git status --untracked-files`. +# +# -U Unless this option is specified, report zero untracked files for repositories +# with status.showUntrackedFiles = false. +# +# -W Unless this option is specified, report zero untracked files for repositories +# with bash.showUntrackedFiles = false. +# +# -D Unless this option is specified, report zero staged, unstaged and conflicted +# changes for repositories with bash.showDirtyState = false. +# +# -r INT Close git repositories that haven't been used for this many seconds. This is +# meant to release resources such as memory and file descriptors. The next request +# for a repo that's been closed is much slower than for a repo that hasn't been. +# Negative value means infinity. The default is 3600 (one hour). +function gitstatus_start() { + if [[ "$BASH_VERSION" < 4 ]]; then + >&2 printf 'gitstatus_start: need bash version >= 4.0, found %s\n' "$BASH_VERSION" + >&2 printf '\n' + >&2 printf 'To see the version of the current shell, type:\n' + >&2 printf '\n' + >&2 printf ' \033[32mecho\033[0m \033[33m"$BASH_VERSION"\033[0m\n' + >&2 printf '\n' + >&2 printf 'The output of `\033[32mbash\033[0m --version` may be different and is not relevant.\n' + return 1 + fi + + unset OPTIND + local opt timeout=5 max_dirty=-1 ttl=3600 extra_flags= + local max_num_staged=1 max_num_unstaged=1 max_num_conflicted=1 max_num_untracked=1 + while getopts "t:s:u:c:d:m:r:eUWD" opt; do + case "$opt" in + t) timeout=$OPTARG;; + s) max_num_staged=$OPTARG;; + u) max_num_unstaged=$OPTARG;; + c) max_num_conflicted=$OPTARG;; + d) max_num_untracked=$OPTARG;; + m) max_dirty=$OPTARG;; + r) ttl=$OPTARG;; + e) extra_flags+='--recurse-untracked-dirs ';; + U) extra_flags+='--ignore-status-show-untracked-files ';; + W) extra_flags+='--ignore-bash-show-untracked-files ';; + D) extra_flags+='--ignore-bash-show-dirty-state ';; + *) return 1;; + esac + done + + (( OPTIND == $# + 1 )) || { echo "usage: gitstatus_start [OPTION]..." >&2; return 1; } + + [[ -z "${GITSTATUS_DAEMON_PID:-}" ]] || return 0 # already started + + if [[ "${BASH_SOURCE[0]}" == */* ]]; then + local gitstatus_plugin_dir="${BASH_SOURCE[0]%/*}" + if [[ "$gitstatus_plugin_dir" != /* ]]; then + gitstatus_plugin_dir="$PWD"/"$gitstatus_plugin_dir" + fi + else + local gitstatus_plugin_dir="$PWD" + fi + + local tmpdir req_fifo resp_fifo culprit + + function gitstatus_start_impl() { + local log_level="${GITSTATUS_LOG_LEVEL:-}" + [[ -n "$log_level" || "${GITSTATUS_ENABLE_LOGGING:-0}" != 1 ]] || log_level=INFO + + local uname_sm + uname_sm="$(command uname -sm)" || return + uname_sm="${uname_sm,,}" + local uname_s="${uname_sm% *}" + local uname_m="${uname_sm#* }" + + if [[ "${GITSTATUS_NUM_THREADS:-0}" -gt 0 ]]; then + local threads="$GITSTATUS_NUM_THREADS" + else + local cpus + if ! command -v sysctl &>/dev/null || [[ "$uname_s" == linux ]] || + ! cpus="$(command sysctl -n hw.ncpu)"; then + if ! command -v getconf &>/dev/null || ! cpus="$(command getconf _NPROCESSORS_ONLN)"; then + cpus=8 + fi + fi + local threads=$((cpus > 16 ? 32 : cpus > 0 ? 2 * cpus : 16)) + fi + + local daemon_args=( + --parent-pid="$$" + --num-threads="$threads" + --max-num-staged="$max_num_staged" + --max-num-unstaged="$max_num_unstaged" + --max-num-conflicted="$max_num_conflicted" + --max-num-untracked="$max_num_untracked" + --dirty-max-index-size="$max_dirty" + --repo-ttl-seconds="$ttl" + $extra_flags) + + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + else + local tmpdir=/tmp + fi + tmpdir="$(command mktemp -d "$tmpdir"/gitstatus.bash.$$.XXXXXXXXXX)" || return + + if [[ -n "$log_level" ]]; then + GITSTATUS_DAEMON_LOG="$tmpdir"/daemon.log + [[ "$log_level" == INFO ]] || daemon_args+=(--log-level="$log_level") + else + GITSTATUS_DAEMON_LOG=/dev/null + fi + + req_fifo="$tmpdir"/req.fifo + resp_fifo="$tmpdir"/resp.fifo + command mkfifo -- "$req_fifo" "$resp_fifo" || return + + { + ( + trap '' INT QUIT TSTP + [[ "$GITSTATUS_DAEMON_LOG" == /dev/null ]] || set -x + builtin cd / + + ( + local fd_in fd_out + exec {fd_in}<"$req_fifo" {fd_out}>>"$resp_fifo" || exit + echo "$BASHPID" >&"$fd_out" + + local _gitstatus_bash_daemon _gitstatus_bash_version _gitstatus_bash_downloaded + + function _gitstatus_set_daemon() { + _gitstatus_bash_daemon="$1" + _gitstatus_bash_version="$2" + _gitstatus_bash_downloaded="$3" + } + + set -- -d "$gitstatus_plugin_dir" -s "$uname_s" -m "$uname_m" \ + -p "printf '.\036' >&$fd_out" -e "$fd_out" -- _gitstatus_set_daemon + [[ "${GITSTATUS_AUTO_INSTALL:-1}" -ne 0 ]] || set -- -n "$@" + source "$gitstatus_plugin_dir"/install || return + [[ -n "$_gitstatus_bash_daemon" ]] || return + [[ -n "$_gitstatus_bash_version" ]] || return + [[ "$_gitstatus_bash_downloaded" == [01] ]] || return + + local sig=(TERM ILL PIPE) + + if (( UID == EUID )); then + local home=~ + else + local user + user="$(command id -un)" || return + [[ "$user" =~ ^[a-zA-Z0-9_,.-]+$ ]] || return + eval "local home=~$user" + [[ -n "$home" ]] || return + fi + + if [[ -x "$_gitstatus_bash_daemon" ]]; then + HOME="$home" "$_gitstatus_bash_daemon" \ + -G "$_gitstatus_bash_version" "${daemon_args[@]}" <&"$fd_in" >&"$fd_out" & + local pid=$! + trap "trap - ${sig[*]}; kill $pid &>/dev/null" ${sig[@]} + wait "$pid" + local ret=$? + trap - ${sig[@]} + case "$ret" in + 0|129|130|131|137|141|143|159) + echo -nE $'}bye\x1f0\x1e' >&"$fd_out" + exit "$ret" + ;; + esac + fi + + (( ! _gitstatus_bash_downloaded )) || return + [[ "${GITSTATUS_AUTO_INSTALL:-1}" -ne 0 ]] || return + [[ "$_gitstatus_bash_daemon" == \ + "${GITSTATUS_CACHE_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/gitstatus}"/* ]] || return + + set -- -f "$@" + _gitstatus_bash_daemon= + _gitstatus_bash_version= + _gitstatus_bash_downloaded= + source "$gitstatus_plugin_dir"/install || return + [[ -n "$_gitstatus_bash_daemon" ]] || return + [[ -n "$_gitstatus_bash_version" ]] || return + [[ "$_gitstatus_bash_downloaded" == 1 ]] || return + + HOME="$home" "$_gitstatus_bash_daemon" \ + -G "$_gitstatus_bash_version" "${daemon_args[@]}" <&"$fd_in" >&"$fd_out" & + local pid=$! + trap "trap - ${sig[*]}; kill $pid &>/dev/null" ${sig[@]} + wait "$pid" + trap - ${sig[@]} + echo -nE $'}bye\x1f0\x1e' >&"$fd_out" + ) & disown + ) & disown + } 0"$GITSTATUS_DAEMON_LOG" + + exec {_GITSTATUS_REQ_FD}>>"$req_fifo" {_GITSTATUS_RESP_FD}<"$resp_fifo" || return + command rm -f -- "$req_fifo" "$resp_fifo" || return + [[ "$GITSTATUS_DAEMON_LOG" != /dev/null ]] || command rmdir -- "$tmpdir" 2>/dev/null + + IFS='' read -r -u $_GITSTATUS_RESP_FD GITSTATUS_DAEMON_PID || return + [[ "$GITSTATUS_DAEMON_PID" == [1-9]* ]] || return + + local reply + echo -nE $'}hello\x1f\x1e' >&$_GITSTATUS_REQ_FD || return + local dl= + while true; do + reply= + if ! IFS='' read -rd $'\x1e' -u $_GITSTATUS_RESP_FD -t "$timeout" reply; then + culprit="$reply" + return 1 + fi + [[ "$reply" == $'}hello\x1f0' ]] && break + if [[ -z "$dl" ]]; then + dl=1 + if [[ -t 2 ]]; then + local spinner=('\b\033[33m-\033[0m' '\b\033[33m\\\033[0m' '\b\033[33m|\033[0m' '\b\033[33m/\033[0m') + >&2 printf '[\033[33mgitstatus\033[0m] fetching \033[32mgitstatusd\033[0m .. ' + else + local spinner=('.') + >&2 printf '[gitstatus] fetching gitstatusd ..' + fi + fi + >&2 printf "${spinner[0]}" + spinner=("${spinner[@]:1}" "${spinner[0]}") + done + + if [[ -n "$dl" ]]; then + if [[ -t 2 ]]; then + >&2 printf '\b[\033[32mok\033[0m]\n' + else + >&2 echo ' [ok]' + fi + fi + + _GITSTATUS_DIRTY_MAX_INDEX_SIZE=$max_dirty + _GITSTATUS_CLIENT_PID="$BASHPID" + } + + if ! gitstatus_start_impl; then + >&2 printf '\n' + >&2 printf '[\033[31mERROR\033[0m]: gitstatus failed to initialize.\n' + if [[ -n "${culprit-}" ]]; then + >&2 printf '\n%s\n' "$culprit" + fi + [[ -z "${req_fifo:-}" ]] || command rm -f "$req_fifo" + [[ -z "${resp_fifo:-}" ]] || command rm -f "$resp_fifo" + unset -f gitstatus_start_impl + gitstatus_stop + return 1 + fi + + export _GITSTATUS_CLIENT_PID _GITSTATUS_REQ_FD _GITSTATUS_RESP_FD GITSTATUS_DAEMON_PID + unset -f gitstatus_start_impl +} + +# Stops gitstatusd if it's running. +function gitstatus_stop() { + if [[ "${_GITSTATUS_CLIENT_PID:-$BASHPID}" == "$BASHPID" ]]; then + [[ -z "${_GITSTATUS_REQ_FD:-}" ]] || exec {_GITSTATUS_REQ_FD}>&- || true + [[ -z "${_GITSTATUS_RESP_FD:-}" ]] || exec {_GITSTATUS_RESP_FD}>&- || true + [[ -z "${GITSTATUS_DAEMON_PID:-}" ]] || kill "$GITSTATUS_DAEMON_PID" &>/dev/null || true + fi + unset _GITSTATUS_REQ_FD _GITSTATUS_RESP_FD GITSTATUS_DAEMON_PID + unset _GITSTATUS_DIRTY_MAX_INDEX_SIZE _GITSTATUS_CLIENT_PID +} + +# Retrives status of a git repository from a directory under its working tree. +# +# Usage: gitstatus_query [OPTION]... +# +# -d STR Directory to query. Defaults to $PWD. Has no effect if GIT_DIR is set. +# -t FLOAT Timeout in seconds. Will block for at most this long. If no results +# are available by then, will return error. +# -p Don't compute anything that requires reading Git index. If this option is used, +# the following parameters will be 0: VCS_STATUS_INDEX_SIZE, +# VCS_STATUS_{NUM,HAS}_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED}. +# +# On success sets VCS_STATUS_RESULT to one of the following values: +# +# norepo-sync The directory doesn't belong to a git repository. +# ok-sync The directory belongs to a git repository. +# +# If VCS_STATUS_RESULT is ok-sync, additional variables are set: +# +# VCS_STATUS_WORKDIR Git repo working directory. Not empty. +# VCS_STATUS_COMMIT Commit hash that HEAD is pointing to. Either 40 hex digits or +# empty if there is no HEAD (empty repo). +# VCS_STATUS_COMMIT_ENCODING Encoding of the HEAD's commit message. Empty value means UTF-8. +# VCS_STATUS_COMMIT_SUMMARY The first paragraph of the HEAD's commit message as one line. +# VCS_STATUS_LOCAL_BRANCH Local branch name or empty if not on a branch. +# VCS_STATUS_REMOTE_NAME The remote name, e.g. "upstream" or "origin". +# VCS_STATUS_REMOTE_BRANCH Upstream branch name. Can be empty. +# VCS_STATUS_REMOTE_URL Remote URL. Can be empty. +# VCS_STATUS_ACTION Repository state, A.K.A. action. Can be empty. +# VCS_STATUS_INDEX_SIZE The number of files in the index. +# VCS_STATUS_NUM_STAGED The number of staged changes. +# VCS_STATUS_NUM_CONFLICTED The number of conflicted changes. +# VCS_STATUS_NUM_UNSTAGED The number of unstaged changes. +# VCS_STATUS_NUM_UNTRACKED The number of untracked files. +# VCS_STATUS_HAS_STAGED 1 if there are staged changes, 0 otherwise. +# VCS_STATUS_HAS_CONFLICTED 1 if there are conflicted changes, 0 otherwise. +# VCS_STATUS_HAS_UNSTAGED 1 if there are unstaged changes, 0 if there aren't, -1 if +# unknown. +# VCS_STATUS_NUM_STAGED_NEW The number of staged new files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_NUM_STAGED_DELETED The number of staged deleted files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_NUM_UNSTAGED_DELETED The number of unstaged deleted files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_HAS_UNTRACKED 1 if there are untracked files, 0 if there aren't, -1 if +# unknown. +# VCS_STATUS_COMMITS_AHEAD Number of commits the current branch is ahead of upstream. +# Non-negative integer. +# VCS_STATUS_COMMITS_BEHIND Number of commits the current branch is behind upstream. +# Non-negative integer. +# VCS_STATUS_STASHES Number of stashes. Non-negative integer. +# VCS_STATUS_TAG The last tag (in lexicographical order) that points to the same +# commit as HEAD. +# VCS_STATUS_PUSH_REMOTE_NAME The push remote name, e.g. "upstream" or "origin". +# VCS_STATUS_PUSH_REMOTE_URL Push remote URL. Can be empty. +# VCS_STATUS_PUSH_COMMITS_AHEAD Number of commits the current branch is ahead of push remote. +# Non-negative integer. +# VCS_STATUS_PUSH_COMMITS_BEHIND Number of commits the current branch is behind push remote. +# Non-negative integer. +# VCS_STATUS_NUM_SKIP_WORKTREE The number of files in the index with skip-worktree bit set. +# Non-negative integer. +# VCS_STATUS_NUM_ASSUME_UNCHANGED The number of files in the index with assume-unchanged bit set. +# Non-negative integer. +# +# The point of reporting -1 via VCS_STATUS_HAS_* is to allow the command to skip scanning files in +# large repos. See -m flag of gitstatus_start. +# +# gitstatus_query returns an error if gitstatus_start hasn't been called in the same +# shell or the call had failed. +function gitstatus_query() { + unset OPTIND + local opt dir= timeout=() no_diff=0 + while getopts "d:c:t:p" opt "$@"; do + case "$opt" in + d) dir=$OPTARG;; + t) timeout=(-t "$OPTARG");; + p) no_diff=1;; + *) return 1;; + esac + done + (( OPTIND == $# + 1 )) || { echo "usage: gitstatus_query [OPTION]..." >&2; return 1; } + + [[ -n "${GITSTATUS_DAEMON_PID-}" ]] || return # not started + + local req_id="$RANDOM.$RANDOM.$RANDOM.$RANDOM" + if [[ -z "${GIT_DIR:-}" ]]; then + [[ "$dir" == /* ]] || dir="$(pwd -P)/$dir" || return + elif [[ "$GIT_DIR" == /* ]]; then + dir=:"$GIT_DIR" + else + dir=:"$(pwd -P)/$GIT_DIR" || return + fi + echo -nE "$req_id"$'\x1f'"$dir"$'\x1f'"$no_diff"$'\x1e' >&$_GITSTATUS_REQ_FD || return + + local -a resp + while true; do + IFS=$'\x1f' read -rd $'\x1e' -a resp -u $_GITSTATUS_RESP_FD "${timeout[@]}" || return + [[ "${resp[0]}" == "$req_id" ]] && break + done + + if [[ "${resp[1]}" == 1 ]]; then + VCS_STATUS_RESULT=ok-sync + VCS_STATUS_WORKDIR="${resp[2]}" + VCS_STATUS_COMMIT="${resp[3]}" + VCS_STATUS_LOCAL_BRANCH="${resp[4]}" + VCS_STATUS_REMOTE_BRANCH="${resp[5]}" + VCS_STATUS_REMOTE_NAME="${resp[6]}" + VCS_STATUS_REMOTE_URL="${resp[7]}" + VCS_STATUS_ACTION="${resp[8]}" + VCS_STATUS_INDEX_SIZE="${resp[9]}" + VCS_STATUS_NUM_STAGED="${resp[10]}" + VCS_STATUS_NUM_UNSTAGED="${resp[11]}" + VCS_STATUS_NUM_CONFLICTED="${resp[12]}" + VCS_STATUS_NUM_UNTRACKED="${resp[13]}" + VCS_STATUS_COMMITS_AHEAD="${resp[14]}" + VCS_STATUS_COMMITS_BEHIND="${resp[15]}" + VCS_STATUS_STASHES="${resp[16]}" + VCS_STATUS_TAG="${resp[17]}" + VCS_STATUS_NUM_UNSTAGED_DELETED="${resp[18]}" + VCS_STATUS_NUM_STAGED_NEW="${resp[19]:-0}" + VCS_STATUS_NUM_STAGED_DELETED="${resp[20]:-0}" + VCS_STATUS_PUSH_REMOTE_NAME="${resp[21]:-}" + VCS_STATUS_PUSH_REMOTE_URL="${resp[22]:-}" + VCS_STATUS_PUSH_COMMITS_AHEAD="${resp[23]:-0}" + VCS_STATUS_PUSH_COMMITS_BEHIND="${resp[24]:-0}" + VCS_STATUS_NUM_SKIP_WORKTREE="${resp[25]:-0}" + VCS_STATUS_NUM_ASSUME_UNCHANGED="${resp[26]:-0}" + VCS_STATUS_COMMIT_ENCODING="${resp[27]-}" + VCS_STATUS_COMMIT_SUMMARY="${resp[28]-}" + VCS_STATUS_HAS_STAGED=$((VCS_STATUS_NUM_STAGED > 0)) + if (( _GITSTATUS_DIRTY_MAX_INDEX_SIZE >= 0 && + VCS_STATUS_INDEX_SIZE > _GITSTATUS_DIRTY_MAX_INDEX_SIZE_ )); then + VCS_STATUS_HAS_UNSTAGED=-1 + VCS_STATUS_HAS_CONFLICTED=-1 + VCS_STATUS_HAS_UNTRACKED=-1 + else + VCS_STATUS_HAS_UNSTAGED=$((VCS_STATUS_NUM_UNSTAGED > 0)) + VCS_STATUS_HAS_CONFLICTED=$((VCS_STATUS_NUM_CONFLICTED > 0)) + VCS_STATUS_HAS_UNTRACKED=$((VCS_STATUS_NUM_UNTRACKED > 0)) + fi + else + VCS_STATUS_RESULT=norepo-sync + unset VCS_STATUS_WORKDIR + unset VCS_STATUS_COMMIT + unset VCS_STATUS_LOCAL_BRANCH + unset VCS_STATUS_REMOTE_BRANCH + unset VCS_STATUS_REMOTE_NAME + unset VCS_STATUS_REMOTE_URL + unset VCS_STATUS_ACTION + unset VCS_STATUS_INDEX_SIZE + unset VCS_STATUS_NUM_STAGED + unset VCS_STATUS_NUM_UNSTAGED + unset VCS_STATUS_NUM_CONFLICTED + unset VCS_STATUS_NUM_UNTRACKED + unset VCS_STATUS_HAS_STAGED + unset VCS_STATUS_HAS_UNSTAGED + unset VCS_STATUS_HAS_CONFLICTED + unset VCS_STATUS_HAS_UNTRACKED + unset VCS_STATUS_COMMITS_AHEAD + unset VCS_STATUS_COMMITS_BEHIND + unset VCS_STATUS_STASHES + unset VCS_STATUS_TAG + unset VCS_STATUS_NUM_UNSTAGED_DELETED + unset VCS_STATUS_NUM_STAGED_NEW + unset VCS_STATUS_NUM_STAGED_DELETED + unset VCS_STATUS_PUSH_REMOTE_NAME + unset VCS_STATUS_PUSH_REMOTE_URL + unset VCS_STATUS_PUSH_COMMITS_AHEAD + unset VCS_STATUS_PUSH_COMMITS_BEHIND + unset VCS_STATUS_NUM_SKIP_WORKTREE + unset VCS_STATUS_NUM_ASSUME_UNCHANGED + unset VCS_STATUS_COMMIT_ENCODING + unset VCS_STATUS_COMMIT_SUMMARY + fi +} + +# Usage: gitstatus_check. +# +# Returns 0 if and only if gitstatus_start has succeeded previously. +# If it returns non-zero, gitstatus_query is guaranteed to return non-zero. +function gitstatus_check() { + [[ -n "$GITSTATUS_DAEMON_PID" ]] +} diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.zsh new file mode 100644 index 0000000..228fea7 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.plugin.zsh @@ -0,0 +1,908 @@ +# Zsh bindings for gitstatus. +# +# ------------------------------------------------------------------ +# +# Example: Start gitstatusd, send it a request, wait for response and print it. +# +# source ~/gitstatus/gitstatus.plugin.zsh +# gitstatus_start MY +# gitstatus_query -d $PWD MY +# typeset -m 'VCS_STATUS_*' +# +# Output: +# +# VCS_STATUS_ACTION='' +# VCS_STATUS_COMMIT=c000eddcff0fb38df2d0137efe24d9d2d900f209 +# VCS_STATUS_COMMITS_AHEAD=0 +# VCS_STATUS_COMMITS_BEHIND=0 +# VCS_STATUS_COMMIT_ENCODING='' +# VCS_STATUS_COMMIT_SUMMARY='pull upstream changes from gitstatus' +# VCS_STATUS_HAS_CONFLICTED=0 +# VCS_STATUS_HAS_STAGED=0 +# VCS_STATUS_HAS_UNSTAGED=1 +# VCS_STATUS_HAS_UNTRACKED=1 +# VCS_STATUS_INDEX_SIZE=33 +# VCS_STATUS_LOCAL_BRANCH=master +# VCS_STATUS_NUM_ASSUME_UNCHANGED=0 +# VCS_STATUS_NUM_CONFLICTED=0 +# VCS_STATUS_NUM_STAGED=0 +# VCS_STATUS_NUM_UNSTAGED=1 +# VCS_STATUS_NUM_SKIP_WORKTREE=0 +# VCS_STATUS_NUM_STAGED_NEW=0 +# VCS_STATUS_NUM_STAGED_DELETED=0 +# VCS_STATUS_NUM_UNSTAGED_DELETED=0 +# VCS_STATUS_NUM_UNTRACKED=1 +# VCS_STATUS_PUSH_COMMITS_AHEAD=0 +# VCS_STATUS_PUSH_COMMITS_BEHIND=0 +# VCS_STATUS_PUSH_REMOTE_NAME='' +# VCS_STATUS_PUSH_REMOTE_URL='' +# VCS_STATUS_REMOTE_BRANCH=master +# VCS_STATUS_REMOTE_NAME=origin +# VCS_STATUS_REMOTE_URL=git@github.com:romkatv/powerlevel10k.git +# VCS_STATUS_RESULT=ok-sync +# VCS_STATUS_STASHES=0 +# VCS_STATUS_TAG='' +# VCS_STATUS_WORKDIR=/home/romka/powerlevel10k + +[[ -o 'interactive' ]] || 'return' + +# Temporarily change options. +'builtin' 'local' '-a' '_gitstatus_opts' +[[ ! -o 'aliases' ]] || _gitstatus_opts+=('aliases') +[[ ! -o 'sh_glob' ]] || _gitstatus_opts+=('sh_glob') +[[ ! -o 'no_brace_expand' ]] || _gitstatus_opts+=('no_brace_expand') +'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' + +autoload -Uz add-zsh-hook || return +zmodload zsh/datetime zsh/system || return +zmodload -F zsh/files b:zf_rm || return + +typeset -g _gitstatus_plugin_dir"${1:-}"="${${(%):-%x}:A:h}" + +# Retrives status of a git repo from a directory under its working tree. +# +## Usage: gitstatus_query [OPTION]... NAME +# +# -d STR Directory to query. Defaults to the current directory. Has no effect if GIT_DIR +# is set. +# -c STR Callback function to call once the results are available. Called only after +# gitstatus_query returns 0 with VCS_STATUS_RESULT=tout. +# -t FLOAT Timeout in seconds. Negative value means infinity. Will block for at most this long. +# If no results are available by then: if -c isn't specified, will return 1; otherwise +# will set VCS_STATUS_RESULT=tout and return 0. +# -p Don't compute anything that requires reading Git index. If this option is used, +# the following parameters will be 0: VCS_STATUS_INDEX_SIZE, +# VCS_STATUS_{NUM,HAS}_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED}. +# +# On success sets VCS_STATUS_RESULT to one of the following values: +# +# tout Timed out waiting for data; will call the user-specified callback later. +# norepo-sync The directory isn't a git repo. +# ok-sync The directory is a git repo. +# +# When the callback is called, VCS_STATUS_RESULT is set to one of the following values: +# +# norepo-async The directory isn't a git repo. +# ok-async The directory is a git repo. +# +# If VCS_STATUS_RESULT is ok-sync or ok-async, additional variables are set: +# +# VCS_STATUS_WORKDIR Git repo working directory. Not empty. +# VCS_STATUS_COMMIT Commit hash that HEAD is pointing to. Either 40 hex digits or +# empty if there is no HEAD (empty repo). +# VCS_STATUS_COMMIT_ENCODING Encoding of the HEAD's commit message. Empty value means UTF-8. +# VCS_STATUS_COMMIT_SUMMARY The first paragraph of the HEAD's commit message as one line. +# VCS_STATUS_LOCAL_BRANCH Local branch name or empty if not on a branch. +# VCS_STATUS_REMOTE_NAME The remote name, e.g. "upstream" or "origin". +# VCS_STATUS_REMOTE_BRANCH Upstream branch name. Can be empty. +# VCS_STATUS_REMOTE_URL Remote URL. Can be empty. +# VCS_STATUS_ACTION Repository state, A.K.A. action. Can be empty. +# VCS_STATUS_INDEX_SIZE The number of files in the index. +# VCS_STATUS_NUM_STAGED The number of staged changes. +# VCS_STATUS_NUM_CONFLICTED The number of conflicted changes. +# VCS_STATUS_NUM_UNSTAGED The number of unstaged changes. +# VCS_STATUS_NUM_UNTRACKED The number of untracked files. +# VCS_STATUS_HAS_STAGED 1 if there are staged changes, 0 otherwise. +# VCS_STATUS_HAS_CONFLICTED 1 if there are conflicted changes, 0 otherwise. +# VCS_STATUS_HAS_UNSTAGED 1 if there are unstaged changes, 0 if there aren't, -1 if +# unknown. +# VCS_STATUS_NUM_STAGED_NEW The number of staged new files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_NUM_STAGED_DELETED The number of staged deleted files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_NUM_UNSTAGED_DELETED The number of unstaged deleted files. Note that renamed files +# are reported as deleted plus new. +# VCS_STATUS_HAS_UNTRACKED 1 if there are untracked files, 0 if there aren't, -1 if +# unknown. +# VCS_STATUS_COMMITS_AHEAD Number of commits the current branch is ahead of upstream. +# Non-negative integer. +# VCS_STATUS_COMMITS_BEHIND Number of commits the current branch is behind upstream. +# Non-negative integer. +# VCS_STATUS_STASHES Number of stashes. Non-negative integer. +# VCS_STATUS_TAG The last tag (in lexicographical order) that points to the same +# commit as HEAD. +# VCS_STATUS_PUSH_REMOTE_NAME The push remote name, e.g. "upstream" or "origin". +# VCS_STATUS_PUSH_REMOTE_URL Push remote URL. Can be empty. +# VCS_STATUS_PUSH_COMMITS_AHEAD Number of commits the current branch is ahead of push remote. +# Non-negative integer. +# VCS_STATUS_PUSH_COMMITS_BEHIND Number of commits the current branch is behind push remote. +# Non-negative integer. +# VCS_STATUS_NUM_SKIP_WORKTREE The number of files in the index with skip-worktree bit set. +# Non-negative integer. +# VCS_STATUS_NUM_ASSUME_UNCHANGED The number of files in the index with assume-unchanged bit set. +# Non-negative integer. +# +# The point of reporting -1 via VCS_STATUS_HAS_* is to allow the command to skip scanning files in +# large repos. See -m flag of gitstatus_start. +# +# gitstatus_query returns an error if gitstatus_start hasn't been called in the same shell or +# the call had failed. +# +# !!!!! WARNING: CONCURRENT CALLS WITH THE SAME NAME ARE NOT ALLOWED !!!!! +# +# It's illegal to call gitstatus_query if the last asynchronous call with the same NAME hasn't +# completed yet. If you need to issue concurrent requests, use different NAME arguments. +function gitstatus_query"${1:-}"() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + + local fsuf=${${(%):-%N}#gitstatus_query} + + unset VCS_STATUS_RESULT + + local opt dir callback OPTARG + local -i no_diff OPTIND + local -F timeout=-1 + while getopts ":d:c:t:p" opt; do + case $opt in + +p) no_diff=0;; + p) no_diff=1;; + d) dir=$OPTARG;; + c) callback=$OPTARG;; + t) + if [[ $OPTARG != (|+|-)<->(|.<->)(|[eE](|-|+)<->) ]]; then + print -ru2 -- "gitstatus_query: invalid -t argument: $OPTARG" + return 1 + fi + timeout=OPTARG + ;; + \?) print -ru2 -- "gitstatus_query: invalid option: $OPTARG" ; return 1;; + :) print -ru2 -- "gitstatus_query: missing required argument: $OPTARG"; return 1;; + *) print -ru2 -- "gitstatus_query: invalid option: $opt" ; return 1;; + esac + done + + if (( OPTIND != ARGC )); then + print -ru2 -- "gitstatus_query: exactly one positional argument is required" + return 1 + fi + + local name=$*[OPTIND] + if [[ $name != [[:IDENT:]]## ]]; then + print -ru2 -- "gitstatus_query: invalid positional argument: $name" + return 1 + fi + + (( _GITSTATUS_STATE_$name == 2 )) || return + + if [[ -z $GIT_DIR ]]; then + if [[ $dir != /* ]]; then + if [[ $PWD == /* && $PWD -ef . ]]; then + dir=$PWD/$dir + else + dir=${dir:a} + fi + fi + else + if [[ $GIT_DIR == /* ]]; then + dir=:$GIT_DIR + elif [[ $PWD == /* && $PWD -ef . ]]; then + dir=:$PWD/$GIT_DIR + else + dir=:${GIT_DIR:a} + fi + fi + + if [[ $dir != (|:)/* ]]; then + typeset -g VCS_STATUS_RESULT=norepo-sync + _gitstatus_clear$fsuf + return 0 + fi + + local -i req_fd=${(P)${:-_GITSTATUS_REQ_FD_$name}} + local req_id=$EPOCHREALTIME + print -rnu $req_fd -- $req_id' '$callback$'\x1f'$dir$'\x1f'$no_diff$'\x1e' || return + + (( ++_GITSTATUS_NUM_INFLIGHT_$name )) + + if (( timeout == 0 )); then + typeset -g VCS_STATUS_RESULT=tout + _gitstatus_clear$fsuf + else + while true; do + _gitstatus_process_response$fsuf $name $timeout $req_id || return + [[ $VCS_STATUS_RESULT == *-async ]] || break + done + fi + + [[ $VCS_STATUS_RESULT != tout || -n $callback ]] +} + +# If the last call to gitstatus_query timed out (VCS_STATUS_RESULT=tout), wait for the callback +# to be called. Otherwise do nothing. +# +# Usage: gitstatus_process_results [OPTION]... NAME +# +# -t FLOAT Timeout in seconds. Negative value means infinity. Will block for at most this long. +# +# Returns an error only when invoked with incorrect arguments and when gitstatusd isn't running or +# broken. +# +# If a callback gets called, VCS_STATUS_* parameters are set as in gitstatus_query. +# VCS_STATUS_RESULT is either norepo-async or ok-async. +function gitstatus_process_results"${1:-}"() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + + local fsuf=${${(%):-%N}#gitstatus_process_results} + + local opt OPTARG + local -i OPTIND + local -F timeout=-1 + while getopts ":t:" opt; do + case $opt in + t) + if [[ $OPTARG != (|+|-)<->(|.<->)(|[eE](|-|+)<->) ]]; then + print -ru2 -- "gitstatus_process_results: invalid -t argument: $OPTARG" + return 1 + fi + timeout=OPTARG + ;; + \?) print -ru2 -- "gitstatus_process_results: invalid option: $OPTARG" ; return 1;; + :) print -ru2 -- "gitstatus_process_results: missing required argument: $OPTARG"; return 1;; + *) print -ru2 -- "gitstatus_process_results: invalid option: $opt" ; return 1;; + esac + done + + if (( OPTIND != ARGC )); then + print -ru2 -- "gitstatus_process_results: exactly one positional argument is required" + return 1 + fi + + local name=$*[OPTIND] + if [[ $name != [[:IDENT:]]## ]]; then + print -ru2 -- "gitstatus_process_results: invalid positional argument: $name" + return 1 + fi + + (( _GITSTATUS_STATE_$name == 2 )) || return + + while (( _GITSTATUS_NUM_INFLIGHT_$name )); do + _gitstatus_process_response$fsuf $name $timeout '' || return + [[ $VCS_STATUS_RESULT == *-async ]] || break + done + + return 0 +} + +function _gitstatus_clear"${1:-}"() { + unset VCS_STATUS_{WORKDIR,COMMIT,LOCAL_BRANCH,REMOTE_BRANCH,REMOTE_NAME,REMOTE_URL,ACTION,INDEX_SIZE,NUM_STAGED,NUM_UNSTAGED,NUM_CONFLICTED,NUM_UNTRACKED,HAS_STAGED,HAS_UNSTAGED,HAS_CONFLICTED,HAS_UNTRACKED,COMMITS_AHEAD,COMMITS_BEHIND,STASHES,TAG,NUM_UNSTAGED_DELETED,NUM_STAGED_NEW,NUM_STAGED_DELETED,PUSH_REMOTE_NAME,PUSH_REMOTE_URL,PUSH_COMMITS_AHEAD,PUSH_COMMITS_BEHIND,NUM_SKIP_WORKTREE,NUM_ASSUME_UNCHANGED} +} + +function _gitstatus_process_response"${1:-}"() { + local name=$1 timeout req_id=$3 buf + local -i resp_fd=_GITSTATUS_RESP_FD_$name + local -i dirty_max_index_size=_GITSTATUS_DIRTY_MAX_INDEX_SIZE_$name + + (( $2 >= 0 )) && timeout=-t$2 && [[ -t $resp_fd ]] + sysread $timeout -i $resp_fd 'buf[$#buf+1]' || { + if (( $? == 4 )); then + if [[ -n $req_id ]]; then + typeset -g VCS_STATUS_RESULT=tout + _gitstatus_clear$fsuf + fi + return 0 + else + gitstatus_stop$fsuf $name + return 1 + fi + } + while [[ $buf != *$'\x1e' ]]; do + if ! sysread -i $resp_fd 'buf[$#buf+1]'; then + gitstatus_stop$fsuf $name + return 1 + fi + done + + local s + for s in ${(ps:\x1e:)buf}; do + local -a resp=("${(@ps:\x1f:)s}") + if (( resp[2] )); then + if [[ $resp[1] == $req_id' '* ]]; then + typeset -g VCS_STATUS_RESULT=ok-sync + else + typeset -g VCS_STATUS_RESULT=ok-async + fi + for VCS_STATUS_WORKDIR \ + VCS_STATUS_COMMIT \ + VCS_STATUS_LOCAL_BRANCH \ + VCS_STATUS_REMOTE_BRANCH \ + VCS_STATUS_REMOTE_NAME \ + VCS_STATUS_REMOTE_URL \ + VCS_STATUS_ACTION \ + VCS_STATUS_INDEX_SIZE \ + VCS_STATUS_NUM_STAGED \ + VCS_STATUS_NUM_UNSTAGED \ + VCS_STATUS_NUM_CONFLICTED \ + VCS_STATUS_NUM_UNTRACKED \ + VCS_STATUS_COMMITS_AHEAD \ + VCS_STATUS_COMMITS_BEHIND \ + VCS_STATUS_STASHES \ + VCS_STATUS_TAG \ + VCS_STATUS_NUM_UNSTAGED_DELETED \ + VCS_STATUS_NUM_STAGED_NEW \ + VCS_STATUS_NUM_STAGED_DELETED \ + VCS_STATUS_PUSH_REMOTE_NAME \ + VCS_STATUS_PUSH_REMOTE_URL \ + VCS_STATUS_PUSH_COMMITS_AHEAD \ + VCS_STATUS_PUSH_COMMITS_BEHIND \ + VCS_STATUS_NUM_SKIP_WORKTREE \ + VCS_STATUS_NUM_ASSUME_UNCHANGED \ + VCS_STATUS_COMMIT_ENCODING \ + VCS_STATUS_COMMIT_SUMMARY in "${(@)resp[3,29]}"; do + done + typeset -gi VCS_STATUS_{INDEX_SIZE,NUM_STAGED,NUM_UNSTAGED,NUM_CONFLICTED,NUM_UNTRACKED,COMMITS_AHEAD,COMMITS_BEHIND,STASHES,NUM_UNSTAGED_DELETED,NUM_STAGED_NEW,NUM_STAGED_DELETED,PUSH_COMMITS_AHEAD,PUSH_COMMITS_BEHIND,NUM_SKIP_WORKTREE,NUM_ASSUME_UNCHANGED} + typeset -gi VCS_STATUS_HAS_STAGED=$((VCS_STATUS_NUM_STAGED > 0)) + if (( dirty_max_index_size >= 0 && VCS_STATUS_INDEX_SIZE > dirty_max_index_size )); then + typeset -gi \ + VCS_STATUS_HAS_UNSTAGED=-1 \ + VCS_STATUS_HAS_CONFLICTED=-1 \ + VCS_STATUS_HAS_UNTRACKED=-1 + else + typeset -gi \ + VCS_STATUS_HAS_UNSTAGED=$((VCS_STATUS_NUM_UNSTAGED > 0)) \ + VCS_STATUS_HAS_CONFLICTED=$((VCS_STATUS_NUM_CONFLICTED > 0)) \ + VCS_STATUS_HAS_UNTRACKED=$((VCS_STATUS_NUM_UNTRACKED > 0)) + fi + else + if [[ $resp[1] == $req_id' '* ]]; then + typeset -g VCS_STATUS_RESULT=norepo-sync + else + typeset -g VCS_STATUS_RESULT=norepo-async + fi + _gitstatus_clear$fsuf + fi + (( --_GITSTATUS_NUM_INFLIGHT_$name )) + [[ $VCS_STATUS_RESULT == *-async ]] && emulate zsh -c "${resp[1]#* }" + done + + return 0 +} + +function _gitstatus_daemon"${1:-}"() { + local -i pipe_fd + exec 0<&- {pipe_fd}>&1 1>>$daemon_log 2>&1 || return + local pgid=$sysparams[pid] + [[ $pgid == <1-> ]] || return + builtin cd -q / || return + + { + { + trap '' PIPE + + local uname_sm + uname_sm="${${(L)$(command uname -sm)}//ı/i}" || return + [[ $uname_sm == [^' ']##' '[^' ']## ]] || return + local uname_s=${uname_sm% *} + local uname_m=${uname_sm#* } + + if [[ $GITSTATUS_NUM_THREADS == <1-> ]]; then + args+=(-t $GITSTATUS_NUM_THREADS) + else + local cpus + if (( ! $+commands[sysctl] )) || [[ $uname_s == linux ]] || + ! cpus="$(command sysctl -n hw.ncpu)"; then + if (( ! $+commands[getconf] )) || ! cpus="$(command getconf _NPROCESSORS_ONLN)"; then + cpus=8 + fi + fi + args+=(-t $((cpus > 16 ? 32 : cpus > 0 ? 2 * cpus : 16))) + fi + + command mkfifo -- $file_prefix.fifo || return + print -rnu $pipe_fd -- ${(l:20:)pgid} || return + exec <$file_prefix.fifo || return + zf_rm -- $file_prefix.fifo || return + + local _gitstatus_zsh_daemon _gitstatus_zsh_version _gitstatus_zsh_downloaded + + function _gitstatus_set_daemon$fsuf() { + _gitstatus_zsh_daemon="$1" + _gitstatus_zsh_version="$2" + _gitstatus_zsh_downloaded="$3" + } + + local gitstatus_plugin_dir_var=_gitstatus_plugin_dir$fsuf + local gitstatus_plugin_dir=${(P)gitstatus_plugin_dir_var} + builtin set -- -d $gitstatus_plugin_dir -s $uname_s -m $uname_m \ + -p "printf '\\001' >&$pipe_fd" -e $pipe_fd -- _gitstatus_set_daemon$fsuf + [[ ${GITSTATUS_AUTO_INSTALL:-1} == (|-|+)<1-> ]] || builtin set -- -n "$@" + builtin source $gitstatus_plugin_dir/install || return + [[ -n $_gitstatus_zsh_daemon ]] || return + [[ -n $_gitstatus_zsh_version ]] || return + [[ $_gitstatus_zsh_downloaded == [01] ]] || return + + if (( UID == EUID )); then + local home=~ + else + local user + user="$(command id -un)" || return + local home=${userdirs[$user]} + [[ -n $home ]] || return + fi + + if [[ -x $_gitstatus_zsh_daemon ]]; then + HOME=$home $_gitstatus_zsh_daemon -G $_gitstatus_zsh_version "${(@)args}" >&$pipe_fd + local -i ret=$? + [[ $ret == (0|129|130|131|137|141|143|159) ]] && return ret + fi + + (( ! _gitstatus_zsh_downloaded )) || return + [[ ${GITSTATUS_AUTO_INSTALL:-1} == (|-|+)<1-> ]] || return + [[ $_gitstatus_zsh_daemon == \ + ${GITSTATUS_CACHE_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/gitstatus}/* ]] || return + + builtin set -- -f "$@" + _gitstatus_zsh_daemon= + _gitstatus_zsh_version= + _gitstatus_zsh_downloaded= + builtin source $gitstatus_plugin_dir/install || return + [[ -n $_gitstatus_zsh_daemon ]] || return + [[ -n $_gitstatus_zsh_version ]] || return + [[ $_gitstatus_zsh_downloaded == 1 ]] || return + + HOME=$home $_gitstatus_zsh_daemon -G $_gitstatus_zsh_version "${(@)args}" >&$pipe_fd + } always { + local -i ret=$? + zf_rm -f -- $file_prefix.lock $file_prefix.fifo + kill -- -$pgid + } + } &! + + (( lock_fd == -1 )) && return + + { + if zsystem flock -- $file_prefix.lock && command sleep 5 && [[ -e $file_prefix.lock ]]; then + zf_rm -f -- $file_prefix.lock $file_prefix.fifo + kill -- -$pgid + fi + } &! +} + +# Starts gitstatusd in the background. Does nothing and succeeds if gitstatusd is already running. +# +# Usage: gitstatus_start [OPTION]... NAME +# +# -t FLOAT Fail the self-check on initialization if not getting a response from gitstatusd for +# this this many seconds. Defaults to 5. +# +# -s INT Report at most this many staged changes; negative value means infinity. +# Defaults to 1. +# +# -u INT Report at most this many unstaged changes; negative value means infinity. +# Defaults to 1. +# +# -c INT Report at most this many conflicted changes; negative value means infinity. +# Defaults to 1. +# +# -d INT Report at most this many untracked files; negative value means infinity. +# Defaults to 1. +# +# -m INT Report -1 unstaged, untracked and conflicted if there are more than this many +# files in the index. Negative value means infinity. Defaults to -1. +# +# -e Count files within untracked directories like `git status --untracked-files`. +# +# -U Unless this option is specified, report zero untracked files for repositories +# with status.showUntrackedFiles = false. +# +# -W Unless this option is specified, report zero untracked files for repositories +# with bash.showUntrackedFiles = false. +# +# -D Unless this option is specified, report zero staged, unstaged and conflicted +# changes for repositories with bash.showDirtyState = false. +function gitstatus_start"${1:-}"() { + emulate -L zsh -o no_aliases -o no_bg_nice -o extended_glob -o typeset_silent || return + print -rnu2 || return + + local fsuf=${${(%):-%N}#gitstatus_start} + + local opt OPTARG + local -i OPTIND + local -F timeout=5 + local -i async=0 + local -a args=() + local -i dirty_max_index_size=-1 + + while getopts ":t:s:u:c:d:m:eaUWD" opt; do + case $opt in + a) async=1;; + +a) async=0;; + t) + if [[ $OPTARG != (|+)<->(|.<->)(|[eE](|-|+)<->) ]] || (( ${timeout::=OPTARG} <= 0 )); then + print -ru2 -- "gitstatus_start: invalid -t argument: $OPTARG" + return 1 + fi + ;; + s|u|c|d|m) + if [[ $OPTARG != (|-|+)<-> ]]; then + print -ru2 -- "gitstatus_start: invalid -$opt argument: $OPTARG" + return 1 + fi + args+=(-$opt $OPTARG) + [[ $opt == m ]] && dirty_max_index_size=OPTARG + ;; + e|U|W|D) args+=-$opt;; + +(e|U|W|D)) args=(${(@)args:#-$opt});; + \?) print -ru2 -- "gitstatus_start: invalid option: $OPTARG" ; return 1;; + :) print -ru2 -- "gitstatus_start: missing required argument: $OPTARG"; return 1;; + *) print -ru2 -- "gitstatus_start: invalid option: $opt" ; return 1;; + esac + done + + if (( OPTIND != ARGC )); then + print -ru2 -- "gitstatus_start: exactly one positional argument is required" + return 1 + fi + + local name=$*[OPTIND] + if [[ $name != [[:IDENT:]]## ]]; then + print -ru2 -- "gitstatus_start: invalid positional argument: $name" + return 1 + fi + + local -i lock_fd resp_fd stderr_fd + local file_prefix xtrace=/dev/null daemon_log=/dev/null culprit + + { + if (( _GITSTATUS_STATE_$name )); then + (( async )) && return + (( _GITSTATUS_STATE_$name == 2 )) && return + lock_fd=_GITSTATUS_LOCK_FD_$name + resp_fd=_GITSTATUS_RESP_FD_$name + xtrace=${(P)${:-GITSTATUS_XTRACE_$name}} + daemon_log=${(P)${:-GITSTATUS_DAEMON_LOG_$name}} + file_prefix=${(P)${:-_GITSTATUS_FILE_PREFIX_$name}} + else + typeset -gi _GITSTATUS_START_COUNTER + local log_level=$GITSTATUS_LOG_LEVEL + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + else + local tmpdir=/tmp + fi + local file_prefix=${tmpdir:A}/gitstatus.$name.$EUID + file_prefix+=.$sysparams[pid].$EPOCHSECONDS.$((++_GITSTATUS_START_COUNTER)) + (( GITSTATUS_ENABLE_LOGGING )) && : ${log_level:=INFO} + if [[ -n $log_level ]]; then + xtrace=$file_prefix.xtrace.log + daemon_log=$file_prefix.daemon.log + fi + args+=(-v ${log_level:-FATAL}) + typeset -g GITSTATUS_XTRACE_$name=$xtrace + typeset -g GITSTATUS_DAEMON_LOG_$name=$daemon_log + typeset -g _GITSTATUS_FILE_PREFIX_$name=$file_prefix + typeset -gi _GITSTATUS_CLIENT_PID_$name="sysparams[pid]" + typeset -gi _GITSTATUS_DIRTY_MAX_INDEX_SIZE_$name=dirty_max_index_size + fi + + () { + if [[ $xtrace != /dev/null && -o no_xtrace ]]; then + exec {stderr_fd}>&2 || return + exec 2>>$xtrace || return + setopt xtrace + fi + + setopt monitor || return + + if (( ! _GITSTATUS_STATE_$name )); then + if [[ -r /proc/version && "$($file_prefix.lock || return + zsystem flock -f lock_fd $file_prefix.lock || return + [[ $lock_fd == <1-> ]] || return + fi + + typeset -gi _GITSTATUS_LOCK_FD_$name=lock_fd + + if [[ $OSTYPE == cygwin* && -d /proc/self/fd ]]; then + # Work around bugs in Cygwin 32-bit. + # + # This hangs: + # + # emulate -L zsh + # () { exec {fd}< $1 } <(:) + # =true # hangs here + # + # This hangs: + # + # sysopen -r -u fd <(:) + local -i fd + exec {fd}< <(_gitstatus_daemon$fsuf) || return + { + [[ -r /proc/self/fd/$fd ]] || return + sysopen -r -o cloexec -u resp_fd /proc/self/fd/$fd || return + } always { + exec {fd} >&- || return + } + else + sysopen -r -o cloexec -u resp_fd <(_gitstatus_daemon$fsuf) || return + fi + + typeset -gi GITSTATUS_DAEMON_PID_$name="${sysparams[procsubstpid]:--1}" + + [[ $resp_fd == <1-> ]] || return + typeset -gi _GITSTATUS_RESP_FD_$name=resp_fd + typeset -gi _GITSTATUS_STATE_$name=1 + fi + + if (( ! async )); then + (( _GITSTATUS_CLIENT_PID_$name == sysparams[pid] )) || return + + local pgid + while (( $#pgid < 20 )); do + [[ -t $resp_fd ]] + sysread -s $((20 - $#pgid)) -t $timeout -i $resp_fd 'pgid[$#pgid+1]' || return + done + [[ $pgid == ' '#<1-> ]] || return + typeset -gi GITSTATUS_DAEMON_PID_$name=pgid + + sysopen -w -o cloexec -u req_fd -- $file_prefix.fifo || return + [[ $req_fd == <1-> ]] || return + typeset -gi _GITSTATUS_REQ_FD_$name=req_fd + + print -nru $req_fd -- $'}hello\x1f\x1e' || return + local expected=$'}hello\x1f0\x1e' actual + if (( $+functions[p10k] )) && [[ ! -t 1 && ! -t 0 ]]; then + local -F deadline='EPOCHREALTIME + 4' + else + local -F deadline='1' + fi + while true; do + [[ -t $resp_fd ]] + sysread -s 1 -t $timeout -i $resp_fd actual || return + [[ $expected == $actual* ]] && break + if [[ $actual != $'\1' ]]; then + [[ -t $resp_fd ]] + while sysread -t $timeout -i $resp_fd 'actual[$#actual+1]'; do + [[ -t $resp_fd ]] + done + culprit=$actual + return 1 + fi + (( EPOCHREALTIME < deadline )) && continue + if (( deadline > 0 )); then + deadline=0 + if (( stderr_fd )); then + unsetopt xtrace + exec 2>&$stderr_fd {stderr_fd}>&- + stderr_fd=0 + fi + if (( $+functions[p10k] )); then + p10k clear-instant-prompt || return + fi + if [[ $name == POWERLEVEL9K ]]; then + local label=powerlevel10k + else + local label=gitstatus + fi + if [[ -t 2 ]]; then + local spinner=($'\b%3F-%f' $'\b%3F\\%f' $'\b%3F|%f' $'\b%3F/%f') + print -Prnu2 -- "[%3F$label%f] fetching %2Fgitstatusd%f .. " + else + local spinner=('.') + print -rnu2 -- "[$label] fetching gitstatusd .." + fi + fi + print -Prnu2 -- $spinner[1] + spinner=($spinner[2,-1] $spinner[1]) + done + + if (( deadline == 0 )); then + if [[ -t 2 ]]; then + print -Pru2 -- $'\b[%2Fok%f]' + else + print -ru2 -- ' [ok]' + fi + if [[ $xtrace != /dev/null && -o no_xtrace ]]; then + exec {stderr_fd}>&2 || return + exec 2>>$xtrace || return + setopt xtrace + fi + fi + + while (( $#actual < $#expected )); do + [[ -t $resp_fd ]] + sysread -s $(($#expected - $#actual)) -t $timeout -i $resp_fd 'actual[$#actual+1]' || return + done + [[ $actual == $expected ]] || return + + function _gitstatus_process_response_$name-$fsuf() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + local pair=${${(%):-%N}#_gitstatus_process_response_} + local name=${pair%%-*} + local fsuf=${pair#*-} + [[ $name == POWERLEVEL9K && $fsuf == _p9k_ ]] && eval $__p9k_intro_base + if (( ARGC == 1 )); then + _gitstatus_process_response$fsuf $name 0 '' + else + gitstatus_stop$fsuf $name + fi + } + if ! zle -F $resp_fd _gitstatus_process_response_$name-$fsuf; then + unfunction _gitstatus_process_response_$name-$fsuf + return 1 + fi + + function _gitstatus_cleanup_$name-$fsuf() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + local pair=${${(%):-%N}#_gitstatus_cleanup_} + local name=${pair%%-*} + local fsuf=${pair#*-} + (( _GITSTATUS_CLIENT_PID_$name == sysparams[pid] )) || return + gitstatus_stop$fsuf $name + } + if ! add-zsh-hook zshexit _gitstatus_cleanup_$name-$fsuf; then + unfunction _gitstatus_cleanup_$name-$fsuf + return 1 + fi + + if (( lock_fd != -1 )); then + zf_rm -- $file_prefix.lock || return + zsystem flock -u $lock_fd || return + fi + unset _GITSTATUS_LOCK_FD_$name + + typeset -gi _GITSTATUS_STATE_$name=2 + fi + } + } always { + local -i err=$? + (( stderr_fd )) && exec 2>&$stderr_fd {stderr_fd}>&- + (( err == 0 )) && return + + gitstatus_stop$fsuf $name + + setopt prompt_percent no_prompt_subst no_prompt_bang + (( $+functions[p10k] )) && p10k clear-instant-prompt + print -ru2 -- '' + print -Pru2 -- '[%F{red}ERROR%f]: gitstatus failed to initialize.' + print -ru2 -- '' + if [[ -n $culprit ]]; then + print -ru2 -- $culprit + return err + fi + if [[ -s $xtrace ]]; then + print -ru2 -- '' + print -Pru2 -- " Zsh log (%U${xtrace//\%/%%}%u):" + print -Pru2 -- '%F{yellow}' + print -lru2 -- "${(@)${(@f)$(<$xtrace)}/#/ }" + print -Pnru2 -- '%f' + fi + if [[ -s $daemon_log ]]; then + print -ru2 -- '' + print -Pru2 -- " Daemon log (%U${daemon_log//\%/%%}%u):" + print -Pru2 -- '%F{yellow}' + print -lru2 -- "${(@)${(@f)$(<$daemon_log)}/#/ }" + print -Pnru2 -- '%f' + fi + if [[ $GITSTATUS_LOG_LEVEL == DEBUG ]]; then + print -ru2 -- '' + print -ru2 -- ' System information:' + print -Pru2 -- '%F{yellow}' + print -ru2 -- " zsh: $ZSH_VERSION" + print -ru2 -- " uname -a: $(command uname -a)" + print -Pru2 -- '%f' + print -ru2 -- ' If you need help, open an issue and attach this whole error message to it:' + print -ru2 -- '' + print -Pru2 -- ' %Uhttps://github.com/romkatv/gitstatus/issues/new%u' + else + print -ru2 -- '' + local home=~ + local zshrc=${${${(q)${ZDOTDIR:-~}}/#${(q)home}/'~'}//\%/%%}/.zshrc + print -Pru2 -- " Add the following parameter to %U$zshrc%u for extra diagnostics on error:" + print -ru2 -- '' + print -Pru2 -- ' %BGITSTATUS_LOG_LEVEL=DEBUG%b' + print -ru2 -- '' + print -ru2 -- ' Restart Zsh to retry gitstatus initialization:' + print -ru2 -- '' + print -Pru2 -- ' %F{green}%Uexec%u zsh%f' + fi + } +} + +# Stops gitstatusd if it's running. +# +# Usage: gitstatus_stop NAME. +function gitstatus_stop"${1:-}"() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + + local fsuf=${${(%):-%N}#gitstatus_stop} + + if (( ARGC != 1 )); then + print -ru2 -- "gitstatus_stop: exactly one positional argument is required" + return 1 + fi + + local name=$1 + if [[ $name != [[:IDENT:]]## ]]; then + print -ru2 -- "gitstatus_stop: invalid positional argument: $name" + return 1 + fi + + local state_var=_GITSTATUS_STATE_$name + local req_fd_var=_GITSTATUS_REQ_FD_$name + local resp_fd_var=_GITSTATUS_RESP_FD_$name + local lock_fd_var=_GITSTATUS_LOCK_FD_$name + local client_pid_var=_GITSTATUS_CLIENT_PID_$name + local daemon_pid_var=GITSTATUS_DAEMON_PID_$name + local inflight_var=_GITSTATUS_NUM_INFLIGHT_$name + local file_prefix_var=_GITSTATUS_FILE_PREFIX_$name + local dirty_max_index_size_var=_GITSTATUS_DIRTY_MAX_INDEX_SIZE_$name + + local req_fd=${(P)req_fd_var} + local resp_fd=${(P)resp_fd_var} + local lock_fd=${(P)lock_fd_var} + local daemon_pid=${(P)daemon_pid_var} + local file_prefix=${(P)file_prefix_var} + + local cleanup=_gitstatus_cleanup_$name-$fsuf + local process=_gitstatus_process_response_$name-$fsuf + + if (( $+functions[$cleanup] )); then + add-zsh-hook -d zshexit $cleanup + unfunction -- $cleanup + fi + + if (( $+functions[$process] )); then + [[ -n $resp_fd ]] && zle -F $resp_fd + unfunction -- $process + fi + + [[ $daemon_pid == <1-> ]] && kill -- -$daemon_pid 2>/dev/null + [[ $file_prefix == /* ]] && zf_rm -f -- $file_prefix.lock $file_prefix.fifo + [[ $lock_fd == <1-> ]] && zsystem flock -u $lock_fd + [[ $req_fd == <1-> ]] && exec {req_fd}>&- + [[ $resp_fd == <1-> ]] && exec {resp_fd}>&- + + unset $state_var $req_fd_var $lock_fd_var $resp_fd_var $client_pid_var $daemon_pid_var + unset $inflight_var $file_prefix_var $dirty_max_index_size_var + + unset VCS_STATUS_RESULT + _gitstatus_clear$fsuf +} + +# Usage: gitstatus_check NAME. +# +# Returns 0 if and only if `gitstatus_start NAME` has succeeded previously. +# If it returns non-zero, gitstatus_query NAME is guaranteed to return non-zero. +function gitstatus_check"${1:-}"() { + emulate -L zsh -o no_aliases -o extended_glob -o typeset_silent + + local fsuf=${${(%):-%N}#gitstatus_check} + + if (( ARGC != 1 )); then + print -ru2 -- "gitstatus_check: exactly one positional argument is required" + return 1 + fi + + local name=$1 + if [[ $name != [[:IDENT:]]## ]]; then + print -ru2 -- "gitstatus_check: invalid positional argument: $name" + return 1 + fi + + (( _GITSTATUS_STATE_$name == 2 )) +} + +(( ${#_gitstatus_opts} )) && setopt ${_gitstatus_opts[@]} +'builtin' 'unset' '_gitstatus_opts' diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.sh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.sh new file mode 100644 index 0000000..8ee28de --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.sh @@ -0,0 +1,104 @@ +# Simple Bash prompt with Git status. + +# Source gitstatus.plugin.sh from $GITSTATUS_DIR or from the same directory +# in which the current script resides if the variable isn't set. +if [[ -n "${GITSTATUS_DIR:-}" ]]; then + source "$GITSTATUS_DIR" || return +elif [[ "${BASH_SOURCE[0]}" == */* ]]; then + source "${BASH_SOURCE[0]%/*}/gitstatus.plugin.sh" || return +else + source gitstatus.plugin.sh || return +fi + +# Sets GITSTATUS_PROMPT to reflect the state of the current git repository. +# The value is empty if not in a git repository. Forwards all arguments to +# gitstatus_query. +# +# Example value of GITSTATUS_PROMPT: master ⇣42⇡42 ⇠42⇢42 *42 merge ~42 +42 !42 ?42 +# +# master current branch +# ⇣42 local branch is 42 commits behind the remote +# ⇡42 local branch is 42 commits ahead of the remote +# ⇠42 local branch is 42 commits behind the push remote +# ⇢42 local branch is 42 commits ahead of the push remote +# *42 42 stashes +# merge merge in progress +# ~42 42 merge conflicts +# +42 42 staged changes +# !42 42 unstaged changes +# ?42 42 untracked files +function gitstatus_prompt_update() { + GITSTATUS_PROMPT="" + + gitstatus_query "$@" || return 1 # error + [[ "$VCS_STATUS_RESULT" == ok-sync ]] || return 0 # not a git repo + + local reset=$'\001\e[0m\002' # no color + local clean=$'\001\e[38;5;076m\002' # green foreground + local untracked=$'\001\e[38;5;014m\002' # teal foreground + local modified=$'\001\e[38;5;011m\002' # yellow foreground + local conflicted=$'\001\e[38;5;196m\002' # red foreground + + local p + + local where # branch name, tag or commit + if [[ -n "$VCS_STATUS_LOCAL_BRANCH" ]]; then + where="$VCS_STATUS_LOCAL_BRANCH" + elif [[ -n "$VCS_STATUS_TAG" ]]; then + p+="${reset}#" + where="$VCS_STATUS_TAG" + else + p+="${reset}@" + where="${VCS_STATUS_COMMIT:0:8}" + fi + + (( ${#where} > 32 )) && where="${where:0:12}…${where: -12}" # truncate long branch names and tags + p+="${clean}${where}" + + # ⇣42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && p+=" ${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 )) && p+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && p+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" + # ⇠42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && p+=" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && p+=" " + # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && p+="${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && p+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n "$VCS_STATUS_ACTION" ]] && p+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && p+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && p+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && p+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + (( VCS_STATUS_NUM_UNTRACKED )) && p+=" ${untracked}?${VCS_STATUS_NUM_UNTRACKED}" + + GITSTATUS_PROMPT="${p}${reset}" +} + +# Start gitstatusd in the background. +gitstatus_stop && gitstatus_start -s -1 -u -1 -c -1 -d -1 + +# On every prompt, fetch git status and set GITSTATUS_PROMPT. +PROMPT_COMMAND=gitstatus_prompt_update +PROMPT_DIRTRIM=3 + +# Enable promptvars so that ${GITSTATUS_PROMPT} in PS1 is expanded. +shopt -s promptvars + +# Customize prompt. Put $GITSTATUS_PROMPT in it reflect git status. +# +# Example: +# +# user@host ~/projects/skynet master ⇡42 +# $ █ +PS1='\[\033[01;32m\]\u@\h\[\033[00m\] ' # green user@host +PS1+='\[\033[01;34m\]\w\[\033[00m\]' # blue current working directory +PS1+='${GITSTATUS_PROMPT:+ $GITSTATUS_PROMPT}' # git status (requires promptvars option) +PS1+='\n\[\033[01;$((31+!$?))m\]\$\[\033[00m\] ' # green/red (success/error) $/# (normal/root) +PS1+='\[\e]0;\u@\h: \w\a\]' # terminal title: user@host: dir diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.zsh b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.zsh new file mode 100644 index 0000000..6ad6485 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/gitstatus.prompt.zsh @@ -0,0 +1,111 @@ +# Simple Zsh prompt with Git status. + +# Source gitstatus.plugin.zsh from $GITSTATUS_DIR or from the same directory +# in which the current script resides if the variable isn't set. +source "${GITSTATUS_DIR:-${${(%):-%x}:h}}/gitstatus.plugin.zsh" || return + +# Sets GITSTATUS_PROMPT to reflect the state of the current git repository. Empty if not +# in a git repository. In addition, sets GITSTATUS_PROMPT_LEN to the number of columns +# $GITSTATUS_PROMPT will occupy when printed. +# +# Example: +# +# GITSTATUS_PROMPT='master ⇣42⇡42 ⇠42⇢42 *42 merge ~42 +42 !42 ?42' +# GITSTATUS_PROMPT_LEN=39 +# +# master current branch +# ⇣42 local branch is 42 commits behind the remote +# ⇡42 local branch is 42 commits ahead of the remote +# ⇠42 local branch is 42 commits behind the push remote +# ⇢42 local branch is 42 commits ahead of the push remote +# *42 42 stashes +# merge merge in progress +# ~42 42 merge conflicts +# +42 42 staged changes +# !42 42 unstaged changes +# ?42 42 untracked files +function gitstatus_prompt_update() { + emulate -L zsh + typeset -g GITSTATUS_PROMPT='' + typeset -gi GITSTATUS_PROMPT_LEN=0 + + # Call gitstatus_query synchronously. Note that gitstatus_query can also be called + # asynchronously; see documentation in gitstatus.plugin.zsh. + gitstatus_query 'MY' || return 1 # error + [[ $VCS_STATUS_RESULT == 'ok-sync' ]] || return 0 # not a git repo + + local clean='%76F' # green foreground + local modified='%178F' # yellow foreground + local untracked='%39F' # blue foreground + local conflicted='%196F' # red foreground + + local p + + local where # branch name, tag or commit + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + where=$VCS_STATUS_LOCAL_BRANCH + elif [[ -n $VCS_STATUS_TAG ]]; then + p+='%f#' + where=$VCS_STATUS_TAG + else + p+='%f@' + where=${VCS_STATUS_COMMIT[1,8]} + fi + + (( $#where > 32 )) && where[13,-13]="…" # truncate long branch names and tags + p+="${clean}${where//\%/%%}" # escape % + + # ⇣42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && p+=" ${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 )) && p+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && p+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" + # ⇠42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && p+=" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && p+=" " + # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && p+="${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && p+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n $VCS_STATUS_ACTION ]] && p+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && p+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && p+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && p+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + (( VCS_STATUS_NUM_UNTRACKED )) && p+=" ${untracked}?${VCS_STATUS_NUM_UNTRACKED}" + + GITSTATUS_PROMPT="${p}%f" + + # The length of GITSTATUS_PROMPT after removing %f and %F. + GITSTATUS_PROMPT_LEN="${(m)#${${GITSTATUS_PROMPT//\%\%/x}//\%(f|<->F)}}" +} + +# Start gitstatusd instance with name "MY". The same name is passed to +# gitstatus_query in gitstatus_prompt_update. The flags with -1 as values +# enable staged, unstaged, conflicted and untracked counters. +gitstatus_stop 'MY' && gitstatus_start -s -1 -u -1 -c -1 -d -1 'MY' + +# On every prompt, fetch git status and set GITSTATUS_PROMPT. +autoload -Uz add-zsh-hook +add-zsh-hook precmd gitstatus_prompt_update + +# Enable/disable the right prompt options. +setopt no_prompt_bang prompt_percent prompt_subst + +# Customize prompt. Put $GITSTATUS_PROMPT in it to reflect git status. +# +# Example: +# +# user@host ~/projects/skynet master ⇡42 +# % █ +# +# The current directory gets truncated from the left if the whole prompt doesn't fit on the line. +PROMPT='%70F%n@%m%f ' # green user@host +PROMPT+='%39F%$((-GITSTATUS_PROMPT_LEN-1))<…<%~%<<%f' # blue current working directory +PROMPT+='${GITSTATUS_PROMPT:+ $GITSTATUS_PROMPT}' # git status +PROMPT+=$'\n' # new line +PROMPT+='%F{%(?.76.196)}%#%f ' # %/# (normal/root); green/red (ok/error) diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install.info b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install.info new file mode 100644 index 0000000..45807be --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/install.info @@ -0,0 +1,34 @@ +# 3 +# +# This file is used by ./install and indirectly by shell bindings. +# +# The first line is read by powerlevel10k instant prompt. It must +# be updated whenever the content of this file changes. The actual +# value doesn't matter as long as it's unique. Consecutive integers +# work fine. + +# Official gitstatusd binaries. +uname_s_glob="cygwin_nt-10.0"; uname_m_glob="i686"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="5a8a809dcebdb6aa9b47d37e086c0485424a9d9c136770eec3c26cedf5bb75e3"; +uname_s_glob="cygwin_nt-10.0"; uname_m_glob="x86_64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.1"; sha256="c84cade0d6b86e04c27a6055f45851f6b46d6b88ba58772f7ca8ef4d295c800f"; +uname_s_glob="darwin"; uname_m_glob="arm64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="eae979e990ca37c56ee39fadd0c3f392cbbd0c6bdfb9a603010be60d9e48910a"; +uname_s_glob="darwin"; uname_m_glob="x86_64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="9fd3913ec1b6b856ab6e08a99a2343f0e8e809eb6b62ca4b0963163656c668e6"; +uname_s_glob="freebsd"; uname_m_glob="amd64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="8e57ad642251e5acfa430aed82cd4ffe103db0bfadae4a15ccaf462c455d0442"; +uname_s_glob="linux"; uname_m_glob="aarch64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="32b57eb28bf6d80b280e4020a0045184f8ca897b20b570c12948aa6838673225"; +uname_s_glob="linux"; uname_m_glob="armv6l"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.1"; sha256="4bf5a0d0a082f544a48536ad3675930d5d2cc6a8cf906710045e0788f51192b3"; +uname_s_glob="linux"; uname_m_glob="armv7l"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.1"; sha256="2b9deb29f86c8209114b71b94fc2e1ed936a1658808a1bee46f4a82fd6a1f8cc"; +uname_s_glob="linux"; uname_m_glob="armv8l"; file="gitstatusd-${uname_s}-aarch64"; version="v1.5.4"; sha256="32b57eb28bf6d80b280e4020a0045184f8ca897b20b570c12948aa6838673225"; +uname_s_glob="linux"; uname_m_glob="i686"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="56d55e2e9a202d3072fa612d8fa1faa61243ffc86418a7fa64c2c9d9a82e0f64"; +uname_s_glob="linux"; uname_m_glob="ppc64le"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="1afd072c8c26ef6ec2d9ac11cef96c84cd6f10e859665a6ffcfb6112c758547e"; +uname_s_glob="linux"; uname_m_glob="x86_64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.4"; sha256="9633816e7832109e530c9e2532b11a1edae08136d63aa7e40246c0339b7db304"; +uname_s_glob="msys_nt-10.0"; uname_m_glob="i686"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.1"; sha256="7f9b849fc52e7a95b9b933e25121ad5ae990a1871aad6616922ad7bcf1eebf20"; +uname_s_glob="msys_nt-10.0"; uname_m_glob="x86_64"; file="gitstatusd-${uname_s}-${uname_m}"; version="v1.5.1"; sha256="5d3c626b5ee564dbc13ddba89752dc58b0efe925b26dbd8b2304849d9ba01732"; + +# Fallbacks to official gitstatusd binaries. +uname_s_glob="cygwin_nt-*"; uname_m_glob="i686"; file="gitstatusd-cygwin_nt-10.0-${uname_m}"; version="v1.5.2"; sha256="5a8a809dcebdb6aa9b47d37e086c0485424a9d9c136770eec3c26cedf5bb75e3"; +uname_s_glob="cygwin_nt-*"; uname_m_glob="x86_64"; file="gitstatusd-cygwin_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="c84cade0d6b86e04c27a6055f45851f6b46d6b88ba58772f7ca8ef4d295c800f"; +uname_s_glob="mingw32_nt-*"; uname_m_glob="i686"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="7f9b849fc52e7a95b9b933e25121ad5ae990a1871aad6616922ad7bcf1eebf20"; +uname_s_glob="mingw32_nt-*"; uname_m_glob="x86_64"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="5d3c626b5ee564dbc13ddba89752dc58b0efe925b26dbd8b2304849d9ba01732"; +uname_s_glob="mingw64_nt-*"; uname_m_glob="i686"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="7f9b849fc52e7a95b9b933e25121ad5ae990a1871aad6616922ad7bcf1eebf20"; +uname_s_glob="mingw64_nt-*"; uname_m_glob="x86_64"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="5d3c626b5ee564dbc13ddba89752dc58b0efe925b26dbd8b2304849d9ba01732"; +uname_s_glob="msys_nt-*"; uname_m_glob="i686"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="7f9b849fc52e7a95b9b933e25121ad5ae990a1871aad6616922ad7bcf1eebf20"; +uname_s_glob="msys_nt-*"; uname_m_glob="x86_64"; file="gitstatusd-msys_nt-10.0-${uname_m}"; version="v1.5.1"; sha256="5d3c626b5ee564dbc13ddba89752dc58b0efe925b26dbd8b2304849d9ba01732"; diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/readonly_gitstatus.plugin.zsh.zwc b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/readonly_gitstatus.plugin.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..b3359741d62aede84e0129a38021365a148fec91 GIT binary patch literal 63216 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
YiOaSWpr3{w~2AE=usi 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 z zeX;r?v@7p+;)MtPB@tKN?R4ecPQjITJMnU|je4)wm3KQO-xhV{-A?8mQdi#Xq}Qk< zUr~1D-A=Wy?3(JmHPyEv@g5xWGMX#zcB0TGU$0m9+NWv_zVdD-_dY=X7ABu$SKjT^ Nqx-x6kKXO{{{YR7f1CgS literal 0 HcmV?d00001 diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/algorithm.h b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/algorithm.h new file mode 100644 index 0000000..b87b13f --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/algorithm.h @@ -0,0 +1,37 @@ +// Copyright 2019 Roman Perepelitsa. +// +// This file is part of GitStatus. +// +// GitStatus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GitStatus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with GitStatus. If not, see . + +#ifndef ROMKATV_GITSTATUS_ALGORITHM_H_ +#define ROMKATV_GITSTATUS_ALGORITHM_H_ + +#include + +namespace gitstatus { + +// Requires: Iter is a BidirectionalIterator. +// +// Returns iterator pointing to the last value in [begin, end) that compares equal to the value, or +// begin if none compare equal. +template +Iter FindLast(Iter begin, Iter end, const T& val) { + while (begin != end && !(*--end == val)) {} + return end; +} + +} // namespace gitstatus + +#endif // ROMKATV_GITSTATUS_ALGORITHM_H_ diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.cc b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.cc new file mode 100644 index 0000000..4c13763 --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.cc @@ -0,0 +1,118 @@ +// Copyright 2019 Roman Perepelitsa. +// +// This file is part of GitStatus. +// +// GitStatus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GitStatus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with GitStatus. If not, see . + +#include "arena.h" + +#include +#include + +#include "bits.h" +#include "check.h" + +namespace gitstatus { + +namespace { + +size_t Clamp(size_t min, size_t val, size_t max) { return std::min(max, std::max(min, val)); } + +static const uintptr_t kSingularity = reinterpret_cast(&kSingularity); + +} // namespace + +// Triple singularity. We are all fucked. +Arena::Block Arena::g_empty_block = {kSingularity, kSingularity, kSingularity}; + +Arena::Arena(Arena::Options opt) : opt_(std::move(opt)), top_(&g_empty_block) { + CHECK(opt_.min_block_size <= opt_.max_block_size); +} + +Arena::Arena(Arena&& other) : Arena() { *this = std::move(other); } + +Arena::~Arena() { + // See comments in Makefile for the reason sized deallocation is not used. + for (const Block& b : blocks_) ::operator delete(reinterpret_cast(b.start)); +} + +Arena& Arena::operator=(Arena&& other) { + if (this != &other) { + // In case std::vector ever gets small object optimization. + size_t idx = other.reusable_ ? other.top_ - other.blocks_.data() : 0; + opt_ = other.opt_; + blocks_ = std::move(other.blocks_); + reusable_ = other.reusable_; + top_ = reusable_ ? blocks_.data() + idx : &g_empty_block; + other.blocks_.clear(); + other.reusable_ = 0; + other.top_ = &g_empty_block; + } + return *this; +} + +void Arena::Reuse(size_t num_blocks) { + reusable_ = std::min(reusable_, num_blocks); + for (size_t i = reusable_; i != blocks_.size(); ++i) { + const Block& b = blocks_[i]; + // See comments in Makefile for the reason sized deallocation is not used. + ::operator delete(reinterpret_cast(b.start)); + } + blocks_.resize(reusable_); + if (reusable_) { + top_ = blocks_.data(); + top_->tip = top_->start; + } else { + top_ = &g_empty_block; + } +} + +void Arena::AddBlock(size_t size, size_t alignment) { + if (alignment > alignof(std::max_align_t)) { + size += alignment - 1; + } else { + size = std::max(size, alignment); + } + if (size <= top_->size() && top_ < blocks_.data() + reusable_ - 1) { + assert(blocks_.front().size() == top_->size()); + ++top_; + top_->tip = top_->start; + return; + } + if (size <= opt_.max_alloc_threshold) { + size = + std::max(size, Clamp(opt_.min_block_size, NextPow2(top_->size() + 1), opt_.max_block_size)); + } + + auto p = reinterpret_cast(::operator new(size)); + blocks_.push_back(Block{p, p, p + size}); + if (reusable_) { + if (size < blocks_.front().size()) { + top_ = &blocks_.back(); + return; + } + if (size > blocks_.front().size()) reusable_ = 0; + } + std::swap(blocks_.back(), blocks_[reusable_]); + top_ = &blocks_[reusable_++]; +} + +void* Arena::AllocateSlow(size_t size, size_t alignment) { + assert(alignment && !(alignment & (alignment - 1))); + AddBlock(size, alignment); + assert(Align(top_->tip, alignment) + size <= top_->end); + return Allocate(size, alignment); +} + +} // namespace gitstatus diff --git a/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.h b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.h new file mode 100644 index 0000000..569833c --- /dev/null +++ b/private_dot_config/oh-my-zsh/custom/themes/powerlevel10k/gitstatus/src/arena.h @@ -0,0 +1,273 @@ +// Copyright 2019 Roman Perepelitsa. +// +// This file is part of GitStatus. +// +// GitStatus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GitStatus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with GitStatus. If not, see . + +#ifndef ROMKATV_GITSTATUS_ARENA_H_ +#define ROMKATV_GITSTATUS_ARENA_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "string_view.h" + +namespace gitstatus { + +// Thread-compatible. Very fast and very flexible w.r.t. allocation size and alignment. +// +// Natural API extensions: +// +// // Donates a block to the arena. When the time comes, it'll be freed with +// // free(p, size, userdata). +// void Donate(void* p, size_t size, void* userdata, void(*free)(void*, size_t, void*)); +class Arena { + public: + struct Options { + // The first call to Allocate() will allocate a block of this size. There is one exception when + // the first requested allocation size is larger than this limit. Subsequent blocks will be + // twice as large as the last until they saturate at max_block_size. + size_t min_block_size = 64; + + // Allocate blocks at most this large. There is one exception when the requested allocation + // size is larger than this limit. + size_t max_block_size = 8 << 10; + + // When the size of the first allocation in a block is larger than this threshold, the block + // size will be equal to the allocation size. This is meant to reduce memory waste when making + // many allocations with sizes slightly over max_block_size / 2. With max_alloc_threshold equal + // to max_block_size / N, the upper bound on wasted memory when making many equally-sized + // allocations is 100.0 / (N + 1) percent. When making allocations of different sizes, the upper + // bound on wasted memory is 50%. + size_t max_alloc_threshold = 1 << 10; + + // Natural extensions: + // + // void* userdata; + // void (*alloc)(size_t size, size_t alignment, void* userdata); + // void (*free)(void* p, size_t size, void* userdata); + }; + + // Requires: opt.min_block_size <= opt.max_block_size. + // + // Doesn't allocate any memory. + Arena(Options opt); + Arena() : Arena(Options()) {} + Arena(Arena&&); + ~Arena(); + + Arena& operator=(Arena&& other); + + // Requires: alignment is a power of 2. + // + // Result is never null and always aligned. If size is zero, the result may be equal to the last. + // Alignment above alignof(std::max_align_t) is supported. There is no requirement for alignment + // to be less than size or to divide it. + inline void* Allocate(size_t size, size_t alignment) { + assert(alignment && !(alignment & (alignment - 1))); + uintptr_t p = Align(top_->tip, alignment); + uintptr_t e = p + size; + if (e <= top_->end) { + top_->tip = e; + return reinterpret_cast(p); + } + return AllocateSlow(size, alignment); + } + + template + inline T* Allocate(size_t n) { + static_assert(!std::is_reference(), ""); + return static_cast(Allocate(n * sizeof(T), alignof(T))); + } + + template + inline T* Allocate() { + return Allocate(1); + } + + inline char* MemDup(const char* p, size_t len) { + char* res = Allocate(len); + std::memcpy(res, p, len); + return res; + } + + // Copies the null-terminated string (including the trailing null character) to the arena and + // returns a pointer to the copy. + inline char* StrDup(const char* s) { + size_t len = std::strlen(s); + return MemDup(s, len + 1); + } + + // Guarantees: !StrDup(p, len)[len]. + inline char* StrDup(const char* p, size_t len) { + char* res = Allocate(len + 1); + std::memcpy(res, p, len); + res[len] = 0; + return res; + } + + // Guarantees: !StrDup(s)[s.len]. + inline char* StrDup(StringView s) { + return StrDup(s.ptr, s.len); + } + + template + inline char* StrCat(const Ts&... ts) { + return [&](std::initializer_list ss) { + size_t len = 0; + for (StringView s : ss) len += s.len; + char* p = Allocate(len + 1); + for (StringView s : ss) { + std::memcpy(p, s.ptr, s.len); + p += s.len; + } + *p = 0; + return p - len; + }({ts...}); + } + + // Copies/moves `val` to the arena and returns a pointer to it. + template + inline std::remove_const_t>* Dup(T&& val) { + return DirectInit>>(std::forward(val)); + } + + // The same as `new T{args...}` but on the arena. + template + inline T* DirectInit(Args&&... args) { + T* res = Allocate(); + ::new (const_cast(static_cast(res))) T(std::forward(args)...); + return res; + } + + // The same as `new T(args...)` but on the arena. + template + inline T* BraceInit(Args&&... args) { + T* res = Allocate(); + ::new (const_cast(static_cast(res))) T{std::forward(args)...}; + return res; + } + + // Tip() and TipSize() allow you to allocate the remainder of the current block. They can be + // useful if you are flexible w.r.t. the allocation size. + // + // Invariant: + // + // const void* tip = Tip(); + // void* p = Allocate(TipSize(), 1); // grab the remainder of the current block + // assert(p == tip); + const void* Tip() const { return reinterpret_cast(top_->tip); } + size_t TipSize() const { return top_->end - top_->tip; } + + // Invalidates all allocations (without running destructors of allocated objects) and frees all + // blocks except at most the specified number of blocks. The retained blocks will be used to + // fulfil future allocation requests. + void Reuse(size_t num_blocks = std::numeric_limits::max()); + + private: + struct Block { + size_t size() const { return end - start; } + uintptr_t start; + uintptr_t tip; + uintptr_t end; + }; + + inline static size_t Align(size_t n, size_t m) { return (n + m - 1) & ~(m - 1); }; + + void AddBlock(size_t size, size_t alignment); + bool ReuseBlock(size_t size, size_t alignment); + + __attribute__((noinline)) void* AllocateSlow(size_t size, size_t alignment); + + Options opt_; + std::vector blocks_; + // Invariant: !blocks_.empty() <= reusable_ && reusable_ <= blocks_.size(). + size_t reusable_ = 0; + // Invariant: (top_ == &g_empty_block) == blocks_.empty(). + // Invariant: blocks_.empty() || top_ == &blocks_.back() || top_ < blocks_.data() + reusable_. + Block* top_; + + static Block g_empty_block; +}; + +// Copies of ArenaAllocator use the same thread-compatible Arena without synchronization. +template +class ArenaAllocator { + public: + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = size_t; + using difference_type = ptrdiff_t; + using propagate_on_container_move_assignment = std::true_type; + template + struct rebind { + using other = ArenaAllocator; + }; + using is_always_equal = std::false_type; + + ArenaAllocator(Arena* arena = nullptr) : arena_(*arena) {} + + Arena& arena() const { return arena_; } + + pointer address(reference x) const { return &x; } + const_pointer address(const_reference x) const { return &x; } + pointer allocate(size_type n, const void* hint = nullptr) { return arena_.Allocate(n); } + void deallocate(T* p, std::size_t n) {} + size_type max_size() const { return std::numeric_limits::max() / sizeof(value_type); } + + template + void construct(U* p, Args&&... args) { + ::new (const_cast(static_cast(p))) U(std::forward(args)...); + } + + template + void destroy(U* p) { + p->~U(); + } + + bool operator==(const ArenaAllocator& other) const { return &arena_ == &other.arena_; } + bool operator!=(const ArenaAllocator& other) const { return &arena_ != &other.arena_; } + + private: + Arena& arena_; +}; + +template +struct LazyWithArena; + +template