commit 908a23c7b56be637e01e95314c2c260acb2b1da9 Author: Oliver Weyhmueller Date: Thu Jan 27 17:00:02 2022 +0100 Initial Commit diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml new file mode 100644 index 0000000..bb16d26 --- /dev/null +++ b/checkstyle/checkstyle.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle/intellij-java-google-style.xml b/checkstyle/intellij-java-google-style.xml new file mode 100644 index 0000000..369157b --- /dev/null +++ b/checkstyle/intellij-java-google-style.xml @@ -0,0 +1,598 @@ + + + + + + diff --git a/dot_ackrc b/dot_ackrc new file mode 100644 index 0000000..78bf167 --- /dev/null +++ b/dot_ackrc @@ -0,0 +1,11 @@ +# Search +--type-set=coffee=.coffee +--type-set=cucumber=.feature +--type-set=haml=.haml +--type-set=sass=.sass,.scss +--type-set=markdown=.md,.mark,.markdown + +# Don't search +--ignore-dir=log +--ignore-dir=tags +--ignore-dir=tmp diff --git a/dot_aliases b/dot_aliases new file mode 100644 index 0000000..1574cfa --- /dev/null +++ b/dot_aliases @@ -0,0 +1,71 @@ +# task config with dropbox +alias task="task rc:/Users/oliver/Dropbox/tasks/.taskrc" + +# use own ssh ca with httpie +alias https="https --verify=${HOME}/.ssl/cacert.pem" + +# Use `hub` as our git wrapper: +# http://defunkt.github.com/hub/ +hub_path=$(which hub 2>/dev/null) +if (( $+commands[hub] )) +then + alias git=$hub_path +fi + +ack_path=$(which ack-grep 2>/dev/null) +if (( $+commands[ack-grep] )) +then + alias ack=$ack_path +fi + +LSCMD="ls -G" +if $(gls &>/dev/null) +then + LSCMD="gls --color" +fi +\ls --help &>/dev/null + +if [ $? -eq 0 ] +then + LSCMD="ls --color" +fi +exa_path=$(which exa 2>/dev/null) +if (( $+commands[exa] )) +then + LSCMD=$exa_path + alias ls="$LSCMD -F" + alias dir="$LSCMD -lt | most" +else + + alias ls="$LSCMD -Fh" + alias dir="$LSCMD -lht | most" +fi +alias bd="bd -s" + +alias grep="grep --color=auto" +alias fgrep="fgrep --color=auto" +alias egrep="egrep --color=auto" + +# be faster aliase +alias ..='cd ..' +alias cd..='cd ..' +alias ...='cd ../..' +alias cd...='cd ../..' +alias cls='clear' +alias df='df -h' + +# Unix +alias tlf="tail -f" +alias ln='ln -v' +alias mkdir='mkdir -p' + +alias -g LIN='| wc -l' +alias -g ONE="| awk '{ print \$1}'" +alias -g TWO="| awk '{ print \$2}'" +alias -g THREE="| awk '{ print \$3}'" +alias -g FOUR="| awk '{ print \$4}'" +alias -g FIVE="| awk '{ print \$5}'" +alias -g SIX="| awk '{ print \$6}'" +alias -g SEVEN="| awk '{ print \$7}'" +alias -g EIGHT="| awk '{ print \$8}'" +alias -g NINE="| awk '{ print \$9}'" diff --git a/dot_dircolors b/dot_dircolors new file mode 100644 index 0000000..cfb2be7 --- /dev/null +++ b/dot_dircolors @@ -0,0 +1,267 @@ + +# Dark 256 color solarized theme for the color GNU ls utility. +# Used and tested with dircolors (GNU coreutils) 8.5 +# +# @author {@link http://sebastian.tramp.name Sebastian Tramp} +# @license http://sam.zoy.org/wtfpl/ Do What The Fuck You Want To Public +# License (WTFPL) +# +# More Information at +# https://github.com/seebi/dircolors-solarized + +# Term Section +TERM Eterm +TERM ansi +TERM color-xterm +TERM con132x25 +TERM con132x30 +TERM con132x43 +TERM con132x60 +TERM con80x25 +TERM con80x28 +TERM con80x30 +TERM con80x43 +TERM con80x50 +TERM con80x60 +TERM cons25 +TERM console +TERM cygwin +TERM dtterm +TERM eterm-color +TERM gnome +TERM gnome-256color +TERM jfbterm +TERM konsole +TERM kterm +TERM linux +TERM linux-c +TERM mach-color +TERM mlterm +TERM putty +TERM rxvt +TERM rxvt-256color +TERM rxvt-cygwin +TERM rxvt-cygwin-native +TERM rxvt-unicode +TERM rxvt-unicode256 +TERM rxvt-unicode-256color +TERM screen +TERM screen-256color +TERM screen-256color-bce +TERM screen-256color-s +TERM screen-bce +TERM screen-w +TERM screen.linux +TERM vt100 +TERM xterm +TERM xterm-16color +TERM xterm-256color +TERM xterm-88color +TERM xterm-color +TERM xterm-debian + +## Documentation +# +# standard colors +# +# Below are the color init strings for the basic file types. A color init +# string consists of one or more of the following numeric codes: +# Attribute codes: +# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed +# Text color codes: +# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white +# Background color codes: +# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white +# +# +# 256 color support +# see here: http://www.mail-archive.com/bug-coreutils@gnu.org/msg11030.html) +# +# Text 256 color coding: +# 38;5;COLOR_NUMBER +# Background 256 color coding: +# 48;5;COLOR_NUMBER + +## Special files + +NORMAL 00;38;5;244 # no color code at all +#FILE 00 # regular file: use no color at all +RESET 0 # reset to "normal" color +DIR 00;38;5;33 # directory 01;34 +LINK 01;38;5;37 # symbolic link. (If you set this to 'target' instead of a + # numerical value, the color is as for the file pointed to.) +MULTIHARDLINK 00 # regular file with more than one link +FIFO 48;5;230;38;5;136;01 # pipe +SOCK 48;5;230;38;5;136;01 # socket +DOOR 48;5;230;38;5;136;01 # door +BLK 48;5;230;38;5;244;01 # block device driver +CHR 48;5;230;38;5;244;01 # character device driver +ORPHAN 48;5;235;38;5;160 # symlink to nonexistent file, or non-stat'able file +SETUID 48;5;160;38;5;230 # file that is setuid (u+s) +SETGID 48;5;136;38;5;230 # file that is setgid (g+s) +CAPABILITY 30;41 # file with capability +STICKY_OTHER_WRITABLE 48;5;64;38;5;230 # dir that is sticky and other-writable (+t,o+w) +OTHER_WRITABLE 48;5;235;38;5;33 # dir that is other-writable (o+w) and not sticky +STICKY 48;5;33;38;5;230 # dir with the sticky bit set (+t) and not other-writable +# This is for files with execute permission: +EXEC 01;38;5;64 + +## Archives or compressed (violet + bold for compression) +.tar 00;38;5;61 +.tgz 01;38;5;61 +.arj 01;38;5;61 +.taz 01;38;5;61 +.lzh 01;38;5;61 +.lzma 01;38;5;61 +.tlz 01;38;5;61 +.txz 01;38;5;61 +.zip 01;38;5;61 +.z 01;38;5;61 +.Z 01;38;5;61 +.dz 01;38;5;61 +.gz 01;38;5;61 +.lz 01;38;5;61 +.xz 01;38;5;61 +.bz2 01;38;5;61 +.bz 01;38;5;61 +.tbz 01;38;5;61 +.tbz2 01;38;5;61 +.tz 01;38;5;61 +.deb 01;38;5;61 +.rpm 01;38;5;61 +.jar 01;38;5;61 +.rar 01;38;5;61 +.ace 01;38;5;61 +.zoo 01;38;5;61 +.cpio 01;38;5;61 +.7z 01;38;5;61 +.rz 01;38;5;61 +.apk 01;38;5;61 +.gem 01;38;5;61 + +# Image formats (yellow) +.jpg 00;38;5;136 +.JPG 00;38;5;136 #stupid but needed +.jpeg 00;38;5;136 +.gif 00;38;5;136 +.bmp 00;38;5;136 +.pbm 00;38;5;136 +.pgm 00;38;5;136 +.ppm 00;38;5;136 +.tga 00;38;5;136 +.xbm 00;38;5;136 +.xpm 00;38;5;136 +.tif 00;38;5;136 +.tiff 00;38;5;136 +.png 00;38;5;136 +.svg 00;38;5;136 +.svgz 00;38;5;136 +.mng 00;38;5;136 +.pcx 00;38;5;136 +.dl 00;38;5;136 +.xcf 00;38;5;136 +.xwd 00;38;5;136 +.yuv 00;38;5;136 +.cgm 00;38;5;136 +.emf 00;38;5;136 +.eps 00;38;5;136 +.CR2 00;38;5;136 +.ico 00;38;5;136 + +# Files of special interest (base1 + bold) +.tex 01;38;5;245 +.rdf 01;38;5;245 +.owl 01;38;5;245 +.n3 01;38;5;245 +.ttl 01;38;5;245 +.nt 01;38;5;245 +.torrent 01;38;5;245 +.xml 01;38;5;245 +*Makefile 01;38;5;245 +*Rakefile 01;38;5;245 +*build.xml 01;38;5;245 +*rc 01;38;5;245 +*1 01;38;5;245 +.nfo 01;38;5;245 +*README 01;38;5;245 +*README.txt 01;38;5;245 +*readme.txt 01;38;5;245 +.md 01;38;5;245 +*README.markdown 01;38;5;245 +.ini 01;38;5;245 +.yml 01;38;5;245 +.cfg 01;38;5;245 +.conf 01;38;5;245 +.c 01;38;5;245 +.cpp 01;38;5;245 +.cc 01;38;5;245 + +# "unimportant" files as logs and backups (base01) +.log 00;38;5;240 +.bak 00;38;5;240 +.aux 00;38;5;240 +.bbl 00;38;5;240 +.blg 00;38;5;240 +*~ 00;38;5;240 +*# 00;38;5;240 +.part 00;38;5;240 +.incomplete 00;38;5;240 +.swp 00;38;5;240 +.tmp 00;38;5;240 +.temp 00;38;5;240 +.o 00;38;5;240 +.pyc 00;38;5;240 +.class 00;38;5;240 +.cache 00;38;5;240 + +# Audio formats (orange) +.aac 00;38;5;166 +.au 00;38;5;166 +.flac 00;38;5;166 +.mid 00;38;5;166 +.midi 00;38;5;166 +.mka 00;38;5;166 +.mp3 00;38;5;166 +.mpc 00;38;5;166 +.ogg 00;38;5;166 +.ra 00;38;5;166 +.wav 00;38;5;166 +.m4a 00;38;5;166 +# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions +.axa 00;38;5;166 +.oga 00;38;5;166 +.spx 00;38;5;166 +.xspf 00;38;5;166 + +# Video formats (as audio + bold) +.mov 01;38;5;166 +.mpg 01;38;5;166 +.mpeg 01;38;5;166 +.m2v 01;38;5;166 +.mkv 01;38;5;166 +.ogm 01;38;5;166 +.mp4 01;38;5;166 +.m4v 01;38;5;166 +.mp4v 01;38;5;166 +.vob 01;38;5;166 +.qt 01;38;5;166 +.nuv 01;38;5;166 +.wmv 01;38;5;166 +.asf 01;38;5;166 +.rm 01;38;5;166 +.rmvb 01;38;5;166 +.flc 01;38;5;166 +.avi 01;38;5;166 +.fli 01;38;5;166 +.flv 01;38;5;166 +.gl 01;38;5;166 +.m2ts 01;38;5;166 +.divx 01;38;5;166 +.webm 01;38;5;166 +# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions +.axv 01;38;5;166 +.anx 01;38;5;166 +.ogv 01;38;5;166 +.ogx 01;38;5;166 + + diff --git a/dot_gitconfig b/dot_gitconfig new file mode 100644 index 0000000..7b2b8f3 --- /dev/null +++ b/dot_gitconfig @@ -0,0 +1,111 @@ +[user] + name = Oliver Weyhmueller + email = oliver@weyhmueller.de + username = weyhmueller + signingkey = 2ECE9419860C7C3CD1C65D2A5286794099F934A3 +[mergetool] + keepBackup = true +[difftool "Kaleidoscope"] + cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\" +[diff] + tool = Kaleidoscope +[difftool] + prompt = false +[mergetool "Kaleidoscope"] + cmd = ksdiff --merge --output \"$MERGED\" --base \"$BASE\" -- \"$LOCAL\" --snapshot \"$REMOTE\" --snapshot + trustExitCode = true +[merge] + tool = Kaleidoscope + +[init] + defaultBranch = main +[commit] + gpgsign = true +[push] + default = tracking +[color] + branch = auto + diff = auto + status = auto +[format] + pretty = %Cblue%h%Creset %Cgreen[%ar]%Creset (%an) %s +[merge] + log = true +[apply] + whitespace = fix +[alias] + ci = commit -v + create-branch = !sh -c 'git push origin HEAD:refs/heads/$1 && git fetch origin && git branch --track $1 origin/$1 && cd . && git checkout $1' - + delete-branch = !sh -c 'git push origin :refs/heads/$1 && git remote prune origin && git branch -D $1' - + merge-branch = !git checkout master && git merge @{-1} --ff-only + rebase-origin = !git fetch origin && git rebase origin/master + show-graph = log --graph --abbrev-commit --pretty=oneline + all = add -A + amend = commit --amend -C HEAD + credit = commit --amend --author "$1 <$2>" -C HEAD + delete-local-merged = branch -d `git branch --merged | grep -v '^*' | grep -v 'master'| tr -d '\n'` + promote = !~/bin/git-promote + rank-contributers = !~/bin/git-rank-contributers + undo = reset --soft HEAD^ + wtf = !~/bin/git-wtf + browse = !hub browse + w = !hub browse + compare = !hub compare + cia = !git add -A && git commit -av + s = status -s + p = !"git pull; git submodule foreach git pull origin master" + remotes = remote -v + ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate + ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat + lnc = log --pretty=format:"%h\\ %s\\ [%cn]" + lds = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short + ld = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=relative + le = log --oneline --decorate + filelog = log -u + fl = log -u + dl = "!git ll -1" + dlc = diff --cached HEAD^ + dr = "!f() { git diff "$1"^.."$1"; }; f" + lc = "!f() { git ll "$1"^.."$1"; }; f" + diffr = "!f() { git diff "$1"^.."$1"; }; f" + f = "!git ls-files | grep -i" + grep = grep -Ii + gr = grep -Ii + gra = "!f() { A=$(pwd) && TOPLEVEL=$(git rev-parse --show-toplevel) && cd $TOPLEVEL && git grep --full-name -In $1 | xargs -I{} echo $TOPLEVEL/{} && cd $A; }; f" + la = "!git config -l | grep alias | cut -c 7-" + done = "!f() { git branch | grep "$1" | cut -c 3- | grep -v done | xargs -I{} git branch -m {} done-{}; }; f" + assume = update-index --assume-unchanged + unassume = update-index --no-assume-unchanged + assumed = "!git ls-files -v | grep ^h | cut -c 3-" + unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged" + assumeall = "!git st -s | awk {'print $2'} | xargs git assume" + lasttag = describe --tags --abbrev=0 + lt = describe --tags --abbrev=0 + ours = "!f() { git co --ours $@ && git add $@; }; f" + theirs = "!f() { git co --theirs $@ && git add $@; }; f" + diff = diff --word-diff + dc = diff --cached + r = reset + r1 = reset HEAD^ + r2 = reset HEAD^^ + rh = reset --hard + rh1 = reset HEAD^ --hard + rh2 = reset HEAD^^ --hard + svnr = svn rebase + svnd = svn dcommit + svnl = svn log --oneline --show-commit + sl = stash list + sa = stash apply + ss = stash save +[core] + excludesfile = ~/.gitignore + autocrlf = input + attributesfile = ~/.gitattributes + # Treat spaces before tabs, lines that are indented with 8 or more spaces, and all kinds of trailing whitespace as an error + whitespace = space-before-tab,indent-with-non-tab,trailing-space + pager = +[gpg "x509"] + program = smimesign + +#[gpg] +# program = /usr/local/bin/gpg diff --git a/dot_gitignore b/dot_gitignore new file mode 100644 index 0000000..1092055 --- /dev/null +++ b/dot_gitignore @@ -0,0 +1,13 @@ +*.DS_Store +*.sw[nop] +.bundle +.sass-cache/ +db/*.sqlite3 +log/*.log +rerun.txt +tags +tmp/**/* +!tmp/cache/.keep +vendor/bundler_gems +vim/.netrwhist +zeus.json diff --git a/dot_gitmoji/gitmojis.json b/dot_gitmoji/gitmojis.json new file mode 100644 index 0000000..80fd62e --- /dev/null +++ b/dot_gitmoji/gitmojis.json @@ -0,0 +1 @@ +[{"emoji":"๐ŸŽจ","entity":"🎨","code":":art:","description":"Improve structure / format of the code.","name":"art","semver":null},{"emoji":"โšก๏ธ","entity":"⚡","code":":zap:","description":"Improve performance.","name":"zap","semver":"patch"},{"emoji":"๐Ÿ”ฅ","entity":"🔥","code":":fire:","description":"Remove code or files.","name":"fire","semver":null},{"emoji":"๐Ÿ›","entity":"🐛","code":":bug:","description":"Fix a bug.","name":"bug","semver":"patch"},{"emoji":"๐Ÿš‘","entity":"🚑","code":":ambulance:","description":"Critical hotfix.","name":"ambulance","semver":"patch"},{"emoji":"โœจ","entity":"✨","code":":sparkles:","description":"Introduce new features.","name":"sparkles","semver":"minor"},{"emoji":"๐Ÿ“","entity":"📝","code":":memo:","description":"Add or update documentation.","name":"memo","semver":null},{"emoji":"๐Ÿš€","entity":"🚀","code":":rocket:","description":"Deploy stuff.","name":"rocket","semver":null},{"emoji":"๐Ÿ’„","entity":"&#ff99cc;","code":":lipstick:","description":"Add or update the UI and style files.","name":"lipstick","semver":"patch"},{"emoji":"๐ŸŽ‰","entity":"🎉","code":":tada:","description":"Begin a project.","name":"tada","semver":null},{"emoji":"โœ…","entity":"✅","code":":white_check_mark:","description":"Add or update tests.","name":"white-check-mark","semver":null},{"emoji":"๐Ÿ”’","entity":"🔒","code":":lock:","description":"Fix security issues.","name":"lock","semver":"patch"},{"emoji":"๐Ÿ”–","entity":"🔖","code":":bookmark:","description":"Release / Version tags.","name":"bookmark","semver":null},{"emoji":"๐Ÿšจ","entity":"🚨","code":":rotating_light:","description":"Fix compiler / linter warnings.","name":"rotating-light","semver":null},{"emoji":"๐Ÿšง","entity":"🚧","code":":construction:","description":"Work in progress.","name":"construction","semver":null},{"emoji":"๐Ÿ’š","entity":"💚","code":":green_heart:","description":"Fix CI Build.","name":"green-heart","semver":null},{"emoji":"โฌ‡๏ธ","entity":"โฌ‡๏ธ","code":":arrow_down:","description":"Downgrade dependencies.","name":"arrow-down","semver":"patch"},{"emoji":"โฌ†๏ธ","entity":"โฌ†๏ธ","code":":arrow_up:","description":"Upgrade dependencies.","name":"arrow-up","semver":"patch"},{"emoji":"๐Ÿ“Œ","entity":"📌","code":":pushpin:","description":"Pin dependencies to specific versions.","name":"pushpin","semver":"patch"},{"emoji":"๐Ÿ‘ท","entity":"👷","code":":construction_worker:","description":"Add or update CI build system.","name":"construction-worker","semver":null},{"emoji":"๐Ÿ“ˆ","entity":"📈","code":":chart_with_upwards_trend:","description":"Add or update analytics or track code.","name":"chart-with-upwards-trend","semver":"patch"},{"emoji":"โ™ป๏ธ","entity":"♲","code":":recycle:","description":"Refactor code.","name":"recycle","semver":null},{"emoji":"โž•","entity":"➕","code":":heavy_plus_sign:","description":"Add a dependency.","name":"heavy-plus-sign","semver":"patch"},{"emoji":"โž–","entity":"➖","code":":heavy_minus_sign:","description":"Remove a dependency.","name":"heavy-minus-sign","semver":"patch"},{"emoji":"๐Ÿ”ง","entity":"🔧","code":":wrench:","description":"Add or update configuration files.","name":"wrench","semver":"patch"},{"emoji":"๐Ÿ”จ","entity":"🔨","code":":hammer:","description":"Add or update development scripts.","name":"hammer","semver":null},{"emoji":"๐ŸŒ","entity":"🌐","code":":globe_with_meridians:","description":"Internationalization and localization.","name":"globe-with-meridians","semver":"patch"},{"emoji":"โœ๏ธ","entity":"","code":":pencil2:","description":"Fix typos.","name":"pencil2","semver":"patch"},{"emoji":"๐Ÿ’ฉ","entity":"","code":":poop:","description":"Write bad code that needs to be improved.","name":"poop","semver":null},{"emoji":"โช","entity":"⏪","code":":rewind:","description":"Revert changes.","name":"rewind","semver":"patch"},{"emoji":"๐Ÿ”€","entity":"🔀","code":":twisted_rightwards_arrows:","description":"Merge branches.","name":"twisted-rightwards-arrows","semver":null},{"emoji":"๐Ÿ“ฆ","entity":"F4E6;","code":":package:","description":"Add or update compiled files or packages.","name":"package","semver":"patch"},{"emoji":"๐Ÿ‘ฝ","entity":"F47D;","code":":alien:","description":"Update code due to external API changes.","name":"alien","semver":"patch"},{"emoji":"๐Ÿšš","entity":"F69A;","code":":truck:","description":"Move or rename resources (e.g.: files, paths, routes).","name":"truck","semver":null},{"emoji":"๐Ÿ“„","entity":"F4C4;","code":":page_facing_up:","description":"Add or update license.","name":"page-facing-up","semver":null},{"emoji":"๐Ÿ’ฅ","entity":"💥","code":":boom:","description":"Introduce breaking changes.","name":"boom","semver":"major"},{"emoji":"๐Ÿฑ","entity":"F371","code":":bento:","description":"Add or update assets.","name":"bento","semver":"patch"},{"emoji":"โ™ฟ๏ธ","entity":"♿","code":":wheelchair:","description":"Improve accessibility.","name":"wheelchair","semver":"patch"},{"emoji":"๐Ÿ’ก","entity":"💡","code":":bulb:","description":"Add or update comments in source code.","name":"bulb","semver":null},{"emoji":"๐Ÿป","entity":"🍻","code":":beers:","description":"Write code drunkenly.","name":"beers","semver":null},{"emoji":"๐Ÿ’ฌ","entity":"💬","code":":speech_balloon:","description":"Add or update text and literals.","name":"speech-balloon","semver":"patch"},{"emoji":"๐Ÿ—ƒ","entity":"🗃","code":":card_file_box:","description":"Perform database related changes.","name":"card-file-box","semver":"patch"},{"emoji":"๐Ÿ”Š","entity":"🔊","code":":loud_sound:","description":"Add or update logs.","name":"loud-sound","semver":null},{"emoji":"๐Ÿ”‡","entity":"🔇","code":":mute:","description":"Remove logs.","name":"mute","semver":null},{"emoji":"๐Ÿ‘ฅ","entity":"👥","code":":busts_in_silhouette:","description":"Add or update contributor(s).","name":"busts-in-silhouette","semver":null},{"emoji":"๐Ÿšธ","entity":"🚸","code":":children_crossing:","description":"Improve user experience / usability.","name":"children-crossing","semver":"patch"},{"emoji":"๐Ÿ—","entity":"f3d7;","code":":building_construction:","description":"Make architectural changes.","name":"building-construction","semver":null},{"emoji":"๐Ÿ“ฑ","entity":"📱","code":":iphone:","description":"Work on responsive design.","name":"iphone","semver":"patch"},{"emoji":"๐Ÿคก","entity":"🤡","code":":clown_face:","description":"Mock things.","name":"clown-face","semver":null},{"emoji":"๐Ÿฅš","entity":"🥚","code":":egg:","description":"Add or update an easter egg.","name":"egg","semver":"patch"},{"emoji":"๐Ÿ™ˆ","entity":"bdfe7;","code":":see_no_evil:","description":"Add or update a .gitignore file.","name":"see-no-evil","semver":null},{"emoji":"๐Ÿ“ธ","entity":"📸","code":":camera_flash:","description":"Add or update snapshots.","name":"camera-flash","semver":null},{"emoji":"โš—","entity":"📸","code":":alembic:","description":"Perform experiments.","name":"alembic","semver":"patch"},{"emoji":"๐Ÿ”","entity":"🔍","code":":mag:","description":"Improve SEO.","name":"mag","semver":"patch"},{"emoji":"๐Ÿท๏ธ","entity":"🏷","code":":label:","description":"Add or update types.","name":"label","semver":"patch"},{"emoji":"๐ŸŒฑ","entity":"🌱","code":":seedling:","description":"Add or update seed files.","name":"seedling","semver":null},{"emoji":"๐Ÿšฉ","entity":"🚩","code":":triangular_flag_on_post:","description":"Add, update, or remove feature flags.","name":"triangular-flag-on-post","semver":"patch"},{"emoji":"๐Ÿฅ…","entity":"🥅","code":":goal_net:","description":"Catch errors.","name":"goal-net","semver":"patch"},{"emoji":"๐Ÿ’ซ","entity":"💫","code":":dizzy:","description":"Add or update animations and transitions.","name":"animation","semver":"patch"},{"emoji":"๐Ÿ—‘","entity":"🗑","code":":wastebasket:","description":"Deprecate code that needs to be cleaned up.","name":"wastebasket","semver":"patch"},{"emoji":"๐Ÿ›‚","entity":"🛂","code":":passport_control:","description":"Work on code related to authorization, roles and permissions.","name":"passport-control","semver":"patch"},{"emoji":"๐Ÿฉน","entity":"🩹","code":":adhesive_bandage:","description":"Simple fix for a non-critical issue.","name":"adhesive-bandage","semver":"patch"},{"emoji":"๐Ÿง","entity":"🧐","code":":monocle_face:","description":"Data exploration/inspection.","name":"monocle-face","semver":null}] \ No newline at end of file diff --git a/dot_httpie/config.json b/dot_httpie/config.json new file mode 100644 index 0000000..2ca82e1 --- /dev/null +++ b/dot_httpie/config.json @@ -0,0 +1,8 @@ +{ + "default_options": [ + "--follow", + "--style=solarized-dark", + "--ssl=tls1.2", + "--verbose" + ] +} diff --git a/dot_p10k.zsh b/dot_p10k.zsh new file mode 100644 index 0000000..e237e06 --- /dev/null +++ b/dot_p10k.zsh @@ -0,0 +1,1712 @@ +# 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. + autoload -Uz is-at-least && is-at-least 5.1 || 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) + 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) + 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) + 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) + 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) + # 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/) + 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= + 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='%238Fโ”€โ•ฎ' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%238Fโ”€โ”ค' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%238Fโ”€โ•ฏ' + + # 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 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=238 + # 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='\u2571' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\u2571' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0BC' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0BA' + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0BC' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0BA' + # 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=last + # 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 system 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 '\uF126 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 ' + + # Untracked files icon. It's really a question mark, your font isn't broken. + # Change the value of this parameter to show a different icon. + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='ษ†' + + # Formatter for Git status. + # + # Example output: master โ‡ฃ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 + + # โ‡ฃ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}" + # โ‡ 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}โ”€" + + VCS_STATUS_USER="๏ˆ›" + VCS_STATUS_ACTIVE_USER_EMAIL=$(git config user.email) + if [[ $VCS_STATUS_ACTIVE_USER_EMAIL = "oliver.weyhmueller@t-systems.com" ]]; then + VCS_STATUS_USER="๏ก" + fi + if [[ $VCS_STATUS_ACTIVE_USER_EMAIL = "oliver.weyhmueller@bwi.de" ]]; then + VCS_STATUS_USER="๏œŽ" + fi + if [[ $VCS_STATUS_ACTIVE_USER_EMAIL = "oliver@weyhmueller.de" ]]; then + VCS_STATUS_USER="๏•" + fi + res+=" ${VCS_STATUS_USER}" + + 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 reposotiry. + 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=false + 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=2 + # 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=232 + # 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=232 + # 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=196 + 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='โญ' + + ##################[ 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 + + # 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='โญ' + + ##################################[ 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=232 + 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='โญ' + + ##################################[ 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=232 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=232 + + # 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=if-different + # 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=232 + # 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 + # 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=232 + # 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=196 + 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=true + # 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=196 + 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='โญ' + + ############[ 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=232 + # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when the 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|fluxctl|stern' + + # 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 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=232 + # 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 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' + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_FOREGROUND=7 + typeset -g POWERLEVEL9K_AZURE_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when the 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' + # 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 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//\%/%%}' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7 + typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=232 + # 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|gif|(.*tun)|tailscale)[0-9]*' + # 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=true + # 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=232 + # 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='e.*' + # 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=232 + # 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='\uf58d\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf578' + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=true + typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=232 + + #####################################[ 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=always + + # Instant prompt mode. + # + # - off: Disable instant prompt. Choose this if you've tried instant prompt and found + # it incompatible with your zsh configuration files. + # - quiet: Enable instant prompt and don't print warnings when detecting console output + # during zsh initialization. Choose this if you've read and understood + # https://github.com/romkatv/powerlevel10k/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=off + + # 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/dot_powerlevel9k b/dot_powerlevel9k new file mode 100644 index 0000000..85cb48e --- /dev/null +++ b/dot_powerlevel9k @@ -0,0 +1,181 @@ +POWERLEVEL9K_MODE='nerdfont-complete' +POWERLEVEL9K_PROMPT_ON_NEWLINE=true +POWERLEVEL9K_RPROMPT_ON_NEWLINE=false +POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + +POWERLEVEL9K_STATUS_VERBOSE=true +POWERLEVEL9K_STATUS_CROSS=false + +POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="โ•ญ" +POWERLEVEL9K_MULTILINE_SECOND_PROMPT_PREFIX="โฑโฑโฑ " +POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="โ•ฐ\uF460\uF460\uF460 " +POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B4' +POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B6' +POWERLEVEL9K_SHORTEN_DIR_LENGTH=3 +POWERLEVEL9K_SHORTEN_DELIMITER=.. + +POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon root_indicator context dir_writable dir custom_git_user vcs rvm aws docker_machine virtualenv) +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(command_execution_time background_jobs status history disk_usage custom_battery time ssh) + +POWERLEVEL9K_DISK_USAGE_ONLY_WARNING="true" + +POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND="black" +POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND="yellow" +POWERLEVEL9K_EXECUTION_TIME_ICON="\uf64f" + +POWERLEVEL9K_ALWAYS_SHOW_USER=true +POWERLEVEL9K_CONTEXT_DEFAULT_BACKGROUND="green" +POWERLEVEL9K_CONTEXT_DEFAULT_FOREGROUND="black" +POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND="red" +POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND="white" +POWERLEVEL9K_CONTEXT_SUDO_FOREGROUND="red" +POWERLEVEL9K_CONTEXT_SUDO_BACKGROUND="white" +POWERLEVEL9K_CONTEXT_REMOTE_SUDO_FOREGROUND="purple" +POWERLEVEL9K_CONTEXT_REMOTE_SUDO_BACKGROUND="white" +POWERLEVEL9K_CONTEXT_REMOTE_FOREGROUND="white" +POWERLEVEL9K_CONTEXT_REMOTE_BACKGROUND="purple" + + + +POWERLEVEL9K_CUSTOM_WIFI_SIGNAL="zsh_wifi_signal" +POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_BACKGROUND="black" +POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_FOREGROUND="white" + +POWERLEVEL9K_CUSTOM_SPOTIFY="zsh_spotify" +POWERLEVEL9K_CUSTOM_SPOTIFY_BACKGROUND=34 +POWERLEVEL9K_CUSTOM_SPOTIFY_FOREGROUND=15 + +POWERLEVEL9K_CUSTOM_BATTERY="zsh_battery_level" +POWERLEVEL9K_CUSTOM_BATTERY_FOREGROUND="white" +POWERLEVEL9K_CUSTOM_BATTERY_BACKGROUND="black" + +POWERLEVEL9K_CUSTOM_GIT_USER="zsh_git_user" +POWERLEVEL9K_CUSTOM_GIT_USER_BACKGROUND="yellow" +POWERLEVEL9K_CUSTOM_GIT_USER_FOREGROUND="black" + +POWERLEVEL9K_TIME_FORMAT="%D{%H:%M}" + +POWERLEVEL9K_IP_BACKGROUND="black" +POWERLEVEL9K_IP_FOREGROUND="white" +POWERLEVEL9K_IP_ICON="" +POWERLEVEL9K_NETWORK_ICON="" + +# Add some elements which are already displayed in tmux if we are not inside a tmux session +if [ -z "$TMUX" ]; then + POWERLEVEL9K_TIME_FORMAT="%D{%H:%M %d.%m}" + POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(command_execution_time background_jobs status history disk_usage custom_spotify ip custom_wifi_signal_joined custom_battery_joined time ssh) +fi + +zsh_wifi_signal(){ + if [ "x$NETWORK_CONNECTION_METHOD" = "xwireless" ] || [ "`uname`" = "Darwin" ] && [ "x$NETWORK_CONNECTION_METHOD" != "xwired" ]; then + local output=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I) + local airport=$(echo $output | grep 'AirPort' | awk -F': ' '{print $2}') + + if [ "$airport" = "Off" ]; then + local color='%F{grey}' + echo -n "%{$color%}\ufaa9" + else + local ssid=$(echo $output | grep ' SSID' | awk -F': ' '{print $2}') + local speed=$(echo $output | grep 'lastTxRate' | awk -F': ' '{print $2}') + local color='%F{yellow}' + + [[ $speed -gt 100 ]] && color='%F{green}' + [[ $speed -lt 50 ]] && color='%F{red}' + + echo -n "%{$color%}\uf1eb %{%f%}" # removed char not in my PowerLine font + fi + else + # This machine has probably no wifi + local color='%F{grey}' + echo -n "%{$color%}\uf817 %{%f%}" + fi +} +zsh_git_user(){ + if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then + local gitrepuser="$(git config --local user.email)" + local gitglobuser="$(git config --global user.email)" + local gituser="${GIT_AUTHOR_EMAIL:-${gitrepuser:-${gitglobuser}}}" + if [[ ${gituser} == 'oliver@weyhmueller.de' || ${gituser} == '' ]]; then + gituser="Oli" + elif [[ ${gituser} == 'oliver.weyhmueller@t-systems.com' ]]; then + gituser="TSec" + else + gituser="???" + fi + echo -n "$gituser" + #left_prompt_segment "$0" "$2" "$bg" "$color" "\uf415 ${gituser}" + fi +} + + +zsh_battery_level() { + if [ "x$POWER_SOURCE" = "xbattery" ] || [ "`uname`" = "Darwin" ] && [ "x$POWER_SOURCE" != "xgrid" ]; then + local percentage1=`pmset -g ps | sed -n 's/.*[[:blank:]]+*\(.*%\).*/\1/p'` + local percentage=`echo "${percentage1//\%}"` + local color='%F{red}' + local symbol="\uf00d" + pmset -g ps | grep "discharging" > /dev/null + if [ $? -eq 0 ]; then + charging="false"; + else + charging="true"; + fi + if [ $percentage -le 20 ] + then symbol='\uf579' ; color='%F{red}' ; + #10% + elif [ $percentage -gt 19 ] && [ $percentage -le 30 ] + then symbol="\uf57a" ; color='%F{red}' ; + #20% + elif [ $percentage -gt 29 ] && [ $percentage -le 40 ] + then symbol="\uf57b" ; color='%F{yellow}' ; + #35% + elif [ $percentage -gt 39 ] && [ $percentage -le 50 ] + then symbol="\uf57c" ; color='%F{yellow}' ; + #45% + elif [ $percentage -gt 49 ] && [ $percentage -le 60 ] + then symbol="\uf57d" ; color='%F{blue}' ; + #55% + elif [ $percentage -gt 59 ] && [ $percentage -le 70 ] + then symbol="\uf57e" ; color='%F{blue}' ; + #65% + elif [ $percentage -gt 69 ] && [ $percentage -le 80 ] + then symbol="\uf57f" ; color='%F{blue}' ; + #75% + elif [ $percentage -gt 79 ] && [ $percentage -le 90 ] + then symbol="\uf580" ; color='%F{blue}' ; + #85% + elif [ $percentage -gt 89 ] && [ $percentage -le 100 ] + then symbol="\uf581" ; color='%F{blue}' ; + #85% + elif [ $percentage = 100 ] + then symbol="\uf578" ; color='%F{40}' ; + #100% + fi + if [ $charging = "true" ]; + then color='%F{040}'; symbol='\uf583'; if [ $percentage = 100 ]; then symbol='\uf584'; fi + fi + else + color='%F{040}'; symbol='\ufba3' + fi + echo -n "%{$color%}$symbol " ; +} + +zsh_spotify() { + if [ "`uname`" = "Darwin" ]; then + local spotpid=`ps -ef | egrep "MacOS/Spotify$" | awk '{print $2}'` + local color='%F{white}' + local state="disabled" + if [ -n $spotpid ]; then + state=`osascript -e 'tell application "Spotify" to player state as string'`; + if [ $state = "playing" ]; then + artist=`osascript -e 'tell application "Spotify" to artist of current track as string'`; + track=`osascript -e 'tell application "Spotify" to name of current track as string'`; + echo -n "%{$color%}\uf1bc $artist - $track " ; + #local nowplaying=$(~/bin/prompt-spotify-info) + #if [ -n $nowplaying ] + # echo -n "%{$color%}\uf1bc $nowplaying " ; + #fi + fi + fi + fi +} diff --git a/dot_ssh/authorized_keys.tmpl b/dot_ssh/authorized_keys.tmpl new file mode 100644 index 0000000..32f4492 --- /dev/null +++ b/dot_ssh/authorized_keys.tmpl @@ -0,0 +1,3 @@ +{{ range (gitHubKeys "weyhmueller") -}} +{{ .Key }} +{{ end -}} diff --git a/dot_ssh/config b/dot_ssh/config new file mode 100644 index 0000000..54abe63 --- /dev/null +++ b/dot_ssh/config @@ -0,0 +1,66 @@ +# $OpenBSD: ssh_config,v 1.25 2009/02/17 01:28:32 djm Exp $ + +# This is the ssh client system-wide configuration file. See +# ssh_config(5) for more information. This file provides defaults for +# users, and the values can be changed in per-user configuration files +# or on the command line. + +# Configuration data is parsed as follows: +# 1. command line options +# 2. user-specific file +# 3. system-wide file +# Any configuration value is only changed the first time it is set. +# Thus, host-specific definitions should be at the beginning of the +# configuration file, and defaults at the end. + +# Site-wide defaults for some commonly used options. For a comprehensive +# list of available options, their meanings and defaults, please see the +# ssh_config(5) man page. + +Port 22 + +# Defaults to allowing v1 which has known vulnerabilities +Protocol 2 + +# Almost always get a small win from compression, +# but we don't want to expend too much CPU on it either. +#Compression yes +#CompressionLevel 4 + +# Try and maintain a connection even if the server concerned +# is hiding behind a stateful firewall :-( +ServerAliveInterval 120 +ServerAliveCountMax 3 + +ForwardAgent yes +ForwardX11 no + +# Stops the operating system shipping an /etc/ssh/ssh_config +# which enables hashing, thereby making me quite angry! +HashKnownHosts no + +# By default we emphasize on strong encryption, and use compression for a speed boost. +# An alias exists in ~/.bashrc for 'sshf' which tries to connect with a broader list of ciphers. +# Ciphers aes256-ctr,aes192-ctr,aes128-ctr + +# Not using GSSAPI or Hostbased in any places... +PreferredAuthentications publickey,keyboard-interactive,password + +# If a SSHFP entry exists in DNS, then we should trust it. +# If it doesn't then add to known_hosts since in 99% of cases +# we have no way to validate good vs. bad anyway! +# Future attempts to connect will spot any changes to fingerprint. +VerifyHostKeyDNS yes +StrictHostKeyChecking no + +# More likely to notice changes in this than a hex fingerprint! +VisualHostKey yes + +#SendEnv LANG LC_* + +IdentitiesOnly yes + +Include ~/./ssh/cred_config + +Host * + AddKeysToAgent 60m diff --git a/dot_ssh/encrypted_private_executable_id_ecdsa.age b/dot_ssh/encrypted_private_executable_id_ecdsa.age new file mode 100644 index 0000000..30238b4 --- /dev/null +++ b/dot_ssh/encrypted_private_executable_id_ecdsa.age @@ -0,0 +1,19 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwYkdLeTdFM3RTNmhQT201 +OTkxdU5tNEVwLzVTVkczRzEzcjVWUkN2RXhvCml6V0gwb1Q2UU1uUEVUemduWFlD +S3JtSHF4T25vcjBndWJlWGpXOEtXNzgKLS0tIERwUXNUUEhYVlpWOWVSaDczRG41 +ajlzL3V3bXVQc24zREF0NzIxSU83M0EKuWFFiO4Bvz0ssEbG817h5k37hH5Z1/aZ +lF0AGqKxGaA4KmRfRC+fotpMmriQa/sG5urQpIYMNgrIP+ps2K7+/f/P927IvabB +uxTA0UYbTsLw2W9hv5rQMRwR2niDl2yTMweBRy7YjR/nCAQQP20DfXWRnvzphyoL +FvocGicftyHeC+ksKSeQ1HRnshRTDdsM1WK4NF6sLemrW6CSda/PD4/b3NpE+a5/ +9fLtb/bwUGT/bb89qlfZIFO0/Btsliu0k75Y+3qUSCknc3P2y4cK9NJzL9SR8cLJ +1yoCG582s2vmiPvFXuRLzpk6NQ3Fe0fBo8X3LN/DAcv/jqWe8tekcWDXiqI8RKPA +1SF5Jg566SavwVm+OjNzjQYzg2xDKVCXHGo7Yq0QyrEcPUSE8C6gHA7J98UpFFst +BbD6NZZoNmlLXswHbECdVqQ/YBhEW25qK0vJtOYrfl6smuF5El022nB/84yf1m5a +Ur0B6Nwuf21QO4nMy2Nu9L0dNKDYoX+DrViGFQI/+tvPMHdEYJgGsGYjezlzl/O/ +RkvLLGYb836ULjK6lUs53n98gMXGxOuDI9IGWZ2OBOBEwH8/HPmZFFXeCnEZzglI +GiaBFWDZZJuwpVeQ8o5jxHJGpz4cPlenAoh0cNWxzi79kR4C9ZW80nPL6/Lg78HW +QRvT3cYlWP7j+WqA7MA2d/ApL8t/UTBxN++2hG/+h4VWIBLa1T8LH94w9dd+MQsf +9ISvOm5z2aRFoxpNUKYLWheKXNOIFzT5aEoahuP3rNz2aPMo5hLqtAubLNAPiAJ2 +66BOLVdOS42XFg== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/encrypted_private_executable_id_ed25519.age b/dot_ssh/encrypted_private_executable_id_ed25519.age new file mode 100644 index 0000000..2c443f9 --- /dev/null +++ b/dot_ssh/encrypted_private_executable_id_ed25519.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3cFZLUE5RMjJhZ1RUYWRz +QjZZM09PWkdacFdaL0FaUzFobmhwbkUrZUhrCjBsc2RDWDcrUmE1V3VLSXVsS1RB +Zjh4Z0ZXTEVpZVllS3p4R29kTW9QM2sKLS0tIHZERUQ1NkRlQnkvZVp1MGJkWjBp +aHR1aksrV2NrWndyeEF0Rm0yTkRkTEEKozu7xWoKH+5R8koXHMy7Zw0PtvTesbp6 +jRP9y1Kh6bdS3Kt1rcQhR1no+M6ChMe9VwY7qiIekjP4WERw8lUCcvkeF8mfagLy +3/MyPC0HwimCSf/T7keXaPxja1aOlWdIUwMq7yA6qnAUxEtB22z+PpFN/ZwBlO85 +3/EW8r+zT3YltX2i3sKyZBtPQ+vETy5yu3iU+gO3hZzxyKETMnbz5EhkK5wwgs7H +wHFPeCAbleR7/euYHqCEqbdkxUKujctzVOEJXK52fAkytvm8Fk81EwyPoA0ooqvv +fehcu3XI3xhpiMz+KHdah3rZoFq1s0FYcv9nNrYmXxvGoLi9xR/KCtzeRkwhuL+n +Osrh+z2LxKersMS7hAjlozUzIhC1SVfFml9PD56hWuPhesBjF2zmVmOUD6xaX+ml +nIc5YNfcW4KTcqEH37Z1VE1dDfvO1/zwzwpZN0CzByRF5DsevPteWqPdq5wfRnbN +71Wyx355Ed6vQxRLSd0gwopcvOF2UW8i7MFGeyPeBgYULCfjATDXMxCZtPTF/RIr +ZeKoG37Zt2UGRQDFGPcYNFmtuYklJQWCS+39LbB7WmlFRdZ0PBqe5saNUdq80ZGR +rSCqsA5RD1Epa4cIqA37BvBq1sDYWtBxWpmTELY9HVDy000XySFfL5oUol4xyR5K +1zzKd+pba8y4zbj6 +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/encrypted_private_executable_id_rsa.age b/dot_ssh/encrypted_private_executable_id_rsa.age new file mode 100644 index 0000000..8e2e713 --- /dev/null +++ b/dot_ssh/encrypted_private_executable_id_rsa.age @@ -0,0 +1,79 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1VnM2MUtJKzJ0WnVmMzNB +cE5JSk1JaXZGSWhLWjBHUkMvSUpRWnh4OTBRCndoNklTYW5lYittZXR3NGJlVS9m +elJ1WHJoV1MreDlWblFleVRSazgyZmMKLS0tIGdWUnZlbnNEZDNqeDNKK0VMdVdQ +b3BqRVN2ZHhlM2NkbmIveTExcjZJbXcKO9obdeOUcke3w8fFWKH2EzMaP0fH3DWT +JdT4D2yuKrSi+Bhl6JkyfyzK2G2jHx0pmb0AK4JsWmZ7R2v7EqVXWpKeKPG85rmK +fveH/1OJwqnlSEirXGhtPHaJwQzSqDCXzRZSF3J1LFXhPq0rDcCnhg+yC5Zffg5f +f7sJ0FeSY27dOxfY+5H0nqERjt7mODepAletzIxWnZL2M5txvyb2gGw3DytTVq2X +1EHOks5ccmbPQG6edf7SELpdujsNZYQaXF+2qulp+IvziQJ+MXkbV2HkqefF/wEc +QuLiEVFv/1QqcUcWcOyxH6GvnoCtudPn6xVoGTCP/9zzAAIN9ek4vm72/UBdoXPJ +hgkpJLXicj4By+57fEDNOTVfxHTGJ85BX3bwaSxRsRgw9VVeA4Y8JCm7AN4BrY08 +sst4G+pKNp5qgY+TGjghjs6XKohrTktwQfYUFrJ2XhANmz68RIFSTv2DrR1Cj80L +yi02COQOppbpXCQIwJVgS7rDO0aZ4s5E4K7kKDdeI3u9wn4qlViZzwQN5eHaw1O0 +TgWzMpdlnV+dJlQtNJDWkud58rQVkcb2wL2ppjSQQBn3XpN1MtJpzpXtVZcZ2Mu6 ++FikKs1Zz0jRpWWdBtMVrhkvrpKxHD1NhygvKsU97ppO2gW8OvQRL48Iu4DVzrRr +x0jmRXEclDA8GQ91D7K1xwm4nubFuDsXi+qGFZuzoLBH37RRliEO9/vvM+Ql+xIi +7EX7KVd1ZR4Adudt56UcGjWbIquj6smif0PnThqPMUgfCnMtoaAbujGYQvprettl +BirXyJdG3w6OLEEVVKtDsVzMUZhGvGXonlzsny0MuXxeqesXcp2vaWWvRfXmQmMd +c11c7yRCfXOQh9zRLE6sDFCeZYjWzk8/kd6LP9dBY7DxCnoNLH8hlDuDycZvkqGR +2wZGGV8HRxfSJ83ts9LuiObYEZX4q6xMo5K4elyACCQdYgAQOkYjLyWm4La/iNuC +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 +yg2Na7TN +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/encrypted_private_id_ed25519_sk_5c1.age b/dot_ssh/encrypted_private_id_ed25519_sk_5c1.age new file mode 100644 index 0000000..b2b5303 --- /dev/null +++ b/dot_ssh/encrypted_private_id_ed25519_sk_5c1.age @@ -0,0 +1,20 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6SitoV1BpSTI4V1I5d1Jq +ZHdUempWTGpRamRHYlZFMk40OTZjekhQem1zClJ1R0FxUmY0VDJQajZDaEtRT0E4 +aFZEL2JnNUtVUFREeWRmbWsvclpyMEkKLS0tIC95SUFXM2JNUHZhQ0FDd293Vi9V +eWZ4ejV2M0F0VjJFdTE3SWJBVlIyREEKpIurHYV1kEyc6bWEO51o/UNfYcSBmIEe +rhGXAwub3dNPWd8IumbxQANgdtlNgjNpM0eLf3GDsPtC824Nv2dFRxaYSKif3FP3 +fCJu7IQADJVijjWqyL4Y9lc0GaYD52xGpBBLz6DMOjnEUQO32BMgyDzq09tI+7ZK +B8Yxn7pkaB3rotrdTN9ZXic/UOlEJVh52Fk6eEiIywZZQaLmNe+XaXV1xVzOzkrv +UIshKgsfjypWYduVgO/lFc28vjmbbzhcWO1emK88vOM+kbtjbb7Nek/y7EF9vazx +AlOqvFfx3YDBGkAEXTipBII6V7hQFpZ4YiEqLnmvkewPBCoj+of/WDxohZjioYEW +RsMh73f1/RceS04rkd3Xz92hGACcGgeHp6gtdR9/rQ8Wulz7QowfnRO4QepJX0QO +GQgVKl478d/rwlNxWZF6oMyMom4GiOnzqv8qnkPWLbFf6D+ql3uty/ek7YiNoqjF +I+yXL5anmotAyhX9yzf9uzuYDMPFfh8Q/p5nYYRbvILWK4WEVR/stAMxCtx0h4Ks +X+PKCL/YGIHb5EEIg7S5ljoBq3n65S3ln83ysOuX1e45p33pIAaCww+bbAjHxkor +CCMRLIIXm4sO1mww4GM5TvCVvyQ6vJsOfuetMkPC8ylLlem3XSB1fhKWiQ0LlSEr +AP5/JRMypUJyCQ8ZP46evsSo5Nz2A5dzB/ctNmBZ9FJggvbOP2tlufxHU1tLaVQg +GXfBlpG//uTaUraoyfYOHJIo5C6ORL5QMsGjzA7dsH2Gmwl/wssKm3nVP9a7HwIh +s03StOEyJdXj2KMxjNwAih13KECzoEveUhxlTgZPR2x+Mi4CJlIih4Ys0Vm5kOV3 +TUtpi5JlCvM56GWQ8xZEbqIi0NknR3BXBaBm6+pCUg== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc1.age b/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc1.age new file mode 100644 index 0000000..95727b0 --- /dev/null +++ b/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc1.age @@ -0,0 +1,20 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxajdWREZLS3YvWENsVTlr +bkl2R0VHTXc5UTFzTGNkTWpaSHdacGRJaHdzCkxzaGxnOGxkRFlqb3hqNFl0eXpq +SnRRY3Q2dDBBKzQxNk9QZlpLR2NkTjgKLS0tIFZUVlBjcnVGemtHOHA1TGVGWkxX +SXo1VXpkU0E3UlQ1cXVwa2pvTlRoQkkKFOGcK9kk2pwfzW6OJgdYHSv3cSzGgauI +f/FNEfxfpMH2H8iUdRfbt2DxP+cBF4QXydNdDtd101G8mI9v8UrHNj/g2yhuQICX +uxca/ycNz2t6mcyP/O3NoFzELnZS5FYSL8L31Obw+eAMV7ctr3U2F3LdfS/LBWyQ +1Q8HbPydebrSiNJ+/3m+cowwbL59IDcJlPTeCY38p893FyQxrQab7qZCO8URAWrC +b1Lx8Wa1d9hB/BN12nZmZJzZ8zZzu/CRRUrnWqBu9AeX9JTyy3I4+kgF+NmVQG21 +V6qmpHmc2AgF+YtVsgVDkJdGVylU6NbfIilRurlrnkLNhqOtj79OuWDc4CQOSjuz +T5Rgz8AuNFTLGNcctbFLAGPYo84i6tgLBxWIQ1V2h4Sl0CeJQ+nESSsgbG4nbq7F +DLLhu8dzZciOEQe9PayFPMAGyT4AH0CfRh7nPCl9oOv0xLQPOm3vSYTohezdKMzk +cok4mausncWt2UlB1LwikkjArYRX88vZUzOSSSB/uFURV61v8591YE1Nzm3SGKq/ +M0mO/oBYBSm9I51uoJyD0JWCLGz2iAC7XpYGqVlGwve0rdZCk8cCjQnogTc/V08l +tlEuLJoP9PiVlEAv5dPJM73RC+KH4Zq6Auyc3SE0jt+m/kgJGatVOR9fBQGtUFA6 +c2P52oSaq1ScalJGpSV7o7xi5oUfyLtQfi58HDC+0WrcGmt42QsptUqTce2eIQkc +5/JC9YSpHhswtw05XzQaX/34pfN8mkvd28JGWpoIH5MigpoqZxF6m34UN6Z8fe3O +o2j9U3Ue+0h0xwl8xTtnarGs7bBGHfsv6Iasw0pIAzI94N8BJb1JuJ6CGIYZ/3uO +Sw1SQeSu6VyqEx1JSj4GGoToW47cuXLr5NWu6cnyjw== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc2.age b/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc2.age new file mode 100644 index 0000000..e2e7819 --- /dev/null +++ b/dot_ssh/encrypted_private_id_ed25519_sk_5cnfc2.age @@ -0,0 +1,20 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBeC96NEZmYTk3RVh3a1hx +V05pbkQ1TGwxRjBNSXExSkx0Q3poeUF5VVhJCnIzY3A1SWR4YUExaTI0OWtpTDYr +SnBobHpzbERrREZKTU52cFBkYjhBTncKLS0tIG5IWVJucnN0V2xQN1JBb3o0U0JH +VHNmYjhwck1YQm4yMDhuaTY4UUVIZmcKJ+H349c8bVnOvlH9JzVR5II3xE1PkMUc +68VsQvZ3bElDsFfFJ6CEb8zM/tTLntAxvFQ9K8Me9vqZ1sjMs4EvYHCa373pNGVB +cd0OxO+5mUb5VU7mA9EuxJdrYh2MsZkx4kxJKdnWHk8shp5Yyv8AkGDo7MfPlRCE +xj+89hHK0+uNr0x31XOfNA4KVZAsql9ppgvLN4RyZYyW7FNaS0ID/T1xuT3MixOK +BVqotuUYqdLCWXahP7eyGi/FLBhzoUGJkwI2mL+OZzgDp4ZbewGn6Bq8RU7jwJ73 +bFVIy/2M/YAieYzWujZU7LRp3TOd8u9vsQ3HGxyCSNlsOXXQVyjagr8OpmF8nw+B +VP/hbB3V8xL4VrciB6DYlwiisarWFL0nYZmVx9QbC5uXXy7q5U82JYMfesXH2b52 +rKDH4ijLvnYdqLBFJbQojSQmN5DhSB2VnjHw8IT8U8A5QFoZZmqSKkKsaOnlLM7Q +saF4csAzwTyjEiV7iu400nIb7I/Y/lwyuLZAPH35g6ljzsq+8X3VbzOTNNuw+vdA +9/Try7SnrpN5gE3fSkcGV+ziss0d5r86Pvzy24myTXhQWRW0t53Cw5FeF07cWZBc +Gj131Mcj66fiuMPv4G2hyUvs2IFlsJ0tvK4XVleVbfJZyw/RwjQGfuUTtH+SZHDS +QpEKK/EaStumcGHQxsdsr1XUmZnIm69wI6gTv1UBQz2/PjQCumt+uY49Nh6NkY5m +TddTYCwoiaez5Q3KxXQkT6ncecp15WQFWbXDqvRvv4lgWRjm8uVNOpr+v25Ox+SB +bjM0gXBQdgi54qC5fcD9iieKBiT1XJi/I6c2STLfzpfLvI3e2QHgGPkLI8/isqHo +WuCj/rCjETy8zAqSLzBM/vjM27UWouVUAQg3VvTA2A== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_ssh/id_ecdsa.pub b/dot_ssh/id_ecdsa.pub new file mode 100644 index 0000000..9a6f3d8 --- /dev/null +++ b/dot_ssh/id_ecdsa.pub @@ -0,0 +1 @@ +ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOF0rbt2/IF0NNs0mxkMgIOh9kaLjrZdMaW0FY4zQzbz/DbTiEO3yCFT2YwHFUpGJz0rvy2PgdWRqdleaTI8jtk= oliver@weyhmueller.de diff --git a/dot_ssh/id_ed25519.pub b/dot_ssh/id_ed25519.pub new file mode 100644 index 0000000..a82304b --- /dev/null +++ b/dot_ssh/id_ed25519.pub @@ -0,0 +1 @@ +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILH2FApnLnyzGQSju+guYwO2jp+rS68lhFszaI84lKBF oliver@weyhmueller.de diff --git a/dot_ssh/id_ed25519_sk_5c1.pub b/dot_ssh/id_ed25519_sk_5c1.pub new file mode 100644 index 0000000..94bcc5d --- /dev/null +++ b/dot_ssh/id_ed25519_sk_5c1.pub @@ -0,0 +1 @@ +sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIMabEX4GIUruPYzqj9cky8z7oe1JNtz2w2nWcFl5J1KoAAAABHNzaDo= oliver@weyhmueller.de (Yubikey FIDO 5C 01) diff --git a/dot_ssh/id_ed25519_sk_5cnfc1.pub b/dot_ssh/id_ed25519_sk_5cnfc1.pub new file mode 100644 index 0000000..016b7ed --- /dev/null +++ b/dot_ssh/id_ed25519_sk_5cnfc1.pub @@ -0,0 +1 @@ +sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIGrnbLzPrSIckK+v4VRvEuVx+NDMoa7lJQ2uKh5whN2iAAAABHNzaDo= oliver@weyhmueller.de (Yubikey FIDO 5CNFC 01) diff --git a/dot_ssh/id_ed25519_sk_5cnfc2.pub b/dot_ssh/id_ed25519_sk_5cnfc2.pub new file mode 100644 index 0000000..681434d --- /dev/null +++ b/dot_ssh/id_ed25519_sk_5cnfc2.pub @@ -0,0 +1 @@ +sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIN0phNBrWZlOjQ62EtmufKyxDSDo9fbpgXq8eIdjlM/bAAAABHNzaDo= oliver@weyhmueller.de (Yubikey FIDO 5CNFC 02) diff --git a/dot_ssh/id_rsa.pub b/dot_ssh/id_rsa.pub new file mode 100644 index 0000000..bbc8ddb --- /dev/null +++ b/dot_ssh/id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwhI8wVqL1pP1GA6CRb/+2q9Z63/RZaSzAxZfSiPi3YjVQtjmrMKySgoK60v6Kzp7bojvWnPxgIxBHF2cw9Xzuvazd4J/MHvsoD+cqCsJkMmQy2rLznnmO/2UQ2hEvLGqc45re/htjErsZhqUHuBlDUB6ydnpbzB5BoGh3CyYeY6UfkGTmTYG8E2WKWI9K4wO/lyifkN4pqZUQduPEaXi878oX5cJYTC9D+P3j0akME89zPCJi+7JreSDr9A9vF+9Fg1Fb9IxHTimsmFeAOGMLujOCA027bLZU9adgXilGhFdYsV+4eabF8CGtKzTZ9hepUT7hwji1OTxpAl0SAWEheWhywTFrI9MelIsGMLRcnuGhic1PzDzvedSfYJrC16K3ioj6bYyqKy7DSv+cuzWLYBbHP837jFLzP4WcY8kqUiWof3lV5J+tfL67Ok+5xHzcxmAqxDap/9H2rsA4CstB3Y7Nye/MT89Bqu8eyGqTGa/WHjl1pJ5R/wTqbcvFggju2+FMWYX6vak10DzaR+OnAfI0gVzXyuMfUJ2BtLm16YemtoGm1Q24YCLA74ig4TrgRmpyP5h9uLqFxg3tTSZrvjUw7rrogHEGiGrFNZ2sc6rAwXalQdJ84XF7jvh2DotODtfninFWEHKtEFZMX/qku5xzksUA+Rc2Dt1ZEZ+ucs= oliver@weyhmueller.de diff --git a/dot_ssh/id_rsa_yubi.pub b/dot_ssh/id_rsa_yubi.pub new file mode 100644 index 0000000..fb4e173 --- /dev/null +++ b/dot_ssh/id_rsa_yubi.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCfOK118UUM4JQB4FQfAn6Jc3AvrlQj4vZTFNt/6+0/att+1Vt1doJTBlx+wYdI/CT0azsFwKW2l75Sim+DE7Fy+VtLDbB14BFlToA9NxoevUAsX24/Qxv0Qr+z990Q8sdSuEe/0MIJ0x2qPNM7y8b+eQjuaoOzXasnfti13rZwImvAZOR3Rpl5Knn3NJyRTMmwnpLo0T9ohlSd6rvhfJPBmgk5pjMa95MX25zhuBYmbmuWq3uG9V1faxLCmg+S5JSAlWOILF4nrFJucFj0/cLO5FiVXSwj9e1vSuWCKPMbZAn86yGBU6WwnqcCJpMg//ltpuiD/kvSESAy9hdvp2MEqlvR6fn5S8zY5Q7zAV3tGW299bzkPMSHUNkL+k1ZgnIm/V/OePGs4f7VXn+OmB4MpKyESxhMu2mKrW7FrIGIP+GZuevgHgkxUCUP6Gh/DFTDq1o10R5SbR0TGJss/PY2BOFXVq1wSGU3LqRovIteF8FF6CgifjzfOW0mACZk+JuwXHeFXUfegtFTRrH49aAeZrlEqRI8PbbJTe/G6x6j4L+7Jku32TfkTkoNm0XTE2W+IzIRW1TFuMVK833CO/PU3v2he1cS6NFJ+RIBkcIFhF+KF6JzG9z8s2zOmn3XeKJ9KJct8yXUt7dQIFztphLGEW7d4BcJbOgDk1baQJeWxQ== Oliver Weyhmueller (YubiKey) diff --git a/dot_tigrc b/dot_tigrc new file mode 100644 index 0000000..74e373e --- /dev/null +++ b/dot_tigrc @@ -0,0 +1,2 @@ +set show-date = no +set author-width = 3 diff --git a/dot_tmux.conf b/dot_tmux.conf new file mode 100644 index 0000000..94d5f0d --- /dev/null +++ b/dot_tmux.conf @@ -0,0 +1,106 @@ +# +# tmux configuration +# Version: 1.0 +# Date: 2021-02-21 19:32:35 +0100 +# +# Copyright 2021, Oliver Weyhmueller + +#new-session -A -t 0 +set -g prefix C-a +unbind C-b +unbind Space +set -g base-index 1 +setw -g pane-base-index 1 +bind r source-file ~/.tmux.conf \; display-message "Reloaded!" +bind C-a send-prefix +bind | split-window -h +bind - split-window -v +bind C-x setw synchronize-panes +set -g mouse on + +set -g status-fg white +set -g status-bg colour232 +set -g status-position top + +set -g default-terminal "tmux-256color" +set -ga terminal-overrides ",*:Tc" + +#set-option history-limit 3000 + +setw -g window-status-format "#[fg=colour242]#I #W" +setw -g window-status-current-format "#[fg=colour247]#I #W" +setw -g window-status-last-style fg=brightblue +setw -g window-status-activity-style fg=green +setw -g window-status-bell-style fg=blue + +setw -g window-status-separator ' | ' + +set -g status-left-length 120 +set -g status-right-length 192 +set -g status-left "#[fg=black]#[bg=blue] #S#[fg=blue,bg=green]๎‚ผ#[bg=green,fg=black]W#I/#{session_windows} P#P/#{window_panes}#{?pane_synchronized,#[fg=green]#[bg=red]๎‚ผ#[fg=colour232]#[bg=red]ALL#[fg=red]#[bg=yellow]๎‚ผ,#[fg=green]#[bg=cyan]๎‚ผ#[fg=colour232]#[bg=cyan]one#[fg=green]#[bg=yellow]๎‚ผ}#[fg=black,bg=yellow]#W#[fg=yellow,bg=colour232]๎‚ผ " +set -g status-right "#{prefix_highlight} #[fg=colour242] | #[fg=colour254]#{ip} #[fg=colour242]| #[fg=colour245]#{wifi_ssid} #{wifi_icon} #{online_status} #[fg=colour242]| #[fg=colour247]%H:%M #[fg=colour245]%F #[fg=green]#[bg=colour232]๎‚บ#[fg=black]#[bg=green]#U@#H #[fg=green,bg=color232]" + +set-option -g allow-rename off +setw -g automatic-rename off + +set -g pane-active-border-style 'bg=default fg=white' +set -g pane-border-style 'bg=default fg=brightblue' +setw -g pane-border-format "#{pane_title}: #{pane_current_command}#{?#{!=:#{pane_current_command},ssh}, #{pane_current_path},} (#{pane_width}x#{pane_height})" +setw -g pane-border-status top + + +set -g message-style 'bg=default fg=white bright' + +setw -g monitor-activity on +set -g visual-activity off +setw -g mode-keys vi +setw -g main-pane-width 120 +# set -g default-command "tmux rename-window zsh; reattach-to-user-namespace -l $SHELL" +set -g default-shell /bin/zsh + +unbind [ +bind Escape copy-mode +unbind p +bind p paste-buffer +bind C-p choose-buffer + +unbind -T copy-mode-vi MouseDragEnd1Pane +bind -T copy-mode-vi MouseDown1Pane select-pane \;\ + send-keys -X copy-pipe "zsh -c 'source ~/.cache/zsh4humans/v5/ohmyzsh/ohmyzsh/lib/clipboard.zsh; clipcopy" \;\ + send-keys -X clear-selection + +#bind -t vi-copy 'v' begin-selection +#bind -t vi-copy 'y' copy-selection + +set -g @prefix_highlight_fg 'colour04' # default is 'colour231' +set -g @prefix_highlight_bg 'default' # default is 'colour04' +set -g @prefix_highlight_show_copy_mode 'on' +set -g @prefix_highlight_copy_mode_attr 'fg=yellow,bg=default' # default is 'fg=default,bg=yellow' +set -g @prefix_highlight_prefix_prompt 'Wait' +set -g @prefix_highlight_copy_prompt 'Copy' +bind -n C-x setw synchronize-panes +bind C-c run "zsh -c 'source ~/.cache/zsh4humans/v5/ohmyzsh/ohmyzsh/lib/clipboard.zsh; tmux show-buffer | clipcopy'" +bind C-v run "zsh -c 'source ~/.cache/zsh4humans/v5/ohmyzsh/ohmyzsh/lib/clipboard.zsh; tmux set-buffer \"$(clippaste)\"; tmux paste-buffer'" + +set -g @continuum-restore 'on' +set -g @continuum-boot 'on' +set -g @continuum-boot-options 'iterm,fullscreen' +set -g @resurrect-capture-pane-contents 'on' +set -g @online_icon "#[fg=green]๏ —" +set -g @offline_icon "#[fg=red]๏ ˜" +set -g @route_to_ping "blofeld.nc.w9r.de" + +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-sensible' +set -g @plugin 'tmux-plugins/tmux-online-status' +set -g @plugin 'tmux-plugins/tmux-urlview' +set -g @plugin 'tmux-plugins/tmux-resurrect' +set -g @plugin 'tmux-plugins/tmux-continuum' +set -g @plugin 'weyhmueller/tmux-spotify' +set -g @plugin 'soyuka/tmux-current-pane-hostname' +set -g @plugin 'weyhmueller/tmux-plugin-ip' +set -g @plugin 'gmoe/tmux-wifi-macos' +set -g @plugin 'tmux-plugins/tmux-prefix-highlight' +set -g @plugin 'tmux-plugins/tmux-logging' + +run '~/.tmux/plugins/tpm/tpm' diff --git a/dot_vim/autoload/plug.vim b/dot_vim/autoload/plug.vim new file mode 100644 index 0000000..ac14332 --- /dev/null +++ b/dot_vim/autoload/plug.vim @@ -0,0 +1,2597 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" 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. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if &shell =~# 'powershell\.exe' + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win && a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') || has('wsl') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = get(spec, 'branch', 'master') + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ plug#shellescape(spec.uri, {'script': 0}), + \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +function! plug#shellescape(arg, ...) + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\.exe' + return s:shellesc_cmd(a:arg, script) + elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = 'git log --graph --color=never ' + \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '') + \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) + if has_key(v, 'rtp') + let cmd .= ' -- '.plug#shellescape(v.rtp) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@`-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" 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. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') || has('win64') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]).'/**' + for dir in ['ftdetect', 'ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if s:is_win + set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1 + elseif a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'batchfile': (s:is_win && (s:nvim || s:vim8)) ? tempname().'.bat' : '', + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd + if !empty(job.batchfile) + call writefile(["@echo off\r", cmd . "\r"], job.batchfile) + let cmd = job.batchfile + endif + let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], cmd) + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + if has_key(job, 'batchfile') && !empty(job.batchfile) + call delete(job.batchfile) + endif + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = !isdirectory(spec.dir) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg) + let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g') + let escaped = substitute(escaped, '%', '%%', 'g') + let escaped = substitute(escaped, '"', '\\^&', 'g') + let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g') + return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"' +endfunction + +function! s:shellesc(arg) + if &shell =~# 'cmd.exe$' + return s:shellesc_cmd(a:arg) + endif + return shellescape(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let diff = s:system_chomp('git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 's:shellesc(v:val)')), v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap :silent! call preview_commit() + nnoremap o :silent! call preview_commit() + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@ 580 + if exists("syntax_on") + syntax reset + endif +endif + +let colors_name="github" + +if has("gui_running") + set background=light +endif + +hi Normal guifg=#000000 ctermfg=16 guibg=#F8F8FF ctermbg=231 gui=NONE cterm=NONE +hi DiffAdd guifg=#003300 ctermfg=22 guibg=#DDFFDD ctermbg=194 gui=NONE cterm=NONE +hi DiffChange guibg=#ECECEC ctermbg=255 gui=NONE cterm=NONE +hi DiffText guifg=#000033 ctermfg=17 guibg=#DDDDFF ctermbg=189 gui=NONE cterm=NONE +hi DiffDelete guifg=#DDCCCC ctermfg=252 guibg=#FFDDDD ctermbg=224 gui=NONE cterm=NONE +hi Folded guifg=#808080 ctermfg=244 guibg=#ECECEC ctermbg=255 gui=NONE cterm=NONE +hi LineNr guifg=#BBBBBB ctermfg=250 guibg=#ECECEC ctermbg=255 gui=NONE cterm=NONE +hi NonText guifg=#808080 ctermfg=244 guibg=#ECECEC ctermbg=255 gui=NONE cterm=NONE +hi VertSplit guifg=#BBBBBB ctermfg=250 guibg=#BBBBBB ctermbg=250 gui=NONE cterm=NONE +hi StatusLine guifg=#404040 ctermfg=238 guibg=#BBBBBB ctermbg=250 gui=BOLD cterm=BOLD +hi StatusLineNC guifg=#BBBBBB ctermfg=250 guibg=#ECECEC ctermbg=255 gui=ITALIC cterm=NONE +hi ModeMsg guifg=#990000 ctermfg=88 gui=NONE cterm=NONE +hi MoreMsg guifg=#990000 ctermfg=88 gui=NONE cterm=NONE +hi Title guifg=#EF5939 ctermfg=203 gui=NONE cterm=NONE +hi WarningMsg guifg=#EF5939 ctermfg=203 gui=NONE cterm=NONE +hi SpecialKey guifg=#FFFFFF ctermfg=231 guibg=#FF1100 ctermbg=196 gui=ITALIC cterm=NONE +hi MatchParen guifg=#000000 ctermfg=16 guibg=#CDCDFD ctermbg=189 gui=NONE cterm=NONE +hi Underlined guifg=#000000 ctermfg=16 gui=UNDERLINE cterm=UNDERLINE +hi Directory guifg=#990000 ctermfg=88 gui=NONE cterm=NONE +hi Visual guifg=#FFFFFF ctermfg=231 guibg=#3465A4 ctermbg=61 gui=NONE cterm=NONE +hi VisualNOS guifg=#FFFFFF ctermfg=231 guibg=#204A87 ctermbg=24 gui=NONE cterm=NONE +hi IncSearch guifg=#000000 ctermfg=16 guibg=#CDCDFD ctermbg=189 gui=ITALIC cterm=NONE +hi Search guifg=#000000 ctermfg=16 guibg=#CDCDFD ctermbg=189 gui=ITALIC cterm=NONE +hi Ignore guifg=#808080 ctermfg=244 gui=NONE cterm=NONE +hi Identifier guifg=#0086B3 ctermfg=31 gui=NONE cterm=NONE +hi PreProc guifg=#A0A0A0 ctermfg=247 gui=BOLD cterm=BOLD +hi Comment guifg=#AAAAAA ctermfg=248 gui=ITALIC cterm=NONE +hi Constant guifg=#177F80 ctermfg=30 gui=NONE cterm=NONE +hi String guifg=#D81745 ctermfg=161 gui=NONE cterm=NONE +hi Function guifg=#990000 ctermfg=88 gui=BOLD cterm=BOLD +hi Statement guifg=#000000 ctermfg=16 gui=BOLD cterm=BOLD +hi Type guifg=#445588 ctermfg=60 gui=BOLD cterm=BOLD +hi Number guifg=#1C9898 ctermfg=30 gui=NONE cterm=NONE +hi Todo guifg=#FFFFFF ctermfg=231 guibg=#990000 ctermbg=88 gui=BOLD cterm=BOLD +hi Special guifg=#159828 ctermfg=28 gui=BOLD cterm=BOLD +hi rubySymbol guifg=#960B73 ctermfg=89 gui=NONE cterm=NONE +hi Error guifg=#F8F8FF ctermfg=231 guibg=#FF1100 ctermbg=196 gui=NONE cterm=NONE +hi Todo guifg=#F8F8FF ctermfg=231 guibg=#FF1100 ctermbg=196 gui=UNDERLINE cterm=UNDERLINE +hi Label guifg=#000000 ctermfg=16 gui=BOLD cterm=BOLD +hi StorageClass guifg=#000000 ctermfg=16 gui=BOLD cterm=BOLD +hi Structure guifg=#000000 ctermfg=16 gui=BOLD cterm=BOLD +hi TypeDef guifg=#000000 ctermfg=16 gui=BOLD cterm=BOLD +hi WildMenu guifg=#7FBDFF ctermfg=111 guibg=#425C78 ctermbg=60 gui=NONE cterm=NONE +hi Pmenu guifg=#FFFFFF ctermfg=231 guibg=#808080 ctermbg=244 gui=BOLD cterm=BOLD +hi PmenuSel guifg=#000000 ctermfg=16 guibg=#CDCDFD ctermbg=189 gui=ITALIC cterm=NONE +hi PmenuSbar guifg=#444444 ctermfg=238 guibg=#000000 ctermbg=16 gui=NONE cterm=NONE +hi PmenuThumb guifg=#AAAAAA ctermfg=248 guibg=#AAAAAA ctermbg=248 gui=NONE cterm=NONE +hi TabLine guifg=#404040 ctermfg=238 guibg=#DDDDDD ctermbg=253 gui=NONE cterm=NONE +hi TabLineFill guifg=#404040 ctermfg=238 guibg=#DDDDDD ctermbg=253 gui=NONE cterm=NONE +hi TabLineSel guifg=#404040 ctermfg=238 gui=BOLD cterm=BOLD +hi cucumberTags guifg=#333333 ctermfg=236 guibg=#FFFF66 ctermbg=227 gui=BOLD cterm=BOLD +hi htmlTagN gui=BOLD cterm=BOLD +hi Cursor guifg=#F8F8FF ctermfg=231 guibg=#444454 ctermbg=238 gui=NONE cterm=NONE +hi CursorLine guibg=#D8D8DD ctermbg=253 gui=NONE cterm=NONE +hi CursorColumn guibg=#D8D8DD ctermbg=253 gui=NONE cterm=NONE + +hi link rubyStringDelimiter String diff --git a/dot_vim/pack/themes/start/dracula_pro/after/plugin/encrypted_dracula_pro.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/plugin/encrypted_dracula_pro.vim.age new file mode 100644 index 0000000..51c22ee --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/plugin/encrypted_dracula_pro.vim.age @@ -0,0 +1,32 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPeUZ4THJXeElBOE43UFcr +RU5jaUw5VXFQdjhFazc3SHE3VmxPdWhKMEJzCkVsTzVwOVlEUkNzVXE0YU1GWE5i +bWpQUlZJK1E3VWJnbjVVTFZQVUhXZDAKLS0tIHl4N1U1dnA3RjFKWVIyU2IzV1B0 +WGVFaTU5bUlvaG1mWDBYdEZiTDNVeWMKeXgwqd2TWNoBZogcY+KCYbw+k0ZM5rsP +LoyJdU1wMWNVIzzKN9LzFz5+nLTMjz3xnS/LOfrnPXC699hNo4BDipIItXq2laDa +HBMpgErdAvKeopoLUIDfU4O9DKVFARd/0VeYrhXXYXLNvptzORJdr5vG6z4ZxSzf +/jmLX/f2dkvwTw82ikCVORP/I9l853n3bYB/pwsT4fi9P0RnDuLTTRXsfYJ//jB/ +jUJaxJDAMOR0Nq9x/HPQJenuZIH5ovYSTuATx3xKEW2OlwkYsl/9IUhNz/Jrd+Cx +AQW4CydrjTOcyOiksYXl6HGXTzimnbXTNcYwgxdoVjsCNVuUMhK2FqCyiEnJ0oCe +sMWfYfIzfx6CkIruiAjLtpjy3thpoWRNa1MqrT2wUsvc4gENivsaL5K7Z50SNkGn +HG61lQ+L7Ma8OXX8NiZSgUUvCgLg4u9AgJtuiRk0tHmYGME88xuisxQk72PD9jNq +onhi9vOgXb2O/91+vWjwAqCAb7uLKI5ALD5fv3j1xahUURyhoXFCDJw2HVMU4XM7 +9CZweOpTZepb186LnvuYfqNPguKI+n1HsveKrI4cxRYnU6ttsJ5RqyxX5tE5vCc0 +GzJpZ822h5adjflFo7VPUIFBPhQQc/HBZz0nT3dEdYv1U3g0ubA03J1w5CxM0A1G +Td8D9rq/4b08tFFF/84WqwLBuZx9DYYFd1rXqIcJ/eCuRoI5Wz6lQ6VgaUT94AFe +4wtz9THhrRv3XZM00xh5Nm3JRs3YpFxiVWzm0nEzfyVcfkWAFCanUCJ0nU4X1plk +EPUSnD3/rqackUkQAbEcpurVJRAWZJ7FasgSpsTavQIQPhzYp744xMYUsEb8TtTX +DhBPzMO99H3pRi3PU06t/k7Uft8ojgmvOWdzxwzHwIr67NKIZr1biKiHK8/XatUC +rGtaQ946R9jyGKJTQzSkNvrVDr/utpH1quuk074esk/ZMa3ksXreJmnj65YkvTFP +9+jtyWDAGGFIGplKAHWmiAOpTM7FxRxZwNcAhp80vwKrSv7zcjSgm3+Mful9Y6+G +BkpuDnzM0jL7NfjbTtE7vyBTabnFIQtlz8FAx9y/QiZQYYhDe6aMMur2SMj9vdwz +z7qqPXAv2/mrTdnaGtW7vcuDNSZCVFr9qiAjVI+deJgi2fEY3J4HZM5FliuHRC+F +IXE1VaZJ1v3LU+KoJsdr44oJNam8z5pfJp3UEQleqN3cuumzTAbX6MhWLgp9UeIV +sNgv5ZRl9+qOfiTl0tlD3vwtmuqI+DiRH5Dj+YMD66LePd6Hed3lZy8AGtwI41VR +R8gXMeU/bhR2I2/cK8KwWNT2oXLlsqMIW+p58wWJKIj6BixNGS846XFrd27aLa04 +PsW7EXMxZBZDHq6f9ygZjIAO7xtwd5Cx6w8T6NrZnhvsxpHEQesU5x2n4tnhS1f7 +6RUEptYD2gZ22V+lwlfS9OrNRDvbDor6SSAQGTNZ17zk3/MdvZo+UKg3oLcd/ZDu +7rWs3ykYwYvq48bdAFqQksjPQpG/TmsbWKmCEB8Or6m9cb0WV8vdAz6xcdU7PGI9 +lFzDTPyz89VP3Ib5prKU94Tv4ocmqLAbBnllkenT4Xux/VKuWSomMjKw2J9tA5Ti +LOAXZg7jGw2frOCQlGjb8UsJjAtG +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_css.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_css.vim.age new file mode 100644 index 0000000..654e02f --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_css.vim.age @@ -0,0 +1,18 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjU2NEbTliUTgvOHdvR3dQ +S2tkdzhFb3BKZS91V1U4YmFXR0R0N3d6eVJFCm1tN1dYRGFwL1o5ZGdRL1E5M3Ny +MUNJdVZ4Z0VNbXlxdGhwNW0vL2IyZ2sKLS0tIFJ4MCtVaVdQT2FGVjhobTh6K29u +MHNNUkZsdk9lNmhNbHpyS0dDYXJrQkEKg5+Z8NFx0MPDe80Tj/XhrcYO3e8HgMTo +MW/+egp+AmL1M+Cl5Gf9sP5DIh351/EUYRtQzqw7qEnAlLj/8udUzOwqSYlkSrde +kfgNqWREk38x2HqkHAlpbZbQ/4IuuTlNBRqN/GIGqorTvJxlIhGJ90iP73fk5+XK +RQLGdUiDTwL/9VxCgqacqOhhRt8P+SjMQaVtv32y9BjXdEzfa/F+MxHMkBJWG2Qy +0c1wLIAD4vI1/73GOsUBv5XpNgNdTS5TO86PvUBJyvK3/gqUcTfrKOZ9KC1m4z5r +CPKnZP3TGJlQcIuGqJr1da6uFMHwDplu89KLV9ySJMqqNwTWbcUmPsi26kqTt4SI +zJcz5dM+ggwvh302yTEZQ1IvTMoy6mfCEx6A4YC1/NmBvV9zzwDJUOZDdwhQeMdF +mb2lvqC6P+6p3de6pi1eloDvXXg8ZkI+E8+VughaWxuEhoEAY5ZjvbVlqMICHsVd +QIVe5EmHa3lBFTcvFhi5BUDRtEavIETC0Tfa0SUmHs/P5BiRrAXBFylCK+SrJg9T +G/4QsWLWBNHxsecvyYaC7xuQMjIi6H/QyS3AZ1rMRU69/BckC4TX8xSi8B0fgN4P +LCgWXt1vYxUlbapJA4tAjIkn+FfmKdmiQf/43gNYZ5kROusG+3U4we2UQllhHjOM +fUw1AUZXc3moVjUAWQ/XyJijzL4F5b9FK4Xx6OhU8P9nJsVUt6h0Nl+3rVKTS0y+ +P57toPI9ATvcGw== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_gitcommit.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_gitcommit.vim.age new file mode 100644 index 0000000..3844a3e --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_gitcommit.vim.age @@ -0,0 +1,13 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0NjVuclh6TDRHSWFvbU53 +MnFPQkhvb2thNGNJT2ZuTldzUERQdENOTHc4ClVwSFVxL1dzVkRDQ09qY29xcnZU +YzJlOGt6ME02QXhqc0lqUVFkWmltSXcKLS0tIGtMZkROS3lKMHRwZjZHaXJGSkJw +SFE2UEFaWEpQRm0wd2s4UHFVZDBmdnMKHEv2SDVYF+celNbJQA2hpCBhFI+0qQCG +ZTH4t5NWLlmpipwuMypim2OOwf/6IXXACPVFMtPSxHgHR12bS6h8KOOf/Y4BU812 +83rWnMmQ/v102Jshh7ZhmgFQa2aUiZWilCSpUU+qPWKtadobOJUnQlD1Qj8K9sfx +W+M+jxz8KuMjOyY+QL48TnVSfUbk10M8H0Zjgo/TQXNJcJUmFTBJCV9ATV6qboIR +59FwP+yWs+nIbi7mAnVL8Ajqpmi1jmDxPTf3NvLqkoeB8yiREWP7Qv6MdQ3dRso0 +CCVdkImlJ4pcm7YwRPOussHbmvwlkvnp45HpqeHx/XgAxJI5M/g7ZZKvNgeDwPRC +l9VwQwvJCE9HC6MMxoA57oRuFI+bOU96Mz1vIV4cok/pep23UzGJMgay7QpXG2r0 +kQwjgMuzhA== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_html.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_html.vim.age new file mode 100644 index 0000000..ec10498 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_html.vim.age @@ -0,0 +1,12 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXN1FTN2Q3anZramc5elNq +a29ubm40ejFMdWY4RGROdk9MTTlPaWZIUFNzCjk5Nm84Q0k3c2hoeVU4T2VSVTE5 +aTNzL2NOdUYrV01ITUFrSWVOTkFoK0UKLS0tIEh3SmtVcFRKYWZtWFhPQW1ma3c3 +SkRSdjM5TEpCUUVGYW92aThxd2FKbVkKbqsW7iQ3NXGt/WIC5XvQUXDwOT4C5KfD +Q64NXqifjJkgudziohFY2VqETfKPRE6xX5jw2cS6WSVgfTbDbzz4AafB6Dr1Y71J +AFoBvah1QoONdRShXtZUgFTZVNJjm62mZPiHkZlhuASqbMiwsyrgNjeDLQTJMe3d +Mi1EQVvIsa3bGUs/s1zq2VK7YPDEHTadH0xd4wcypCHpiB0AoK0JS5j8QwfZcz1R +aMUwUgmC/65wU3t58rgSJXOq4r0mSaOBezOtadZPXiyrdKE0BinFgMdycVsp2+hT +cB8rRGyxWW6TdOPXBT4w72BF1Ui71e70IG3fOARKCPyq4Iem70o3PEoIlnxb4lep +YT79TTb9NASkAA== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_javascript.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_javascript.vim.age new file mode 100644 index 0000000..53be29e --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_javascript.vim.age @@ -0,0 +1,22 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaT1J0MEgwSU5NNzEvV3BW +R2JReVBOTjJzcGJoZytzbG1xOEx3NTlYZUVjCmJvVnIzclFybTNTQ2FwOU1EY2Fw +T3FhYmZ4ekVjWGJwRlhSR1F6MVZRQ2sKLS0tIFNGaU9DMy9ETHRSWGRRM2ZMdDFG +b2JYUDllMHp1a2RBazhSZG1WWHBHM1EKPyaVY7t2bOSBFk9zGdSOus3rkivcwRdh +BDu0QXchl7gf62PMT8kIUDiGC34t8eOAhW5FXCcPxQReUeCVGAgrSbZwVV8Yr7+L +qEWdKtZvFu0uwVpMUKBlbpp3BDij25XW4rgK5gjbhWxwZ2KUaDm29Mgj87zZqTJl +2M80ZxUTQyA8nUe0/UCl4txKbrHraEV0qj28GyH/l6sUwphRlvCRPTOIruY3q1PR +vIHBNg6CzeyDxQnPyPf/Rqlws9s5hb5rg8SnRiwARHYZFh+D3rXOJDPNHzpBuYM8 +Lu2dCgvCHFZKl7TZa6LD92soUvmfC8inHAT5Do+LC4JSLlsJlk2nIIV3COGMbtOR +Yq73A+fzFSS49ixiIShLj3SWevW6dt7bKkPkE/NGe9jlny4DEltxZ5cZYnfxRjZn +tb58FNMY7ZBTm3SWxaz9dKUcjkwfN8zyW9Z3czCacmOiJmlFmCMYcWE9IfmqtJIY +jb8aK50kmloEW4tbOFsMGRnLUzRi2sA35TzZn68f+p1rpBCBtEPs+v2kFa3XVoBW +IjqxKrd6n8fOrfZMOR8pnN7YFA9O4w7BFotPAJuteTbHUKtATFvQKt3IjYablK/0 +LiLpn4ryE7UHo8IB3Fz1/+Glw3hXOO3yZVOqH8kkJZ3Axi/ZZlDMEBe0pF9kK+sT +/j05/XxB8mq00gDsbjbQfAVYPaNXa64O2drqiT3WwMI37ESaOxgd8nLwJ71/9yxw +lxOhuCmxH35H6aZURoj/OVCym4AmJQrV0lxQr02SVunDAaYJ/0fG5T6duRQ01mCC +tb2S0E6OY2+tdPDpaDh6mUufVJ565eaQrHwvHsmeie+AkK2pm8PM8/j8UwKw81TA +vt5v9pP/WI31XMN8gr/H8LCMpywiSmZr7zkYPDBkUiOvQIp0kSJnH/m7R/HGVH+M +tTw2/5OZS9Gd2vFx89XItd1i1Mm8ic8f99+926iSyakgjkC/POVv8dR7nAaxV0gx +OSuiyfza6mcUJu09LIoPu16iIbuEukeGNuhGTNiYIADh +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_json.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_json.vim.age new file mode 100644 index 0000000..a977035 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_json.vim.age @@ -0,0 +1,9 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlS1QxZGhVZ3N5bkxyVm5I +YXowSUNtb3M5ZVVhWEJEeFppRmFrNzU5U1NVCnB1eGt3YjVLR3lla0p1NWQrbC91 +VDFJNVQ5dEoxUjB3aHhySU9OM3RLVlEKLS0tIHNWMDREdFdaeXBTS0Z6ajNPOUNp +bkFCOWhRMS9HdjJDNzRFNit2M3NKaUEKv9PxyseZPAS5QuMCDEEPJ6v5iGbUAX0+ +8R4jWZKsWwl4r+rRX32L9/Kk3Pv5PGG47S8TEAd8+DdGhP649lErVv4NTNCQvZZ1 +O0bxdjky40YE6LWsv1k6O9uzKyJcejasEf2tEURfmS46Db7jdvdZHj9rGjThbvqw +qtfCwsTChoNSOnMrtnjzYeg4Pr3Ks6gZaGiAywuyzT1dRk6hA6wQeEQR +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_markdown.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_markdown.vim.age new file mode 100644 index 0000000..bbc1713 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_markdown.vim.age @@ -0,0 +1,48 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4cXlabFdQc1dLQWVTbktO +MXptSHA2b01EY01MYnhkL2EwWi9XZndVTWhzCnNjZ2ptU004MUNNVHFxc0lYNTQv +cW9xdDFVRzhZeWxJcUp5ejM1TWkvU2sKLS0tIDFsamp6WUNudm03bU12SjNVSmR4 +MmJvQXc3aE9nMW5TSkVlenNtaTFrYncKF1IAkHo0YjP0uW7gg1MJMaLYZlcva4pb +XTGlcJl+1pcAAjb6/jM7upt72NfyLTV5OsFrycRWA6YweTZOrxGG4IGqjgcIB7Ok +32fjuTT/HpuvtIGajTVDfSthSwFTU08EbEjEyAeEjgGFsFjwagbasf6bvs5EF9gV +ffcjS4gvXA4LhaBCd4J+jDDc/J2dhwDZJ3CBe79SuUBCzqDDXBfD9g2AvE5gfOQK +WeY06i2MogQH2GNjfDbV2WLw3on37RwRFS95da+4Zyn6+WGAO7Eu1k4cOhyHOh26 +6jXNNgZI2cL1pRXaC/BNGAHAnf3I1k3vzxkFmkCtXn8DaphFg1Ry1w7ZkOwoMJl5 +E5Aw75BaX0YqYrsmnjKDDo/C8YZP+1ZDoe5jj3alCGiu9prb0ZLl3AmFUAjEfRDX +9koTxcaSYsyt+vkPyuvnZWL1PZHtLLKkQJowvmDOlpSU+xtMi6VXs7mn6InBesnH +Qb0tvDvfPDzqwFKxdqR9RosXKFc1TVU+hhVvJqe7Z4zT7m45LhEx1YLj+c4JHsUu +Gkac7u2dl+KMezHQlkw7XzTCXo/aoehSZv57DTewF0zkJV2I1ZjejVRd25cSEGli +58U/0mn4Pk432V2DzUWgMlvIpePgTVUhIbCBEC/OYwkUpjVmrenuy4zVzZmtMGyW +pEubOZcWrIa1KkdbdwxSYbrtOlWTfIWDb1b28Qlw/vJ4x9gv/LBoCTJ7+o9ff7Iq +Q8GsqMF9O2WD/4o/QweTHGHwL7LSXcM79tE0KF1gjbIaVa4zbI6UfxIpvbo4I9Jm +x9cBuTTx2ZPGdXaJIiNMsJyy1nhM1CPDS3XNEVousW4IGtHBSwkhhbUwIo7l5JpK +mJYmH563dCkEBYW/a1Ib5KJqE2xSgk9isYu8/KvjxYW0iE34SJ2hLzx6BHk9B1wH ++XuLmGmH7pH6FIGPohVMNv26qlIqMvIMpqOdCFt3cy6sOl25SZo8Ntei/gf1N84o +kP5usa28UfhXA5bEkhr9GEmRfZhCRZYYo/cBOvtfdihCxOSe4QEuueshMDhh+HFd +zVEUinPSCHPkNHCFut04RPX3ZeMCKxAK0R1xz01C0peAOyvmWjRgSxS7rBcoH82N +4KeZvyrqi0WVkWceUWOyVK2V2HWYJJkDmT+s85Of3FRjs1TiUZzGdHoi6orASxSN +V5GmfEvbOq72XzJxr/ZfbS238Lp/fRJj6yzvM1hqEzvzZdWf1f8MfsCR8JjGv3z0 +gYX3KM8m/bSj7EF0Uf8DP7L/XLAJ8OwNHqCRSmtHQlcsA3ydW5TR4W51yCYpsWD3 +HLrTt+H0Ktkt6uXiRBnWI1UaW+kAXaB2UPWczFhtpGlXxhTAKJjsGFex42LnO6f5 +jcbkI8k9oxPoyUKgOniaiiDLBgrhRryAkaanKfqqm2d9IT56fkQ5KSeSL5wvj+l1 +G/1W8KvGZHlelQdFryLSHcZ/IHEgt2KbfnP7NpWU932ten2tryApAPsAEXwwTRgP +mOgUUayzhhfvuHXFCUZ9J6kPxEtfy5vFodt+wNKsJSWUsN0t1lA0JO+KklRfsBvD +VbatWfY0wxpBHDos8xSxu0f47j/gJ3vQ8Jb0iBKSSxqlgHgagnkbp959/Gx9VuhS +SlZeYvFeFmtJzofp1WlSLSdkyM2jaX/vvJQquWVGxOTByBZ+RsYKt09yn7UI2Tf6 +4LFV90bfoMZbfA+iJJqpiR20jN+ILX3awpZXu2q9LE3jjystm0orFLnCwu+QyjKb +5blGmW/JBlK7UnxY9MbhCDRI932g3POP3n8eWUpr1xC32ChM7ua/cMYEdn9GT4Aq +cZD8RfKX9sT8WUyzW6MGwUBNzkObbOcS0cEt0vCgi+Sjj1HmBRitIPfRWp6oYFYD +rheV+QdTUhkjaLRfCCem6Zo5Zj261NbHpJ404sjdc+jMg4EfMgaVeb8Vp4ieNPKJ +F5jaxuV8CPLxsNb6Jvr0tVgNf2t/9qO9gDvTGkRlT24rYLAmQYzcO4qTUrtY/w9s +0T9jrw+vS7gOzVyqGGGzKUuCH7stq8EkUlkvb1eMrTuFpe52E53KiZXcH48HrPkQ +CNUIQYa37Rs0f8TY6rYs9rRDlDphUkMBppLn39V65ML6YGNqivLldxI1UgSPdyvj +GRYi12WARKCHKtIn1rDdy3HMAY0W8jaXNWmJsOVH80I2e6CQ5qRds3PW5M+0oqFt +b+nBlRF1S+P/vKm0fkqH4rFR+fMkmLjCpfdYQ3pCGf546DpUoIOJZ6aegc9oHpaE +ugtOGUg3IbIfUbapVtUunbFPhYYIx1rPVgfW/A9oScVu9aChF66TAR2CwbjlRNVM +Ma2VJYLAJDAQOiBgMw97ZBulO7+I8JP5HqGHQ8NP5sCLiFNzSC+F6H/p7rkrwcNZ +yt1QX9ATMoPI6hTgAa94F0SRI9Fnf0vIaiq3Hy/9cADn5Sp8S9fLtxQlQlxur1dq +cKnfqTW66EV0NVqrztQ8sqGyIgyysGa/Y8sxi7SNrOyDE+xDWIE8b0vW7fviHn+V ++ypnIvd7F488Lf6cy/WRm6v9iQXc7ZRGffh6htg8NM+VmmkZS9YYnSIzA6aYrlEU +oLY8d1TgbecX0wxi+WNniOa3mjEMSA+Irh52Ad1yp97yNopFMIRBl4w5N/noK8KR +FtPtF6j6aeyMzuKRtOMA +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ocaml.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ocaml.vim.age new file mode 100644 index 0000000..394419d --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ocaml.vim.age @@ -0,0 +1,10 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBdkFqbUZZVzZCRUZMTVUy +amNwWHRCaGFXeG9MOHh6NFBMSHdNWWFMRldrCnFmU2Nhekdod0lvRVBGTlBBM1Bs +Q1lwMWRtV1piUlJiL1l1Nkp3bjBqZ1UKLS0tIDVISmlFN0lYSkZ3cVdnbEZNZTJG +cU9NeGpEUi9TbE8wbzBVdlk3dXUyT3cK7/d4fcGlSAsOUGQr+X/RuH3D5zSCTs4d +2gMDuymQHf9StS4rGLS5Va2DmAePZ2jWbnej1OJncGuq2ZjGSPgKI5fRLl3jX88S +4XxlrwHZPJvfexAHavrLkff9Kymih4Ku+lteX5tALkIFlmVD7hCZy73jIVGonwUG +ggIJoD/nTL+O2cpROXe4QOnqLmNmtE9FU5BePDuhH82Ohgfx9wQYLQuY7MusXMUu +KvPjg/uY8j7JX8uLPGarEGw= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_perl.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_perl.vim.age new file mode 100644 index 0000000..3b25388 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_perl.vim.age @@ -0,0 +1,33 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0cWJsTDdablVyVVpHemFr +ZXZQQ3FQMDdXUzZsMlg4SmtSR2VEd3I5cnc0ClkvRzlCenVheFJjTTJrQ2JHTnBE +NlkyNmtYaWw2NWt6Nk83aUU1bFFkWG8KLS0tIDJnbmJOUEQrbFhYWXYvQzNjTUJz +Uk1nNnpQODBMajBaUVJmbEErYktXdkUKdq1yMHoxI8kNAdl4F4fnGZsXlZ7QzE3q +YnlhJQz5mpVQE4MpHb2n1xGO9WTRFxIXme1+IWkpToQQyC1NU8WV3NuBvF/+KfQ9 +eV9bPtX93NZd+PsIkHvhkbiPMUSUDkS7MfD43nmMwa0snTmfJIH7bu8wiH51R15U +UQxqwKWfaxsG1pnOMPCwcGCLVreA8Isy1IpDEAotpi+71x3luFx94FrQHtv2zmTH +UWKQEPn3H5D5PkZzAb3Pfb9tGkfFwPkcKe/Z7eE5r1HqXpsCJ5m/iz0dLtzOoZOO +JXLoutOsz2PeK2/rZsWlL0ZBzBaqZEBYuX00JK6O9FuaI+AI76EpU+hyNN9X6mVS +lagygOVkWnSXYyg/a2EnmXi/bkddBapHcdUHXmjmVvRTdNmpTNBa78MDjAYwDJSV +RYE3N3cKqEm9EC2nln1wcSq9bo7cDu6R+gT5kyuDMzgIPm1JJDEsiqkInXKXXsPI +bV6S4EF14PdloytmxT8GC3mOatjmJ7G9tdzs4COQcJMR5pdhSnCR+XZ/VB9m4JGf +zQgcKUr5/EK7maUlTO7oLuAmM9WymJywQ0XAseJR0+B+GguWYwTOOa6vba3DecG9 +LbOPZnrt0rw9uDxQLWW/NBBDc0a51ORkAvNGk6B7lwOBR61g0mThg5WRBp0pBP1n +wZvlQeP8CieDwOEPLH0vRqt+PA5BhXxdTQXE/E7gaqaWNif7q5ZgkhsQ265CXmN8 +WRWWFk4NPHHKqVKU4/R+3oQaPxU4g4W4L1Il9iKXjANnJ205yE7jxjSMhXZXWzKB +vucory/lzYRQIIIrh5sp/zQBERQgFV3kvjAdMwnKiCC9Cr/4U3G7dAPy4FhY5dKJ +7goX6fvAE1YYn8IUvrDrBNAlO+nAtQcpJFNCzJRnZcJoRukkky9NsTHA+Uce5MUc +TiPk16HGFaNNax0Zj6FLjmGZz34fMGRcNZeNhgNO5lVU7/84m4BUgEtDVoiFwiCQ +6Yod1cfBmAazPa4ZfYRmCfY/BBT/0Df3qedFeG5D+PSEjKjAiP3RBlLhKhxQtMCE +7jImGxzbRBOHckvB9pv/n8cm0uFY3qh+B5B7gxDKqa8nnWPumPOn02jAZI0Q0SUs +HebzwHMJGyjzX6X4J8i6c9nzthkwUOrbU98egMbPnSXVrP/6opMjyRBMQLfdf5Nc +/EEtptiSyeHMJxWFa8NT4okkBDm8rVZD3Hkey+1Zcsk77mQwqn0ifX5WYVRGMb+l +X7WnyiVtQ2ywDHeKjEk7AfLvRUv8vIEklEscHLfMymbcTqJNqXGgIXjOWU8S2zvx +ysZ7649avye3ptlE0GmDrSUVvB5TZY+Bu0cfu4Doi9v/Hur6HEOCUmRX3fJx6qjR +mLoYxTVDiE/KWNqy5fDhtWftHQUhhD0XvqRVvCyFL8M+UtpTbiIKzSG+DSGSRqet +FstyfQHeZIUnEg5Ghz3zvMPdgpUqzLSbXkt9WNxNOh3e45Q/hpXuXTw8yw+OZzht +R74MVpDneW4qGnHOVowKxqtrDIGQ3otORAYOAymWtk7Q4yNFX2sLuS1TQiP5HGp4 +k8eomMLQtHBGrumhKyqsx9oKPR8h3M/l7cKQ2DpVPziksZ9u1ZGr0eKov6Cs/ykQ +JeLAAcgn+pswUXjrvWGKPXhZ447xXI6Q28mefERQ2MoDLhFOLUUBQoPcikZKViqM +Seo4uyCooJit46NqEpbnji3OJe+qGAF4soMDyHsX2irLHU/uWjTRaDjD +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_php.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_php.vim.age new file mode 100644 index 0000000..62c2618 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_php.vim.age @@ -0,0 +1,12 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAra3RvTXNMc1NvNmhDUnNC +emp2YjJ0UmZVeVBXTlJkSW1JMkY0RlpmYlVRCmdzeDVxMU5WZ25naU1QUVNobko2 +dzU2dWE0bXF0KzJtZU5HdmpHd2lLaFEKLS0tIEZ0MVM5WW1NNmZDSzZEUUJMOVJj +SXFGUkF0NCt3eUN1Z0g2ZDExSjl2UUkKOv/iXzBa/bHXxEKkF9AF8IaOE9+f/bXq +Fx7OzPucP5N5cDHWhaY3Bd6K7t3LcwlgnMkP0UN5hpMY32d62ewUa6l/bMkaJ2CB +MInNhaJ6ejnZewgyGL90yDvi6Y9DfQySMSuR12Fs9HiH6iFYanzAz4MqZ3xauXpQ +Bk9Wjvz17NaaSZJf74P7dE1D8qJSBwsX6kcSnLAgzPmhDYUqXOTGat568X7vocer +zovU26FWFWDDi/pQUJ6d/wQmM9OFoWnMKMA7dVi8b9H/dn2nkF7OCQ1XqKefCoJF +gJOjJhflvSL8mQWSJXhnuSk7lwJ7Qe+YirTfYSvNk1QtAHrz5cXXeLrm8XcYOJCD +RoIhCf5Tj3FfLNNVQqjBkzQbbhuLcKq6d5n18WM9IDAERmaCvSbylXyZwQmU +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_plantuml.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_plantuml.vim.age new file mode 100644 index 0000000..702a1ff --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_plantuml.vim.age @@ -0,0 +1,18 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaTSthM054TFZzZmhGcHFS +SXRpQkZJdUVuSDF4YTlHQXYvSUxYdUxNVUFRCmU3QXA0Qm5JZUlDemI5L2gvRElJ +SmJqREZyQi9vTkpVaSt3QVRONHhqQVEKLS0tIGg3cGY1bi9SK3VjbnJhY3dmSkFy +M0N0WWo0c0M0S0dxTXBVNGVhVWQySWsKwFYoRB1j5b3O1poyuVHH2WiP4vWo7zT2 +bjv5+A151c8brIWV8aByDZfy4JJ/60Cfl2DmDktW/e7QZaMjid4/kdFky8zX3Xh7 +6VFZwuu8To6FRRfksBh2u18z9QodB/Wij/epvG40vvFnCFGDfvUjzNRjo6D3/k+7 +wEL3VQGb0G5To6OvKRD3qPNJ61njmz8KR3lRk6uFXig9Fj4kLb+/1I8r9r3HXqxS +MwWNP7YBahsZsc9AfZX0/mCgoyyuJpWuMmVHRyWfrwOSBlvHSICC/DB95Z6EgSIS +0IGhxuviTj2tyQ+BbrnOVGHUGs09iH5gE8+2eVNeXYQAEu3yGW9usatvwwH+8zuL +A4KbFVaGUnGLVgwOV+mIohVkGb3948+rmGKJSZ0vhn8hlGzx5ZllFGVF24Re3GO6 +khHW8yIfOalh9Ypa9k0YhLKoJSpoRyh4PuEoyUx5f42p3Zgl+YYe1oGiRKjGARBe +d71KbSnv9TzN2FKUaUwckHNJVy3+XAlCZATMVm3qoDRbo5GLHIx/VxgyX1Te5IfA +FHqgqP2wL0IA89mzkwS1wUpBA3zuwjwwPGRfGvSCWGHISFqMUfXuQvxLqvwVhm6X +HTxCHI1F7T3dPs0g8MDAXXqIle86C6HJIs0Qz1lKO+RuEX3EkMvllIgaYswDFtyu +hqPrrT8k0Qcl815qwhIv+thhQHJuKMlhZhdI3aIdcjaQ0RXGEuyuBNqa9NloMya+ +zbrfTCzLZeWUUWrPvA== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_python.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_python.vim.age new file mode 100644 index 0000000..7f4401b --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_python.vim.age @@ -0,0 +1,13 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2MUxqVUMzZDhWa1BueWZu +VWh6czJ4S0tUVTcyV0Q3K2ZyUHhqSnJFam1vCjVLZDR6cCtmajM2QU16UDhYUjVP +STBsYTBuL0RTSGE1OE5OUUR5ejh6R2sKLS0tIFpQcGJYNWxwUDV4UDRXd1E4NWdp +ZlQ1OGFQWlZxWEhmQUs1SmRrZzZ0K1UKzmRPDwZVrkx8B0yC2eH6KurvXDTrPRyB +uR7+VkbX/CV4dpe8IFATsXvL4FIJTvJaHxmpNvyXaC4JossmdrMxMgLrdul94VKJ +NMYmkGIw2KSgziDtLp5vtVt7QR5DYwM6Z0QWCwIiSP3DrRhoIcLmBl3ENG4i2GQE +hkQPffyx/nMXWf2GMuX//9GdasKUDvqlHuKFUul9sL8QiLUv6tHSviYD6HcagkzN +EliOW1Y+tJrISxkv8paLqcdTrkE5yHjTNFptFK38qdQ84m8cI0VlRtKpmEn6RUso +SoDFoK3U6UB1gvGGgpKSm1tsnCE2CbHk4VtSHWsVTgE5Jzh31mpQM3XVUFpSJ49/ +uMaVt0aLlQQ1OypbTi+W4HDM2w7fajyMnO4OH37UVOJvVmPcbsq4Wv5DBgLXgIKs +xvwvSASlPXUTPckG6UIP6ETi1ym8cYIsNXNurK9oeAg= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ruby.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ruby.vim.age new file mode 100644 index 0000000..bff38d6 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_ruby.vim.age @@ -0,0 +1,18 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzcnE1QU9IUlp3aHlVWWxi +ODAyZFc1bWhTeTJZek9hQzdDaGl0YTBRRzMwCm1nZzU0UzEySW1GTHpSQktQUmFR +b0oyY2xscTBhVDF2U3dHY0UySFdvb0EKLS0tIFhRcHJDZTRCN05oQ0lWajNUR1RN +N3o0Y1d2ZTZKOUR5NmdMSmN3YkxRM00K2p6pN3cALXv5G4QzKRArzqH4NaL9dMKK +zBHfRgAOn9WvqZMto7ecHMxOE0hq3QmdEBx4xZhIbWnpqAhAqso6VvtDdR1bnMYt +08R1PK5hIIf3vxOjla4Le6KXXmVetn6fQapu0nY3rfKidJkLwMDlefRrwW3/11Ti +QTGvYhaaLhkRPRUmbYCPpu8SzeITDfxOCQa3oQQTNAnoYPsZrhkcAwG62jZPjgmd +51anhDvc65uCxEjlYRf1HHW3didTKBBSexKv4QGV7UbQtGBagyQM4E5LksX3fkzQ +aeg+MwoIK6vxSse6ELJwnizYO3nF08yzixnvFDhdzmEARB2TeejDgtivXVO5kVTB +cm07vTp+O19/IkKKT4zOCVjGIVvsolp82In0c3oGp6bcOXq/L3nxFQctR9qLcw+6 +ojkVY5T26W8bjKT01YYJETjr+ngU9PJ4jQw/xLoL9HdoJ0A0FT3R+ti85lWCNBWg +RkIEbSmjzcP/QAvCt0HtKl/IS4UThfF+zFd4NknfrOuQVbI1JF4i0vbkahGFrMsf +CT1UbFl0j/akkmhkTLRWkTFourpqRjQ2z4TDnolsJPDVBqTG5fOLfHkFsZmMTnUS +nQM3AIFrPOodZ0RXAZabjVJiPiN5LaVSPh5i/UCYvf+my3Kx036h0UI41/1xULrA +Ol7IAUuCjdiN1q3XoCakKOHddN1GdL/OB/YGfur/KrKcfEsaKvgtVBZF9fVP0oql +fCLmLg1ZKBEPm1Y= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_rust.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_rust.vim.age new file mode 100644 index 0000000..0cff197 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_rust.vim.age @@ -0,0 +1,9 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXUm9qV29yV1BMVVUxN1BR +ck1lZThmYlFnNlkwZEZKUVBBbUVQUjkzR2djCmZXdkhwbHgyNElKQ0t1UnhXcUh4 +Z2YvaDRKVUFad0lmejg5Ukp5SzR4UncKLS0tIFNiQmlDWko4VXErdXA3NG5SVlFY +cnppN0QxanBYeXoycm1OSGRnc0FaQVUKC3CTVxnHZW7rPIc36WP04HJ24kThwFYA +r4qgbq1O8bWg35cUiOFHauxbezZRXY/J0oHzJy1qHPttendAVyBUO0l2F3zPrsre +AXYMiaeat3Rt20kOS+LgVv7Z7KxjKOQPnoxBnEtikD5y4U2wKpgQr4TP3lw38VYG +JCw= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sass.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sass.vim.age new file mode 100644 index 0000000..5cb4d1e --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sass.vim.age @@ -0,0 +1,16 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBZNTBXK2ZHN1c5TnR1Q1hr +UTB6VFU3bmtseDFRVjFaUUFBS1BEenc4UWdzCmJUQVVORTl0dTJXTWJJUW9tQWRv +VCtxSW00b3A1aGNPSW5ISjJQendBaWMKLS0tIEM5ZktlakswMk9rK3BaWEVOa0ha +ZkNGZVNoYXJPUTZ4dlN5dVdzM2N6a3cKQy1e/lNjLfAavCqexm19M4r3aezeR5wg +/NOB2DEN5TKPsyRlBJQnTNTvIuUG1GQBY+PMNUHU0ADuOByPjEA9uXlcEB4mTsZ4 +pddsSn10yQt27kdXnc3NevV5KFur2lB9JBnsILfjG36CdHjbOQe8uwHX1G7X9Lme +ekxj8xYBkCV1mfAqqhYtPCOo7Iky1S5woWP1V/9T/2yTCsvq+iUBzzkwkgrUoNKT +XztahP65FKXy/pkTOSwv5ovzhJ9O7mRO4gguWSxz6Gbg0kQPw/mdASZdNNo1eJrD +p21qQsbYqtenr1WB9tzvFsz6HSveLPORK+AQO8AmkMBOV7dMMaSdMe5joPzzTQ7a +Wg5UIfVMB7PdbMW50NQtC3JWCfNdz2W2d/EVuGZ0Uzf3U9DK8W1L5HRHmSpgwiia +k+1x4hBMPwQcCJ+FAf53T6zTjdtDzPpWpUAfdrjJ7zbGPlHa+UKFN6777jlH5g82 +zfnumR/mZFeaCEqif0hOM7BRB5yUc7lyJRf+Rtg8hHCFbvugaNm6T8xHyXwkzza6 +b43DBEvFhjeHLhusJbiSSnuVZVcWadfsZSZnl5qI9vxztt56+4ByGDHrmn/aNIrs +FC3NFHpPXbXCOn+PuQ== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sh.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sh.vim.age new file mode 100644 index 0000000..0d20601 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_sh.vim.age @@ -0,0 +1,11 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqSGlRb0dSYjZyRlJaZFNR +MmtBTE1kZ1lMMFhjVUZuUE1kTkl6c0QrNTF3CmJtUzNubmUrOUdrcG01S1QyVnlw +aENSbnlUTmZIRHZuM1hnSFdxTENLRk0KLS0tIDJNK01JUVI5dmV0MlNTOUlZM0V3 +ZXFKdGc1eTNMNWVhNGU3Mk1vZHpLUWcKt4a/QkYvgKmGrrSQZWr317AjhUiPZMUN +9J4UTtF195Uju5MLVojWi8/wEguM5bOIB7fdEOqRjerjUH4AoqWzMqx0PQqHAx41 +OqI/PVJQcRNCcBAjGMArHvCJr5PxCbN5DfYu6ELmt4LAVhBu34NUCVVpnAoEhurU +kJWNY80hU0KFlT0BLYxZGtRC+FkaFY4fxyOH2tnV+N3K3x6th+BnwB2CEkUVVPkC +OZhiYNTqKtQqxdPVlYFUfFisapIFjI/uGpJVYqZgegZ6nyknHMbXeJMbb+3IDIOY +X6ej7CB7 +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_tex.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_tex.vim.age new file mode 100644 index 0000000..54bae2f --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_tex.vim.age @@ -0,0 +1,19 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhZklRUUYxTkE0QjFPT0Nq +WXR3NWpUSS9hekRKWkxnZ3lCTy9HOEd0SDJ3ClJyZ2M0eFBLczdNYk9PVXdzVXRW +QnJBdDN6bm0zQmdvNmtDVDRHUmNUUk0KLS0tIFRHLzYyWXBEMXRhN3pSYWtTUnl6 +elBJaXBiVlpWd2UxakxZY3pPbmhhQWMKUjgtatD7PRC4zPkU14ghoLd4WTsAzruS +yS1Kjw5rIiDdIBgN3A4u+4V6cQsY/iplhRspApgipTCHQE0mGXDT6fF7qcI8w5oF +FlqDv9QCcRSmLynY5pIv7x7947o12RtIoU52+1mFWag4An4jR8MCqU5O8+eN7xJV +D2IYcGmIbRGte+gj7CVBzbMuuhsLlVrY5SxscO62f58QutcnGzqBxyaXigE+1+vt +Njs5NWXLucYUCBg3/CBL/hussNed/aD2UdQi0RFXCPiP1uhKAx9EmAwYMjFF2kNu +7MsS7afl++GM5ocuIbxIklM4yRiAC3Oq6mh1mnBY3Rnq4Wii4YVMx3PvyuTl+Ick +QWDWvn/s2ZfpAuXFXWcpJpPoTkHvb5ObUnVezIJ7kRX55PSQXzdTj3x/INB+/UXP +FQ1VozwZvExNm6KlL7QA1mhGp/7hXC9j/ZxreTVON3iJNNMoVVDvZiRA25YfSTuE +Ya+MGCJKCDWuG9CqmaI5ZL2BNQPhlyHjoMzlGZuAMf72hS5QzTJTbs0QGclS/FpN +pP9IyWmp7g9FqCtM+jp3lLWiIazMyNqWOnNJ6AZiKVZ1ZHYkW/B38JBMF/gqUwLS +HudGN/UNvgJn5LSkEeEGO9PlByX6gSz0lRAVDxsahavvCxOMmt8YDFbeMf90hxbD +CcEwIl0OdN3IhCQ7s/CpCeUMCGyxUtn9HbYsHGo1Wz6vUSTi6Pblc9ApbKCiU+pn +fVZJ3iohm0snhQjdVHMJJIC12I3SEPEolg5FF9m0kObXlYKegIxY51rhX+jmC6ke +V4f3Mzho/qz7cr76diQB2xMBSYQ4hK1sbMUHC0cSBII1jh5wd9JA +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescript.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescript.vim.age new file mode 100644 index 0000000..11fbe0e --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescript.vim.age @@ -0,0 +1,62 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxV3JHL1k0WWw0QVlvU0ds +UThKcmdJd0FVbjVjWTBuSmtzdk5XMGdkMzBjCkdjZ0ZhaW50endUYXh0YjJobEtn +cysybFNxTVFTZkN5dkdZVjRTZVVQU0kKLS0tIFZ0dFA5cHdqVWhrMlZFUmhtaVFy +bmVwUlNkSkdPbDRxL2JGeTZNeFp2SDQKsXMiEA72gWIeCVJjHZM8u/iM54SGqspE +2iX38d73NSybKg1wdaz1xrhkDayWfMCw+cE8VNP+2H0aJFokzIfzDJmUQC+JdnXH +tg2BIGqGXQNOIqE53q/C1glK4LnICMqEQ5KxbSio6m/3wUeZXGhd5bl7kTiMSLmL +x0sbGaALsBrKYghC+STM3IV0nlRw6giia9LcBZQU3B5mL3qY/g1Gubnu5b9iQWuT +aPKfHckm6JTKVn0j4o7FARqC9oWnA4b4f13Ybuj+JUm4Eb1c2mj87Acv8cR7oy/7 +sJiWwhdv9/1S5OlkFw1BSBMyj20v6ssgzj3+p0A+jUdKYB4cmbYLTHiiNFfZ/muH +VAtxeTyicsCGpFxONtY9f3tRvPUXtmI6ypVxXFibEdiBdYBszhlYAf96tw9UGbms +izT5dQl2XrbSzeGyXGtMCnI4swEDjKrpxPLhm9FcCQBo9vJtmLBdARfYZMmpVOmz +ZIg58uwvD0x+7E9B8xem2AI7HklnbbpwMRTCbh4+zmdM+rlcaIuu6GADJPleQvrr +z9ezEvm4dmZ2OJbl+QXfbvLGBhb5NQ9zj76ec/mQ79K5lbqCqrWod1iuVlr/0o2s +Zi2iT2n9Z5ZplPHizRdKQ9aKVreiPX5HnjctCTEmRAo/tGRNFP2YRulUJJZnlIIK +nieJ0dED5LUe9QXQAwilVVXlJ07STaXLBISuwCpUgCgdIQCsYljl7DMdmHyR2ois +0OruJP1L9j2gXwdUkm3ekpmtWXicMARVJjMsuKXvK84wwXFKhjHbIgt8Kua8miE+ +1hVMJVzxsMAY0WxSG5JjARZUY9kb4h39fVXkgj2PYHIEIhKfGbXRO5tUA7SFv81F +5Bh2dZ/lStSzFqaN9bVp0nmMFJbh/ENN1tdM8AqNC4wpVYDDU/ZwPBF62z72chXT +0hAPAT7F4xEQGo+WjR93ocXLm7Vn3K/0tkZg1E0ONUwlZvmprYuMUuqqm2ZybcTJ +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 +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescriptreact.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescriptreact.vim.age new file mode 100644 index 0000000..b2832ab --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_typescriptreact.vim.age @@ -0,0 +1,12 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvMDU1YURCSHdYVGxXOVpW +eUJyYTVHZHlwRkk2TFZEdSt4YlFsNlpOdjF3Ci9iRTFpODFLRis0UGd5d2taeTRY +R0xBQWdpSGZRZ252UHhJL3NlSjJpWEEKLS0tIFJ1MXc4bncvYWhoREprQjAvd2ND +ZUFwOUZmNXRFYkQ2bVhmTkhRbTVEazgK0NfWAPlKzzVFht6QP7248CxOiGv92adJ +Lhiiq4eGoed7XzQ/RFQUYqfCukARqADkZgzf6MonZ/TNLx592rqsh00d88QFXdqG +mGOEnUiOucmDhSVjwWq+Ds7KRrpha4E7cZ/M+bBWLU+9FnN2hvbg+1Jhj6Vv5oPz +e96yqW8MGFsHcj/M9hebG6/vX0rXPlo8SBAGHkGtQz7NkO6GYieGMPRxWaZEU0pM +wRX/oNrXRyBdrQfqEJPtbDUPSauA5JrzHoSuELDtmKySuksnUFKZlypCuv4s/oGp +vvUjHqYirrVtsta7IQAXsuKNnfT1a2gfo35axNY1GyyuvuuVvD3NQYFYQ3MUiqP8 +EcQv11vASLirNh4EIJI0B85uzw6LHA== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_vim.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_vim.vim.age new file mode 100644 index 0000000..dc435f3 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_vim.vim.age @@ -0,0 +1,16 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3eWRwTmUxSHRhdFQxTzdy +U2E3dmM5Q1V2SnUwNisrNkZTblVXczloa0E4CllBUStFdnRHSXhhTExFVVNyLzhx +ZjNuTzllUW5lK2hWM3NiT1ZFRlVuakkKLS0tIDZLTDlBVm04aEYrOEdZWERTVlNK +dlF6QWlraGhNOFZqOS9PNkZvYUEra3MKxXL4EMvP4H9R6Bp72kK7TqbIXPzYxwvK +Ywbey3gHV5UrJRTt1eQE8DX+YEndcVJSOui8aHhemOfskd2ZQuhSC7OAgGrNEy4C +w+8N7i+hMumqFYvtrqkBP0g2PYj72U/xwJHMBy6V8VxHXw6QKOtDZylY6L+OjF0h +khaDwXrJviqNNJT/uMB3wSQ7q8RyPCdQeusZXTC6GR0DEzwNx8QEl54EAaFeC1ah +7x34LV5GuOYbMqu25Ax9bh48WwpNPrf7EDO+JXenKonWfNEqFhbg7r5y6u8C55Jc +gh+VBXa/T1/CqfBVuQiV9I20yhtyOzR5cn2mpX/YwXp9l2XmLvebOMyXWGjx5D7q +QoGW4CsOAQbMLZV/nw3pu8SyeeRjYU4cpCu5ccDIpUcwn623pPkZiGrH330dL1HS +Y1fxLFfTFxCw/b1IKvweUJ9IvYO10m7SffOjX4yg3z4Zj3s9MqPvcc04oCWIiWV/ +94H69Mw0LVenXBJfOcvaqZ+CRaBWAnQWmKAb8PKh3tErBHk7mP4o/F0J7xS1as4U +m/sgahotWr5Me3b2tego7J5jfO/g6eQOy9iDzZsCGG/qDjwVsmEYmGof5bpVssHc +bt14gwnrUdQyti1XwOmTow== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_xml.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_xml.vim.age new file mode 100644 index 0000000..836e168 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_xml.vim.age @@ -0,0 +1,13 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmdjhHdVZoclRTNzd1QXFt +MzJzR1A1M0JuMXlETDE5b0RpL25BKy9OU2xBClZmOTZTYnQ0WS9XK2IyUHM4djUy +ZFJ3andUMCs5UGdLMEhHelF1eHNwWU0KLS0tIDhTYXBTQ1hvQmVJajZ5bVVuYW5a +Wm1DdEVPWnJPeDUwUHd5SVY2Y2NTTWcKweGnT1hF2vyrptZ1yuRLzyl5hotlwe6b +t1FxMIUOphbpbEYmGMkWv/vtI7/KlDDOkqdN8N91NX3IxM77U5hRbgjzCY8wRPvN +r8xOw6VB3M/D8TyX369HCrfFti5yKHONGJFaTtfp4CbStpPWLq0XFU5UY2/2hQ5I +M2x4YV+0QypPhQnw+zzPoBOD/pYXOqD8k1VLBroPvMPUZ3F80VZDbQCH8WB99keB +9hJbV0fyZzRsqrE7ZxTklVr0Af9cCNqgjvqWKfqBeRH+aSwtPzN+zUlpbCDroebF +tZMeNobUwyXYpMtoqeVvfBETBK3iw9lhTKsZZLIA7UaDuwK4LgAy3iRZUDP871CJ +1cN7m+ssflxH2MBLOfM8rPvELpEOTwMFGf4F28qGFSNso9HwpHva0LISF7OvJesa +svyK2cF14H4sfr7qJsK30YKcKTT6uQXC1nRLz/r3+XAvXcYKZF4v +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_yaml.vim.age b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_yaml.vim.age new file mode 100644 index 0000000..8527bc7 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/after/syntax/encrypted_yaml.vim.age @@ -0,0 +1,14 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoMGV0NDdJb2ZyWlIxV0E3 +bkhjcWczK2NlWENvTElDSnRDWWtVUVhEOVJzCmNUaHg0U3BkQ1BnUGdEb0RHK3BP +ejZFUDY5V0pWT0ErUms5RE5HeWFFYlEKLS0tIGQxWm1Ia2NPVXMrUzdHZzg2RXht +bjB5UzFjbEppRnhiTFRvbGpMNEh5RnMKHlP/asDnR8TtRwaABle34EaHlLh4rJwe +NCK5WOolqf0/11SP4AEpeEkiLdaY7+9JczqbD7ZXnD0e47Z5Xiab3eAJtxfzQqWg +ZRI+vnHDsUsnRIymdzU0xp46zxDb+Jwby5XQuiq6nhs4g3mRzp4m0tC6Ax2cYTw6 +AL3T9pEiz+kztuzQSYmOEQjIhjL26g8cnInfxhVSwRkqh18RcklCJdH+r4bWJP5P +TaOB5zPw9rricoXGGwcZVfkzkIPdhW+9DhTY3kWMTPsQ3wZUfnFMIi8dzqlsVkLD +sop+rom38pluYghWzHYkgt5Vch96ne2Aqu1V7t+JiPrhC6rDxKcpIIaE5uzqGoq1 +kjTUk/fFJdvCvNsM1lS/GAIZNCKpTz714bChxxXM74c3daLOJHzmNpoj0pZ+p/Ym +pSrCPtkU0t6OvcreCZpGUWIJtmXDGQGHSbpqaetZcsvKMY6dj3KpkAlW1DRv0NPe ++xzMLyAq7RQdzFySZ5XxG9Zu/2MrizaQ/AtI6kKGtnlsYFdz +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/autoload/airline/themes/encrypted_dracula_pro.vim.age b/dot_vim/pack/themes/start/dracula_pro/autoload/airline/themes/encrypted_dracula_pro.vim.age new file mode 100644 index 0000000..73d43df --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/autoload/airline/themes/encrypted_dracula_pro.vim.age @@ -0,0 +1,98 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAycThIY0JvZTVkRmJEaGtt +RERzdzlXb1BBbXlKU1NaL1BhbDI2WlgzVTBjCnJiOElNcWVxV3NNYitnekR6cVFN +THZnNU9LVm14bWpZNUQ0TXkweVV4VDgKLS0tIExTbXpibVd0YlI0czF3T2tKVmpO +QVhTWjdDSHg2cXo2K29VYVR0alpoWDQKu201rxeUwRvxcBNuKmx1VUJVkz/XQdan +3tNUO7K5Vxr8huoClUHGcaydHaI54AXXJrbWBvj6x3QSjoLtmkGN3SWap4w553z+ +PMQEOUDShbkYB0e2FOwLHIKF11zOIu4KWsmsVVKjaeoo4wjBrWM2AInTovpPaKAD +3ZVcR2VcRRGlA3IXJ+l/aUQqwFch0sLgqg3L3FMSHtzr2ojYtzERIl1Vl9Z1CCf/ +6PNiR+AimFrkEIZdJ8lMCLlRuHEFuLzHUyQK1Qv0U2NzN08+bmZWGuAo8CR0vdCf +UPmy4hM8iMBfOpzNrNkv3E4yfVtLQhfupQx5oEsE17NAALeuOZ+tmvDwGsRZ+KNR +ETnDLu23iFjDP6YDIU4okJIeMS47Zk5zsGOSHdFF8O+Yu2JP/xQpy2VRGopwLMEt +M4XIYxV4xt8KUKDGkK9FNMEg/OQT71n6Mz9WAJZR/9EoZGFCq3bfzJtK2xe564w/ +NGDw6N6SgOfkyKHn/h4IsOjUfXqnzxobhoy0jOty+cPNo/o8OaXil5ndEC3iCJkI +leEG2YVus1G7rdH6zQ+ljeWLYRz1LnE8hgqinCo28XAQr7ON9cbIzNYyt45ql6go +qUpRYFGYBVTTQ/LPchg/iLfkyMEK4xXYccvraBaDeks7d29RHd59eLAo7+jni1N4 +QYGGXPPGBZRPJV8HxK4/6ucRV9aoCj1oo6yuM/oWRwqyLGs0adpt2ezVxPqU5AcJ +0qYL8EkgnWdZ7mcKbXHIxh/mh4AEkoJrKxRMCe+235ro/AheXY+Mz2bmPKznhLju +PH87ZSRYiTIE1Y1LHjuqDVfpXG7sryLkDZfa7KC84UkfJbNg33xC5+gksBJxV49i +pEQnDZ1x9Bk3Y9LLwIYAFWFXGNWDlvQBmxud5tzQaGHDh2gYF8JzzccsEBMiu56i +1BcXPHIna3aYVJSjbVjd4QWNGAcewbQtJzAlPbGeyvDrj9hV5oc1sTlFI3d7ukfd +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 +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/autoload/encrypted_dracula_pro.vim.age b/dot_vim/pack/themes/start/dracula_pro/autoload/encrypted_dracula_pro.vim.age new file mode 100644 index 0000000..3aa020a --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/autoload/encrypted_dracula_pro.vim.age @@ -0,0 +1,52 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkRVVJSjk3M0NSWWN3T0Rs +elI0MTRIOUxBQjNGcnpROWVrOWtKSFF3OFNjCmRYRmJmYS9Cdkx1azlCYWQ0MFhn +eTVNMW9YbjhEN0NtVmoyMUtYZVp0N3cKLS0tIHd0QUtDZnJFWWZUbVFYTHQ2L3ZP +L3VnYUQ3eGNCVlBrUTlmRjlEVjFnRG8K5ePhKO9DZmMkVfc7C52bP3AYeqN7kFcQ +xpXaMguejmKbvny9ZDdqy/NSYmhndwyGVjfeOE/xPe2/+bAawMRQNh5LYnHS4n7O +6mBuHeVdy0KBWsstdkp1gpMP7m9gXE4HcKAbOs08v5uuZGVgFmRm7MY0UJLI0zXi +EEpmyAwXPky1B8uAiH0c0FFsHFV+eDdGavE06k8BqAD7hlYuglDeWcC00/fvurX8 +/AqLh9CcyviD3zlGf2Sizk9aTKmxwz++H6aqpgCUl7LvPD+z6nxNsHpzIp0Rqx4g +mSRgai01mAyqQuKcTZU2p4bqVpp2toLoEO3AmDfANdvtYdfGQaRE/U2+m6CEhJ7Q +B1VYgkQv35/JFvFM0RoncSSY52eBkSqIV55ahKCUHjeq5roIzERLtm9L+1MOGTsp +PngY02/o3ihdiKZUEiGokoqWIBDczUsLxxRpzOigJ2pYQ0OD18tva0C6oNPEIhmD +SgHxm746Ye57RzpC+luhHM4E9svstnyOVRi381cmNilwLUwUvrGj1SGBM0M76nuV +xmavwCrlNFBw/RHowrd+OSUffqj2wLr3llJns4ctZEpMacZBG1+AfIqjeXcxX9Wq +Wik6cfw1z7N7UCfeOe7WTZqAuOAMmn9N4N2rUUadU+/VxONMhnxB53S/o1N7T6gO +qEEDnAK6Vu7M2UHvPsfoipjkM5sULELlO3Rlznw006PaST0OJGm8pNGQ4VFJAylt +TTR0XU5zRB50a9da67dDaV9uvN4iCgsVs7IAaBUBqMJLowjJ9qO5qR7MCtIq7sBr +77TfbeeBaq58mbxBY3V2+QhgjFe4XlITV7FmO1d0eLwmRlsi5D1m6DyNDAFr9iy4 +Najg63z6vjqrRQhIqTLxZ8/EulPLIFl1RdPPtbYFqt4BxZpNpqJOugyoVYgbMKn0 +lQdiWPOPgdOtI8a5tDc2FV+1/7AG5JW9QSXmG1hkUjMj9nGrDWNSMiGPxb0V3Bh1 +loDaTPMwyNQqvzSm8fTq2jUH7wXzAlsoI+lC3bg56z4IXmpAsrM6a6TG76EIq0H4 +FkCLxwioZZZ01pk3Smnze7LfDtQiyT7meXeEHd9JXMCK9AcKx9VMzk7O8qrh8tOa +3sSWBhZebVpzgLJ71gJqdT3VwqutZo5mpEVapEapK94epDZqYw8PsUlqaCkG32PN +6KGoyLMcr7JltwYx3rJicReGbT04bNLtQAZcSvd3N/F3eG0Im5Z086m2iJLzj6mX +H8tmxBtcPVXWUToMyUXooh5cjFE7etfiht2Gm/2R6bHdcfz9ZRHUWbIfCLIakD0H +Gr45tujxLkqcUQllOX3VU6Vupp0ETaew84xS4ACTQt91KQSk3XtIKR1tN9PUuWf2 +DN73DRsSUZfPSZwgGZeRycql9fNMrF8K0l1N85DKUftJ84OnaLwk2pB+aJ0NUY9w +v5SJzG/IiD4TGadi179RBhWIxSrrgOdLK68P6f/dBHJYcgNGUWpWl0f8ZQMaac4M +wq3xNCAyheaxkuM3Nf5JCSgESNs8FWDglzOGNGS7QK5RJ3yV+YoiB9cXQo1zBl9B +0qah1E4K4/WmLWiideo776lEk246/G3jyRg4ufYYRnkAJjdNbq3XDWQ3dm/TI2QG +o6OzoxcBZiFixbBtQVnnRIzvbubtF2hYzpRxb9wyFczh+2qUBNrQxoy/pSXG1qdh +uO35Oc2Lskh57T1snK6atG4yOErE44zhD16LuOh2wlO2xJ6BseQKq/E/xfN7/J4a +u0qDsbEIObC+IENmtUMn7rQiAl3zgYr2ekTwIrpP8zNxYKwDzL6vBqIkMKvxcJ32 +DX6UeNDesxWK9rtJ/csW0ohEwWcTbMZr6qlrkmpFvbzgI9issjZZ0piMnu4RSOWp +5T7om6qCGIVwbTsVWGrB7nOjHurW7c4apDlb++8/gcoqgmuS2jQ2qoSxVFIQhhTe +V8pNRRRHbh8zCPYkwaNubdBizrchHPBxOVRnOBG/GAXCmJeQ2iUMEtBVquHYjt9T +88FstS/rhv6eF+lKTCUGabJggBHdJmw1I6RF/oiCzPD5tjplJufNcxlK2sD64PXy +PsKBl8EJ6bkgfPHFvD9rMmPYcoj8aW58iJ5/ksFNjWWC8SDTyFmBQ3AWoKhicAE/ +RT8KD53nMmqEPS7HV0av9WnwtNpuRy0eBP7Cv5rSd1rkSRpCxNYOIlyYnTPyC3wP +9jPcJzXV8104oi/SS8K38+VAf0vYrB5lRS42r99SudMr6rm2lN7Yo/DW76Pd0Lbz +dEZVeoHwKD5FSWqWUsWXufNgTbV/1o6FZu4zyNOxU1a9LQmCmRs3Xpod0j8isHoG +YTstxXk/cjIeVqQaGgtZehaoD1/pVgwIdGng7OSFn8b/Gw8gvd2epmmQVdai/sTT +LZjjy25SiK5uSCXOaUEI531xXUcEXPwX2IutnnhCoRYqrlt7wRxS5AnCmbTWsrf9 +3WwP3DxGIS4KzNpxgk60eFs12n1PZC05jh1euL15PCfrGsrXL427LoVWo+vEN9Yp +aPEZjbs14hJgHTFCR0pUl9SvbmJKF2XD3otgs/xvDOoCUhwjGID/uWyprYNAKoKe +cGXriclkKddY7UpeeZ+8B/b1hd4Tb5xk1B4mmSAGxjy48ObXNCrS7IsI6dyTnJiR +NmKP2EgC65OceFdUlP0doYto2sVeY7stfPw5PRYR4LaK8Vwk1dW0iWFbBQbjslpC +d82CRVL5Iw1hnINdrwegIXe/idJPidgVYrzdrk2oRyRq+tkz8qiFZyHCN6lG+tlr +hnPFTz4wdh2TyYIaa/veh3RjcVsvwXLjRlXu1d5VJe0iTVnvScNB9Tjvgd9+eBHa +FnmWsbgqmJ6RDg5q5nmqbE9qx8+a2fHDvHFSK04ATP3UJAFyykKaOjCTcBX4Jjh0 +l3aM2WCrvXr9zCMjdBI= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/autoload/lightline/colorscheme/encrypted_dracula_pro.vim.age b/dot_vim/pack/themes/start/dracula_pro/autoload/lightline/colorscheme/encrypted_dracula_pro.vim.age new file mode 100644 index 0000000..f3b3d08 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/autoload/lightline/colorscheme/encrypted_dracula_pro.vim.age @@ -0,0 +1,41 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlVlRoazlOR0s1MkZWd1N2 +OXhQMUhRNW1iUVk5VTZyM1JxUFZwVjlVOFZBCjNnWkNKL1hxM0xQZnNsamI1TlJi +YnUwcFBFTFBLWllQN2tQbUFZa0dybGsKLS0tIElSZC92UXNhaVVmcTZYdHVpcG5w +ZDF0Smw3bmNSZk1tWmtobXdwU3M4azgKDOdT+3KLt6v5qwGBkLzFRw2DAO2OK11U +708Agyrb//v6NE3BO0L1bLUT36L5GZcavaqhsEQ/pIA64vZbAgSLEMeRu30AESF2 +tAI/TlduYj5tI3He0WiGoMY5f9aVq2ldKhIgwtAgcrokJsVIgUAmKHsO0Vstt7Ix +mGxoUsE02CVcDJVu8HihPR0loUa0vsvn6aHb9a9A7jqBIdY5FVT3gtlGXVp/iWkV +DhWYkuxM7tsNz4a9g4CGkjU42FFBajgCOOmVYw19Ds23lwtPhemzgCUSpCjaxNEI +ETADftaM1WTaMBkjk0LSTFlmhMFNwh8LjZXreRdXDt77PcM6hfQzEpd8W9VqExiQ +43TF0b36lVf8/m9YSPc5ny8XFr0F3YbiFWHBnG4AGhF0vMj/hOMUtuZ8UXA8B8QQ +dgTlFIjYs93SOHTF0MTm7vp4uKLoUOiZSVOwMIVWbml0/gTEmPwo9dtKFe9oxl5U +pcG53YOknTmplaRzbooMp2szkOmhr21geY/SPhQPm9/aF6DacA1hQ7Rdeb488ul+ +7F/myMHHJfL+YHFHOTSkvffV99sqGdJy8BOXj15JwpoNHanh/f5nat378FXpcRep +rtbdnFkb9mpqEstbz3HcK5n95etF7yEH3VNiIzbsg5sLYDMY3LBflKG/mLnk8A0W +NfKFf4uP2YVsS3NSZOqqJdDVaPfAeT4sArc05N58tqunXBnvyrI/nIr52bFTxjOa +oPOcaa+1Ewd9ZNzoKFwjLqBRAd48zoftXJOq1AdZxU2ddD/puhRRlgjzVTzQOx7y +p8JvUNR0suWi2QL4hIS7vdWbMD1aswufMsj1QCCIUVZ03jzhyvVInncKQuM16K8j +Gi/LLTxHX/D3uWJuY+as5Zvw1FiRMNeUHhESt/e27XvnButTJBcPkuPokOhVKeiG +TT8cWGNn0nuQfzhay3g66+XazitZZv5pOiwUlm6/c7WmYOHbvl+GnGDsx4dMCEwD +CQzkcPr1zHi36zvzwPAm0GCHcEFwgHwoAhS4Wv11MVKqRgS4Mp3svqGsRZhJSbhg +Eq9zkYO9fDCmMzoiSvXJeKUPMW+5p8bj+lI58t0xbWTuV2Jjzkzrzz5VJK4eiqJS +NgIsSamjyq3vFsFZ43gzg89WEnuqwQe8cD70pDoxfIpGUYj+jCm+LLbSnHCmKH5R +P3OKpRB0Jqm8Q9dkLqdQee3722aMlL1QnYR96jFsn+6D7vmRg0WV3n+j9AxzYN3G +rh+HErts1ca8DOaii6/FaIDAqu3w8QK9LCey0oK5pY0f9ymccNx/iJzZpGDCiK3s +LHz/NuzX/qIlC/s9Kux/2MG2/Fu9t3bcReIyuvC0zAr+tIbcs6gtL0+znko4ml9L +ubjpv4WY6iyR3+2so9U8R5zQyhAuzxFmPsLCJZZ95Vmy1tmdskzfGQJPQmjgV9FF +w6ZGOtfKUTizpRU2q5KO/VFefygvDIs2zcnzqO8jf4ha4HVnXyncC8vuKQbix7QQ +Dcq7VR2UOTyRKNI5d3r0yzwFw+ZK3vdc6pMQ0H3Wb7WeqTKiE2XuP/6OnFyurdRF +FPriC5PSdvfWxIqPj3QjTVRgNgq9wuQn17+/gKhRm7qac6pqn3CwlDTiAE5LaV/l +BCtHR5/JqkryRfW1Bkaw9NL66M6uNrbC5vGn/ixMzKQCYj8JpIF9/MDNcUsC7ASJ +WEp/VFro6jQrPDIxHSXTCAT4ErgYFMLMXff6IEBNKtlRv0e6Splqw99ysh/zBLqt +nMTnTxD7vONPCf30k150dvD00/RSjf9DUWNhvvuLVHQY5+9bmOyewjSw2m4uyjfK +b5h7pOBGQbhBSwCsN87hATle6YkAQdBwkqnFgjhIW9eKxHT0vXsz3+WFUL7md9us +WpVGcXD7H/mqS/DphmcvZ4Ju6V4nBkukhoveOwvJQBcRys/gMqz9o3AG9jKDq2ta +VA58dSzj08LwI9YbxapWJZon8XnmOsarlSkJICYMhHTS/cDdsZRFiM0RyOSvzpj5 ++CiWFhxxYBXlsJOmWDlR+j0gv1f4nBz4Hvrl3FQQQkresrAlRu1fUgGYLkk+oBm+ +OPGmgGIo2UA5nQJ+BfVL7zssGtqobvLc1uzi8PQSkFfBjrVE/GeukNUvN99QHdOr +YxXuAB+gNs+ZuItggjFB0CtDAUpy1FYXdfd/YY6NUn42Ky/CbPMZsIfRCYpW0AQP +6uiw +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro.vim.age new file mode 100644 index 0000000..cd3f728 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4a012Tmw0eDFuNDg5RkRy +ZEFwYUFuemtyUnE3Vm9uOUxTS0ZxY0NCM2xNCmxPNGRHSUUrdVJ5eHBHcEViTzFq +cE84Ukc2TTcyaU1vYSs4aXBCMTlGWkEKLS0tIENTeVdRdDB3WjJPbmt1eXIwZ1h6 +QWt6djl4ZFkybURrTlgyTVpha2JFWVkKyo+uUyWyxfQQKGLzM6KQvAQkBX6Ngt9Z +tNTXE5de6eXW2b35D06RA4KscoBON2YK0FO01klYyjwUAksvk4TruP+Dq8Bhufmf +CnF5MGqGNMKgGp3CbXDtZ7XDxo6UEUKN0pYvRKi40O6PWxtZte6IRD+NPPqSsNrJ +7+/Y1VRHArEZGg15/SNy6IC+UiBzGIAtBXOr4SpV+KK5R1DnwYqJ7Cn/iMFfcH5E +18RF2kaz6X/5i/yoFBHy3dAT0nbl1QiKaLBjU6MmATR+h/gtNx27e3ichwjnl5Zn +xCKDY94SiXVrvydJ6Nwc8gzZIRlnyi6TpCHj2p91z6tAJ01BqHllbjU9P4fTfdNJ +e84OEPBNS6pzZRl30CLPPFULfADwrgiiXshCZmhfSfqXXPLUhnhWXlRvBKRy0Usj +FoJcZiP+hX9I83jv4/X48ZNzeIzrYdfclRYz7omIra92GtLYPLf3lV/KcOMByS7Q +Op8mbT/RxQOdzcqqViZfgkShMHp17WTr1/7cAM9baoSkAmqhiX2NZquw88QA6phO +qz9Dyz8enFncO1+K8uBXrH/VkbBWH74tuxPIJoIie2CULbA4/84A2FVW0lI/iKv4 +dHPh85/cvVXjfqgjPMg7RfgfJIOqaQrxfuxD+Omg0lwdU2qsk1sG8jC+n1Crt9By +6mxs58M0sv0zM4TrymTan6LhKaA= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_base.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_base.vim.age new file mode 100644 index 0000000..455d246 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_base.vim.age @@ -0,0 +1,197 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJQTVUd1pyR0x2V25uYnNZ +Mi9IWlJIYWx3VTNNaTJmZTljRVNCZ1RiRjFNCld6bE1iN0hZQVVKZ254Y0dINGpV +aGJuZzBDWCs5azRxcEhFaDJpL0hCL2sKLS0tIGJBOTF4TGJUOEhtOTVycm5IT0ls +cmFKU2YxOFdxblRCd0VpLzB0eFFneHcKk1aHDdAVZ5ZW72JujfrnZNmdZs+/mj7f +WmAbyEZUx6CIywgpjfG2zkk+AgujEQEaKKX4qMqZhf7/9C48bkAur6s8ZGxEDjkM +m8cizqrwUtYY5p3HeH3cbEz4gZ+i/SGJ9B4v1dCITNZjESA6tizPZ8CANbxgMiqo +hKYgdI+6P6R3hNyXUBcixAmcLhAlXL13DjEoV1JR4S//c8uQo12Vyq4Sek5yEFBc +8qLqc1QF/vPJ5WkGzSnBl2mNqP8YVcAdHn2xsu/xQblhNDq6zFnaxym3g+5i+ppG +DLGvdeXNhZQzsOjg1MuTtwXdAOQlAiyS/Qdl28jxnE9ANxPKtMa00voqJdF1T/SI +N5RJmJjfza04cI8tJTyS2LyVNREdlYyBtqrR0kF9pY2XbZay4LcNrgI8CHS+NrUX +84E9L4btPFqms+Yi45eegVWz+oFYyKbg+bWwrSSUJja2kmllMw2C69s85MqP5UO4 +wuUc4sDlZ34TNpwweaSVTDkNvPpZIvZdXDH5mytU6jNUlLIpG+P1PqcXqKpe4lg3 +ygZe8RTMAM5gzCfXbskU7NlDe5Lh+aqOaVjrJF597TSTN6cpTrQubpPw7G+U/Zca +y5c5nn1p9bOvjdaa+rd8cwyBwnQ8Of/rIvMrG0+a6Atn8+pp37l/YfXz4OTiljcX +MqiF6apIlqwjQr/x1gyaVpQcpYDnlR+i6T85/jKiZk2l0Gm3bLfUeu4PUuCs4b26 +lMn/AQJC6a1hf5plDw7oARNxYi12VsBc/15bw8DAkwdD7fgU0kLD8NuSfUlKpzHx +vh+1T+HWwPneVTjmtjF93FuxeVkZUBAYsQKacVKNQ9Fu0BET2I0WCE55YokdP3gx +ohL4/prTW8bO+AwTxqXaqPnqNE8/nr3opeEmYeVjX9J9Sudow6MAcmZyZadlZh0n +LiVNwvdqoJTBPfK8AqRVA926OnMII821zkVyoziuewl9E4CemTSn2RHjyCl8zEYN +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 +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_blade.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_blade.vim.age new file mode 100644 index 0000000..ec21a17 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_blade.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3NTZxditYS1pZSVR2RE83 +MDVjQ0h3ckhZWVJkamZBSkRmTnZsb1RUUEIwCnNjenZveDN1SHN4ekZQZDJYT1p4 +MUlsdGRRZHJOWUYxeVdJOTllMXNCbUUKLS0tICs4c1BnbHhxU0huR1RoV25pQjl2 +VThjOWRzcDMxMjdHeDFVbnF6dHdKZTgKvQAgEHGs6+6hrmybjFojSOEdy8Yv/5te +qxV6iwzVAPZuqmldMBOC4C9ZO8EGe96sgMnIvstw0klWQgv459GBOsZhxQxtHTPz +MbcsQuMgF1lDMioGg3+JD/jcxjwyejjFcgFyRpiIk8uHrzBB3b19lC6D4oV7DjTk +kwYmn7QLziBNlbfnA4vgNrJ189yDJ9uceEPBZjZzEKgcRT6XgutmZpuK6upVJxCg +9d2S68c5l+dJE4z6oouQ/HpKG7TJC+oUli1zzwCFn0SFWKdl6zbJUzxydcbuBQ3D +zQBKEOZNKXPjW0kdH/IkbjiqOW1Wntzo7aUUanqdeTCSLANkLG6dgrzqiU4a4qWm +USsEprfMFz1/7lquP9YB1YAT4UvVEjo+yBSNNTvZxYjUV3b9aNQK+GVjeMot08PZ +Yy+44HaikmKNjhVA49kxuWd2sVxlyd0BUm6tmcKu7b7hbPdb18Qj2ttd5qtaB8qi +tXTYAw9SpVTZYhIDQWmMiYaUAkgnB1P2Zg1Xa5aLKeVPxdnan6yYo94deSBZ5Fwz +mAXzD027VO1xMhuvEGkWLRZqAdqn34GvoLU5gbxppmNBQOBwhFjOFX7KlDiG6Cj9 +Dh5D6ybESi493ejF0WAawzvWM7fMdYjMrcUpkT71bzjegf5PsR6s5KqMIZzeJno1 +tnIzaatl4Z7n+7i1cA5o5Yj6J90JHB4Eavc= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_buffy.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_buffy.vim.age new file mode 100644 index 0000000..748002c --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_buffy.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyVjlINi80N0JPYmZBc1hP +SHBTL1IyVVArQ3NVRzNjTjlUU05BSUI0enhRCk9vcEdDb3VIREdBSldHRVRELzRL +a21QSGxyeGJDeGpERlhxQ01oRnRNd0kKLS0tIGYzeGJ2ZWVYak02M1BCa1A4aUR0 +Tm9qc2JGU3hIT3VkbmREVnExY3h1N1UKnR+To5iTiFJmevUrWJzEWVkLkNAvSqzs +c4Stw6W2uZn0O5lIBXn9If1sDzhF1aSlQDsiqLzDJDWS0MQOpI1Mne3Y6U5j8gT8 +ihvaSX/pf/sKlOMaB3ajLS9Pl3bkg/Lf6CFV06i8NKUyjwhYmG8T+wHKlKVJg3ba +reggYNxYVFKI0SbUiVsM27+dDiwexuO2e2PVqyrghj5i+TyB5KJwSC0GVWIj/QWx +IrXfjA5a1SFGZr5b9Rva5D/MRT5M6P2Tks5AsFAH+JdDPtYmgxT2ajg/FhE8LmRV +WglTW13hfLop8Xaf1TNZp2wO01gmaB7+9x4eVml2gFqMzDyCVi7c5lX3xpWJoeMx +zXtgYLf296hWtmuESwmIAPkMolt+Zwc0XNZS7BxLteGXxViFwZfw5B3uh+IR45h2 +dX5kXdja20S74rF79l79d4yVFsMExkvxl3PbGGGLvRekA2AhHDf/5xX8vEK/UMzE +yQM98A8f4yk/AvfeqECvT6DneEtzV4kZBYDF+KZqwnPCAThkDwJ7D9c2dE25YlT8 +ql8Nir51P6FDV4m6YCTzyv5G9qYmXYE1seTBoa73ujgNGzjNCTu+AAWGPXwGUHSV +jqNi8XiXd56NXScwyLTAEy3g927gxD1SMXMdWhWbouqRvxt49p/aWthqtUzfCt1+ ++2dNsNHCCkbDgrXegf5cKh2jAC0btO1RWPQ= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_lincoln.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_lincoln.vim.age new file mode 100644 index 0000000..b9981c8 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_lincoln.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArOUMyMlpiOS8wRmtHSjlm +Wll1U3BoUnVCeUtWSExBNjhiTTdmWFFUOFdZClRKU2ZiSDNCUjlOa0g1RlgxQ1Ns +UnNYSUN3dVJxYWFPSmg1YTB1QjJ3Tm8KLS0tIEd1SWFraGZaR1VuVVAxdWJpYURs +a002d0pzUU9LTVJHODRXOUlHcHcxbmMKTa0Ze6D1L3p2cLa9VUPPDKROvylKqGCc +U0ut4wLNhNN+WfLawrHyIm7iNKRVt5ULlpRV7n2bbzsbFwu4LIWdKGjB90AQ42Xx +CpjpyKK9oNC1yoPtqBQuBkEkpxgRkeZWo5Zysy7Kz4fVxJuW6EcITNJcKMGhMuu2 +YZAZho5ygho2Rwqtjm1eTtOwVpdJD4PQv69Giak2IJxfDaqgZoPULXWmIwsjnwZk +33SgHVV1qBf14WdWZofWqWK1JlvWSaTlLuwA4usxwQx/H9+2IBSY0R8xOmPRpXMF +irmPxMC2Z9EXql7sK7jlmmTXLQWBHTy2IWYRBH64SJ9hXomr+B/J2euIv6qdP8bL +OIgdfxoot0r8ag12n/hMRDcUUtQkGGLL3zDJLt9BQuQqMBHxZFdRboTfbGFP9Ns1 +QYVSHfMnRxPy+7TfFLXoVUBBhahevNv/+5Q6DC3NFaqg5mmnUadD0A7dKlgKBO1t +UlwkD2Us3i+jkyEDjb/F6HB92ojCS6qEMSVDdSVAHs7Nv11ltwrM/OlDasVsehzM +08wLi+fJ5lh4oe8yg2QnYZ4mrVZAqe8cNIMSHzn9VbpAXbexJzpPlkMpdZN8BZvb +4ObCS2ido9Zqz6C6C9crWP+jbnSp4vE2IPaWm74JMIrvSow0v4P9pYp5ghl63wF7 +h1G/5NgCGn3uCENGd50IqIRnDPmUe36C4eTojA== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_morbius.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_morbius.vim.age new file mode 100644 index 0000000..4bdff8c --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_morbius.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0REFjVzNsemtpWTZiajBt +VC9STU5ROXc0N2RHOExaTDZRRXoxVG4wcHg0ClczVnpHRXkvbEErV091UWRRa0xp +aFJZVU8rcEVaNUhSQ1FhWGJZQWZQU3MKLS0tIGZYdDhMZzlLd0owQkJWVCtEZTN2 +bVQ2M2FwUVdQZENsN1hzWlZlOGwyZU0K9bz6kX4iPkHyojUQnD6vDWLVI5nBRz3Y +vJ/V5XTrqpV9dzbDxnvI0FQsf0vr+KAKc0HyxUEBJ5PNu/u6pNmPOkypEB8z/Ppi +vkWTWycJJUbKeN5gTH+vCMnDEpNeiGLFW6/k2BG4VwyxD5aznWpNTN8NRchiYQkL +P7lTWaYPlsUPLwdnaT8z6hgmWX7Mj1IQLZ7hX1FTOfwPnLEPbjVKl2CgpDEbtKRv +rRjf7+WyCai2jYjShNWZCwWv+400v0s9m9M3OouW5JwuzlmpSY8AIaPwt8cOcxiJ +tbrEWlGX/tXh7F2RmCHUIsomCpfCbBL9v4TgwRZbaM4Wy99dfu5glsVCkzb+my6a +36NJLFiVSnWx2SI8gMh8KNwCm7BTOPT2/ec7U1LPPVWdVFn78Yz4rYchTrpbp4Cs +Te1hBgnF+ncheELa3ndJBJqtHP/Px913sjtxkHLbfxCbPEnNrLout8MoJgsQhagQ +QqdXDo6tVjWiOKwD02AvObcIT9fkiMc8TPmJy1h2uM9+na62AQid8dnTk40SQCOf +jxT3g3CPLv19gEHDcWMxw+lrvsv+g4NZ432NlfuNozaBLiFwXzLed8NM7w0iSRDG +LKQ3fuqnQZ01WMVC81+s2oeSnWhLvblODD36vQhyGFzShEuL/sNInENsP0vfPGmD +JLHMFEUF1vBEP82sWbjanIMihcdR62h2FDgo7Q== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_van_helsing.vim.age b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_van_helsing.vim.age new file mode 100644 index 0000000..b92900d --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/colors/encrypted_dracula_pro_van_helsing.vim.age @@ -0,0 +1,17 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGekM1amJlN1pRb0VSNGZS +VWJEbUZPTGF3eFFBejVWVmRVUGhBYUVjSjJrClFNbWwzNEk2OGh2UFptVjBDYWpE +LzhkeDF0eHByUSsrQmFDaHQ5ZGtZUE0KLS0tIDdLMys1NTdZWC9kYTcxa0pZQVNJ +aGpNQkNML0tCc0thaVBsS1VVdTFIRnMKhwcCtPHjI+xCeEmv7e6E6OKP83GtOklV +2dBrQF+JZEpltplKAVb9O1MLj6FgzUusqVMmpfpw12GnNmXflE9ORISWjQL3bbaI +y8Y5Qk2ohbSMmyV+IXMz1gwNrojWphWvJzKSBfVE8ub5FgMyiqRZrDMOT/xfjXbW +R1snvrswMaFzP7TEMkQSKKRNkTwPFnZakDRUBWrxYbGi/QMmdFLXE0QzcvCSFS0j +GQIdVMbbs62brZxmMI/hDjFnb4x9AndGFz8zsBJlZLuzxB7f/4o7mkkOWILjGj/7 +l4XFzbGEV+kOlG8Jo6dVP285B9UHNtMtThnHOZwjtHgdXraDFPxEenoXpchaVu7X +3Hmrv3/Fr9GSOCczErGq9sCzMxy8McDxNi1q/2M1XdsxuoydeN3B7y73BsmqTdV7 +eMf/Hlin9m+z+E5+BP49OuXS7gOUKX6wUu1iqyVnEIHEIrpBh1FivJdDYCRhlyAK +QO9YCe0vWZfEXmvBdsdjow7sXKePnkkFPjF3wDduWnfwkbepzCqfQKukYkfEA1FM +kRvdKo/ZiVFJvyxOF3OvfG32nAn7s+LSSHjJt/gjnE2eNqse5/WdOlofpjxnkqPs +rZP4WLyemRl9Oxz6c7OfL0FBCJOa62HHxsR8id72RjqlGsXVgN0X4iXEhMyOjWOA +JxAIVFehmoZDaWiM3jk6AG+RjC00W8Kv7InGQhqR3Jw= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/doc/encrypted_dracula_pro.txt.age b/dot_vim/pack/themes/start/dracula_pro/doc/encrypted_dracula_pro.txt.age new file mode 100644 index 0000000..eac9af6 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/doc/encrypted_dracula_pro.txt.age @@ -0,0 +1,128 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOR0xnejE0aERuSjZPajNZ +d3N1bTdlZ1U5Sm1KKzE2L0paa1kxdjBGRmc4CjVGU3lxSGdzdVZOT2FFZVpCbCtu +aEtQNmZWTjhXR1RPQmF5a3dGQ2pKVVEKLS0tIGM4dzQrRGwwRlQrVG9yUXBJcTJ6 +Qm1nVGVMMUZUV2dKQnpyVVFrelZuRncKi4XIekXL4nIV8ejb/0Pbraq9RIxi8YLt +qIaD0UAcN0kR0SpPdBdu3LjRkN4mwOCjZQ5ESg6LO8c01G2gJIO1s5a22Je36Ojr +4tOjHb0Nnf0GIgWzIdZseiynBVU64sxlfr0F1b32C2GkthAaL+STLGHcRG9KCQqI +dWWsOOYXJwJhOHX/blCpYzh9LWrYdXdiDHayqAqo8aRfjLVgqErgUj/IRFU6XgH/ +v3FB+wZHH/siNt7KEpNY0a2vPZRpS70dsPoW+t5T3S+q819NB89UTE1aK0FyTi+x +fTfNU8PigoelP5U0NyogepeiCsniaxJrX76sitXLNyfTejx61/sUj+kVDQqM/JNE +uqVCvtuWKCxmpKCt//GeNKGV/CVOhOgmiG2mvU/V3yDeI+Ywie7pehonrAg/tQOd +XmzyKQK5zyIaZHNhWtSqa3lu86RzSRI7be3VO7mcNh7leriooN2Q5L5TF1JOAKOW +HnB0leOA/Wl4T9Cn+JKKdUWDFCMIcdh9nUHk324810YXawjRz5St3+UW7FvrugS5 +XPIB3n02aGqaxBWa8BGYOjCl2MxgOp6dVJ0IhtiTUT5VnhDiJiWCWpRSMbDwmAZU +TirD4aCD5h8+c4JlS8+70ZN0tNZUH2yvmOdk0wg5RV4N7aSRJUZkOa7LwPY4hAGg +QAIg+qCxvHpmgwwgqBYmg1HqUbgyiCVt8eJhES8ElQRkBRYApBaWrxohmXT2WFr9 +ecN9EoprzheooRpAYMbQ5H7148XIp9BYrazsF7KmNAW3hR8QlCmwdeo6gYgzYr3Q +jH9ecE4AhyDux18oFrLQa8Mbs00YRzmNrGqTj/3FCSTzmXYOK+QAGQnhCmDn7m1M +7cDqYnnIZCZi0V3DzTsfxliEqbfOSUdAdXdIbukeHwXUbDG4RqC8vbAY2WRxR9d+ +ZqitH/RPojxbdVtdj+Rp5EDu4c1Kl8DSljzGmOLV68A87ZnBmL/fGO8TZEetPam+ +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 +f7q8e+1LIk5JbLFvJRxvHbB++Q== +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vim/pack/themes/start/dracula_pro/encrypted_INSTALL.md.age b/dot_vim/pack/themes/start/dracula_pro/encrypted_INSTALL.md.age new file mode 100644 index 0000000..e435b98 --- /dev/null +++ b/dot_vim/pack/themes/start/dracula_pro/encrypted_INSTALL.md.age @@ -0,0 +1,21 @@ +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMMDNISFlkV1FJNWljZHdW +a1Z6UWQ4dFVZdWErNVdBUmdMQzVyS09VaEhrClIrbFNWSlcvZUxBQkdhWTFhWml5 +Yjd1clFzTHlHQUFpVXhFcUFmOVFiWW8KLS0tIDRWcE9VN1NNK04zRGJ0VUVUTFl1 +QmRjN2dWS2d0YlJseXZlK0FLWjU1dkkKaEo5pQ/I3MsvfKVxnLwn8Fj6UuyP3ST2 +bw+36CfLo9ANA4My7C8Ux6ISVA01la84EfGnAUC0UPs6joEpgydNLfGhfeBKJ+/4 +m2Ef3qqoFIIgaFChgzRhcAfkxXYbOqiIShj8c5b7040pHgQN9mE1a7ZVyy//RGRe +iJYLYhq6MCrTv0uF6qUNGOnZFRa81cJDFKkcpW+xR2NOmCdnPNkCNuMdwmN0U17G +HhVCpnzJINNx7cA072RONN34kI0XIYaE5MxqgHWCBQQO4qMTYqWpezMjA583kzSE +FUt2mb9FKvggWbsDmPqnMJtON9NUIEv93wkzaNnRbOnLarcSMu6J9DBO/GGpk9a9 +vIGgAcrM2QB8jom3Ys1g2Y6NYFqaSXzRhgbaG6sSpSJGWakvZFzsu/vmaNlwdJGN +GnYdBlSD25nZGid5Ymk7jEEAP847BhsHON55prggIEiu79xJogt+6vFZkADt0+9d +PGuuHzqoeP1jwvkz5BgKmlq3Dhr3HPLO4DQJinRGm76ol7scVX0wNXs582K5qrLJ +9OLgamMcOBeXRVcR2yx2IjM6fNzp6rVWTJfQA4M7NZP85EQ7eRSPHXbY20sIy910 +hMh9XBQaNv7hYvUYHbU11Sun5XlClvKgBNO071aX3pUInGmwhe4/KHqgqq8E8aeR +jyGG4GhxGEceXuido051Gb0UkkTxWDSnQyL+I6a4YBIyHjvWvy/WGlUYozdr3xF3 +YmttXVPjcuhRThGGAZhFZ66gVD1JppjvtfB2w91dyK0X4Dh2Bq3jLh/3T1MhC7pU +kh/aGKFfr1r5TYrC9HfkyDEKCoQYk4shLCKarM+uYZBtbNDKb8d6xztzMCauMMxI +Un9Cmgx6u+VvreabQytQLBTA8+OJ/4uXgP23tDzIf7giycQdpn5kfM/en+Qs4rpw +6ZJHQqZNoNJshmD/taQHI0VTIYd8fq/wQSIAHlU= +-----END AGE ENCRYPTED FILE----- diff --git a/dot_vimrc b/dot_vimrc new file mode 100644 index 0000000..c15f0e2 --- /dev/null +++ b/dot_vimrc @@ -0,0 +1,333 @@ +" Leader +let mapleader = " " + +set nocompatible " Use Vim settings, rather then Vi settings +set backupcopy=yes +set backspace=2 +set autoread +set autoindent +set clipboard=unnamed +set directory-=. +set encoding=utf-8 +set ignorecase +set list +set listchars=tab:โ–ธ\ ,trail:โ–ซ +set history=50 +set ruler " show the cursor position all the time +set showcmd " display incomplete commands +set incsearch " do incremental searching +set laststatus=2 " Always display the status line +set smartcase +set wildignore=log/**,node_submodules/**,target/**,tmp/**,*.rbc +set wildmenu +set hlsearch +set notimeout +set ttimeout +set ttimeoutlen=50 +set noshowmode + + +set mouse=a + +" Switch syntax highlighting on, when the terminal has colors +" Also switch on highlighting the last used search pattern. +if (&t_Co > 2 || has("gui_running")) && !exists("syntax_on") + syntax on +endif + +" Declare bundles are handled via Vundle +"set rtp+=~/.vim/bundle/vundle/ +"call vundle#rc() + +"let g:vundle_default_git_proto = 'http' +"let g:netrw_home=$HOME + +" Let Vundle manage Vundle +"Bundle 'gmarik/vundle' + +call plug#begin('~/.vim/bundle') + +" Define bundles via Github repos +Plug 'kchmck/vim-coffee-script' +"Plug 'nanki/treetop.vim' +"Plug 'timcharper/textile.vim' +Plug 'tpope/vim-cucumber' +Plug 'tpope/vim-endwise' +Plug 'tpope/vim-fugitive' +"Plug 'tpope/vim-haml' +Plug 'tpope/vim-markdown' +Plug 'tpope/vim-rails' +Plug 'tpope/vim-surround' +Plug 'tpope/vim-speeddating' +Plug 'tpope/vim-bundler' +Plug 'raysrashmi/vim-matchit' +"Plug 'vim-scripts/ctags.vim' +Plug 'vim-scripts/greplace.vim' +"Plug 'vim-scripts/tComment' +"Plug 'vim-scripts/taglist.vim' +Plug 'xenoterracide/html.vim' +Plug 'altercation/vim-colors-solarized' +Plug 'lifepillar/vim-solarized8' +Plug 'scrooloose/syntastic' +Plug 'rstacruz/sparkup' +Plug 'scrooloose/nerdtree' +Plug 'kien/ctrlp.vim' +Plug 'airblade/vim-gitgutter' +Plug 'juvenn/mustache.vim' +Plug 'nono/vim-handlebars' +Plug 'austintaylor/vim-indentobject' +Plug 'pangloss/vim-javascript' +Plug 'rmanalan/jshint.vim' +Plug 'vim-scripts/kwbdi.vim' +Plug 'tpope/vim-pastie' +Plug 'uarun/vim-protobuf' +Plug 'tpope/vim-ragtag' +Plug 'tpope/vim-repeat' +Plug 'mileszs/ack.vim' +Plug 'vim-ruby/vim-ruby' +Plug 'msanders/snipmate.vim' +Plug 'majutsushi/tagbar' +Plug 'leafgarland/typescript-vim' +Plug 'tpope/vim-unimpaired' +Plug 'nathanaelkane/vim-indent-guides' +Plug 'slim-template/vim-slim' +Plug 'vim-airline/vim-airline' +Plug 'vim-airline/vim-airline-themes' +Plug 'tmux-plugins/vim-tmux-focus-events' +Plug 'tmux-plugins/vim-tmux' +" Plug 'christoomey/vim-tmux-navigator' +Plug 'joshdick/onedark.vim' +Plug 'sheerun/vim-polyglot' +Plug 'dense-analysis/ale' +packadd! dracula_pro + +call plug#end() + +filetype plugin indent on + +augroup vimrcEx + au! + + " For all text files set 'textwidth' to 78 characters. + autocmd FileType text setlocal textwidth=78 + + " When editing a file, always jump to the last known cursor position. + " Don't do it when the position is invalid or when inside an event handler + " (happens when dropping a file on gvim). + autocmd BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal g`\"" | + \ endif +augroup END + +" Softtabs, 2 spaces +set tabstop=2 +set shiftwidth=2 +set expandtab + +" Display extra whitespace +set list listchars=tab:ยปยท,trail:ยท + +" Local config +if filereadable(".vimrc.local") + source .vimrc.local +endif + +" Use Ack instead of Grep when available +if executable("ack") + set grepprg=ack\ -H\ --nogroup\ --nocolor +endif + +" Color scheme +" +if has('gui_running') + set background=light +else + set background=dark +endif +set term=xterm-256color +if exists('+termguicolors') + let &t_8f = "\[38;2;%lu;%lu;%lum" + let &t_8b = "\[48;2;%lu;%lu;%lum" + set termguicolors +endif +"highlight NonText guibg=#060606 +"highlight Folded guibg=#0A0A0A guifg=#9090D0 +"highlight SignColumn ctermbg=8 + +let g:indent_guides_auto_colors = 0 +autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd ctermbg=10 +autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=0 + +" Numbers +set number +set numberwidth=5 + +" Snippets are activated by Shift+Tab +let g:snippetsEmu_key = "" + +" Tab completion +" will insert tab at beginning of line, +" will use completion if not at beginning +set wildmode=list:longest,list:full +set complete=.,w,t +function! InsertTabWrapper() + let col = col('.') - 1 + if !col || getline('.')[col - 1] !~ '\k' + return "\" + else + return "\" + endif +endfunction +inoremap =InsertTabWrapper() + +" Exclude Javascript files in :Rtags via rails.vim due to warnings when parsing +let g:Tlist_Ctags_Cmd="ctags --exclude='*.js'" + +" Index ctags from any project, including those outside Rails +map ct :!ctags -R . + +" Cucumber navigation commands +autocmd User Rails Rnavcommand step features/step_definitions -glob=**/* -suffix=_steps.rb +autocmd User Rails Rnavcommand config config -glob=**/* -suffix=.rb -default=routes +" :Cuc my text (no quotes) -> runs cucumber scenarios containing "my text" +command! -nargs=+ Cuc :!ack --no-heading --no-break | cut -d':' -f1,2 | xargs bundle exec cucumber --no-color + +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif + +" Switch between the last two files +nnoremap + +" Treat
  • and

    tags like the block tags they are +let g:html_indent_tags = 'li\|p' + +" Markdown files end in .md +au BufRead,BufNewFile *.md set filetype=markdown + +" Enable spellchecking for Markdown +au BufRead,BufNewFile *.md setlocal spell + +" Automatically wrap at 80 characters for Markdown +au BufRead,BufNewFile *.md setlocal textwidth=80 + +" rspec mappings +map t :call RunCurrentSpecFile() +map s :call RunNearestSpec() +map l :call RunLastSpec() + +function! RunCurrentSpecFile() + if InSpecFile() + let l:command = "s " . @% . " -f documentation" + call SetLastSpecCommand(l:command) + call RunSpecs(l:command) + endif +endfunction + +function! RunNearestSpec() + if InSpecFile() + let l:command = "s " . @% . " -l " . line(".") . " -f documentation" + call SetLastSpecCommand(l:command) + call RunSpecs(l:command) + endif +endfunction + +function! RunLastSpec() + if exists("t:last_spec_command") + call RunSpecs(t:last_spec_command) + endif +endfunction + +function! InSpecFile() + return match(expand("%"), "_spec.rb$") != -1 +endfunction + +function! SetLastSpecCommand(command) + let t:last_spec_command = a:command +endfunction + +function! RunSpecs(command) + execute ":w\|!clear && echo " . a:command . " && echo && " . a:command +endfunction + +nmap I :IndentGuidesToggle +nmap d :NERDTreeToggle +nmap f :NERDTreeFind +nmap b :CtrlPBuffer +nmap t :CtrlP +nmap T :CtrlPClearCache:CtrlP +nmap ] :TagbarToggle +nmap :call Strip_trailing() +nmap g :GitGutterToggle +nmap c Kwbd + +let g:ctrlp_match_window = 'order:ttb,max:20' +let g:NERDSpaceDelims=1 +let g:gitgutter_enabled = 1 +let g:gitgutter_highlight_lines = 0 +let g:gitgutter_realtime = 4000 +set signcolumn=yes +let g:airline_symbols = {} +let g:airline_skip_empty_sections = 1 +let g:airline_left_sep = '๎‚ผ' +let g:airline_left_alt_sep = '๎‚ฝ' +let g:airline_right_sep = '๎‚บ' +let g:airline_right_alt_sep = '๎‚ป' +let g:airline_symbols.branch = '๏„ฆ' +let g:airline_symbols.readonly = '๎‚ข' +let g:airline_symbols.linenr = 'โ˜ฐ ' +let g:airline_symbols.maxlinenr = '๎‚ก' +let g:airline_symbols.whitespace = 'โ˜ฒ ' +let g:airline_symbols.notexists = ' ษ†' +let g:airline_symbols.dirty = ' ๏ƒง' +let g:airline_symbols.crypt = '๏€ฃ' +let g:airline_theme = 'simple' +let g:solarized_termtrans = 1 +let g:solarized_extra_hi_groups = 1 +let g:indent_guides_guide_size = 1 +let g:indent_guides_enable_on_vim_startup = 1 +let g:indent_guides_default_mapping = 0 +let g:indent_guides_exclude_filetypes = ['help', 'nerdtree'] + +let g:dracula_colorterm = 1 +let g:dracula_bold = 1 +let g:dracula_italic = 1 +let g:dracula_underline = 1 +let g:dracula_undercurl = 1 +let g:dracula_inverse = 1 + +set t_ku=OA +set t_kd=OB +set t_kr=OC +set t_kl=OD + +" Use The Silver Searcher https://github.com/ggreer/the_silver_searcher +if executable('ag') + let g:ackprg = 'ag --nogroup --column' + + " Use Ag over Grep + set grepprg=ag\ --nogroup\ --nocolor + + " Use ag in CtrlP for listing files. Lightning fast and respects .gitignore + let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""' +endif + +" thanks to http://vimcasts.org/e/4 +function! Strip_trailing() + let previous_search=@/ + let previous_cursor_line=line('.') + let previous_cursor_column=col('.') + %s/\s\+$//e + let @/=previous_search + call cursor(previous_cursor_line, previous_cursor_column) +endfunction + +" strip trailing whitespace on Ruby buffer saves +augroup whitespace + autocmd BufWritePre *.rb call Strip_trailing() +augroup END + +if (has("nvim")) + "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > + let $NVIM_TUI_ENABLE_TRUE_COLOR=1 +endif +colorscheme dracula_pro_van_helsing diff --git a/dot_zshenv b/dot_zshenv new file mode 100644 index 0000000..cc6985e --- /dev/null +++ b/dot_zshenv @@ -0,0 +1,47 @@ +# Documentation: https://github.com/romkatv/zsh4humans/blob/v5/README.md. +# +# Do not modify this file unless you know exactly what you are doing. +# It is strongly recommended to keep all shell customization and configuration +# (including exported environment variables such as PATH) in ~/.zshrc or in +# files sourced from ~/.zshrc. If you are certain that you must export some +# environment variables in ~/.zshenv, do it where indicated by comments below. + +if [ -n "${ZSH_VERSION-}" ]; then + : ${ZDOTDIR:=~} + setopt no_global_rcs + if [[ -o no_interactive && -z "${Z4H_BOOTSTRAPPING-}" ]]; then + return + fi + setopt no_rcs + unset Z4H_BOOTSTRAPPING + + # If you are certain that you must export some environment variables + # in ~/.zshenv (see comments at the top!), do it here: + # + # export GOPATH=$HOME/go + # + # Do not change anything else in this file. +fi + +Z4H_URL="https://raw.githubusercontent.com/romkatv/zsh4humans/v5" +: "${Z4H:=${XDG_CACHE_HOME:-$HOME/.cache}/zsh4humans/v5}" + +umask o-w + +if [ ! -e "$Z4H"/z4h.zsh ]; then + mkdir -p -- "$Z4H" || return + >&2 printf '\033[33mz4h\033[0m: fetching \033[4mz4h.zsh\033[0m\n' + if command -v curl >/dev/null 2>&1; then + curl -fsSL -- "$Z4H_URL"/z4h.zsh >"$Z4H"/z4h.zsh.$$ || return + elif command -v wget >/dev/null 2>&1; then + wget -O- -- "$Z4H_URL"/z4h.zsh >"$Z4H"/z4h.zsh.$$ || return + else + >&2 printf '\033[33mz4h\033[0m: please install \033[32mcurl\033[0m or \033[32mwget\033[0m\n' + return 1 + fi + mv -- "$Z4H"/z4h.zsh.$$ "$Z4H"/z4h.zsh || return +fi + +. "$Z4H"/z4h.zsh || return + +setopt rcs diff --git a/dot_zshrc b/dot_zshrc new file mode 100644 index 0000000..62041ca --- /dev/null +++ b/dot_zshrc @@ -0,0 +1,189 @@ +# Personal Zsh configuration file. It is strongly recommended to keep all +# shell customization and configuration (including exported environment +# variables such as PATH) in this file or in files sourced from it. +# +# Documentation: https://github.com/romkatv/zsh4humans/blob/v5/README.md. + +# Periodic auto-update on Zsh startup: 'ask' or 'no'. +# You can manually run `z4h update` to update everything. +zstyle ':z4h:' auto-update 'yes' +# Ask whether to auto-update this often; has no effect if auto-update is 'no'. +zstyle ':z4h:' auto-update-days '28' + +# Move prompt to the bottom when zsh starts and on Ctrl+L. +zstyle ':z4h:' prompt-at-bottom 'yes' + +# Keyboard type: 'mac' or 'pc'. +zstyle ':z4h:bindkey' keyboard 'mac' + +# Mark up shell's output with semantic information. +zstyle ':z4h:' term-shell-integration 'no' + +# Right-arrow key accepts one character ('partial-accept') from +# command autosuggestions or the whole thing ('accept')? +zstyle ':z4h:autosuggestions' forward-char 'accept' + +# Recursively traverse directories when TAB-completing files. +zstyle ':z4h:fzf-complete' recurse-dirs 'no' + +# Enable direnv to automatically source .envrc files. +zstyle ':z4h:direnv' enable 'yes' +# Show "loading" and "unloading" notifications from direnv. +zstyle ':z4h:direnv:success' notify 'yes' + +# Enable ('yes') or disable ('no') automatic teleportation of z4h over +# SSH when connecting to these hosts. +zstyle ':z4h:ssh:example-hostname1' enable 'yes' +zstyle ':z4h:ssh:*.example-hostname2' enable 'no' +# The default value if none of the overrides above match the hostname. +zstyle ':z4h:ssh:*' enable 'no' + +# Send these files over to the remote host when connecting over SSH to the +# enabled hosts. +zstyle ':z4h:ssh:*' send-extra-files '~/.nanorc' '~/.env.zsh' + +# Move the cursor to the end when Up/Down fetches a command from history? +zstyle ':zle:up-line-or-beginning-search' leave-cursor 'yes' +zstyle ':zle:down-line-or-beginning-search' leave-cursor 'yes' + +# Clone additional Git repositories from GitHub. +# +# This doesn't do anything apart from cloning the repository and keeping it +# up-to-date. Cloned files can be used after `z4h init`. This is just an +# example. If you don't plan to use Oh My Zsh, delete this line. +z4h install ohmyzsh/ohmyzsh || return + +z4h source $Z4H/ohmyzsh/plugins/gpg-agent/gpg-agent.plugin.zsh +export GPG_AGENT_INFO="~/.gnupg/S.gpg-agent:$(pgrep gpg-agent):1" + +#unset SSH_AUTH_SOCK +zstyle :omz:plugins:ssh-agent agent-forwarding on +zstyle :omz:plugins:ssh-agent identities id_ed25519 id_ed25519_sk_5c1 id_ed25519_sk_5cnfc1 id_ed25519_sk_5cnfc2 + +# Install or update core components (fzf, zsh-autosuggestions, etc.) and +# initialize Zsh. After this point console I/O is unavailable until Zsh +# is fully initialized. Everything that requires user interaction or can +# perform network I/O must be done above. Everything else is best done below. +z4h init || return + +# Export environment variables. +export ZSH_CUSTOM=~/.credentials +export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + +# Extend PATH. +path=(~/bin /usr/local/opt/python@3.9/bin /opt/homebrew/opt/curl/bin /opt/homebrew/bin $path) + +# Export environment variables. +export GPG_TTY=$TTY + +# Source additional local files if they exist. +z4h source ~/.env.zsh + +# Use additional Git repositories pulled in with `z4h install`. +# +# This is just an example that you should delete. It does nothing useful. +#z4h source $Z4H/ohmyzsh/ohmyzsh/lib/diagnostics.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/lib/clipboard.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/lib/functions.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/lib/directories.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/lib/grep.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/ansible/ansible.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/aws/aws.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/brew/brew.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/common-aliases/common-aliases.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/colorize/colorize.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/copybuffer/copybuffer.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/copydir/copydir.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/copyfile/copyfile.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/cp/cp.plugin.zsh +# z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/debian/debian.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/direnv/direnv.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/docker/docker.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/doctl/doctl.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/encode64/encode64.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/extract/extract.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/gem/gem.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/git/git.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/git-extras/git-extras.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/git-lfs/git-lfs.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/helm/helm.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/httpie/httpie.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/jsontools/jsontools.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/jump/jump.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/kubectl/kubectl.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/mosh/mosh.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/nmap/nmap.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/macos/macos.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/perms/perms.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/profiles/profiles.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/rvm/rvm.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/ssh-agent/ssh-agent.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/singlechar/singlechar.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/sudo/sudo.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/systemadmin/systemadmin.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/tmux/tmux.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/vscode/vscode.plugin.zsh +z4h source $Z4H/ohmyzsh/ohmyzsh/plugins/web-search/web-search.plugin.zsh + +# Define key bindings. +z4h bindkey z4h-backward-kill-word Ctrl+Backspace Ctrl+H +z4h bindkey z4h-backward-kill-zword Ctrl+Alt+Backspace + +z4h bindkey undo Ctrl+/ Shift+Tab # undo the last command line change +z4h bindkey redo Alt+/ # redo the last undone command line change + +z4h bindkey z4h-cd-back Alt+Left # cd into the previous directory +z4h bindkey z4h-cd-forward Alt+Right # cd into the next directory +z4h bindkey z4h-cd-up Alt+Up # cd into the parent directory +z4h bindkey z4h-cd-down Alt+Down # cd into a child directory + +# Autoload functions. +autoload -Uz zmv + +# Define functions and completions. +function md() { [[ $# == 1 ]] && mkdir -p -- "$1" && cd -- "$1" } +compdef _directories md + +# Define named directories: ~w <=> Windows home directory on WSL. +[[ -z $z4h_win_home ]] || hash -d w=$z4h_win_home + +# Define aliases. +alias tree='tree -a -I .git' + +# Add flags to existing aliases. +# alias ls="${aliases[ls]:-ls} -A" + +# Set shell options: http://zsh.sourceforge.net/Doc/Release/Options.html. +setopt glob_dots # no special treatment for file names with a leading dot +setopt no_auto_menu # require an extra TAB press to open the completion menu + +# aliases +if [ -e "$HOME/.aliases" ]; then + source "$HOME/.aliases" +fi + +# Add flags to existing aliases. +alias ls="${aliases[ls]:-ls} -g" + +# look for ey config in project dirs +export EYRC=./.eyrc + +source "$HOME/.zshsyntax" + +#ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red' +#ZSH_HIGHLIGHT_STYLES[path]='fg=7' +#ZSH_HIGHLIGHT_STYLES[single-hyphen-option]='fg=magenta' +#ZSH_HIGHLIGHT_STYLES[double-hyphen-option]='fg=magenta' + +if [ -e "$HOME/.rvm/scripts/rvm" ]; then + source "$HOME/.rvm/scripts/rvm" +fi + +# Add RVM to PATH for scripting. Make sure this is the last PATH variable change. +export PATH="$PATH:$HOME/.rvm/bin" + +eval $(thefuck --alias) + +#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! +export SDKMAN_DIR="$HOME/.sdkman" +[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh" diff --git a/yt-dlp.conf b/yt-dlp.conf new file mode 100644 index 0000000..35803d5 --- /dev/null +++ b/yt-dlp.conf @@ -0,0 +1,4 @@ +# Lines starting with # are comments + +# Do not copy the mtime +--no-mtime