aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--home-config/aerc/accounts.conf23
-rw-r--r--home-config/aerc/aerc.conf568
-rw-r--r--home-config/aerc/binds.conf149
-rw-r--r--home-config/aerc/signature_personal3
-rw-r--r--home-config/aerc/signature_rit_personal5
-rw-r--r--home-config/aerc/templates/quoted_reply6
-rw-r--r--home-config/aerc/templates/thanks7
-rw-r--r--home-config/alacritty/alacritty.yml15
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Bold.ttfbin2020184 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFont-BoldItalic.ttfbin2008556 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Italic.ttfbin2010136 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Regular.ttfbin2023680 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Bold.ttfbin1960144 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-BoldItalic.ttfbin1948516 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Italic.ttfbin1950096 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Regular.ttfbin1963640 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Bold.ttfbin2039852 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-BoldItalic.ttfbin2028224 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Italic.ttfbin2029804 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Regular.ttfbin2043348 -> 0 bytes
-rw-r--r--home-config/fonts/AnonymicePro/OFL.txt94
-rw-r--r--home-config/fonts/AnonymicePro/readme.md8
-rw-r--r--home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttfbin1244992 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttfbin1244944 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttfbin1274112 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttfbin1274040 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttfbin1213872 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttfbin1213824 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttfbin1242992 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttfbin1242920 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttfbin1209232 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttfbin1209184 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttfbin1238356 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttfbin1238284 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttfbin1215216 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttfbin1215172 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttfbin1244340 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttfbin1244268 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttfbin1210968 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttfbin1210920 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttfbin1240092 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttfbin1240020 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttfbin1229764 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttfbin1229724 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttfbin1258888 -> 0 bytes
-rw-r--r--home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttfbin1258820 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-Bold.ttfbin2156560 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttfbin2152564 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttfbin2153768 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-Medium.ttfbin2154268 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-Regular.ttfbin2156700 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFont-Thin.ttfbin2151156 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttfbin2131952 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttfbin2127972 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttfbin2129176 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttfbin2129676 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttfbin2132092 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttfbin2126560 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttfbin2177624 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttfbin2173648 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttfbin2174852 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttfbin2175352 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttfbin2177764 -> 0 bytes
-rw-r--r--home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttfbin2172236 -> 0 bytes
-rw-r--r--home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttfbin137516 -> 0 bytes
-rw-r--r--home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttfbin167192 -> 0 bytes
-rw-r--r--home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttfbin155228 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/LICENSE.txt20
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFont-Bold.ttfbin2049060 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFont-Italic.ttfbin2074276 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFont-Regular.ttfbin2061956 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Bold.ttfbin1972868 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Italic.ttfbin1999276 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Regular.ttfbin1986888 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Bold.ttfbin2067656 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Italic.ttfbin2094004 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Regular.ttfbin2081676 -> 0 bytes
-rw-r--r--home-config/fonts/MonofurNerdFont/readme.md8
-rw-r--r--home-config/foot/foot.ini7
-rw-r--r--home-config/gnupg/gpg-agent.conf3
-rw-r--r--home-config/gnupg/sshcontrol10
-rw-r--r--home-config/hypr/Wallpapers/static/1685362396481634.jpgbin933436 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1693169418078790.jpgbin1326027 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1694792956043641.jpgbin5067847 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1708470532817406.jpgbin3801100 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1720750738377603.jpgbin177477 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1720751011150282.pngbin1746731 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1723625710776950.jpgbin602989 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1723626275390685.jpgbin388798 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/1728661127589872.jpgbin1892757 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpegbin1877217 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpgbin8550632 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpgbin2357200 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/CN62QXJ.jpgbin146377 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/above-clouds.jpgbin535067 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpgbin632441 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpgbin815957 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-cave-1k.jpgbin479749 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpgbin567195 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpgbin635856 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-cosmo-1k.jpgbin616567 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-downtown-1k.jpgbin605445 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpgbin698119 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpgbin505917 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-end-1k.jpgbin612182 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpgbin612516 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-kosmos19001.jpgbin438105 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpgbin855710 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpgbin607579 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpgbin689660 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpgbin863496 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpgbin489358 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-orangemoon1900p.jpgbin884416 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpgbin741511 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpgbin863258 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpgbin712975 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpgbin992731 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpgbin736011 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-tl-002-1k.pngbin2472437 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-wait.jpgbin632782 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpgbin756726 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/alena-aenami-you-1k-2.jpgbin543184 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/autumn1.jpgbin1084113 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/autumn1.pngbin3956950 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpgbin692972 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/lake-winter.jpgbin1118701 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/mountains.jpgbin1097089 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/northern-lights-2.jpgbin2106126 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/northern-lights-bridge.jpgbin590574 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/ooglygoo.pngbin1286896 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/purple-grass.jpgbin2298196 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/purple-intersection.jpgbin490043 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/purple-lakescape.jpgbin4375129 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpgbin1940378 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/scarecrow.jpgbin458024 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/snow-1.jpgbin944602 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/snow-2.jpgbin1825815 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/vfcfyfyehhi31.pngbin2168863 -> 0 bytes
-rw-r--r--home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpgbin66045 -> 0 bytes
-rw-r--r--home-config/hypr/family_guy.mp4bin20881473 -> 0 bytes
-rw-r--r--home-config/hypr/hypridle.conf16
-rw-r--r--home-config/hypr/hyprland.conf332
-rw-r--r--home-config/hypr/hyprlock.conf57
-rw-r--r--home-config/hypr/kanshi.conf22
-rw-r--r--home-config/hypr/monitors.conf2
-rw-r--r--home-config/hypr/pyprland.toml5
-rwxr-xr-xhome-config/hypr/scripts/autostart.sh40
-rwxr-xr-xhome-config/hypr/scripts/perf_mode.sh14
-rw-r--r--home-config/hypr/subwaysurfer.webmbin77979199 -> 0 bytes
-rwxr-xr-xhome-config/hypr/wallpaper-daemon-animated-old.sh106
-rwxr-xr-xhome-config/hypr/wallpaper-daemon.sh35
-rwxr-xr-xhome-config/hypr/wallpaper.sh9
-rw-r--r--home-config/mailvelope/gpgmejson.json7
-rwxr-xr-xhome-config/mailvelope/start.sh4
-rw-r--r--home-config/mpv/scripts/easycrop.lua254
m---------home-config/nix-files0
-rw-r--r--home-config/nvim/config/after/ftplugin/mail/custom.vim2
-rw-r--r--home-config/nvim/config/after/ftplugin/markdown/custom.vim2
-rw-r--r--home-config/nvim/config/init.vim90
-rw-r--r--home-config/nvim/plugin-manager/plug.vim2812
-rw-r--r--home-config/spotify-player/app.toml34
-rw-r--r--home-config/ssh/config24
-rwxr-xr-xhome-config/tridactyl/native_mainbin514233 -> 0 bytes
-rw-r--r--home-config/tridactyl/tridactyl.json7
-rw-r--r--home-config/waybar/config167
-rwxr-xr-xhome-config/waybar/modules/check-for-music.sh7
-rwxr-xr-xhome-config/waybar/modules/spotify.sh19
-rwxr-xr-xhome-config/waybar/modules/storage.sh25
-rwxr-xr-xhome-config/waybar/modules/weather.sh77
-rw-r--r--home-config/waybar/style.css77
-rw-r--r--home-config/wpaperd/config.toml4
171 files changed, 0 insertions, 5176 deletions
diff --git a/home-config/aerc/accounts.conf b/home-config/aerc/accounts.conf
deleted file mode 100644
index fd3a4dd..0000000
--- a/home-config/aerc/accounts.conf
+++ /dev/null
@@ -1,23 +0,0 @@
1[Personal]
2source = jmap://ryan%40rschanz.org@mail.rschanz.org/jmap/session
3source-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
4outgoing = jmap://
5default = Inbox
6from = Ryan Schanzenbacher <ryan@rschanz.org>
7copy-to = Sent
8signature-file = ~/.config/aerc/signature_personal
9#check-mail = 5m
10aliases = Ryan S <ryan+ritlugdemo@rschanz.org>, Ryan Schanzenbacher <ryan+guixdevel@rschanz.org>
11pgp-self-encrypt = true
12
13[School]
14source = imaps+oauthbearer://rjs1877%40rit.edu@imap.gmail.com:993?token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken&client_id=667738788924-0rdfvaq9ijfo1vk4474eb3quf8206h2t.apps.googleusercontent.com&client_secret=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
15source-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
16outgoing = smtps+oauthbearer://rjs1877%40rit.edu@imap.gmail.com:465?token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken&client_id=667738788924-0rdfvaq9ijfo1vk4474eb3quf8206h2t.apps.googleusercontent.com&client_secret=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
17outgoing-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
18from = Ryan Schanzenbacher <rjs1877@rit.edu>
19signature-file = ~/.config/aerc/signature_rit_personal
20check-mail = 5m
21default = INBOX
22copy-to = [Gmail]/Sent Mail
23pgp-self-encrypt = true
diff --git a/home-config/aerc/aerc.conf b/home-config/aerc/aerc.conf
deleted file mode 100644
index 04ac815..0000000
--- a/home-config/aerc/aerc.conf
+++ /dev/null
@@ -1,568 +0,0 @@
1#
2# aerc main configuration
3
4[general]
5#
6# Used as a default path for save operations if no other path is specified.
7# ~ is expanded to the current user home dir.
8#
9default-save-path=~/Downloads/
10
11# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
12# operations. If set to "internal", the internal openpgp keyring will be used.
13# If set to "auto", the system gpg will be preferred unless the internal
14# keyring already exists, in which case the latter will be used.
15#
16# Default: auto
17pgp-provider=gpg
18
19# By default, the file permissions of accounts.conf must be restrictive and
20# only allow reading by the file owner (0600). Set this option to true to
21# ignore this permission check. Use this with care as it may expose your
22# credentials.
23#
24# Default: false
25unsafe-accounts-conf=true # I don't store my creds in this
26
27# Output log messages to specified file. A path starting with ~/ is expanded to
28# the user home dir. When redirecting aerc's output to a file using > shell
29# redirection, this setting is ignored and log messages are printed to stdout.
30#
31#log-file=~/aerc_log
32
33# Only log messages above the specified level to log-file. Supported levels
34# are: trace, debug, info, warn and error. When redirecting aerc's output to
35# a file using > shell redirection, this setting is ignored and the log level
36# is forced to trace.
37#
38# Default: info
39log-level=trace
40
41# Set the $TERM environment variable used for the embedded terminal.
42#
43# Default: xterm-256color
44#term=xterm-256color
45
46# Display OSC8 strings in the embedded terminal
47#
48# Default: false
49#enable-osc8=false
50
51[ui]
52#
53# Describes the format for each row in a mailbox view. This is a comma
54# separated list of column names with an optional align and width suffix. After
55# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment
56# characters can be added (by default, left) followed by an optional width
57# specifier. The width is either an integer representing a fixed number of
58# characters, or a percentage between 1% and 99% representing a fraction of the
59# terminal width. It can also be one of the '*' (auto) or '=' (fit) special
60# width specifiers. Auto width columns will be equally attributed the remaining
61# terminal width. Fit width columns take the width of their contents. If no
62# width specifier is set, '*' is used by default.
63#
64# Default: date<20,name<17,flags>4,subject<*
65#index-columns=date<20,name<17,flags>4,subject<*
66
67spinner = '/,-,\,|'
68
69#
70# Each name in index-columns must have a corresponding column-$name setting.
71# All column-$name settings accept golang text/template syntax. See
72# aerc-templates(7) for available template attributes and functions.
73#
74# Default settings
75#column-date={{.DateAutoFormat .Date.Local}}
76#column-name={{index (.From | names) 0}}
77#column-flags={{.Flags | join ""}}
78#column-subject={{.ThreadPrefix}}{{.Subject}}
79
80#
81# String separator inserted between columns. When the column width specifier is
82# an exact number of characters, the separator is added to it (i.e. the exact
83# width will be fully available for the column contents).
84#
85# Default: " "
86#column-separator=" "
87
88#
89# See time.Time#Format at https://godoc.org/time#Time.Format
90#
91# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
92#timestamp-format=2006-01-02 03:04 PM
93
94#
95# Index-only time format for messages that were received/sent today.
96# If this is not specified, timestamp-format is used instead.
97#
98#this-day-time-format=
99
100#
101# Index-only time format for messages that were received/sent within the last
102# 7 days. If this is not specified, timestamp-format is used instead.
103#
104#this-week-time-format=
105
106#
107# Index-only time format for messages that were received/sent this year.
108# If this is not specified, timestamp-format is used instead.
109#
110#this-year-time-format=
111
112#
113# Width of the sidebar, including the border.
114#
115# Default: 20
116#sidebar-width=20
117
118#
119# Message to display when viewing an empty folder.
120#
121# Default: (no messages)
122#empty-message=(no messages)
123
124# Message to display when no folders exists or are all filtered
125#
126# Default: (no folders)
127#empty-dirlist=(no folders)
128
129# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
130#
131# Default: false
132#mouse-enabled=false
133
134#
135# Ring the bell when new messages are received
136#
137# Default: true
138#new-message-bell=true
139
140#
141# Template to use for Account tab titles
142#
143# Default: {{.Account}}
144#tab-title-account={{.Account}}
145
146# Marker to show before a pinned tab's name.
147#
148# Default: `
149#pinned-tab-marker='`'
150
151# Template for the left side of the directory list.
152# See aerc-templates(7) for all available fields and functions.
153#
154# Default: {{.Folder}}
155#dirlist-left={{.Folder}}
156
157# Template for the right side of the directory list.
158# See aerc-templates(7) for all available fields and functions.
159#
160# Default: {{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
161#dirlist-right={{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
162
163# Delay after which the messages are actually listed when entering a directory.
164# This avoids loading messages when skipping over folders and makes the UI more
165# responsive. If you do not want that, set it to 0s.
166#
167# Default: 200ms
168#dirlist-delay=200ms
169
170# Display the directory list as a foldable tree that allows to collapse and
171# expand the folders.
172#
173# Default: false
174#dirlist-tree=false
175
176# If dirlist-tree is enabled, set level at which folders are collapsed by
177# default. Set to 0 to disable.
178#
179# Default: 0
180#dirlist-collapse=0
181
182# List of space-separated criteria to sort the messages by, see *sort*
183# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
184# reverses that criterion.
185#
186# Example: "from -r date"
187#
188#sort=
189
190# Moves to next message when the current message is deleted
191#
192# Default: true
193#next-message-on-delete=true
194
195# Automatically set the "seen" flag when a message is opened in the message
196# viewer.
197#
198# Default: true
199#auto-mark-read=true
200
201# The directories where the stylesets are stored. It takes a colon-separated
202# list of directories. If this is unset or if a styleset cannot be found, the
203# following paths will be used as a fallback in that order:
204#
205# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
206# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
207# /usr/local/share/aerc/stylesets
208# /usr/share/aerc/stylesets
209#
210#stylesets-dirs=
211
212# Uncomment to use box-drawing characters for vertical and horizontal borders.
213#
214# Default: " "
215#border-char-vertical=" "
216#border-char-horizontal=" "
217
218# Sets the styleset to use for the aerc ui elements.
219#
220# Default: default
221#styleset-name=default
222
223# Activates fuzzy search in commands and their arguments: the typed string is
224# searched in the command or option in any position, and need not be
225# consecutive characters in the command or option.
226#
227# Default: false
228#fuzzy-complete=false
229
230# How long to wait after the last input before auto-completion is triggered.
231#
232# Default: 250ms
233#completion-delay=250ms
234
235# The minimum required characters to allow auto-completion to be triggered after
236# completion-delay.
237#
238# Default: 1
239#completion-min-chars=1
240
241#
242# Global switch for completion popovers
243#
244# Default: true
245#completion-popovers=true
246
247# Uncomment to use UTF-8 symbols to indicate PGP status of messages
248#
249# Default: ASCII
250#icon-unencrypted=
251#icon-encrypted=✔
252#icon-signed=✔
253#icon-signed-encrypted=✔
254#icon-unknown=✘
255#icon-invalid=⚠
256
257# Reverses the order of the message list. By default, the message list is
258# ordered with the newest (highest UID) message on top. Reversing the order
259# will put the oldest (lowest UID) message on top. This can be useful in cases
260# where the backend does not support sorting.
261#
262# Default: false
263#reverse-msglist-order = false
264
265# Reverse display of the mesage threads. Default order is the the intial
266# message is on the top with all the replies being displayed below. The
267# reverse option will put the initial message at the bottom with the
268# replies on top.
269#
270# Default: false
271#reverse-thread-order=false
272
273# Sort the thread siblings according to the sort criteria for the messages. If
274# sort-thread-siblings is false, the thread siblings will be sorted based on
275# the message UID in ascending order. This option is only applicable for
276# client-side threading with a backend that enables sorting. Note that there's
277# a performance impact when sorting is activated.
278#
279# Default: false
280#sort-thread-siblings=false
281
282#[ui:account=Personal]
283#
284# Enable a threaded view of messages. If this is not supported by the backend
285# (IMAP server or notmuch), threads will be built by the client.
286#
287# Default: false
288threading-enabled=true
289
290# Force client-side thread building
291#
292# Default: false
293#force-client-threads=false
294
295# Debounce client-side thread building
296#
297# Default: 50ms
298#client-threads-delay=50ms
299
300[statusline]
301#
302# Describes the format for the status line. This is a comma separated list of
303# column names with an optional align and width suffix. See [ui].index-columns
304# for more details. To completely mute the status line except for push
305# notifications, explicitly set status-columns to an empty string.
306#
307# Default: left<*,center:=,right>*
308#status-columns=left<*,center:=,right>*
309
310#
311# Each name in status-columns must have a corresponding column-$name setting.
312# All column-$name settings accept golang text/template syntax. See
313# aerc-templates(7) for available template attributes and functions.
314#
315# Default settings
316#column-left=[{{.Account}}] {{.StatusInfo}}
317#column-center={{.PendingKeys}}
318#column-right={{.TrayInfo}}
319
320#
321# String separator inserted between columns.
322# See [ui].column-separator for more details.
323#
324#column-separator=" "
325
326# Specifies the separator between grouped statusline elements.
327#
328# Default: " | "
329#separator=" | "
330
331# Defines the mode for displaying the status elements.
332# Options: text, icon
333#
334# Default: text
335#display-mode=text
336
337[viewer]
338#
339# Specifies the pager to use when displaying emails. Note that some filters
340# may add ANSI codes to add color to rendered emails, so you may want to use a
341# pager which supports ANSI codes.
342#
343# Default: less -R
344#pager=less -R
345
346#
347# If an email offers several versions (multipart), you can configure which
348# mimetype to prefer. For example, this can be used to prefer plaintext over
349# html emails.
350#
351# Default: text/plain,text/html
352#alternatives=text/plain,text/html
353
354#
355# Default setting to determine whether to show full headers or only parsed
356# ones in message viewer.
357#
358# Default: false
359#show-headers=false
360
361#
362# Layout of headers when viewing a message. To display multiple headers in the
363# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
364# none of their specified headers are present in the message.
365#
366# Default: From|To,Cc|Bcc,Date,Subject
367#header-layout=From|To,Cc|Bcc,Date,Subject
368
369# Whether to always show the mimetype of an email, even when it is just a single part
370#
371# Default: false
372#always-show-mime=false
373
374# Parses and extracts http links when viewing a message. Links can then be
375# accessed with the open-link command.
376#
377# Default: true
378#parse-http-links=true
379
380[compose]
381#
382# Specifies the command to run the editor with. It will be shown in an embedded
383# terminal, though it may also launch a graphical window if the environment
384# supports it. Defaults to $EDITOR, or vi.
385#editor=
386
387# Address book command
388address-book-cmd = sh -c 'abook --mutt-query "%s" | tail -n +2'
389
390#
391# Default header fields to display when composing a message. To display
392# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
393#
394# Default: To|From,Subject
395#header-layout=To|From,Subject
396
397#
398# Specifies the command to be used to tab-complete email addresses. Any
399# occurrence of "%s" in the address-book-cmd will be replaced with what the
400# user has typed so far.
401#
402# The command must output the completions to standard output, one completion
403# per line. Each line must be tab-delimited, with an email address occurring as
404# the first field. Only the email address field is required. The second field,
405# if present, will be treated as the contact name. Additional fields are
406# ignored.
407#
408# This parameter can also be set per account in accounts.conf.
409#address-book-cmd=
410
411# Specifies the command to be used to select attachments. Any occurence of '%s'
412# in the file-picker-cmd will be replaced the argument <arg> to :attach -m
413# <arg>.
414#
415# The command must output the selected files to standard output, one file per
416# line.
417file-picker-cmd=fzf --multi --query=%s
418
419#
420# Allow to address yourself when replying
421#
422# Default: true
423#reply-to-self=true
424
425#
426# Warn before sending an email that matches the specified regexp but does not
427# have any attachments. Leave empty to disable this feature.
428#
429# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
430# "(?im)" flags are set by default (case-insensitive and multi-line).
431#
432# Example:
433# no-attachment-warning=^[^>]*attach(ed|ment)
434#
435#no-attachment-warning=
436
437#
438# When set, aerc will generate "format=flowed" bodies with a content type of
439# "text/plain; format=flowed" as described in RFC3676. This format is easier to
440# handle for some mailing software, and generally just looks like ordinary
441# text. To actually make use of this format's features, you'll need support in
442# your editor.
443#
444format-flowed=true
445
446[multipart-converters]
447#
448# Converters allow to generate multipart/alternative messages by converting the
449# main text/plain part into any other MIME type. Only exact MIME types are
450# accepted. The commands are invoked with sh -c and are expected to output
451# valid UTF-8 text.
452#
453# Example (obviously, this requires that you write your main text/plain body
454# using the markdown syntax):
455text/html=pandoc --wrap=preserve -f gfm+hard_line_breaks -t html --standalone
456
457[filters]
458#
459# Filters allow you to pipe an email body through a shell command to render
460# certain emails differently, e.g. highlighting them with ANSI escape codes.
461#
462# The commands are invoked with sh -c. The following folders are appended to
463# the system $PATH to allow referencing filters from their name only:
464#
465# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
466# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
467# $PREFIX/share/aerc/filters
468# /usr/share/aerc/filters
469#
470# The following variables are defined in the filter command environment:
471#
472# AERC_MIME_TYPE the part MIME type/subtype
473# AERC_FORMAT the part content type format= parameter
474# AERC_FILENAME the attachment filename (if any)
475# AERC_SUBJECT the message Subject header value
476# AERC_FROM the message From header value
477#
478# The first filter which matches the email's mimetype will be used, so order
479# them from most to least specific.
480#
481# You can also match on non-mimetypes, by prefixing with the header to match
482# against (non-case-sensitive) and a comma, e.g. subject,text will match a
483# subject which contains "text". Use header,~regex to match against a regex.
484#
485#text/plain=colorize
486#text/calendar=calendar
487message/delivery-status=bat -fn
488message/rfc822=bat -fn
489text/html=pandoc -f html -t plain | bat -fn
490#text/html=html | colorize
491text/*=bat -fn
492application/x-sh=bat -fn -l sh
493#image/*=catimg -w $(tput cols) -
494#subject,~Git(hub|lab)=lolcat -f
495#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize
496
497# This special filter is only used to post-process email headers when
498# [viewer].show-headers=true
499# By default, headers are piped directly into the pager.
500#
501#.headers=bat -fp
502
503[openers]
504#
505# Openers allow you to specify the command to use for the :open and :open-link
506# actions on a per-MIME-type basis. The :open-link URL scheme is used to
507# determine the MIME type as follows: x-scheme-handler/<scheme>.
508#
509# {} is expanded as the temporary filename to be opened. If it is not
510# encountered in the command, the temporary filename will be appened to the end
511# of the command.
512#
513# Like [filters], openers support basic shell globbing. The first opener which
514# matches the part's MIME type (or URL scheme handler MIME type) will be used,
515# so order them from most to least specific.
516#
517# Examples:
518# x-scheme-handler/irc=hexchat
519# x-scheme-handler/http*=firefox
520# text/html=surf -dfgms
521# text/plain=gvim {} +125
522# message/rfc822=thunderbird
523
524[hooks]
525#
526# Hooks are triggered whenever the associated event occurs.
527
528#
529# Executed when a new email arrives in the selected folder
530mail-received=notify-send "$AERC_FROM_NAME" "$AERC_SUBJECT"
531
532#
533# Executed when aerc starts
534#aerc-startup=aerc :terminal calcurse && aerc :next-tab
535
536#
537# Executed when aerc shuts down.
538#aerc-shutdown=
539
540[templates]
541# Templates are used to populate email bodies automatically.
542#
543
544# The directories where the templates are stored. It takes a colon-separated
545# list of directories. If this is unset or if a template cannot be found, the
546# following paths will be used as a fallback in that order:
547#
548# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
549# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
550# /usr/local/share/aerc/templates
551# /usr/share/aerc/templates
552#
553#template-dirs=
554
555# The default template to be used for new messages.
556#
557# default: new_message
558#new-message=new_message
559
560# The default template to be used for quoted replies.
561#
562# default: quoted_reply
563#quoted-reply=quoted_reply
564
565# The default template to be used for forward as body.
566#
567# default: forward_as_body
568#forwards=forward_as_body
diff --git a/home-config/aerc/binds.conf b/home-config/aerc/binds.conf
deleted file mode 100644
index 4dee57f..0000000
--- a/home-config/aerc/binds.conf
+++ /dev/null
@@ -1,149 +0,0 @@
1# Binds are of the form <key sequence> = <command to run>
2# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
3# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
4<C-p> = :prev-tab<Enter>
5<C-n> = :next-tab<Enter>
6<C-t> = :term<Enter>
7? = :help keys<Enter>
8
9[messages]
10q = :quit<Enter>
11
12j = :next<Enter>
13<Down> = :next<Enter>
14<C-d> = :next 50%<Enter>
15<C-f> = :next 100%<Enter>
16<PgDn> = :next 100%<Enter>
17
18k = :prev<Enter>
19<Up> = :prev<Enter>
20<C-u> = :prev 50%<Enter>
21<C-b> = :prev 100%<Enter>
22<PgUp> = :prev 100%<Enter>
23g = :select 0<Enter>
24G = :select -1<Enter>
25<C-r> = :read<Enter>
26<C-u> = :unread<Enter>
27
28J = :next-folder<Enter>
29K = :prev-folder<Enter>
30H = :collapse-folder<Enter>
31L = :expand-folder<Enter>
32
33v = :mark -t<Enter>
34V = :mark -v<Enter>
35
36T = :toggle-threads<Enter>
37
38<Enter> = :view<Enter>
39dd = :mv Trash<Enter>
40dg = :mv [Gmail]/Trash<Enter>
41D = :delete<Enter>
42A = :archive year<Enter>
43
44C = :compose<Enter>
45
46rr = :reply -a<Enter>
47rq = :reply -aq<Enter>
48Rr = :reply<Enter>
49Rq = :reply -q<Enter>
50f = :forward -A<Enter>
51
52# Git custom stuff ala Drew Devault
53ga = :pipe -mb git am -3<Enter>
54gp = :term git push<Enter>
55rt = :reply -aTthanks<Enter>
56
57c = :cf<space>
58$ = :term<space>
59! = :term<space>
60| = :pipe<space>
61
62/ = :search<space>
63\ = :filter<space>
64n = :next-result<Enter>
65N = :prev-result<Enter>
66<Esc> = :clear<Enter>
67
68[messages:folder=Drafts]
69<Enter> = :recall<Enter>
70
71[view]
72/ = :toggle-key-passthrough<Enter>/
73q = :close<Enter>
74O = :open<Enter>
75S = :save<space>
76| = :pipe<space>
77D = :delete<Enter>
78dd = :mv Trash<Enter>
79dg = :mv [Gmail]/Trash<Enter>
80A = :archive year<Enter>
81
82<C-l> = :open-link <space>
83
84f = :forward -A<Enter>
85rr = :reply -a<Enter>
86rq = :reply -aq<Enter>
87Rr = :reply<Enter>
88Rq = :reply -q<Enter>
89
90H = :toggle-headers<Enter>
91<C-k> = :prev-part<Enter>
92<C-j> = :next-part<Enter>
93J = :next<Enter>
94K = :prev<Enter>
95
96[view::passthrough]
97$noinherit = true
98$ex = <C-x>
99<Esc> = :toggle-key-passthrough<Enter>
100
101[compose]
102# Keybindings used when the embedded terminal is not selected in the compose
103# view
104$noinherit = true
105$ex = <C-x>
106<C-k> = :prev-field<Enter>
107<C-j> = :next-field<Enter>
108<A-p> = :switch-account -p<Enter>
109<A-n> = :switch-account -n<Enter>
110<tab> = :next-field<Enter>
111<backtab> = :prev-field<Enter>
112<C-p> = :prev-tab<Enter>
113<C-n> = :next-tab<Enter>
114<C-c> = :cc<Enter>
115<C-b> = :bcc<Enter>
116<C-q> = :abort<Enter>
117
118[compose::editor]
119# Keybindings used when the embedded terminal is selected in the compose view
120$noinherit = true
121$ex = <C-x>
122<C-k> = :prev-field<Enter>
123<C-j> = :next-field<Enter>
124<C-p> = :prev-tab<Enter>
125<C-n> = :next-tab<Enter>
126<C-q> = :abort<Enter>
127
128[compose::review]
129# Keybindings used when reviewing a message to be sent
130y = :send<Enter>
131n = :abort<Enter>
132v = :preview<Enter>
133p = :postpone<Enter>
134q = :choose -o d discard abort -o p postpone postpone<Enter>
135e = :edit<Enter>
136a = :attach<space>
137d = :detach<space>
138S = :sign<Enter>
139E = :encrypt<Enter>
140A = :attach-key<Enter>
141C = :multipart text/html<Enter>
142
143[terminal]
144$noinherit = true
145$ex = <C-x>
146<C-q> = :close<Enter>
147
148<C-p> = :prev-tab<Enter>
149<C-n> = :next-tab<Enter>
diff --git a/home-config/aerc/signature_personal b/home-config/aerc/signature_personal
deleted file mode 100644
index d9a8de7..0000000
--- a/home-config/aerc/signature_personal
+++ /dev/null
@@ -1,3 +0,0 @@
1--
2Best,
3Ryan Schanzenbacher
diff --git a/home-config/aerc/signature_rit_personal b/home-config/aerc/signature_rit_personal
deleted file mode 100644
index efe4ceb..0000000
--- a/home-config/aerc/signature_rit_personal
+++ /dev/null
@@ -1,5 +0,0 @@
1--
2Best,
3Ryan Schanzenbacher
4Rochester Institute of Technology
5Cybersecurity BS/MS Student
diff --git a/home-config/aerc/templates/quoted_reply b/home-config/aerc/templates/quoted_reply
deleted file mode 100644
index 402515f..0000000
--- a/home-config/aerc/templates/quoted_reply
+++ /dev/null
@@ -1,6 +0,0 @@
1X-Mailer: aerc {{version}}
2
3{{.Signature}}
4
5On {{dateFormat (.OriginalDate | toLocal) "Mon Jan 2, 2006 at 3:04 PM MST"}}, {{(index .OriginalFrom 0).Name}} wrote:
6{{trimSignature .OriginalText | quote}}
diff --git a/home-config/aerc/templates/thanks b/home-config/aerc/templates/thanks
deleted file mode 100644
index bc920a6..0000000
--- a/home-config/aerc/templates/thanks
+++ /dev/null
@@ -1,7 +0,0 @@
1X-Mailer: aerc {{version}}
2
3Thanks!
4
5{{exec "{ git remote get-url --push origin; git reflog -2 origin/main --pretty=format:%h; } | xargs printf 'To %s\n %s..%s main -> main\n'" ""}}
6
7{{.Signature}}
diff --git a/home-config/alacritty/alacritty.yml b/home-config/alacritty/alacritty.yml
deleted file mode 100644
index 4fbd991..0000000
--- a/home-config/alacritty/alacritty.yml
+++ /dev/null
@@ -1,15 +0,0 @@
1window:
2 opacity: 0.70
3font:
4 size: 15
5 normal:
6 family: "Monofur Nerd Font Mono"
7 style: Regular
8
9 bold:
10 family: "Monofur Nerd Font Mono"
11 style: Bold
12
13 italic:
14 family: "Monofur Nerd Font Mono"
15 style: Italic
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Bold.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Bold.ttf
deleted file mode 100644
index 0482a5d..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-BoldItalic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-BoldItalic.ttf
deleted file mode 100644
index 0ea8dfe..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-BoldItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Italic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Italic.ttf
deleted file mode 100644
index c373d01..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Regular.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Regular.ttf
deleted file mode 100644
index 5fcf955..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Bold.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Bold.ttf
deleted file mode 100644
index ccdfff1..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-BoldItalic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-BoldItalic.ttf
deleted file mode 100644
index 2091671..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-BoldItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Italic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Italic.ttf
deleted file mode 100644
index 67103b6..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Regular.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Regular.ttf
deleted file mode 100644
index 8610b5b..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Bold.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Bold.ttf
deleted file mode 100644
index 303c6cf..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-BoldItalic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-BoldItalic.ttf
deleted file mode 100644
index 71f2427..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-BoldItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Italic.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Italic.ttf
deleted file mode 100644
index 5e1885e..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Regular.ttf b/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Regular.ttf
deleted file mode 100644
index 2ef511d..0000000
--- a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/AnonymicePro/OFL.txt b/home-config/fonts/AnonymicePro/OFL.txt
deleted file mode 100644
index 68d1d00..0000000
--- a/home-config/fonts/AnonymicePro/OFL.txt
+++ /dev/null
@@ -1,94 +0,0 @@
1Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com),
2with Reserved Font Name Anonymous Pro.
3
4This Font Software is licensed under the SIL Open Font License, Version 1.1.
5This license is copied below, and is also available with a FAQ at:
6http://scripts.sil.org/OFL
7
8
9-----------------------------------------------------------
10SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
11-----------------------------------------------------------
12
13PREAMBLE
14The goals of the Open Font License (OFL) are to stimulate worldwide
15development of collaborative font projects, to support the font creation
16efforts of academic and linguistic communities, and to provide a free and
17open framework in which fonts may be shared and improved in partnership
18with others.
19
20The OFL allows the licensed fonts to be used, studied, modified and
21redistributed freely as long as they are not sold by themselves. The
22fonts, including any derivative works, can be bundled, embedded,
23redistributed and/or sold with any software provided that any reserved
24names are not used by derivative works. The fonts and derivatives,
25however, cannot be released under any other type of license. The
26requirement for fonts to remain under this license does not apply
27to any document created using the fonts or their derivatives.
28
29DEFINITIONS
30"Font Software" refers to the set of files released by the Copyright
31Holder(s) under this license and clearly marked as such. This may
32include source files, build scripts and documentation.
33
34"Reserved Font Name" refers to any names specified as such after the
35copyright statement(s).
36
37"Original Version" refers to the collection of Font Software components as
38distributed by the Copyright Holder(s).
39
40"Modified Version" refers to any derivative made by adding to, deleting,
41or substituting -- in part or in whole -- any of the components of the
42Original Version, by changing formats or by porting the Font Software to a
43new environment.
44
45"Author" refers to any designer, engineer, programmer, technical
46writer or other person who contributed to the Font Software.
47
48PERMISSION & CONDITIONS
49Permission is hereby granted, free of charge, to any person obtaining
50a copy of the Font Software, to use, study, copy, merge, embed, modify,
51redistribute, and sell modified and unmodified copies of the Font
52Software, subject to the following conditions:
53
541) Neither the Font Software nor any of its individual components,
55in Original or Modified Versions, may be sold by itself.
56
572) Original or Modified Versions of the Font Software may be bundled,
58redistributed and/or sold with any software, provided that each copy
59contains the above copyright notice and this license. These can be
60included either as stand-alone text files, human-readable headers or
61in the appropriate machine-readable metadata fields within text or
62binary files as long as those fields can be easily viewed by the user.
63
643) No Modified Version of the Font Software may use the Reserved Font
65Name(s) unless explicit written permission is granted by the corresponding
66Copyright Holder. This restriction only applies to the primary font name as
67presented to the users.
68
694) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
70Software shall not be used to promote, endorse or advertise any
71Modified Version, except to acknowledge the contribution(s) of the
72Copyright Holder(s) and the Author(s) or with their explicit written
73permission.
74
755) The Font Software, modified or unmodified, in part or in whole,
76must be distributed entirely under this license, and must not be
77distributed under any other license. The requirement for fonts to
78remain under this license does not apply to any document created
79using the Font Software.
80
81TERMINATION
82This license becomes null and void if any of the above conditions are
83not met.
84
85DISCLAIMER
86THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
87EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
88MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
89OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
90COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
91INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
92DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
93FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
94OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/home-config/fonts/AnonymicePro/readme.md b/home-config/fonts/AnonymicePro/readme.md
deleted file mode 100644
index 9f2e700..0000000
--- a/home-config/fonts/AnonymicePro/readme.md
+++ /dev/null
@@ -1,8 +0,0 @@
1
2# Nerd Fonts
3
4This is an archived font from a Nerd Fonts release.
5
6For more information see:
7* https://github.com/ryanoasis/nerd-fonts/
8* https://github.com/ryanoasis/nerd-fonts/releases/latest/
diff --git a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index 73fdee5..0000000
--- a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttf
deleted file mode 100644
index 08fa68f..0000000
--- a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index 9bebcda..0000000
--- a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttf
deleted file mode 100644
index 2be7265..0000000
--- a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index 5a096ab..0000000
--- a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttf
deleted file mode 100644
index e962f63..0000000
--- a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index 4121a0f..0000000
--- a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttf
deleted file mode 100644
index c481973..0000000
--- a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index 0cad1c9..0000000
--- a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttf
deleted file mode 100644
index 399b713..0000000
--- a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index a4bb8f4..0000000
--- a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttf
deleted file mode 100644
index 5d05cec..0000000
--- a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index 83e3f02..0000000
--- a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttf
deleted file mode 100644
index e237398..0000000
--- a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index 807b5a8..0000000
--- a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttf
deleted file mode 100644
index 0d48c23..0000000
--- a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index 7394fcf..0000000
--- a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttf
deleted file mode 100644
index fb042d6..0000000
--- a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index 1039298..0000000
--- a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttf
deleted file mode 100644
index 6b9dd2c..0000000
--- a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttf
deleted file mode 100644
index b272520..0000000
--- a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttf b/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttf
deleted file mode 100644
index 9521c6f..0000000
--- a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttf b/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttf
deleted file mode 100644
index 0707a13..0000000
--- a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttf b/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttf
deleted file mode 100644
index a147dac..0000000
--- a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-Bold.ttf b/home-config/fonts/Lilex/LilexNerdFont-Bold.ttf
deleted file mode 100644
index 17e96ee..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttf b/home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttf
deleted file mode 100644
index 8facc07..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttf b/home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttf
deleted file mode 100644
index a724e13..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-Medium.ttf b/home-config/fonts/Lilex/LilexNerdFont-Medium.ttf
deleted file mode 100644
index 0ed3ae9..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-Medium.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-Regular.ttf b/home-config/fonts/Lilex/LilexNerdFont-Regular.ttf
deleted file mode 100644
index 4a11634..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFont-Thin.ttf b/home-config/fonts/Lilex/LilexNerdFont-Thin.ttf
deleted file mode 100644
index 01259b3..0000000
--- a/home-config/fonts/Lilex/LilexNerdFont-Thin.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttf
deleted file mode 100644
index c80849d..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttf
deleted file mode 100644
index e869852..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttf
deleted file mode 100644
index 92a05bd..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttf
deleted file mode 100644
index 1f307b8..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttf
deleted file mode 100644
index 137d8f8..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttf b/home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttf
deleted file mode 100644
index 816470a..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttf
deleted file mode 100644
index b6f3f50..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttf
deleted file mode 100644
index dce2ad5..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttf
deleted file mode 100644
index 921c748..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttf
deleted file mode 100644
index 76c13ef..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttf
deleted file mode 100644
index 4785f1e..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttf b/home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttf
deleted file mode 100644
index 2f1c77e..0000000
--- a/home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttf b/home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttf
deleted file mode 100644
index f27b5a2..0000000
--- a/home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttf b/home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttf
deleted file mode 100644
index d5c8db0..0000000
--- a/home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttf b/home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttf
deleted file mode 100644
index baf799e..0000000
--- a/home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/LICENSE.txt b/home-config/fonts/MonofurNerdFont/LICENSE.txt
deleted file mode 100644
index b20cf9b..0000000
--- a/home-config/fonts/MonofurNerdFont/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
1------------------------------------------------------------------------
2The monofur typeface by tobias b koehler (unci@tigerden.com)
3------------------------------------------------------------------------
4
5This is a monospaced geometric rounded sans serif font based on the
6eurofurence typeface family.
7
8The character set includes Roman, Greek and Cyrillic characters as well
9as box drawing characters. File format is TrueType for PC (under
10Windows, Linux etc).
11
12These fonts are freeware and can be distributed as long as they are
13together with this text file. I would appreciate it though if you could
14contact me at unci@tigerden.com if you put them on a server. Free
15samples from commercial users are always very welcome. :)
16
17For more information, please see the uncifonts WWW page at:
18http://mercurio.iet.unipi.it/users/tobias/uncifonts.html
19
20Have fun! tobias b koehler, 2000-04-02 \ No newline at end of file
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Bold.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Bold.ttf
deleted file mode 100644
index a7f5a8f..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Italic.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Italic.ttf
deleted file mode 100644
index 4ae48d3..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Regular.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Regular.ttf
deleted file mode 100644
index bfce77f..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Bold.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Bold.ttf
deleted file mode 100644
index 459891e..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Italic.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Italic.ttf
deleted file mode 100644
index 75e7ed9..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Regular.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Regular.ttf
deleted file mode 100644
index f69999c..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Bold.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Bold.ttf
deleted file mode 100644
index 7b3a405..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Italic.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Italic.ttf
deleted file mode 100644
index a639973..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Regular.ttf b/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Regular.ttf
deleted file mode 100644
index f02fd35..0000000
--- a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/home-config/fonts/MonofurNerdFont/readme.md b/home-config/fonts/MonofurNerdFont/readme.md
deleted file mode 100644
index 9f2e700..0000000
--- a/home-config/fonts/MonofurNerdFont/readme.md
+++ /dev/null
@@ -1,8 +0,0 @@
1
2# Nerd Fonts
3
4This is an archived font from a Nerd Fonts release.
5
6For more information see:
7* https://github.com/ryanoasis/nerd-fonts/
8* https://github.com/ryanoasis/nerd-fonts/releases/latest/
diff --git a/home-config/foot/foot.ini b/home-config/foot/foot.ini
deleted file mode 100644
index 50cb3fa..0000000
--- a/home-config/foot/foot.ini
+++ /dev/null
@@ -1,7 +0,0 @@
1font=Lilex Nerd Font Mono:size=14,FiraCode Nerd Font Mono:size=14
2
3[desktop-notifications]
4command=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
5
6[colors-dark]
7alpha=0.75
diff --git a/home-config/gnupg/gpg-agent.conf b/home-config/gnupg/gpg-agent.conf
deleted file mode 100644
index 53927ac..0000000
--- a/home-config/gnupg/gpg-agent.conf
+++ /dev/null
@@ -1,3 +0,0 @@
1enable-ssh-support
2
3pinentry-program /run/current-system/profile/bin/pinentry
diff --git a/home-config/gnupg/sshcontrol b/home-config/gnupg/sshcontrol
deleted file mode 100644
index 55e6073..0000000
--- a/home-config/gnupg/sshcontrol
+++ /dev/null
@@ -1,10 +0,0 @@
1# List of allowed ssh keys. Only keys present in this file are used
2# in the SSH protocol. The ssh-add tool may add new entries to this
3# file to enable them; you may also add them manually. Comment
4# lines, like this one, as well as empty lines are ignored. Lines do
5# have a certain length limit but this is not serious limitation as
6# the format of the entries is fixed and checked by gpg-agent. A
7# non-comment line starts with optional white spaces, followed by the
8# keygrip of the key given as 40 hex digits, optionally followed by a
9# caching TTL in seconds, and another optional field for arbitrary
10# flags. Prepend the keygrip with an '!' mark to disable it.
diff --git a/home-config/hypr/Wallpapers/static/1685362396481634.jpg b/home-config/hypr/Wallpapers/static/1685362396481634.jpg
deleted file mode 100644
index fd49cae..0000000
--- a/home-config/hypr/Wallpapers/static/1685362396481634.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1693169418078790.jpg b/home-config/hypr/Wallpapers/static/1693169418078790.jpg
deleted file mode 100644
index 8156108..0000000
--- a/home-config/hypr/Wallpapers/static/1693169418078790.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1694792956043641.jpg b/home-config/hypr/Wallpapers/static/1694792956043641.jpg
deleted file mode 100644
index 431e96b..0000000
--- a/home-config/hypr/Wallpapers/static/1694792956043641.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1708470532817406.jpg b/home-config/hypr/Wallpapers/static/1708470532817406.jpg
deleted file mode 100644
index 4a4f2f0..0000000
--- a/home-config/hypr/Wallpapers/static/1708470532817406.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1720750738377603.jpg b/home-config/hypr/Wallpapers/static/1720750738377603.jpg
deleted file mode 100644
index f8dd9cd..0000000
--- a/home-config/hypr/Wallpapers/static/1720750738377603.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1720751011150282.png b/home-config/hypr/Wallpapers/static/1720751011150282.png
deleted file mode 100644
index dbd3e38..0000000
--- a/home-config/hypr/Wallpapers/static/1720751011150282.png
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1723625710776950.jpg b/home-config/hypr/Wallpapers/static/1723625710776950.jpg
deleted file mode 100644
index 71608ff..0000000
--- a/home-config/hypr/Wallpapers/static/1723625710776950.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1723626275390685.jpg b/home-config/hypr/Wallpapers/static/1723626275390685.jpg
deleted file mode 100644
index aa8c8c2..0000000
--- a/home-config/hypr/Wallpapers/static/1723626275390685.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/1728661127589872.jpg b/home-config/hypr/Wallpapers/static/1728661127589872.jpg
deleted file mode 100644
index b5dcbeb..0000000
--- a/home-config/hypr/Wallpapers/static/1728661127589872.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpeg b/home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpeg
deleted file mode 100644
index 0ef50ad..0000000
--- a/home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpeg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpg b/home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpg
deleted file mode 100644
index 3bb615e..0000000
--- a/home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpg b/home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpg
deleted file mode 100644
index 15aff05..0000000
--- a/home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/CN62QXJ.jpg b/home-config/hypr/Wallpapers/static/CN62QXJ.jpg
deleted file mode 100644
index c49c449..0000000
--- a/home-config/hypr/Wallpapers/static/CN62QXJ.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/above-clouds.jpg b/home-config/hypr/Wallpapers/static/above-clouds.jpg
deleted file mode 100644
index a525ee8..0000000
--- a/home-config/hypr/Wallpapers/static/above-clouds.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpg
deleted file mode 100644
index ade3472..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpg
deleted file mode 100644
index a01b60b..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-cave-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-cave-1k.jpg
deleted file mode 100644
index 048b4c1..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-cave-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpg
deleted file mode 100644
index 853ff56..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpg
deleted file mode 100644
index 5152b02..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-cosmo-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-cosmo-1k.jpg
deleted file mode 100644
index 78f50a9..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-cosmo-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-downtown-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-downtown-1k.jpg
deleted file mode 100644
index 870813b..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-downtown-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpg
deleted file mode 100644
index 3931833..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpg
deleted file mode 100644
index acf008e..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-end-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-end-1k.jpg
deleted file mode 100644
index 5b8d249..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-end-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpg
deleted file mode 100644
index f8a50f8..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-kosmos19001.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-kosmos19001.jpg
deleted file mode 100644
index e3ce36a..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-kosmos19001.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpg
deleted file mode 100644
index 00cbcb1..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpg
deleted file mode 100644
index b3038ec..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpg
deleted file mode 100644
index 73688eb..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpg
deleted file mode 100644
index 7448ab1..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpg
deleted file mode 100644
index 816a884..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-orangemoon1900p.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-orangemoon1900p.jpg
deleted file mode 100644
index 08e56c0..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-orangemoon1900p.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpg
deleted file mode 100644
index 24311ff..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpg
deleted file mode 100644
index 49ab145..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpg
deleted file mode 100644
index 7164548..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpg
deleted file mode 100644
index 84b9739..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpg
deleted file mode 100644
index cb71169..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-tl-002-1k.png b/home-config/hypr/Wallpapers/static/alena-aenami-tl-002-1k.png
deleted file mode 100644
index b6f450f..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-tl-002-1k.png
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-wait.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-wait.jpg
deleted file mode 100644
index 2dc72ac..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-wait.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpg
deleted file mode 100644
index 89b1378..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/alena-aenami-you-1k-2.jpg b/home-config/hypr/Wallpapers/static/alena-aenami-you-1k-2.jpg
deleted file mode 100644
index 5057667..0000000
--- a/home-config/hypr/Wallpapers/static/alena-aenami-you-1k-2.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/autumn1.jpg b/home-config/hypr/Wallpapers/static/autumn1.jpg
deleted file mode 100644
index 1f06edd..0000000
--- a/home-config/hypr/Wallpapers/static/autumn1.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/autumn1.png b/home-config/hypr/Wallpapers/static/autumn1.png
deleted file mode 100644
index 72cac31..0000000
--- a/home-config/hypr/Wallpapers/static/autumn1.png
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpg b/home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpg
deleted file mode 100644
index c678fec..0000000
--- a/home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/lake-winter.jpg b/home-config/hypr/Wallpapers/static/lake-winter.jpg
deleted file mode 100644
index b47a8c9..0000000
--- a/home-config/hypr/Wallpapers/static/lake-winter.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/mountains.jpg b/home-config/hypr/Wallpapers/static/mountains.jpg
deleted file mode 100644
index f51a09b..0000000
--- a/home-config/hypr/Wallpapers/static/mountains.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/northern-lights-2.jpg b/home-config/hypr/Wallpapers/static/northern-lights-2.jpg
deleted file mode 100644
index cb2a7f4..0000000
--- a/home-config/hypr/Wallpapers/static/northern-lights-2.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/northern-lights-bridge.jpg b/home-config/hypr/Wallpapers/static/northern-lights-bridge.jpg
deleted file mode 100644
index 8fa7b28..0000000
--- a/home-config/hypr/Wallpapers/static/northern-lights-bridge.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/ooglygoo.png b/home-config/hypr/Wallpapers/static/ooglygoo.png
deleted file mode 100644
index f3503ca..0000000
--- a/home-config/hypr/Wallpapers/static/ooglygoo.png
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/purple-grass.jpg b/home-config/hypr/Wallpapers/static/purple-grass.jpg
deleted file mode 100644
index 2a81c54..0000000
--- a/home-config/hypr/Wallpapers/static/purple-grass.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/purple-intersection.jpg b/home-config/hypr/Wallpapers/static/purple-intersection.jpg
deleted file mode 100644
index cf75de4..0000000
--- a/home-config/hypr/Wallpapers/static/purple-intersection.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/purple-lakescape.jpg b/home-config/hypr/Wallpapers/static/purple-lakescape.jpg
deleted file mode 100644
index 23d28e2..0000000
--- a/home-config/hypr/Wallpapers/static/purple-lakescape.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpg b/home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpg
deleted file mode 100644
index a21261b..0000000
--- a/home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/scarecrow.jpg b/home-config/hypr/Wallpapers/static/scarecrow.jpg
deleted file mode 100644
index f095d15..0000000
--- a/home-config/hypr/Wallpapers/static/scarecrow.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/snow-1.jpg b/home-config/hypr/Wallpapers/static/snow-1.jpg
deleted file mode 100644
index d00fcd1..0000000
--- a/home-config/hypr/Wallpapers/static/snow-1.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/snow-2.jpg b/home-config/hypr/Wallpapers/static/snow-2.jpg
deleted file mode 100644
index 5343822..0000000
--- a/home-config/hypr/Wallpapers/static/snow-2.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/vfcfyfyehhi31.png b/home-config/hypr/Wallpapers/static/vfcfyfyehhi31.png
deleted file mode 100644
index adb7f37..0000000
--- a/home-config/hypr/Wallpapers/static/vfcfyfyehhi31.png
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpg b/home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpg
deleted file mode 100644
index e59d184..0000000
--- a/home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpg
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/family_guy.mp4 b/home-config/hypr/family_guy.mp4
deleted file mode 100644
index 077fe49..0000000
--- a/home-config/hypr/family_guy.mp4
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/hypridle.conf b/home-config/hypr/hypridle.conf
deleted file mode 100644
index 72688da..0000000
--- a/home-config/hypr/hypridle.conf
+++ /dev/null
@@ -1,16 +0,0 @@
1general {
2 lock_cmd = pidof hyprlock || hyprlock
3 before_sleep_cmd = loginctl lock-session
4 after_sleep_cmd = hyprctl dispatch dpms on
5}
6
7listener {
8 timeout = 300
9 on-timeout = loginctl lock-session
10}
11
12listener {
13 timeout = 600
14 on-timeout = hyprctl dispatch dpms off
15 on-resume = hyprctl dispatch dpms on
16}
diff --git a/home-config/hypr/hyprland.conf b/home-config/hypr/hyprland.conf
deleted file mode 100644
index f45c907..0000000
--- a/home-config/hypr/hyprland.conf
+++ /dev/null
@@ -1,332 +0,0 @@
1exec-once = dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=Hyprland
2
3#
4# Please note not all available settings / options are set here.
5# For a full list, see the wiki
6#
7
8# See https://wiki.hyprland.org/Configuring/Monitors/
9monitor=,preferred,auto,1
10
11# Set cursor theme
12env = HYPRCURSOR_THEME,Bibata-Modern-Classic-Hyprland
13env = HYPRCURSOR_SIZE,24
14env = XCURSOR_THEME,Bibata-Modern-daed9-v1.0.2-x11
15env = XCURSOR_SIZE,24
16
17env = AQ_NO_MODIFIERS,1
18
19render {
20 expand_undersized_textures = false
21}
22
23ecosystem {
24 no_update_news = true
25}
26
27
28# See https://wiki.hyprland.org/Configuring/Keywords/ for more
29
30# Execute your favorite apps at launch
31# exec-once = waybar & hyprpaper & firefox
32
33# Source a file (multi-file configs)
34source = ~/.config/hypr/monitors.conf
35
36# Some default env vars.
37env = XCURSOR_SIZE,24
38
39debug {
40 disable_logs = false
41 enable_stdout_logs = true
42}
43
44# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
45input {
46 kb_layout = us
47 kb_variant =
48 kb_model =
49 kb_options =
50 kb_rules =
51 numlock_by_default = true
52
53 follow_mouse = 1
54
55 touchpad {
56 natural_scroll = no
57 middle_button_emulation = true
58 clickfinger_behavior = true
59 }
60
61 sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
62}
63
64general {
65 # See https://wiki.hyprland.org/Configuring/Variables/ for more
66
67 gaps_in = 5
68 gaps_out = 10
69 border_size = 2
70 col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
71 col.inactive_border = rgba(595959aa)
72
73 layout = dwindle
74}
75
76decoration {
77 # See https://wiki.hyprland.org/Configuring/Variables/ for more
78
79 rounding = 5
80 blur {
81 enabled = yes
82 size = 3
83 passes = 1
84 new_optimizations = on
85 }
86
87 shadow {
88 enabled = true
89 range = 4
90 render_power = 3
91 color = rgba(1a1a1aee)
92 }
93}
94
95animations {
96 enabled = yes
97
98 # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
99
100 bezier = myBezier, 0.05, 0.9, 0.1, 1.05
101
102 animation = windows, 1, 7, myBezier
103 animation = windowsOut, 1, 7, default, popin 80%
104 animation = border, 1, 10, default
105 animation = borderangle, 1, 8, default
106 animation = fade, 1, 7, default
107 animation = workspaces, 1, 6, default
108}
109
110dwindle {
111 # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
112 pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
113 preserve_split = yes # you probably want this
114}
115
116#master {
117# # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
118# new_is_master = true
119#}
120
121# Example per-device config
122# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
123device {
124 name = epic-mouse-v1
125 sensitivity = -0.5
126}
127
128# Example windowrule v1
129# windowrule = float, ^(kitty)$
130# Example windowrule v2
131# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
132# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
133
134
135# See https://wiki.hyprland.org/Configuring/Keywords/ for more
136$mainMod = SUPER
137
138# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
139bind = $mainMod, Return, exec, foot
140bind = $mainMod CTRL, Return, exec, foot -a float-foot
141bind = $mainMod SHIFT, Q, killactive
142bind = $mainMod SHIFT, E, exit
143bind = $mainMod SHIFT, Space, togglefloating
144bind = $mainMod SHIFT, Return, pin, active
145bind = $mainMod, D, exec, fuzzel --width=35 --font='Hack:weight=bold:size=12' --background-color='282a36fa' --selection-color='3d4460fa' --line-height=20 --border-radius=20
146bind = $mainMod, P, pseudo, # dwindle
147bind = $mainMod, J, togglesplit, # dwindle
148bind = $mainMod, F, fullscreen, 1
149bind = $mainMod SHIFT, F, fullscreen
150bind = ,XF86MonBrightnessUp, exec, light -A 10
151bind = ,XF86MonBrightnessDown, exec, light -U 10
152bind = ,XF86AudioRaiseVolume, exec, pamixer -i 5
153bind = ,XF86AudioLowerVolume, exec, pamixer -d 5
154bind = ,XF86AudioMute, exec, pamixer -t
155bind = ,XF86AudioPlay, exec, playerctl play-pause
156bind = ,XF86AudioPause, exec, playerctl play-pause
157bind = ,XF86AudioNext, exec, playerctl next
158bind = ,XF86AudioPrev, exec, playerctl previous
159bind = ,XF86AudioStop, exec, playerctl stop
160
161# "Auto-connect headphones"
162bind = $mainMod, H, exec, bluetoothctl connect AC:80:0A:1C:D6:C7
163
164# Move workspace between monitors
165bind = $mainMod CTRL SHIFT, left, movecurrentworkspacetomonitor, l
166bind = $mainMod CTRL SHIFT, right, movecurrentworkspacetomonitor, r
167bind = $mainMod CTRL SHIFT, up, movecurrentworkspacetomonitor, u
168bind = $mainMod CTRL SHIFT, down, movecurrentworkspacetomonitor, d
169
170# Move focus with mainMod + arrow keys
171bind = $mainMod, left, movefocus, l
172bind = $mainMod, right, movefocus, r
173bind = $mainMod, up, movefocus, u
174bind = $mainMod, down, movefocus, d
175
176# Move window with mainMod + SHIFT + arrow keys
177bind = $mainMod SHIFT, left, movewindow, l
178bind = $mainMod SHIFT, right, movewindow, r
179bind = $mainMod SHIFT, up, movewindow, u
180bind = $mainMod SHIFT, down, movewindow, d
181
182# Switch workspaces with mainMod + [0-9]
183bind = $mainMod, 1, workspace, 1
184bind = $mainMod, 2, workspace, 2
185bind = $mainMod, 3, workspace, 3
186bind = $mainMod, 4, workspace, 4
187bind = $mainMod, 5, workspace, 5
188bind = $mainMod, 6, workspace, 6
189bind = $mainMod, 7, workspace, 7
190bind = $mainMod, 8, workspace, 8
191bind = $mainMod, 9, workspace, 9
192bind = $mainMod, 0, workspace, 10
193
194# Move active window to a workspace with mainMod + SHIFT + [0-9]
195bind = $mainMod SHIFT, 1, movetoworkspace, 1
196bind = $mainMod SHIFT, 2, movetoworkspace, 2
197bind = $mainMod SHIFT, 3, movetoworkspace, 3
198bind = $mainMod SHIFT, 4, movetoworkspace, 4
199bind = $mainMod SHIFT, 5, movetoworkspace, 5
200bind = $mainMod SHIFT, 6, movetoworkspace, 6
201bind = $mainMod SHIFT, 7, movetoworkspace, 7
202bind = $mainMod SHIFT, 8, movetoworkspace, 8
203bind = $mainMod SHIFT, 9, movetoworkspace, 9
204bind = $mainMod SHIFT, 0, movetoworkspace, 10
205
206# Scroll through existing workspaces with mainMod + scroll
207bind = $mainMod, mouse_down, workspace, e+1
208bind = $mainMod, mouse_up, workspace, e-1
209
210# Move/resize windows with mainMod + LMB/RMB and dragging
211bindm = $mainMod, mouse:272, movewindow
212bindm = $mainMod, mouse:273, resizewindow
213
214# Bind mainMod + L to screenlocker
215bind = $mainMod, L, exec, hyprlock
216bind = $mainMod SHIFT, L, exec, loginctl suspend
217
218# Keybind to toggle "performance mode" (toggles GPU intensive things)
219bind = $mainMod, F1, exec, ~/.config/hypr/scripts/perf_mode.sh
220
221bind = $mainMod SHIFT, Z, exec, pypr zoom
222
223# Keybind for screenshot (satty)
224bind = $mainMod SHIFT, S, exec, grimblast save output - | satty --fullscreen --copy-command 'wl-copy' --filename -
225bind = $mainMod, S, exec, grimblast copy area
226bind = $mainMod, Print, exec, export TEMP=$(mktemp) && grimblast copy area && wl-paste > $TEMP && imv $TEMP && rm $TEMP
227
228# Keybind for screenshot (old)
229# bind = $mainMod SHIFT, S, exec, grimblast copy area
230# bind = $mainMod SHIFT, Print, exec, grimblast edit area
231# bind = $mainMod, S, exec, imv <(grimblast save area -)
232
233# Keybind for screenshot (flameshot)
234#bind = $mainMod SHIFT, S, exec, flameshot gui --raw | wl-copy
235#bind = $mainMod SHIFT CTRL, S, exec, flameshot gui --raw -d $(( 1000 * $(fuzzel -l0 --dmenu -p"Delay> ") )) | wl-copy
236#bind = $mainMod, S, exec, flameshot gui
237
238# Notifications keybinds
239bind = $mainMod, N, exec, makoctl dismiss
240bind = $mainMod SHIFT, N, exec, makoctl dismiss -a
241
242# Color picker
243bind = $mainMod SHIFT, C, exec, hyprpicker -a
244
245# LinkedIn Joke (very serious)
246bind = $mainMod SHIFT CTRL ALT, L, exec, xdg-open https://linkedin.com
247
248# Window Rules
249
250# Firefox PiP
251windowrulev2 = float, class:^(zen-beta)$, title:^(Picture-in-Picture)$
252windowrulev2 = pin, class:^(zen-beta)$, title:^(Picture-in-Picture)$
253windowrulev2 = size 22% 22%, class:^(zen-beta)$, title:^(Picture-in-Picture)$
254windowrulev2 = move 76% 8%, class:^(zen-beta)$, title:^(Picture-in-Picture)$
255
256# Firefox Sharing Indicator
257windowrulev2 = float, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
258windowrulev2 = size 56 31, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
259windowrulev2 = move 50% 0, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
260windowrulev2 = suppressevent fullscreen maximize, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
261
262# Weather
263windowrulev2 = float,class:^(ala-wttr)$
264windowrulev2 = size 822 1026, class:^(ala-wttr)$
265
266# Floating terminal
267windowrulev2 = float,class:^(float-foot)$
268windowrulev2 = size 930 680,class:^(float-foot)$
269windowrulev2 = center,class:^(float-foot)$
270
271# Change color of pinned windows
272windowrulev2 = bordercolor rgba(bf0000ee) rgba(ab00adee) 45deg,pinned:1
273
274# Fun Keybinds
275# Subway surfer
276bind = $mainMod CTRL SHIFT, S, exec, mpv ~/.config/hypr/subwaysurfer.webm
277windowrulev2 = float,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
278windowrulev2 = size 310 554,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
279windowrulev2 = move 81% 46% ,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
280windowrulev2 = pin,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
281
282# Family guy funny moments
283bind = $mainMod CTRL SHIFT, F, exec, mpv ~/.config/hypr/family_guy.mp4
284windowrulev2 = float,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
285windowrulev2 = size 595 336,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
286windowrulev2 = move 67% 5% ,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
287windowrulev2 = pin,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
288
289# Satty windowrules
290windowrulev2 = fullscreen,class:^(com.gabm.satty)$
291
292exec-once = ~/.config/hypr/scripts/autostart.sh
293
294misc {
295 disable_hyprland_logo = true
296 force_default_wallpaper = 0
297}
298
299# Cursors!
300plugin:dynamic-cursors {
301 enabled = true
302 mode = tilt
303 threshold = 2
304 tilt {
305 limit = 5000
306 function = negative_quadratic
307 }
308
309 shake {
310 enabled = true
311 nearest = true
312 threshold = 6.0
313 base = 4.0
314 speed = 4.0
315 influence = 0.0
316
317 limit = 0.0
318
319 timeout = 2000
320
321 effects = true
322
323 ipc = false
324 }
325
326 hyprcursor {
327 nearest = true
328 enabled = true
329 resolution = -1
330 fallback = clientside
331 }
332}
diff --git a/home-config/hypr/hyprlock.conf b/home-config/hypr/hyprlock.conf
deleted file mode 100644
index 5c63fad..0000000
--- a/home-config/hypr/hyprlock.conf
+++ /dev/null
@@ -1,57 +0,0 @@
1background {
2 monitor =
3 #path = /home/ryan/.config/hypr/Wallpapers/static/autumn1.png
4 path = screenshot
5
6 # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
7 blur_passes = 2 # 0 disables blurring
8 blur_size = 7
9 noise = 0.2
10 contrast = 0.8916
11 brightness = 0.8172
12 vibrancy = 0.1696
13 vibrancy_darkness = 0.0
14}
15
16input-field {
17 monitor =
18 size = 200, 50
19 outline_thickness = 3
20 dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
21 dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
22 dots_center = false
23 dots_rounding = -1 # -1 default circle, -2 follow input-field rounding
24 outer_color = rgb(151515)
25 inner_color = rgb(200, 200, 200)
26 font_color = rgb(10, 10, 10)
27 fade_on_empty = true
28 fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered.
29 placeholder_text = <i>Input Password...</i> # Text rendered in the input box when it's empty.
30 hide_input = false
31 rounding = -1 # -1 means complete rounding (circle/oval)
32 check_color = rgb(204, 136, 34)
33 fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color
34 fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i> # can be set to empty
35 fail_timeout = 2000 # milliseconds before fail_text and fail_color disappears
36 fail_transition = 300 # transition time in ms between normal outer_color and fail_color
37 capslock_color = -1
38 numlock_color = -1
39 bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above)
40 invert_numlock = false # change color if numlock is off
41 swap_font_color = false # see below
42
43 position = 0, -20
44 halign = center
45 valign = center
46}
47
48label {
49 monitor =
50 text = cmd[update:1000] echo "$(date +"%-H:%M:%S")"
51 #color = rgba(255, 255, 255, 0.6)
52 font_size = 80
53 position = 0, 300
54 halign = center
55 valign = center
56 font_family = Lilex Nerd Font
57}
diff --git a/home-config/hypr/kanshi.conf b/home-config/hypr/kanshi.conf
deleted file mode 100644
index 52c3c0f..0000000
--- a/home-config/hypr/kanshi.conf
+++ /dev/null
@@ -1,22 +0,0 @@
1profile {
2 output "AU Optronics 0x103D Unknown" enable
3}
4
5profile emilydesk {
6 output "AU Optronics 0x103D Unknown" disable
7 output "Dell Inc. DELL U2422H JN4SF83" position 0,0 mode 1920x1080
8 output "Dell Inc. DELL U2414H R9F1P5C59WDL" position 1920,0 mode 1920x1080
9 output "Dell Inc. DELL U2422H 5S9SF83" position 3840,0 mode 1920x1080
10}
11
12profile justindesk {
13 output "AU Optronics 0x103D Unknown" position 0,0 mode 1920x1080
14 output "Dell Inc. DELL U2417H XVNNT7CDC80L" position 1920,0 mode 1920x1080
15 output "Dell Inc. DELL U2417H XVNNT82M978L" position 3840,0 mode 1920x1080
16}
17
18profile homedesk {
19 output "AU Optronics 0x103D Unknown" disable
20 output "Samsung Electric Company C27F390 H1AK500000" position 0,0 mode 1920x1080
21 output "Samsung Electric Company S22R35x H4TNA01683" position 1920,0 mode 1920x1080
22}
diff --git a/home-config/hypr/monitors.conf b/home-config/hypr/monitors.conf
deleted file mode 100644
index 7b3b503..0000000
--- a/home-config/hypr/monitors.conf
+++ /dev/null
@@ -1,2 +0,0 @@
1monitor=eDP-1,1920x1080, 0x0, 1
2monitor=HDMI-A-1,1920x1080, 1920x0, 1
diff --git a/home-config/hypr/pyprland.toml b/home-config/hypr/pyprland.toml
deleted file mode 100644
index cd081fe..0000000
--- a/home-config/hypr/pyprland.toml
+++ /dev/null
@@ -1,5 +0,0 @@
1[pyprland]
2plugins = ["magnify"]
3
4[magnify]
5factor = 2.5
diff --git a/home-config/hypr/scripts/autostart.sh b/home-config/hypr/scripts/autostart.sh
deleted file mode 100755
index 706f82f..0000000
--- a/home-config/hypr/scripts/autostart.sh
+++ /dev/null
@@ -1,40 +0,0 @@
1#!/usr/bin/env bash
2
3waybar &
4
5mako &
6
7#swaybg -i ~/.config/hypr/Wallpapers/above-clouds.jpg &
8
9nice -n13 swww init &
10
11#~/.config/hypr/wallpaper-daemon.sh &
12wpaperd -d &
13
14pypr &
15
16#swayidle -w timeout 300 'swaylock --screenshots --clock --indicator --grace 3 --fade-in 1 --effect-blur 7x5 --effect-greyscale' timeout 600 'hyprctl dispatch dpms off' resume 'hyprctl dispatch dpms on' before-sleep 'swaylock -f -c 000000' &
17
18hypridle &
19
20syncthing serve --no-browser &
21
22# Kill any orphans of this
23killall wl-clip-persist
24wl-clip-persist -c regular --reconnect-tries 5 &
25
26kanshi -c ~/.config/hypr/kanshi.conf &
27
28# Start the portals
29
30sleep 0.5
31killall -e xdg-desktop-portal-hyprland
32killall xdg-desktop-portal-gtk
33killall xdk-desktop-portal
34
35~/.nix-profile/libexec/xdg-desktop-portal-hyprland &
36~/.nix-profile/libexec/xdg-desktop-portal-gtk &
37sleep 2
38XDG_DESKTOP_PORTAL_DIR="/home/ryan/.nix-profile/share/xdg-desktop-portal/portals" ~/.nix-profile/libexec/xdg-desktop-portal &
39
40#flameshot &
diff --git a/home-config/hypr/scripts/perf_mode.sh b/home-config/hypr/scripts/perf_mode.sh
deleted file mode 100755
index c195688..0000000
--- a/home-config/hypr/scripts/perf_mode.sh
+++ /dev/null
@@ -1,14 +0,0 @@
1#!/usr/bin/env bash
2HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
3if [ "$HYPRGAMEMODE" = 1 ] ; then
4 hyprctl --batch "\
5 keyword animations:enabled 0;\
6 keyword decoration:drop_shadow 0;\
7 keyword decoration:blur:enabled 0;\
8 keyword general:gaps_in 0;\
9 keyword general:gaps_out 0;\
10 keyword general:border_size 1;\
11 keyword decoration:rounding 0"
12 exit
13fi
14hyprctl reload
diff --git a/home-config/hypr/subwaysurfer.webm b/home-config/hypr/subwaysurfer.webm
deleted file mode 100644
index 594e1c0..0000000
--- a/home-config/hypr/subwaysurfer.webm
+++ /dev/null
Binary files differ
diff --git a/home-config/hypr/wallpaper-daemon-animated-old.sh b/home-config/hypr/wallpaper-daemon-animated-old.sh
deleted file mode 100755
index 39b2aae..0000000
--- a/home-config/hypr/wallpaper-daemon-animated-old.sh
+++ /dev/null
@@ -1,106 +0,0 @@
1#!/usr/bin/env bash
2
3# Script initialization
4# Check if animated wallpapers exist, set env var if so
5# Sleep for swww init to finish
6sleep 3
7script_init() {
8 if [ `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | wc -l` -gt 0 ]; then
9 echo "true" > /tmp/$USER-desktop-anim
10 ANIM_READY=true
11 else
12 # Download or bail here?
13 echo "no animations found, static only!"
14 fi
15}
16# check if on ac or battery
17check_if_ac() {
18 ON_AC=`cat /sys/class/power_supply/AC/online`
19 if [ $ON_AC -eq 1 ] && [ "$ANIM_READY" = true ]; then
20 echo "Anim"
21 init_anim
22 else
23 echo "Static"
24 init_static
25 fi
26}
27
28init_static() {
29 # On battery or missing wallpapers, just load a random image
30 IMG=`find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
31 echo $IMG >> /tmp/$USER-desktop-anim
32 swww img $IMG
33 # This is hacky but sometimes we get into a race condition where the
34 # animated background will load anyways, so this will ensure we stay static
35 # until we definitely control swww and its state is known
36 sleep 60
37 swww img $IMG
38}
39
40init_anim() {
41 # Preload a static image until the animated one is ready
42 swww img --transition-step 255 `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
43 sleep 2
44 IMG=`find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
45 echo $IMG >> /tmp/$USER-desktop-anim
46 swww img $IMG
47}
48
49begin_randomizer() {
50 while :; do
51 echo "Invoke selector"
52 sleep 3600
53 if [ `cat /sys/class/power_supply/AC/online` -eq 1 ] && [ `cat /tmp/$USER-desktop-anim | head -n1` == "true" ]; then
54 switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
55 else
56 switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
57 fi
58 done
59}
60
61switch_check() {
62 # Simply query what image is displayed and make sure we do not overwrite
63 # it. This is more for animated wallpapers since it causes corruption
64 CURRENT_FILE=`swww query | awk -F'/' '{print $NF}'`
65 SELECTION=`echo $1 | awk -F'/' '{print $NF}'`
66
67 if ! [ "$CURRENT_FILE" == "$SELECTION" ]; then
68 # Update the file
69 sed -i '2c'"$1" /tmp/$USER-desktop-anim
70 # Set the background!
71 swww img $1
72 fi
73}
74
75check_load() {
76 # If system is under stress, disable animated wallpaper. If not, allow them
77 while :; do
78 sleep 60
79 ANIM_ENABLE=`cat /tmp/$USER-desktop-anim`
80 LOAD=`cat /proc/loadavg | cut -d' ' -f1`
81
82 if [ "$ANIM_ENABLE" == "true" ] && [ $LOAD -gt 8.00 ] && [ $ANIM_READY = true ]; then
83 sed -i '1c\false' /tmp/$USER-desktop-anim
84 switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
85 elif [ "$ANIM_ENABLE" == "false" ] && [ $LOAD -lt 8.00 ] && [ $ANIM_READY = true ]; then
86 sed -i '1c\true' /tmp/$USER-desktop-anim
87 switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
88 fi
89 done
90}
91
92script_init
93check_if_ac
94begin_randomizer &
95check_load &
96
97dbus-monitor --system "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',sender=':1.2',path='/org/freedesktop/UPower/devices/line_power_AC'" 2>/dev/null | stdbuf -o0 awk -F' ' '/variant boolean/ {print $(NF)}' |
98while read -r line; do
99 if [ "$line" == "true" ]; then
100 echo "switching to ac"
101 switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
102 elif [ "$line" == "false" ]; then
103 echo "switching to bat"
104 switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
105 fi
106done
diff --git a/home-config/hypr/wallpaper-daemon.sh b/home-config/hypr/wallpaper-daemon.sh
deleted file mode 100755
index b793c5a..0000000
--- a/home-config/hypr/wallpaper-daemon.sh
+++ /dev/null
@@ -1,35 +0,0 @@
1#!/usr/bin/env bash
2
3# Script initialization
4# Check if animated wallpapers exist, set env var if so
5# Sleep for swww init to finish
6init_static() {
7 # On battery or missing wallpapers, just load a random image
8 IMG=`find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
9 echo $IMG >> /tmp/$USER-desktop-anim
10 swww img $IMG
11}
12
13begin_randomizer() {
14 while :; do
15 sleep 3600
16 switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
17 done
18}
19
20switch_check() {
21 # Simply query what image is displayed and make sure we do not overwrite
22 # it. This is more for animated wallpapers since it causes corruption
23 CURRENT_FILE=`swww query | awk -F'/' '{print $NF}'`
24 SELECTION=`echo $1 | awk -F'/' '{print $NF}'`
25
26 if ! [ "$CURRENT_FILE" == "$SELECTION" ]; then
27 # Update the file
28 sed -i '2c'"$1" /tmp/$USER-desktop-anim
29 # Set the background!
30 swww img $1
31 fi
32}
33
34init_static
35begin_randomizer &
diff --git a/home-config/hypr/wallpaper.sh b/home-config/hypr/wallpaper.sh
deleted file mode 100755
index c6266fc..0000000
--- a/home-config/hypr/wallpaper.sh
+++ /dev/null
@@ -1,9 +0,0 @@
1#!/bin/sh
2
3sleep 2
4
5# Get currently loaded image
6IMG=`cat /tmp/$USER-desktop-anim | tail -n1`
7
8# Load it for the monitors
9swww img $IMG -o $1
diff --git a/home-config/mailvelope/gpgmejson.json b/home-config/mailvelope/gpgmejson.json
deleted file mode 100644
index 7ad8586..0000000
--- a/home-config/mailvelope/gpgmejson.json
+++ /dev/null
@@ -1,7 +0,0 @@
1{
2 "name": "gpgmejson",
3 "description": "JavaScript binding for GnuPG",
4 "path": "/home/ryan/.local/share/mailvelope/start.sh",
5 "type": "stdio",
6 "allowed_extensions": ["jid1-AQqSMBYb0a8ADg@jetpack"]
7}
diff --git a/home-config/mailvelope/start.sh b/home-config/mailvelope/start.sh
deleted file mode 100755
index 01b3ee2..0000000
--- a/home-config/mailvelope/start.sh
+++ /dev/null
@@ -1,4 +0,0 @@
1#!/usr/bin/env bash
2
3# Wrap for gpgme-json so firefox can use it
4exec gpgme-json $@
diff --git a/home-config/mpv/scripts/easycrop.lua b/home-config/mpv/scripts/easycrop.lua
deleted file mode 100644
index 415fce5..0000000
--- a/home-config/mpv/scripts/easycrop.lua
+++ /dev/null
@@ -1,254 +0,0 @@
1local msg = require('mp.msg')
2local assdraw = require('mp.assdraw')
3
4local script_name = "easycrop"
5
6-- Number of crop points currently chosen (0 to 2)
7local points = {}
8-- True if in cropping selection mode
9local cropping = false
10-- Original value of osc property
11local osc_prop = false
12
13-- Helper that converts two points to top-left and bottom-right
14local swizzle_points = function (p1, p2)
15 if p1.x > p2.x then p1.x, p2.x = p2.x, p1.x end
16 if p1.y > p2.y then p1.y, p2.y = p2.y, p1.y end
17end
18
19local clamp = function (val, min, max)
20 assert(min <= max)
21 if val < min then return min end
22 if val > max then return max end
23 return val
24end
25
26local video_space_from_screen_space = function (ssp)
27 -- Video native dimensions and screen size
28 local vid_w = mp.get_property("width")
29 local vid_h = mp.get_property("height")
30 local osd_w = mp.get_property("osd-width")
31 local osd_h = mp.get_property("osd-height")
32
33 -- Factor by which the video is scaled to fit the screen
34 local scale = math.min(osd_w/vid_w, osd_h/vid_h)
35
36 -- Size video takes up in screen
37 local vid_sw, vid_sh = scale*vid_w, scale*vid_h
38
39 -- Video offset within screen
40 local off_x = math.floor((osd_w - vid_sw)/2)
41 local off_y = math.floor((osd_h - vid_sh)/2)
42
43 local vsp = {}
44
45 -- Move the point to within the video
46 vsp.x = clamp(ssp.x, off_x, off_x + vid_sw)
47 vsp.y = clamp(ssp.y, off_y, off_y + vid_sh)
48
49 -- Convert screen-space to video-space
50 vsp.x = math.floor((vsp.x - off_x) / scale)
51 vsp.y = math.floor((vsp.y - off_y) / scale)
52
53 return vsp
54end
55
56local screen_space_from_video_space = function (vsp)
57 -- Video native dimensions and screen size
58 local vid_w = mp.get_property("width")
59 local vid_h = mp.get_property("height")
60 local osd_w = mp.get_property("osd-width")
61 local osd_h = mp.get_property("osd-height")
62
63 -- Factor by which the video is scaled to fit the screen
64 local scale = math.min(osd_w/vid_w, osd_h/vid_h)
65
66 -- Size video takes up in screen
67 local vid_sw, vid_sh = scale*vid_w, scale*vid_h
68
69 -- Video offset within screen
70 local off_x = math.floor((osd_w - vid_sw)/2)
71 local off_y = math.floor((osd_h - vid_sh)/2)
72
73 local ssp = {}
74 ssp.x = vsp.x * scale + off_x
75 ssp.y = vsp.y * scale + off_y
76 return ssp
77end
78
79-- Wrapper that converts RRGGBB / RRGGBBAA to ASS format
80local ass_set_color = function (idx, color)
81 assert(color:len() == 8 or color:len() == 6)
82 local ass = ""
83
84 -- Set alpha value (if present)
85 if color:len() == 8 then
86 local alpha = 0xff - tonumber(color:sub(7, 8), 16)
87 ass = ass .. string.format("\\%da&H%X&", idx, alpha)
88 end
89
90 -- Swizzle RGB to BGR and build ASS string
91 color = color:sub(5, 6) .. color:sub(3, 4) .. color:sub(1, 2)
92 return "{" .. ass .. string.format("\\%dc&H%s&", idx, color) .. "}"
93end
94
95local draw_rect = function (p1, p2)
96 local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
97
98 ass = assdraw.ass_new()
99
100 -- Draw overlay over surrounding unselected region
101
102 ass:draw_start()
103 ass:pos(0, 0)
104
105 ass:append(ass_set_color(1, "000000aa"))
106 ass:append(ass_set_color(3, "00000000"))
107
108 local l = math.min(p1.x, p2.x)
109 local r = math.max(p1.x, p2.x)
110 local u = math.min(p1.y, p2.y)
111 local d = math.max(p1.y, p2.y)
112
113 ass:rect_cw(0, 0, l, osd_h)
114 ass:rect_cw(r, 0, osd_w, osd_h)
115 ass:rect_cw(l, 0, r, u)
116 ass:rect_cw(l, d, r, osd_h)
117
118 ass:draw_stop()
119
120 -- Draw border around selected region
121
122 ass:new_event()
123 ass:draw_start()
124 ass:pos(0, 0)
125
126 ass:append(ass_set_color(1, "00000000"))
127 ass:append(ass_set_color(3, "000000ff"))
128 ass:append("{\\bord2}")
129
130 ass:rect_cw(p1.x, p1.y, p2.x, p2.y)
131
132 ass:draw_stop()
133
134 mp.set_osd_ass(osd_w, osd_h, ass.text)
135end
136
137local draw_fill = function ()
138 local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
139
140 ass = assdraw.ass_new()
141 ass:draw_start()
142 ass:pos(0, 0)
143
144 ass:append(ass_set_color(1, "000000aa"))
145 ass:append(ass_set_color(3, "00000000"))
146 ass:rect_cw(0, 0, osd_w, osd_h)
147
148 ass:draw_stop()
149 mp.set_osd_ass(osd_w, osd_h, ass.text)
150end
151
152local draw_clear = function ()
153 local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
154 mp.set_osd_ass(osd_w, osd_h, "")
155end
156
157local draw_cropper = function ()
158 if #points == 1 then
159 local p1 = screen_space_from_video_space(points[1])
160 local p2 = {}
161 p2.x, p2.y = mp.get_mouse_pos()
162 draw_rect(p1, p2)
163 end
164end
165
166local uncrop = function ()
167 mp.command("no-osd vf del @" .. script_name .. ":crop")
168end
169
170local crop = function(p1, p2)
171 swizzle_points(p1, p2)
172
173 local w = p2.x - p1.x
174 local h = p2.y - p1.y
175 local ok, err = mp.command(string.format(
176 "no-osd vf add @%s:crop=%s:%s:%s:%s", script_name, w, h, p1.x, p1.y))
177
178 if not ok then
179 mp.osd_message("Cropping failed")
180 points = {}
181 end
182end
183
184local easycrop_stop = function ()
185 mp.set_property("osc", osc_prop)
186 cropping = false
187 mp.remove_key_binding("easycrop_mouse_btn0")
188 draw_clear()
189end
190
191local mouse_btn0_cb = function ()
192 if not cropping then
193 return
194 end
195
196 local mx, my = mp.get_mouse_pos()
197 table.insert(points, video_space_from_screen_space({ x = mx, y = my }))
198
199 if #points == 2 then
200 crop(points[1], points[2])
201 easycrop_stop()
202 end
203end
204
205local easycrop_start = function ()
206 -- Cropping requires swdec or hwdec with copy-back
207 local hwdec = mp.get_property("hwdec-current")
208 if hwdec == nil then
209 return mp.msg.error("Cannot determine current hardware decoder mode")
210 end
211 -- Check whitelist of ok values
212 local valid_hwdec = {
213 ["no"] = true, -- software decoding
214 -- Taken from mpv manual
215 ["videotoolbox-co"] = true,
216 ["vaapi-copy"] = true,
217 ["dxva2-copy"] = true,
218 ["d3d11va-copy"] = true,
219 ["mediacodec"] = true
220 }
221 if not valid_hwdec[hwdec] then
222 return mp.osd_message("Cropping requires swdec or hwdec with copy-back (see mpv manual)")
223 end
224
225 -- Just clear the current crop and return, if there is one
226 if #points ~= 0 then
227 uncrop()
228 points = {}
229 return
230 end
231
232 -- Hide OSC
233 osc_prop = mp.get_property("osc")
234 mp.set_property("osc", "no")
235
236 cropping = true
237 mp.add_forced_key_binding("mouse_btn0", "easycrop_mouse_btn0", mouse_btn0_cb)
238 draw_fill()
239end
240
241local easycrop_activate = function ()
242 if cropping then
243 easycrop_stop()
244 else
245 easycrop_start()
246 end
247end
248
249mp.add_key_binding("mouse_move", draw_cropper)
250mp.observe_property("osd-width", "native", draw_cropper)
251mp.observe_property("osd-height", "native", draw_cropper)
252
253mp.add_key_binding("c", "easy_crop", easycrop_activate)
254
diff --git a/home-config/nix-files b/home-config/nix-files
Subproject 181f59e7219fa3cfed36c05773ac6a8dc40e557 Subproject 397af8b5b8bf6d08f26292207ce2aaffc095772
diff --git a/home-config/nvim/config/after/ftplugin/mail/custom.vim b/home-config/nvim/config/after/ftplugin/mail/custom.vim
deleted file mode 100644
index 75078e5..0000000
--- a/home-config/nvim/config/after/ftplugin/mail/custom.vim
+++ /dev/null
@@ -1,2 +0,0 @@
1setlocal tw=0 wm=0
2setlocal wrap linebreak
diff --git a/home-config/nvim/config/after/ftplugin/markdown/custom.vim b/home-config/nvim/config/after/ftplugin/markdown/custom.vim
deleted file mode 100644
index 96aac6e..0000000
--- a/home-config/nvim/config/after/ftplugin/markdown/custom.vim
+++ /dev/null
@@ -1,2 +0,0 @@
1"Used to overwrite table behavior in markdown files
2let b:table_mode_corner='+'
diff --git a/home-config/nvim/config/init.vim b/home-config/nvim/config/init.vim
deleted file mode 100644
index 15120de..0000000
--- a/home-config/nvim/config/init.vim
+++ /dev/null
@@ -1,90 +0,0 @@
1set nu rnu
2imap kj <Esc>
3set ts=4
4set sw=4
5set sts=4
6set et
7set mouse=
8set cursorline
9set cc=79
10
11call plug#begin(stdpath('data') . '/plugged')
12"Plug 'prabirshrestha/vim-lsp'
13"Plug 'mattn/vim-lsp-settings'
14"Plug 'prabirshrestha/asyncomplete.vim'
15"Plug 'prabirshrestha/asyncomplete-lsp.vim'
16"Plug 'Yggdroot/indentLine'
17Plug 'nvim-treesitter/nvim-treesitter', {'do':':TSUpdate'}
18Plug 'vim-pandoc/vim-pandoc'
19Plug 'vim-pandoc/vim-pandoc-syntax'
20Plug 'dhruvasagar/vim-table-mode'
21Plug 'skywind3000/asyncrun.vim'
22Plug 'folke/tokyonight.nvim', {'branch':'main'}
23Plug 'nvim-lualine/lualine.nvim'
24Plug 'nvim-tree/nvim-web-devicons'
25Plug 'ms-jpq/coq_nvim', {'branch':'coq'}
26Plug 'ms-jpq/coq.artifacts', {'branch':'artifacts'}
27Plug 'williamboman/mason.nvim'
28Plug 'williamboman/mason-lspconfig.nvim'
29Plug 'neovim/nvim-lspconfig'
30"Plug 'nvim-orgmode/orgmode'
31Plug 'https://codeberg.org/andyg/leap.nvim'
32Plug 'xiyaowong/transparent.nvim'
33Plug 'chentoast/marks.nvim'
34call plug#end()
35
36"Load Theme
37colorscheme tokyonight-night
38
39"Load COQ Autocomplete
40let g:coq_settings = {'auto_start':'shut-up'}
41
42"Load LuaLine, COQ, and nvim-orgmode
43lua << END
44require('lualine').setup()
45require('coq')
46require("transparent")
47require("mason").setup()
48require("mason-lspconfig").setup {
49 ensure_installed = { "pyright" },
50}
51
52-- nvim marks
53require'marks'.setup {
54 default_mappings = true
55}
56
57-- Leap keybinds
58config = function(_, opts)
59 vim.keymap.set({'n', 'x', 'o'}, 's', '<Plug>(leap-forward)')
60 vim.keymap.set({'n', 'x', 'o'}, 'S', '<Plug>(leap-backward)')
61 vim.keymap.set({'n', 'x', 'o'}, 'gs', '<Plug>(leap-from-window)')
62end
63
64require'nvim-treesitter'.install { 'zig','go','python','vim' }
65
66vim.opt.conceallevel = 2
67vim.opt.concealcursor = nc
68
69--local lspconfig = require('lspconfig')
70END
71
72"asynccomplete Auto Complete Config
73"inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
74"inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
75"inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
76
77"vim-pandoc config
78let g:pandoc#modules#disabled = ['spell', 'folding']
79
80"vim-table-mode config
81let g:table_mode_corner_corner='+'
82let g:table_mode_header_fillchar='='
83
84"pandoc render and open preview
85command Pv AsyncRun zathura '%:r.pdf'
86command Rd silent exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
87command Rr exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
88
89"Auto-rerender markdown files to pdf
90autocmd BufWritePost *.mkd :Rd
diff --git a/home-config/nvim/plugin-manager/plug.vim b/home-config/nvim/plugin-manager/plug.vim
deleted file mode 100644
index 9c3011f..0000000
--- a/home-config/nvim/plugin-manager/plug.vim
+++ /dev/null
@@ -1,2812 +0,0 @@
1" vim-plug: Vim plugin manager
2" ============================
3"
4" Download plug.vim and put it in ~/.vim/autoload
5"
6" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
7" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
8"
9" Edit your .vimrc
10"
11" call plug#begin('~/.vim/plugged')
12"
13" " Make sure you use single quotes
14"
15" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
16" Plug 'junegunn/vim-easy-align'
17"
18" " Any valid git URL is allowed
19" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
20"
21" " Multiple Plug commands can be written in a single line using | separators
22" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
23"
24" " On-demand loading
25" Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
26" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
27"
28" " Using a non-default branch
29" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
30"
31" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
32" Plug 'fatih/vim-go', { 'tag': '*' }
33"
34" " Plugin options
35" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
36"
37" " Plugin outside ~/.vim/plugged with post-update hook
38" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
39"
40" " Unmanaged plugin (manually installed and updated)
41" Plug '~/my-prototype-plugin'
42"
43" " Initialize plugin system
44" call plug#end()
45"
46" Then reload .vimrc and :PlugInstall to install plugins.
47"
48" Plug options:
49"
50"| Option | Description |
51"| ----------------------- | ------------------------------------------------ |
52"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
53"| `rtp` | Subdirectory that contains Vim plugin |
54"| `dir` | Custom directory for the plugin |
55"| `as` | Use different name for the plugin |
56"| `do` | Post-update hook (string or funcref) |
57"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
58"| `for` | On-demand loading: File types |
59"| `frozen` | Do not update unless explicitly specified |
60"
61" More information: https://github.com/junegunn/vim-plug
62"
63"
64" Copyright (c) 2017 Junegunn Choi
65"
66" MIT License
67"
68" Permission is hereby granted, free of charge, to any person obtaining
69" a copy of this software and associated documentation files (the
70" "Software"), to deal in the Software without restriction, including
71" without limitation the rights to use, copy, modify, merge, publish,
72" distribute, sublicense, and/or sell copies of the Software, and to
73" permit persons to whom the Software is furnished to do so, subject to
74" the following conditions:
75"
76" The above copyright notice and this permission notice shall be
77" included in all copies or substantial portions of the Software.
78"
79" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
80" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
81" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
82" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
83" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
84" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
85" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
86
87if exists('g:loaded_plug')
88 finish
89endif
90let g:loaded_plug = 1
91
92let s:cpo_save = &cpo
93set cpo&vim
94
95let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
96let s:plug_tab = get(s:, 'plug_tab', -1)
97let s:plug_buf = get(s:, 'plug_buf', -1)
98let s:mac_gui = has('gui_macvim') && has('gui_running')
99let s:is_win = has('win32')
100let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
101let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
102if s:is_win && &shellslash
103 set noshellslash
104 let s:me = resolve(expand('<sfile>:p'))
105 set shellslash
106else
107 let s:me = resolve(expand('<sfile>:p'))
108endif
109let s:base_spec = { 'branch': '', 'frozen': 0 }
110let s:TYPE = {
111\ 'string': type(''),
112\ 'list': type([]),
113\ 'dict': type({}),
114\ 'funcref': type(function('call'))
115\ }
116let s:loaded = get(s:, 'loaded', {})
117let s:triggers = get(s:, 'triggers', {})
118
119function! s:is_powershell(shell)
120 return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
121endfunction
122
123function! s:isabsolute(dir) abort
124 return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
125endfunction
126
127function! s:git_dir(dir) abort
128 let gitdir = s:trim(a:dir) . '/.git'
129 if isdirectory(gitdir)
130 return gitdir
131 endif
132 if !filereadable(gitdir)
133 return ''
134 endif
135 let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
136 if len(gitdir) && !s:isabsolute(gitdir)
137 let gitdir = a:dir . '/' . gitdir
138 endif
139 return isdirectory(gitdir) ? gitdir : ''
140endfunction
141
142function! s:git_origin_url(dir) abort
143 let gitdir = s:git_dir(a:dir)
144 let config = gitdir . '/config'
145 if empty(gitdir) || !filereadable(config)
146 return ''
147 endif
148 return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
149endfunction
150
151function! s:git_revision(dir) abort
152 let gitdir = s:git_dir(a:dir)
153 let head = gitdir . '/HEAD'
154 if empty(gitdir) || !filereadable(head)
155 return ''
156 endif
157
158 let line = get(readfile(head), 0, '')
159 let ref = matchstr(line, '^ref: \zs.*')
160 if empty(ref)
161 return line
162 endif
163
164 if filereadable(gitdir . '/' . ref)
165 return get(readfile(gitdir . '/' . ref), 0, '')
166 endif
167
168 if filereadable(gitdir . '/packed-refs')
169 for line in readfile(gitdir . '/packed-refs')
170 if line =~# ' ' . ref
171 return matchstr(line, '^[0-9a-f]*')
172 endif
173 endfor
174 endif
175
176 return ''
177endfunction
178
179function! s:git_local_branch(dir) abort
180 let gitdir = s:git_dir(a:dir)
181 let head = gitdir . '/HEAD'
182 if empty(gitdir) || !filereadable(head)
183 return ''
184 endif
185 let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
186 return len(branch) ? branch : 'HEAD'
187endfunction
188
189function! s:git_origin_branch(spec)
190 if len(a:spec.branch)
191 return a:spec.branch
192 endif
193
194 " The file may not be present if this is a local repository
195 let gitdir = s:git_dir(a:spec.dir)
196 let origin_head = gitdir.'/refs/remotes/origin/HEAD'
197 if len(gitdir) && filereadable(origin_head)
198 return matchstr(get(readfile(origin_head), 0, ''),
199 \ '^ref: refs/remotes/origin/\zs.*')
200 endif
201
202 " The command may not return the name of a branch in detached HEAD state
203 let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
204 return v:shell_error ? '' : result[-1]
205endfunction
206
207if s:is_win
208 function! s:plug_call(fn, ...)
209 let shellslash = &shellslash
210 try
211 set noshellslash
212 return call(a:fn, a:000)
213 finally
214 let &shellslash = shellslash
215 endtry
216 endfunction
217else
218 function! s:plug_call(fn, ...)
219 return call(a:fn, a:000)
220 endfunction
221endif
222
223function! s:plug_getcwd()
224 return s:plug_call('getcwd')
225endfunction
226
227function! s:plug_fnamemodify(fname, mods)
228 return s:plug_call('fnamemodify', a:fname, a:mods)
229endfunction
230
231function! s:plug_expand(fmt)
232 return s:plug_call('expand', a:fmt, 1)
233endfunction
234
235function! s:plug_tempname()
236 return s:plug_call('tempname')
237endfunction
238
239function! plug#begin(...)
240 if a:0 > 0
241 let s:plug_home_org = a:1
242 let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
243 elseif exists('g:plug_home')
244 let home = s:path(g:plug_home)
245 elseif has('nvim')
246 let home = stdpath('data') . '/plugged'
247 elseif !empty(&rtp)
248 let home = s:path(split(&rtp, ',')[0]) . '/plugged'
249 else
250 return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
251 endif
252 if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
253 return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
254 endif
255
256 let g:plug_home = home
257 let g:plugs = {}
258 let g:plugs_order = []
259 let s:triggers = {}
260
261 call s:define_commands()
262 return 1
263endfunction
264
265function! s:define_commands()
266 command! -nargs=+ -bar Plug call plug#(<args>)
267 if !executable('git')
268 return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
269 endif
270 if has('win32')
271 \ && &shellslash
272 \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
273 return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
274 endif
275 if !has('nvim')
276 \ && (has('win32') || has('win32unix'))
277 \ && !has('multi_byte')
278 return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
279 endif
280 command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
281 command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
282 command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
283 command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
284 command! -nargs=0 -bar PlugStatus call s:status()
285 command! -nargs=0 -bar PlugDiff call s:diff()
286 command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
287endfunction
288
289function! s:to_a(v)
290 return type(a:v) == s:TYPE.list ? a:v : [a:v]
291endfunction
292
293function! s:to_s(v)
294 return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
295endfunction
296
297function! s:glob(from, pattern)
298 return s:lines(globpath(a:from, a:pattern))
299endfunction
300
301function! s:source(from, ...)
302 let found = 0
303 for pattern in a:000
304 for vim in s:glob(a:from, pattern)
305 execute 'source' s:esc(vim)
306 let found = 1
307 endfor
308 endfor
309 return found
310endfunction
311
312function! s:assoc(dict, key, val)
313 let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
314endfunction
315
316function! s:ask(message, ...)
317 call inputsave()
318 echohl WarningMsg
319 let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
320 echohl None
321 call inputrestore()
322 echo "\r"
323 return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
324endfunction
325
326function! s:ask_no_interrupt(...)
327 try
328 return call('s:ask', a:000)
329 catch
330 return 0
331 endtry
332endfunction
333
334function! s:lazy(plug, opt)
335 return has_key(a:plug, a:opt) &&
336 \ (empty(s:to_a(a:plug[a:opt])) ||
337 \ !isdirectory(a:plug.dir) ||
338 \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
339 \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
340endfunction
341
342function! plug#end()
343 if !exists('g:plugs')
344 return s:err('plug#end() called without calling plug#begin() first')
345 endif
346
347 if exists('#PlugLOD')
348 augroup PlugLOD
349 autocmd!
350 augroup END
351 augroup! PlugLOD
352 endif
353 let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
354
355 if get(g:, 'did_load_filetypes', 0)
356 filetype off
357 endif
358 for name in g:plugs_order
359 if !has_key(g:plugs, name)
360 continue
361 endif
362 let plug = g:plugs[name]
363 if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
364 let s:loaded[name] = 1
365 continue
366 endif
367
368 if has_key(plug, 'on')
369 let s:triggers[name] = { 'map': [], 'cmd': [] }
370 for cmd in s:to_a(plug.on)
371 if cmd =~? '^<Plug>.\+'
372 if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
373 call s:assoc(lod.map, cmd, name)
374 endif
375 call add(s:triggers[name].map, cmd)
376 elseif cmd =~# '^[A-Z]'
377 let cmd = substitute(cmd, '!*$', '', '')
378 if exists(':'.cmd) != 2
379 call s:assoc(lod.cmd, cmd, name)
380 endif
381 call add(s:triggers[name].cmd, cmd)
382 else
383 call s:err('Invalid `on` option: '.cmd.
384 \ '. Should start with an uppercase letter or `<Plug>`.')
385 endif
386 endfor
387 endif
388
389 if has_key(plug, 'for')
390 let types = s:to_a(plug.for)
391 if !empty(types)
392 augroup filetypedetect
393 call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
394 augroup END
395 endif
396 for type in types
397 call s:assoc(lod.ft, type, name)
398 endfor
399 endif
400 endfor
401
402 for [cmd, names] in items(lod.cmd)
403 execute printf(
404 \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
405 \ cmd, string(cmd), string(names))
406 endfor
407
408 for [map, names] in items(lod.map)
409 for [mode, map_prefix, key_prefix] in
410 \ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
411 execute printf(
412 \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
413 \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
414 endfor
415 endfor
416
417 for [ft, names] in items(lod.ft)
418 augroup PlugLOD
419 execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
420 \ ft, string(ft), string(names))
421 augroup END
422 endfor
423
424 call s:reorg_rtp()
425 filetype plugin indent on
426 if has('vim_starting')
427 if has('syntax') && !exists('g:syntax_on')
428 syntax enable
429 end
430 else
431 call s:reload_plugins()
432 endif
433endfunction
434
435function! s:loaded_names()
436 return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
437endfunction
438
439function! s:load_plugin(spec)
440 call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
441endfunction
442
443function! s:reload_plugins()
444 for name in s:loaded_names()
445 call s:load_plugin(g:plugs[name])
446 endfor
447endfunction
448
449function! s:trim(str)
450 return substitute(a:str, '[\/]\+$', '', '')
451endfunction
452
453function! s:version_requirement(val, min)
454 for idx in range(0, len(a:min) - 1)
455 let v = get(a:val, idx, 0)
456 if v < a:min[idx] | return 0
457 elseif v > a:min[idx] | return 1
458 endif
459 endfor
460 return 1
461endfunction
462
463function! s:git_version_requirement(...)
464 if !exists('s:git_version')
465 let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)')
466 endif
467 return s:version_requirement(s:git_version, a:000)
468endfunction
469
470function! s:progress_opt(base)
471 return a:base && !s:is_win &&
472 \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
473endfunction
474
475function! s:rtp(spec)
476 return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
477endfunction
478
479if s:is_win
480 function! s:path(path)
481 return s:trim(substitute(a:path, '/', '\', 'g'))
482 endfunction
483
484 function! s:dirpath(path)
485 return s:path(a:path) . '\'
486 endfunction
487
488 function! s:is_local_plug(repo)
489 return a:repo =~? '^[a-z]:\|^[%~]'
490 endfunction
491
492 " Copied from fzf
493 function! s:wrap_cmds(cmds)
494 let cmds = [
495 \ '@echo off',
496 \ 'setlocal enabledelayedexpansion']
497 \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
498 \ + ['endlocal']
499 if has('iconv')
500 if !exists('s:codepage')
501 let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
502 endif
503 return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
504 endif
505 return map(cmds, 'v:val."\r"')
506 endfunction
507
508 function! s:batchfile(cmd)
509 let batchfile = s:plug_tempname().'.bat'
510 call writefile(s:wrap_cmds(a:cmd), batchfile)
511 let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
512 if s:is_powershell(&shell)
513 let cmd = '& ' . cmd
514 endif
515 return [batchfile, cmd]
516 endfunction
517else
518 function! s:path(path)
519 return s:trim(a:path)
520 endfunction
521
522 function! s:dirpath(path)
523 return substitute(a:path, '[/\\]*$', '/', '')
524 endfunction
525
526 function! s:is_local_plug(repo)
527 return a:repo[0] =~ '[/$~]'
528 endfunction
529endif
530
531function! s:err(msg)
532 echohl ErrorMsg
533 echom '[vim-plug] '.a:msg
534 echohl None
535endfunction
536
537function! s:warn(cmd, msg)
538 echohl WarningMsg
539 execute a:cmd 'a:msg'
540 echohl None
541endfunction
542
543function! s:esc(path)
544 return escape(a:path, ' ')
545endfunction
546
547function! s:escrtp(path)
548 return escape(a:path, ' ,')
549endfunction
550
551function! s:remove_rtp()
552 for name in s:loaded_names()
553 let rtp = s:rtp(g:plugs[name])
554 execute 'set rtp-='.s:escrtp(rtp)
555 let after = globpath(rtp, 'after')
556 if isdirectory(after)
557 execute 'set rtp-='.s:escrtp(after)
558 endif
559 endfor
560endfunction
561
562function! s:reorg_rtp()
563 if !empty(s:first_rtp)
564 execute 'set rtp-='.s:first_rtp
565 execute 'set rtp-='.s:last_rtp
566 endif
567
568 " &rtp is modified from outside
569 if exists('s:prtp') && s:prtp !=# &rtp
570 call s:remove_rtp()
571 unlet! s:middle
572 endif
573
574 let s:middle = get(s:, 'middle', &rtp)
575 let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
576 let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
577 let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
578 \ . ','.s:middle.','
579 \ . join(map(afters, 'escape(v:val, ",")'), ',')
580 let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
581 let s:prtp = &rtp
582
583 if !empty(s:first_rtp)
584 execute 'set rtp^='.s:first_rtp
585 execute 'set rtp+='.s:last_rtp
586 endif
587endfunction
588
589function! s:doautocmd(...)
590 if exists('#'.join(a:000, '#'))
591 execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
592 endif
593endfunction
594
595function! s:dobufread(names)
596 for name in a:names
597 let path = s:rtp(g:plugs[name])
598 for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
599 if len(finddir(dir, path))
600 if exists('#BufRead')
601 doautocmd BufRead
602 endif
603 return
604 endif
605 endfor
606 endfor
607endfunction
608
609function! plug#load(...)
610 if a:0 == 0
611 return s:err('Argument missing: plugin name(s) required')
612 endif
613 if !exists('g:plugs')
614 return s:err('plug#begin was not called')
615 endif
616 let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
617 let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
618 if !empty(unknowns)
619 let s = len(unknowns) > 1 ? 's' : ''
620 return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
621 end
622 let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
623 if !empty(unloaded)
624 for name in unloaded
625 call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
626 endfor
627 call s:dobufread(unloaded)
628 return 1
629 end
630 return 0
631endfunction
632
633function! s:remove_triggers(name)
634 if !has_key(s:triggers, a:name)
635 return
636 endif
637 for cmd in s:triggers[a:name].cmd
638 execute 'silent! delc' cmd
639 endfor
640 for map in s:triggers[a:name].map
641 execute 'silent! unmap' map
642 execute 'silent! iunmap' map
643 endfor
644 call remove(s:triggers, a:name)
645endfunction
646
647function! s:lod(names, types, ...)
648 for name in a:names
649 call s:remove_triggers(name)
650 let s:loaded[name] = 1
651 endfor
652 call s:reorg_rtp()
653
654 for name in a:names
655 let rtp = s:rtp(g:plugs[name])
656 for dir in a:types
657 call s:source(rtp, dir.'/**/*.vim')
658 endfor
659 if a:0
660 if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
661 execute 'runtime' a:1
662 endif
663 call s:source(rtp, a:2)
664 endif
665 call s:doautocmd('User', name)
666 endfor
667endfunction
668
669function! s:lod_ft(pat, names)
670 let syn = 'syntax/'.a:pat.'.vim'
671 call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
672 execute 'autocmd! PlugLOD FileType' a:pat
673 call s:doautocmd('filetypeplugin', 'FileType')
674 call s:doautocmd('filetypeindent', 'FileType')
675endfunction
676
677function! s:lod_cmd(cmd, bang, l1, l2, args, names)
678 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
679 call s:dobufread(a:names)
680 execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
681endfunction
682
683function! s:lod_map(map, names, with_prefix, prefix)
684 call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
685 call s:dobufread(a:names)
686 let extra = ''
687 while 1
688 let c = getchar(0)
689 if c == 0
690 break
691 endif
692 let extra .= nr2char(c)
693 endwhile
694
695 if a:with_prefix
696 let prefix = v:count ? v:count : ''
697 let prefix .= '"'.v:register.a:prefix
698 if mode(1) == 'no'
699 if v:operator == 'c'
700 let prefix = "\<esc>" . prefix
701 endif
702 let prefix .= v:operator
703 endif
704 call feedkeys(prefix, 'n')
705 endif
706 call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
707endfunction
708
709function! plug#(repo, ...)
710 if a:0 > 1
711 return s:err('Invalid number of arguments (1..2)')
712 endif
713
714 try
715 let repo = s:trim(a:repo)
716 let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
717 let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
718 let spec = extend(s:infer_properties(name, repo), opts)
719 if !has_key(g:plugs, name)
720 call add(g:plugs_order, name)
721 endif
722 let g:plugs[name] = spec
723 let s:loaded[name] = get(s:loaded, name, 0)
724 catch
725 return s:err(repo . ' ' . v:exception)
726 endtry
727endfunction
728
729function! s:parse_options(arg)
730 let opts = copy(s:base_spec)
731 let type = type(a:arg)
732 let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
733 if type == s:TYPE.string
734 if empty(a:arg)
735 throw printf(opt_errfmt, 'tag', 'string')
736 endif
737 let opts.tag = a:arg
738 elseif type == s:TYPE.dict
739 for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
740 if has_key(a:arg, opt)
741 \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
742 throw printf(opt_errfmt, opt, 'string')
743 endif
744 endfor
745 for opt in ['on', 'for']
746 if has_key(a:arg, opt)
747 \ && type(a:arg[opt]) != s:TYPE.list
748 \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
749 throw printf(opt_errfmt, opt, 'string or list')
750 endif
751 endfor
752 if has_key(a:arg, 'do')
753 \ && type(a:arg.do) != s:TYPE.funcref
754 \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
755 throw printf(opt_errfmt, 'do', 'string or funcref')
756 endif
757 call extend(opts, a:arg)
758 if has_key(opts, 'dir')
759 let opts.dir = s:dirpath(s:plug_expand(opts.dir))
760 endif
761 else
762 throw 'Invalid argument type (expected: string or dictionary)'
763 endif
764 return opts
765endfunction
766
767function! s:infer_properties(name, repo)
768 let repo = a:repo
769 if s:is_local_plug(repo)
770 return { 'dir': s:dirpath(s:plug_expand(repo)) }
771 else
772 if repo =~ ':'
773 let uri = repo
774 else
775 if repo !~ '/'
776 throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
777 endif
778 let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
779 let uri = printf(fmt, repo)
780 endif
781 return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
782 endif
783endfunction
784
785function! s:install(force, names)
786 call s:update_impl(0, a:force, a:names)
787endfunction
788
789function! s:update(force, names)
790 call s:update_impl(1, a:force, a:names)
791endfunction
792
793function! plug#helptags()
794 if !exists('g:plugs')
795 return s:err('plug#begin was not called')
796 endif
797 for spec in values(g:plugs)
798 let docd = join([s:rtp(spec), 'doc'], '/')
799 if isdirectory(docd)
800 silent! execute 'helptags' s:esc(docd)
801 endif
802 endfor
803 return 1
804endfunction
805
806function! s:syntax()
807 syntax clear
808 syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
809 syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
810 syn match plugNumber /[0-9]\+[0-9.]*/ contained
811 syn match plugBracket /[[\]]/ contained
812 syn match plugX /x/ contained
813 syn match plugDash /^-\{1}\ /
814 syn match plugPlus /^+/
815 syn match plugStar /^*/
816 syn match plugMessage /\(^- \)\@<=.*/
817 syn match plugName /\(^- \)\@<=[^ ]*:/
818 syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
819 syn match plugTag /(tag: [^)]\+)/
820 syn match plugInstall /\(^+ \)\@<=[^:]*/
821 syn match plugUpdate /\(^* \)\@<=[^:]*/
822 syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
823 syn match plugEdge /^ \X\+$/
824 syn match plugEdge /^ \X*/ contained nextgroup=plugSha
825 syn match plugSha /[0-9a-f]\{7,9}/ contained
826 syn match plugRelDate /([^)]*)$/ contained
827 syn match plugNotLoaded /(not loaded)$/
828 syn match plugError /^x.*/
829 syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
830 syn match plugH2 /^.*:\n-\+$/
831 syn match plugH2 /^-\{2,}/
832 syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
833 hi def link plug1 Title
834 hi def link plug2 Repeat
835 hi def link plugH2 Type
836 hi def link plugX Exception
837 hi def link plugBracket Structure
838 hi def link plugNumber Number
839
840 hi def link plugDash Special
841 hi def link plugPlus Constant
842 hi def link plugStar Boolean
843
844 hi def link plugMessage Function
845 hi def link plugName Label
846 hi def link plugInstall Function
847 hi def link plugUpdate Type
848
849 hi def link plugError Error
850 hi def link plugDeleted Ignore
851 hi def link plugRelDate Comment
852 hi def link plugEdge PreProc
853 hi def link plugSha Identifier
854 hi def link plugTag Constant
855
856 hi def link plugNotLoaded Comment
857endfunction
858
859function! s:lpad(str, len)
860 return a:str . repeat(' ', a:len - len(a:str))
861endfunction
862
863function! s:lines(msg)
864 return split(a:msg, "[\r\n]")
865endfunction
866
867function! s:lastline(msg)
868 return get(s:lines(a:msg), -1, '')
869endfunction
870
871function! s:new_window()
872 execute get(g:, 'plug_window', 'vertical topleft new')
873endfunction
874
875function! s:plug_window_exists()
876 let buflist = tabpagebuflist(s:plug_tab)
877 return !empty(buflist) && index(buflist, s:plug_buf) >= 0
878endfunction
879
880function! s:switch_in()
881 if !s:plug_window_exists()
882 return 0
883 endif
884
885 if winbufnr(0) != s:plug_buf
886 let s:pos = [tabpagenr(), winnr(), winsaveview()]
887 execute 'normal!' s:plug_tab.'gt'
888 let winnr = bufwinnr(s:plug_buf)
889 execute winnr.'wincmd w'
890 call add(s:pos, winsaveview())
891 else
892 let s:pos = [winsaveview()]
893 endif
894
895 setlocal modifiable
896 return 1
897endfunction
898
899function! s:switch_out(...)
900 call winrestview(s:pos[-1])
901 setlocal nomodifiable
902 if a:0 > 0
903 execute a:1
904 endif
905
906 if len(s:pos) > 1
907 execute 'normal!' s:pos[0].'gt'
908 execute s:pos[1] 'wincmd w'
909 call winrestview(s:pos[2])
910 endif
911endfunction
912
913function! s:finish_bindings()
914 nnoremap <silent> <buffer> R :call <SID>retry()<cr>
915 nnoremap <silent> <buffer> D :PlugDiff<cr>
916 nnoremap <silent> <buffer> S :PlugStatus<cr>
917 nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
918 xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
919 nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
920 nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
921endfunction
922
923function! s:prepare(...)
924 if empty(s:plug_getcwd())
925 throw 'Invalid current working directory. Cannot proceed.'
926 endif
927
928 for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
929 if exists(evar)
930 throw evar.' detected. Cannot proceed.'
931 endif
932 endfor
933
934 call s:job_abort()
935 if s:switch_in()
936 if b:plug_preview == 1
937 pc
938 endif
939 enew
940 else
941 call s:new_window()
942 endif
943
944 nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
945 if a:0 == 0
946 call s:finish_bindings()
947 endif
948 let b:plug_preview = -1
949 let s:plug_tab = tabpagenr()
950 let s:plug_buf = winbufnr(0)
951 call s:assign_name()
952
953 for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
954 execute 'silent! unmap <buffer>' k
955 endfor
956 setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
957 if exists('+colorcolumn')
958 setlocal colorcolumn=
959 endif
960 setf vim-plug
961 if exists('g:syntax_on')
962 call s:syntax()
963 endif
964endfunction
965
966function! s:close_pane()
967 if b:plug_preview == 1
968 pc
969 let b:plug_preview = -1
970 else
971 bd
972 endif
973endfunction
974
975function! s:assign_name()
976 " Assign buffer name
977 let prefix = '[Plugins]'
978 let name = prefix
979 let idx = 2
980 while bufexists(name)
981 let name = printf('%s (%s)', prefix, idx)
982 let idx = idx + 1
983 endwhile
984 silent! execute 'f' fnameescape(name)
985endfunction
986
987function! s:chsh(swap)
988 let prev = [&shell, &shellcmdflag, &shellredir]
989 if !s:is_win
990 set shell=sh
991 endif
992 if a:swap
993 if s:is_powershell(&shell)
994 let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
995 elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
996 set shellredir=>%s\ 2>&1
997 endif
998 endif
999 return prev
1000endfunction
1001
1002function! s:bang(cmd, ...)
1003 let batchfile = ''
1004 try
1005 let [sh, shellcmdflag, shrd] = s:chsh(a:0)
1006 " FIXME: Escaping is incomplete. We could use shellescape with eval,
1007 " but it won't work on Windows.
1008 let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
1009 if s:is_win
1010 let [batchfile, cmd] = s:batchfile(cmd)
1011 endif
1012 let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
1013 execute "normal! :execute g:_plug_bang\<cr>\<cr>"
1014 finally
1015 unlet g:_plug_bang
1016 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
1017 if s:is_win && filereadable(batchfile)
1018 call delete(batchfile)
1019 endif
1020 endtry
1021 return v:shell_error ? 'Exit status: ' . v:shell_error : ''
1022endfunction
1023
1024function! s:regress_bar()
1025 let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
1026 call s:progress_bar(2, bar, len(bar))
1027endfunction
1028
1029function! s:is_updated(dir)
1030 return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
1031endfunction
1032
1033function! s:do(pull, force, todo)
1034 for [name, spec] in items(a:todo)
1035 if !isdirectory(spec.dir)
1036 continue
1037 endif
1038 let installed = has_key(s:update.new, name)
1039 let updated = installed ? 0 :
1040 \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
1041 if a:force || installed || updated
1042 execute 'cd' s:esc(spec.dir)
1043 call append(3, '- Post-update hook for '. name .' ... ')
1044 let error = ''
1045 let type = type(spec.do)
1046 if type == s:TYPE.string
1047 if spec.do[0] == ':'
1048 if !get(s:loaded, name, 0)
1049 let s:loaded[name] = 1
1050 call s:reorg_rtp()
1051 endif
1052 call s:load_plugin(spec)
1053 try
1054 execute spec.do[1:]
1055 catch
1056 let error = v:exception
1057 endtry
1058 if !s:plug_window_exists()
1059 cd -
1060 throw 'Warning: vim-plug was terminated by the post-update hook of '.name
1061 endif
1062 else
1063 let error = s:bang(spec.do)
1064 endif
1065 elseif type == s:TYPE.funcref
1066 try
1067 call s:load_plugin(spec)
1068 let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
1069 call spec.do({ 'name': name, 'status': status, 'force': a:force })
1070 catch
1071 let error = v:exception
1072 endtry
1073 else
1074 let error = 'Invalid hook type'
1075 endif
1076 call s:switch_in()
1077 call setline(4, empty(error) ? (getline(4) . 'OK')
1078 \ : ('x' . getline(4)[1:] . error))
1079 if !empty(error)
1080 call add(s:update.errors, name)
1081 call s:regress_bar()
1082 endif
1083 cd -
1084 endif
1085 endfor
1086endfunction
1087
1088function! s:hash_match(a, b)
1089 return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
1090endfunction
1091
1092function! s:checkout(spec)
1093 let sha = a:spec.commit
1094 let output = s:git_revision(a:spec.dir)
1095 if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
1096 let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
1097 let output = s:system(
1098 \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
1099 endif
1100 return output
1101endfunction
1102
1103function! s:finish(pull)
1104 let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
1105 if new_frozen
1106 let s = new_frozen > 1 ? 's' : ''
1107 call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
1108 endif
1109 call append(3, '- Finishing ... ') | 4
1110 redraw
1111 call plug#helptags()
1112 call plug#end()
1113 call setline(4, getline(4) . 'Done!')
1114 redraw
1115 let msgs = []
1116 if !empty(s:update.errors)
1117 call add(msgs, "Press 'R' to retry.")
1118 endif
1119 if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
1120 \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
1121 call add(msgs, "Press 'D' to see the updated changes.")
1122 endif
1123 echo join(msgs, ' ')
1124 call s:finish_bindings()
1125endfunction
1126
1127function! s:retry()
1128 if empty(s:update.errors)
1129 return
1130 endif
1131 echo
1132 call s:update_impl(s:update.pull, s:update.force,
1133 \ extend(copy(s:update.errors), [s:update.threads]))
1134endfunction
1135
1136function! s:is_managed(name)
1137 return has_key(g:plugs[a:name], 'uri')
1138endfunction
1139
1140function! s:names(...)
1141 return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
1142endfunction
1143
1144function! s:check_ruby()
1145 silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
1146 if !exists('g:plug_ruby')
1147 redraw!
1148 return s:warn('echom', 'Warning: Ruby interface is broken')
1149 endif
1150 let ruby_version = split(g:plug_ruby, '\.')
1151 unlet g:plug_ruby
1152 return s:version_requirement(ruby_version, [1, 8, 7])
1153endfunction
1154
1155function! s:update_impl(pull, force, args) abort
1156 let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
1157 let args = filter(copy(a:args), 'v:val != "--sync"')
1158 let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
1159 \ remove(args, -1) : get(g:, 'plug_threads', 16)
1160
1161 let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
1162 let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
1163 \ filter(managed, 'index(args, v:key) >= 0')
1164
1165 if empty(todo)
1166 return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
1167 endif
1168
1169 if !s:is_win && s:git_version_requirement(2, 3)
1170 let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
1171 let $GIT_TERMINAL_PROMPT = 0
1172 for plug in values(todo)
1173 let plug.uri = substitute(plug.uri,
1174 \ '^https://git::@github\.com', 'https://github.com', '')
1175 endfor
1176 endif
1177
1178 if !isdirectory(g:plug_home)
1179 try
1180 call mkdir(g:plug_home, 'p')
1181 catch
1182 return s:err(printf('Invalid plug directory: %s. '.
1183 \ 'Try to call plug#begin with a valid directory', g:plug_home))
1184 endtry
1185 endif
1186
1187 if has('nvim') && !exists('*jobwait') && threads > 1
1188 call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
1189 endif
1190
1191 let use_job = s:nvim || s:vim8
1192 let python = (has('python') || has('python3')) && !use_job
1193 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()
1194
1195 let s:update = {
1196 \ 'start': reltime(),
1197 \ 'all': todo,
1198 \ 'todo': copy(todo),
1199 \ 'errors': [],
1200 \ 'pull': a:pull,
1201 \ 'force': a:force,
1202 \ 'new': {},
1203 \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
1204 \ 'bar': '',
1205 \ 'fin': 0
1206 \ }
1207
1208 call s:prepare(1)
1209 call append(0, ['', ''])
1210 normal! 2G
1211 silent! redraw
1212
1213 " Set remote name, overriding a possible user git config's clone.defaultRemoteName
1214 let s:clone_opt = ['--origin', 'origin']
1215 if get(g:, 'plug_shallow', 1)
1216 call extend(s:clone_opt, ['--depth', '1'])
1217 if s:git_version_requirement(1, 7, 10)
1218 call add(s:clone_opt, '--no-single-branch')
1219 endif
1220 endif
1221
1222 if has('win32unix') || has('wsl')
1223 call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
1224 endif
1225
1226 let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
1227
1228 " Python version requirement (>= 2.7)
1229 if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
1230 redir => pyv
1231 silent python import platform; print platform.python_version()
1232 redir END
1233 let python = s:version_requirement(
1234 \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
1235 endif
1236
1237 if (python || ruby) && s:update.threads > 1
1238 try
1239 let imd = &imd
1240 if s:mac_gui
1241 set noimd
1242 endif
1243 if ruby
1244 call s:update_ruby()
1245 else
1246 call s:update_python()
1247 endif
1248 catch
1249 let lines = getline(4, '$')
1250 let printed = {}
1251 silent! 4,$d _
1252 for line in lines
1253 let name = s:extract_name(line, '.', '')
1254 if empty(name) || !has_key(printed, name)
1255 call append('$', line)
1256 if !empty(name)
1257 let printed[name] = 1
1258 if line[0] == 'x' && index(s:update.errors, name) < 0
1259 call add(s:update.errors, name)
1260 end
1261 endif
1262 endif
1263 endfor
1264 finally
1265 let &imd = imd
1266 call s:update_finish()
1267 endtry
1268 else
1269 call s:update_vim()
1270 while use_job && sync
1271 sleep 100m
1272 if s:update.fin
1273 break
1274 endif
1275 endwhile
1276 endif
1277endfunction
1278
1279function! s:log4(name, msg)
1280 call setline(4, printf('- %s (%s)', a:msg, a:name))
1281 redraw
1282endfunction
1283
1284function! s:update_finish()
1285 if exists('s:git_terminal_prompt')
1286 let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
1287 endif
1288 if s:switch_in()
1289 call append(3, '- Updating ...') | 4
1290 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))'))
1291 let [pos, _] = s:logpos(name)
1292 if !pos
1293 continue
1294 endif
1295 if has_key(spec, 'commit')
1296 call s:log4(name, 'Checking out '.spec.commit)
1297 let out = s:checkout(spec)
1298 elseif has_key(spec, 'tag')
1299 let tag = spec.tag
1300 if tag =~ '\*'
1301 let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
1302 if !v:shell_error && !empty(tags)
1303 let tag = tags[0]
1304 call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
1305 call append(3, '')
1306 endif
1307 endif
1308 call s:log4(name, 'Checking out '.tag)
1309 let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
1310 else
1311 let branch = s:git_origin_branch(spec)
1312 call s:log4(name, 'Merging origin/'.s:esc(branch))
1313 let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
1314 \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
1315 endif
1316 if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
1317 \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
1318 call s:log4(name, 'Updating submodules. This may take a while.')
1319 let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
1320 endif
1321 let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
1322 if v:shell_error
1323 call add(s:update.errors, name)
1324 call s:regress_bar()
1325 silent execute pos 'd _'
1326 call append(4, msg) | 4
1327 elseif !empty(out)
1328 call setline(pos, msg[0])
1329 endif
1330 redraw
1331 endfor
1332 silent 4 d _
1333 try
1334 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")'))
1335 catch
1336 call s:warn('echom', v:exception)
1337 call s:warn('echo', '')
1338 return
1339 endtry
1340 call s:finish(s:update.pull)
1341 call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
1342 call s:switch_out('normal! gg')
1343 endif
1344endfunction
1345
1346function! s:job_abort()
1347 if (!s:nvim && !s:vim8) || !exists('s:jobs')
1348 return
1349 endif
1350
1351 for [name, j] in items(s:jobs)
1352 if s:nvim
1353 silent! call jobstop(j.jobid)
1354 elseif s:vim8
1355 silent! call job_stop(j.jobid)
1356 endif
1357 if j.new
1358 call s:rm_rf(g:plugs[name].dir)
1359 endif
1360 endfor
1361 let s:jobs = {}
1362endfunction
1363
1364function! s:last_non_empty_line(lines)
1365 let len = len(a:lines)
1366 for idx in range(len)
1367 let line = a:lines[len-idx-1]
1368 if !empty(line)
1369 return line
1370 endif
1371 endfor
1372 return ''
1373endfunction
1374
1375function! s:job_out_cb(self, data) abort
1376 let self = a:self
1377 let data = remove(self.lines, -1) . a:data
1378 let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
1379 call extend(self.lines, lines)
1380 " To reduce the number of buffer updates
1381 let self.tick = get(self, 'tick', -1) + 1
1382 if !self.running || self.tick % len(s:jobs) == 0
1383 let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
1384 let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
1385 call s:log(bullet, self.name, result)
1386 endif
1387endfunction
1388
1389function! s:job_exit_cb(self, data) abort
1390 let a:self.running = 0
1391 let a:self.error = a:data != 0
1392 call s:reap(a:self.name)
1393 call s:tick()
1394endfunction
1395
1396function! s:job_cb(fn, job, ch, data)
1397 if !s:plug_window_exists() " plug window closed
1398 return s:job_abort()
1399 endif
1400 call call(a:fn, [a:job, a:data])
1401endfunction
1402
1403function! s:nvim_cb(job_id, data, event) dict abort
1404 return (a:event == 'stdout' || a:event == 'stderr') ?
1405 \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
1406 \ s:job_cb('s:job_exit_cb', self, 0, a:data)
1407endfunction
1408
1409function! s:spawn(name, cmd, opts)
1410 let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
1411 \ 'new': get(a:opts, 'new', 0) }
1412 let s:jobs[a:name] = job
1413
1414 if s:nvim
1415 if has_key(a:opts, 'dir')
1416 let job.cwd = a:opts.dir
1417 endif
1418 let argv = a:cmd
1419 call extend(job, {
1420 \ 'on_stdout': function('s:nvim_cb'),
1421 \ 'on_stderr': function('s:nvim_cb'),
1422 \ 'on_exit': function('s:nvim_cb'),
1423 \ })
1424 let jid = s:plug_call('jobstart', argv, job)
1425 if jid > 0
1426 let job.jobid = jid
1427 else
1428 let job.running = 0
1429 let job.error = 1
1430 let job.lines = [jid < 0 ? argv[0].' is not executable' :
1431 \ 'Invalid arguments (or job table is full)']
1432 endif
1433 elseif s:vim8
1434 let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
1435 if has_key(a:opts, 'dir')
1436 let cmd = s:with_cd(cmd, a:opts.dir, 0)
1437 endif
1438 let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
1439 let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
1440 \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
1441 \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]),
1442 \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
1443 \ 'err_mode': 'raw',
1444 \ 'out_mode': 'raw'
1445 \})
1446 if job_status(jid) == 'run'
1447 let job.jobid = jid
1448 else
1449 let job.running = 0
1450 let job.error = 1
1451 let job.lines = ['Failed to start job']
1452 endif
1453 else
1454 let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
1455 let job.error = v:shell_error != 0
1456 let job.running = 0
1457 endif
1458endfunction
1459
1460function! s:reap(name)
1461 let job = s:jobs[a:name]
1462 if job.error
1463 call add(s:update.errors, a:name)
1464 elseif get(job, 'new', 0)
1465 let s:update.new[a:name] = 1
1466 endif
1467 let s:update.bar .= job.error ? 'x' : '='
1468
1469 let bullet = job.error ? 'x' : '-'
1470 let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
1471 call s:log(bullet, a:name, empty(result) ? 'OK' : result)
1472 call s:bar()
1473
1474 call remove(s:jobs, a:name)
1475endfunction
1476
1477function! s:bar()
1478 if s:switch_in()
1479 let total = len(s:update.all)
1480 call setline(1, (s:update.pull ? 'Updating' : 'Installing').
1481 \ ' plugins ('.len(s:update.bar).'/'.total.')')
1482 call s:progress_bar(2, s:update.bar, total)
1483 call s:switch_out()
1484 endif
1485endfunction
1486
1487function! s:logpos(name)
1488 let max = line('$')
1489 for i in range(4, max > 4 ? max : 4)
1490 if getline(i) =~# '^[-+x*] '.a:name.':'
1491 for j in range(i + 1, max > 5 ? max : 5)
1492 if getline(j) !~ '^ '
1493 return [i, j - 1]
1494 endif
1495 endfor
1496 return [i, i]
1497 endif
1498 endfor
1499 return [0, 0]
1500endfunction
1501
1502function! s:log(bullet, name, lines)
1503 if s:switch_in()
1504 let [b, e] = s:logpos(a:name)
1505 if b > 0
1506 silent execute printf('%d,%d d _', b, e)
1507 if b > winheight('.')
1508 let b = 4
1509 endif
1510 else
1511 let b = 4
1512 endif
1513 " FIXME For some reason, nomodifiable is set after :d in vim8
1514 setlocal modifiable
1515 call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
1516 call s:switch_out()
1517 endif
1518endfunction
1519
1520function! s:update_vim()
1521 let s:jobs = {}
1522
1523 call s:bar()
1524 call s:tick()
1525endfunction
1526
1527function! s:tick()
1528 let pull = s:update.pull
1529 let prog = s:progress_opt(s:nvim || s:vim8)
1530while 1 " Without TCO, Vim stack is bound to explode
1531 if empty(s:update.todo)
1532 if empty(s:jobs) && !s:update.fin
1533 call s:update_finish()
1534 let s:update.fin = 1
1535 endif
1536 return
1537 endif
1538
1539 let name = keys(s:update.todo)[0]
1540 let spec = remove(s:update.todo, name)
1541 let new = empty(globpath(spec.dir, '.git', 1))
1542
1543 call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
1544 redraw
1545
1546 let has_tag = has_key(spec, 'tag')
1547 if !new
1548 let [error, _] = s:git_validate(spec, 0)
1549 if empty(error)
1550 if pull
1551 let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
1552 if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
1553 call extend(cmd, ['--depth', '99999999'])
1554 endif
1555 if !empty(prog)
1556 call add(cmd, prog)
1557 endif
1558 call s:spawn(name, cmd, { 'dir': spec.dir })
1559 else
1560 let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
1561 endif
1562 else
1563 let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
1564 endif
1565 else
1566 let cmd = ['git', 'clone']
1567 if !has_tag
1568 call extend(cmd, s:clone_opt)
1569 endif
1570 if !empty(prog)
1571 call add(cmd, prog)
1572 endif
1573 call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
1574 endif
1575
1576 if !s:jobs[name].running
1577 call s:reap(name)
1578 endif
1579 if len(s:jobs) >= s:update.threads
1580 break
1581 endif
1582endwhile
1583endfunction
1584
1585function! s:update_python()
1586let py_exe = has('python') ? 'python' : 'python3'
1587execute py_exe "<< EOF"
1588import datetime
1589import functools
1590import os
1591try:
1592 import queue
1593except ImportError:
1594 import Queue as queue
1595import random
1596import re
1597import shutil
1598import signal
1599import subprocess
1600import tempfile
1601import threading as thr
1602import time
1603import traceback
1604import vim
1605
1606G_NVIM = vim.eval("has('nvim')") == '1'
1607G_PULL = vim.eval('s:update.pull') == '1'
1608G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
1609G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
1610G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
1611G_PROGRESS = vim.eval('s:progress_opt(1)')
1612G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
1613G_STOP = thr.Event()
1614G_IS_WIN = vim.eval('s:is_win') == '1'
1615
1616class PlugError(Exception):
1617 def __init__(self, msg):
1618 self.msg = msg
1619class CmdTimedOut(PlugError):
1620 pass
1621class CmdFailed(PlugError):
1622 pass
1623class InvalidURI(PlugError):
1624 pass
1625class Action(object):
1626 INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
1627
1628class Buffer(object):
1629 def __init__(self, lock, num_plugs, is_pull):
1630 self.bar = ''
1631 self.event = 'Updating' if is_pull else 'Installing'
1632 self.lock = lock
1633 self.maxy = int(vim.eval('winheight(".")'))
1634 self.num_plugs = num_plugs
1635
1636 def __where(self, name):
1637 """ Find first line with name in current buffer. Return line num. """
1638 found, lnum = False, 0
1639 matcher = re.compile('^[-+x*] {0}:'.format(name))
1640 for line in vim.current.buffer:
1641 if matcher.search(line) is not None:
1642 found = True
1643 break
1644 lnum += 1
1645
1646 if not found:
1647 lnum = -1
1648 return lnum
1649
1650 def header(self):
1651 curbuf = vim.current.buffer
1652 curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
1653
1654 num_spaces = self.num_plugs - len(self.bar)
1655 curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
1656
1657 with self.lock:
1658 vim.command('normal! 2G')
1659 vim.command('redraw')
1660
1661 def write(self, action, name, lines):
1662 first, rest = lines[0], lines[1:]
1663 msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
1664 msg.extend([' ' + line for line in rest])
1665
1666 try:
1667 if action == Action.ERROR:
1668 self.bar += 'x'
1669 vim.command("call add(s:update.errors, '{0}')".format(name))
1670 elif action == Action.DONE:
1671 self.bar += '='
1672
1673 curbuf = vim.current.buffer
1674 lnum = self.__where(name)
1675 if lnum != -1: # Found matching line num
1676 del curbuf[lnum]
1677 if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
1678 lnum = 3
1679 else:
1680 lnum = 3
1681 curbuf.append(msg, lnum)
1682
1683 self.header()
1684 except vim.error:
1685 pass
1686
1687class Command(object):
1688 CD = 'cd /d' if G_IS_WIN else 'cd'
1689
1690 def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
1691 self.cmd = cmd
1692 if cmd_dir:
1693 self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
1694 self.timeout = timeout
1695 self.callback = cb if cb else (lambda msg: None)
1696 self.clean = clean if clean else (lambda: None)
1697 self.proc = None
1698
1699 @property
1700 def alive(self):
1701 """ Returns true only if command still running. """
1702 return self.proc and self.proc.poll() is None
1703
1704 def execute(self, ntries=3):
1705 """ Execute the command with ntries if CmdTimedOut.
1706 Returns the output of the command if no Exception.
1707 """
1708 attempt, finished, limit = 0, False, self.timeout
1709
1710 while not finished:
1711 try:
1712 attempt += 1
1713 result = self.try_command()
1714 finished = True
1715 return result
1716 except CmdTimedOut:
1717 if attempt != ntries:
1718 self.notify_retry()
1719 self.timeout += limit
1720 else:
1721 raise
1722
1723 def notify_retry(self):
1724 """ Retry required for command, notify user. """
1725 for count in range(3, 0, -1):
1726 if G_STOP.is_set():
1727 raise KeyboardInterrupt
1728 msg = 'Timeout. Will retry in {0} second{1} ...'.format(
1729 count, 's' if count != 1 else '')
1730 self.callback([msg])
1731 time.sleep(1)
1732 self.callback(['Retrying ...'])
1733
1734 def try_command(self):
1735 """ Execute a cmd & poll for callback. Returns list of output.
1736 Raises CmdFailed -> return code for Popen isn't 0
1737 Raises CmdTimedOut -> command exceeded timeout without new output
1738 """
1739 first_line = True
1740
1741 try:
1742 tfile = tempfile.NamedTemporaryFile(mode='w+b')
1743 preexec_fn = not G_IS_WIN and os.setsid or None
1744 self.proc = subprocess.Popen(self.cmd, stdout=tfile,
1745 stderr=subprocess.STDOUT,
1746 stdin=subprocess.PIPE, shell=True,
1747 preexec_fn=preexec_fn)
1748 thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
1749 thrd.start()
1750
1751 thread_not_started = True
1752 while thread_not_started:
1753 try:
1754 thrd.join(0.1)
1755 thread_not_started = False
1756 except RuntimeError:
1757 pass
1758
1759 while self.alive:
1760 if G_STOP.is_set():
1761 raise KeyboardInterrupt
1762
1763 if first_line or random.random() < G_LOG_PROB:
1764 first_line = False
1765 line = '' if G_IS_WIN else nonblock_read(tfile.name)
1766 if line:
1767 self.callback([line])
1768
1769 time_diff = time.time() - os.path.getmtime(tfile.name)
1770 if time_diff > self.timeout:
1771 raise CmdTimedOut(['Timeout!'])
1772
1773 thrd.join(0.5)
1774
1775 tfile.seek(0)
1776 result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
1777
1778 if self.proc.returncode != 0:
1779 raise CmdFailed([''] + result)
1780
1781 return result
1782 except:
1783 self.terminate()
1784 raise
1785
1786 def terminate(self):
1787 """ Terminate process and cleanup. """
1788 if self.alive:
1789 if G_IS_WIN:
1790 os.kill(self.proc.pid, signal.SIGINT)
1791 else:
1792 os.killpg(self.proc.pid, signal.SIGTERM)
1793 self.clean()
1794
1795class Plugin(object):
1796 def __init__(self, name, args, buf_q, lock):
1797 self.name = name
1798 self.args = args
1799 self.buf_q = buf_q
1800 self.lock = lock
1801 self.tag = args.get('tag', 0)
1802
1803 def manage(self):
1804 try:
1805 if os.path.exists(self.args['dir']):
1806 self.update()
1807 else:
1808 self.install()
1809 with self.lock:
1810 thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
1811 except PlugError as exc:
1812 self.write(Action.ERROR, self.name, exc.msg)
1813 except KeyboardInterrupt:
1814 G_STOP.set()
1815 self.write(Action.ERROR, self.name, ['Interrupted!'])
1816 except:
1817 # Any exception except those above print stack trace
1818 msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
1819 self.write(Action.ERROR, self.name, msg.split('\n'))
1820 raise
1821
1822 def install(self):
1823 target = self.args['dir']
1824 if target[-1] == '\\':
1825 target = target[0:-1]
1826
1827 def clean(target):
1828 def _clean():
1829 try:
1830 shutil.rmtree(target)
1831 except OSError:
1832 pass
1833 return _clean
1834
1835 self.write(Action.INSTALL, self.name, ['Installing ...'])
1836 callback = functools.partial(self.write, Action.INSTALL, self.name)
1837 cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
1838 '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
1839 esc(target))
1840 com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
1841 result = com.execute(G_RETRIES)
1842 self.write(Action.DONE, self.name, result[-1:])
1843
1844 def repo_uri(self):
1845 cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
1846 command = Command(cmd, self.args['dir'], G_TIMEOUT,)
1847 result = command.execute(G_RETRIES)
1848 return result[-1]
1849
1850 def update(self):
1851 actual_uri = self.repo_uri()
1852 expect_uri = self.args['uri']
1853 regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
1854 ma = regex.match(actual_uri)
1855 mb = regex.match(expect_uri)
1856 if ma is None or mb is None or ma.groups() != mb.groups():
1857 msg = ['',
1858 'Invalid URI: {0}'.format(actual_uri),
1859 'Expected {0}'.format(expect_uri),
1860 'PlugClean required.']
1861 raise InvalidURI(msg)
1862
1863 if G_PULL:
1864 self.write(Action.UPDATE, self.name, ['Updating ...'])
1865 callback = functools.partial(self.write, Action.UPDATE, self.name)
1866 fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
1867 cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
1868 com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
1869 result = com.execute(G_RETRIES)
1870 self.write(Action.DONE, self.name, result[-1:])
1871 else:
1872 self.write(Action.DONE, self.name, ['Already installed'])
1873
1874 def write(self, action, name, msg):
1875 self.buf_q.put((action, name, msg))
1876
1877class PlugThread(thr.Thread):
1878 def __init__(self, tname, args):
1879 super(PlugThread, self).__init__()
1880 self.tname = tname
1881 self.args = args
1882
1883 def run(self):
1884 thr.current_thread().name = self.tname
1885 buf_q, work_q, lock = self.args
1886
1887 try:
1888 while not G_STOP.is_set():
1889 name, args = work_q.get_nowait()
1890 plug = Plugin(name, args, buf_q, lock)
1891 plug.manage()
1892 work_q.task_done()
1893 except queue.Empty:
1894 pass
1895
1896class RefreshThread(thr.Thread):
1897 def __init__(self, lock):
1898 super(RefreshThread, self).__init__()
1899 self.lock = lock
1900 self.running = True
1901
1902 def run(self):
1903 while self.running:
1904 with self.lock:
1905 thread_vim_command('noautocmd normal! a')
1906 time.sleep(0.33)
1907
1908 def stop(self):
1909 self.running = False
1910
1911if G_NVIM:
1912 def thread_vim_command(cmd):
1913 vim.session.threadsafe_call(lambda: vim.command(cmd))
1914else:
1915 def thread_vim_command(cmd):
1916 vim.command(cmd)
1917
1918def esc(name):
1919 return '"' + name.replace('"', '\"') + '"'
1920
1921def nonblock_read(fname):
1922 """ Read a file with nonblock flag. Return the last line. """
1923 fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
1924 buf = os.read(fread, 100000).decode('utf-8', 'replace')
1925 os.close(fread)
1926
1927 line = buf.rstrip('\r\n')
1928 left = max(line.rfind('\r'), line.rfind('\n'))
1929 if left != -1:
1930 left += 1
1931 line = line[left:]
1932
1933 return line
1934
1935def main():
1936 thr.current_thread().name = 'main'
1937 nthreads = int(vim.eval('s:update.threads'))
1938 plugs = vim.eval('s:update.todo')
1939 mac_gui = vim.eval('s:mac_gui') == '1'
1940
1941 lock = thr.Lock()
1942 buf = Buffer(lock, len(plugs), G_PULL)
1943 buf_q, work_q = queue.Queue(), queue.Queue()
1944 for work in plugs.items():
1945 work_q.put(work)
1946
1947 start_cnt = thr.active_count()
1948 for num in range(nthreads):
1949 tname = 'PlugT-{0:02}'.format(num)
1950 thread = PlugThread(tname, (buf_q, work_q, lock))
1951 thread.start()
1952 if mac_gui:
1953 rthread = RefreshThread(lock)
1954 rthread.start()
1955
1956 while not buf_q.empty() or thr.active_count() != start_cnt:
1957 try:
1958 action, name, msg = buf_q.get(True, 0.25)
1959 buf.write(action, name, ['OK'] if not msg else msg)
1960 buf_q.task_done()
1961 except queue.Empty:
1962 pass
1963 except KeyboardInterrupt:
1964 G_STOP.set()
1965
1966 if mac_gui:
1967 rthread.stop()
1968 rthread.join()
1969
1970main()
1971EOF
1972endfunction
1973
1974function! s:update_ruby()
1975 ruby << EOF
1976 module PlugStream
1977 SEP = ["\r", "\n", nil]
1978 def get_line
1979 buffer = ''
1980 loop do
1981 char = readchar rescue return
1982 if SEP.include? char.chr
1983 buffer << $/
1984 break
1985 else
1986 buffer << char
1987 end
1988 end
1989 buffer
1990 end
1991 end unless defined?(PlugStream)
1992
1993 def esc arg
1994 %["#{arg.gsub('"', '\"')}"]
1995 end
1996
1997 def killall pid
1998 pids = [pid]
1999 if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
2000 pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
2001 else
2002 unless `which pgrep 2> /dev/null`.empty?
2003 children = pids
2004 until children.empty?
2005 children = children.map { |pid|
2006 `pgrep -P #{pid}`.lines.map { |l| l.chomp }
2007 }.flatten
2008 pids += children
2009 end
2010 end
2011 pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
2012 end
2013 end
2014
2015 def compare_git_uri a, b
2016 regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
2017 regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
2018 end
2019
2020 require 'thread'
2021 require 'fileutils'
2022 require 'timeout'
2023 running = true
2024 iswin = VIM::evaluate('s:is_win').to_i == 1
2025 pull = VIM::evaluate('s:update.pull').to_i == 1
2026 base = VIM::evaluate('g:plug_home')
2027 all = VIM::evaluate('s:update.todo')
2028 limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
2029 tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
2030 nthr = VIM::evaluate('s:update.threads').to_i
2031 maxy = VIM::evaluate('winheight(".")').to_i
2032 vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
2033 cd = iswin ? 'cd /d' : 'cd'
2034 tot = VIM::evaluate('len(s:update.todo)') || 0
2035 bar = ''
2036 skip = 'Already installed'
2037 mtx = Mutex.new
2038 take1 = proc { mtx.synchronize { running && all.shift } }
2039 logh = proc {
2040 cnt = bar.length
2041 $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
2042 $curbuf[2] = '[' + bar.ljust(tot) + ']'
2043 VIM::command('normal! 2G')
2044 VIM::command('redraw')
2045 }
2046 where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
2047 log = proc { |name, result, type|
2048 mtx.synchronize do
2049 ing = ![true, false].include?(type)
2050 bar += type ? '=' : 'x' unless ing
2051 b = case type
2052 when :install then '+' when :update then '*'
2053 when true, nil then '-' else
2054 VIM::command("call add(s:update.errors, '#{name}')")
2055 'x'
2056 end
2057 result =
2058 if type || type.nil?
2059 ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
2060 elsif result =~ /^Interrupted|^Timeout/
2061 ["#{b} #{name}: #{result}"]
2062 else
2063 ["#{b} #{name}"] + result.lines.map { |l| " " << l }
2064 end
2065 if lnum = where.call(name)
2066 $curbuf.delete lnum
2067 lnum = 4 if ing && lnum > maxy
2068 end
2069 result.each_with_index do |line, offset|
2070 $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
2071 end
2072 logh.call
2073 end
2074 }
2075 bt = proc { |cmd, name, type, cleanup|
2076 tried = timeout = 0
2077 begin
2078 tried += 1
2079 timeout += limit
2080 fd = nil
2081 data = ''
2082 if iswin
2083 Timeout::timeout(timeout) do
2084 tmp = VIM::evaluate('tempname()')
2085 system("(#{cmd}) > #{tmp}")
2086 data = File.read(tmp).chomp
2087 File.unlink tmp rescue nil
2088 end
2089 else
2090 fd = IO.popen(cmd).extend(PlugStream)
2091 first_line = true
2092 log_prob = 1.0 / nthr
2093 while line = Timeout::timeout(timeout) { fd.get_line }
2094 data << line
2095 log.call name, line.chomp, type if name && (first_line || rand < log_prob)
2096 first_line = false
2097 end
2098 fd.close
2099 end
2100 [$? == 0, data.chomp]
2101 rescue Timeout::Error, Interrupt => e
2102 if fd && !fd.closed?
2103 killall fd.pid
2104 fd.close
2105 end
2106 cleanup.call if cleanup
2107 if e.is_a?(Timeout::Error) && tried < tries
2108 3.downto(1) do |countdown|
2109 s = countdown > 1 ? 's' : ''
2110 log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
2111 sleep 1
2112 end
2113 log.call name, 'Retrying ...', type
2114 retry
2115 end
2116 [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
2117 end
2118 }
2119 main = Thread.current
2120 threads = []
2121 watcher = Thread.new {
2122 if vim7
2123 while VIM::evaluate('getchar(1)')
2124 sleep 0.1
2125 end
2126 else
2127 require 'io/console' # >= Ruby 1.9
2128 nil until IO.console.getch == 3.chr
2129 end
2130 mtx.synchronize do
2131 running = false
2132 threads.each { |t| t.raise Interrupt } unless vim7
2133 end
2134 threads.each { |t| t.join rescue nil }
2135 main.kill
2136 }
2137 refresh = Thread.new {
2138 while true
2139 mtx.synchronize do
2140 break unless running
2141 VIM::command('noautocmd normal! a')
2142 end
2143 sleep 0.2
2144 end
2145 } if VIM::evaluate('s:mac_gui') == 1
2146
2147 clone_opt = VIM::evaluate('s:clone_opt').join(' ')
2148 progress = VIM::evaluate('s:progress_opt(1)')
2149 nthr.times do
2150 mtx.synchronize do
2151 threads << Thread.new {
2152 while pair = take1.call
2153 name = pair.first
2154 dir, uri, tag = pair.last.values_at *%w[dir uri tag]
2155 exists = File.directory? dir
2156 ok, result =
2157 if exists
2158 chdir = "#{cd} #{iswin ? dir : esc(dir)}"
2159 ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
2160 current_uri = data.lines.to_a.last
2161 if !ret
2162 if data =~ /^Interrupted|^Timeout/
2163 [false, data]
2164 else
2165 [false, [data.chomp, "PlugClean required."].join($/)]
2166 end
2167 elsif !compare_git_uri(current_uri, uri)
2168 [false, ["Invalid URI: #{current_uri}",
2169 "Expected: #{uri}",
2170 "PlugClean required."].join($/)]
2171 else
2172 if pull
2173 log.call name, 'Updating ...', :update
2174 fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
2175 bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
2176 else
2177 [true, skip]
2178 end
2179 end
2180 else
2181 d = esc dir.sub(%r{[\\/]+$}, '')
2182 log.call name, 'Installing ...', :install
2183 bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
2184 FileUtils.rm_rf dir
2185 }
2186 end
2187 mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
2188 log.call name, result, ok
2189 end
2190 } if running
2191 end
2192 end
2193 threads.each { |t| t.join rescue nil }
2194 logh.call
2195 refresh.kill if refresh
2196 watcher.kill
2197EOF
2198endfunction
2199
2200function! s:shellesc_cmd(arg, script)
2201 let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
2202 return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
2203endfunction
2204
2205function! s:shellesc_ps1(arg)
2206 return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
2207endfunction
2208
2209function! s:shellesc_sh(arg)
2210 return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
2211endfunction
2212
2213" Escape the shell argument based on the shell.
2214" Vim and Neovim's shellescape() are insufficient.
2215" 1. shellslash determines whether to use single/double quotes.
2216" Double-quote escaping is fragile for cmd.exe.
2217" 2. It does not work for powershell.
2218" 3. It does not work for *sh shells if the command is executed
2219" via cmd.exe (ie. cmd.exe /c sh -c command command_args)
2220" 4. It does not support batchfile syntax.
2221"
2222" Accepts an optional dictionary with the following keys:
2223" - shell: same as Vim/Neovim 'shell' option.
2224" If unset, fallback to 'cmd.exe' on Windows or 'sh'.
2225" - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
2226function! plug#shellescape(arg, ...)
2227 if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
2228 return a:arg
2229 endif
2230 let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
2231 let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
2232 let script = get(opts, 'script', 1)
2233 if shell =~# 'cmd\(\.exe\)\?$'
2234 return s:shellesc_cmd(a:arg, script)
2235 elseif s:is_powershell(shell)
2236 return s:shellesc_ps1(a:arg)
2237 endif
2238 return s:shellesc_sh(a:arg)
2239endfunction
2240
2241function! s:glob_dir(path)
2242 return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
2243endfunction
2244
2245function! s:progress_bar(line, bar, total)
2246 call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
2247endfunction
2248
2249function! s:compare_git_uri(a, b)
2250 " See `git help clone'
2251 " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
2252 " [git@] github.com[:port] : junegunn/vim-plug [.git]
2253 " file:// / junegunn/vim-plug [/]
2254 " / junegunn/vim-plug [/]
2255 let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
2256 let ma = matchlist(a:a, pat)
2257 let mb = matchlist(a:b, pat)
2258 return ma[1:2] ==# mb[1:2]
2259endfunction
2260
2261function! s:format_message(bullet, name, message)
2262 if a:bullet != 'x'
2263 return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
2264 else
2265 let lines = map(s:lines(a:message), '" ".v:val')
2266 return extend([printf('x %s:', a:name)], lines)
2267 endif
2268endfunction
2269
2270function! s:with_cd(cmd, dir, ...)
2271 let script = a:0 > 0 ? a:1 : 1
2272 return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
2273endfunction
2274
2275function! s:system(cmd, ...)
2276 let batchfile = ''
2277 try
2278 let [sh, shellcmdflag, shrd] = s:chsh(1)
2279 if type(a:cmd) == s:TYPE.list
2280 " Neovim's system() supports list argument to bypass the shell
2281 " but it cannot set the working directory for the command.
2282 " Assume that the command does not rely on the shell.
2283 if has('nvim') && a:0 == 0
2284 return system(a:cmd)
2285 endif
2286 let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
2287 if s:is_powershell(&shell)
2288 let cmd = '& ' . cmd
2289 endif
2290 else
2291 let cmd = a:cmd
2292 endif
2293 if a:0 > 0
2294 let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
2295 endif
2296 if s:is_win && type(a:cmd) != s:TYPE.list
2297 let [batchfile, cmd] = s:batchfile(cmd)
2298 endif
2299 return system(cmd)
2300 finally
2301 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
2302 if s:is_win && filereadable(batchfile)
2303 call delete(batchfile)
2304 endif
2305 endtry
2306endfunction
2307
2308function! s:system_chomp(...)
2309 let ret = call('s:system', a:000)
2310 return v:shell_error ? '' : substitute(ret, '\n$', '', '')
2311endfunction
2312
2313function! s:git_validate(spec, check_branch)
2314 let err = ''
2315 if isdirectory(a:spec.dir)
2316 let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
2317 let remote = result[-1]
2318 if empty(remote)
2319 let err = join([remote, 'PlugClean required.'], "\n")
2320 elseif !s:compare_git_uri(remote, a:spec.uri)
2321 let err = join(['Invalid URI: '.remote,
2322 \ 'Expected: '.a:spec.uri,
2323 \ 'PlugClean required.'], "\n")
2324 elseif a:check_branch && has_key(a:spec, 'commit')
2325 let sha = s:git_revision(a:spec.dir)
2326 if empty(sha)
2327 let err = join(add(result, 'PlugClean required.'), "\n")
2328 elseif !s:hash_match(sha, a:spec.commit)
2329 let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
2330 \ a:spec.commit[:6], sha[:6]),
2331 \ 'PlugUpdate required.'], "\n")
2332 endif
2333 elseif a:check_branch
2334 let current_branch = result[0]
2335 " Check tag
2336 let origin_branch = s:git_origin_branch(a:spec)
2337 if has_key(a:spec, 'tag')
2338 let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
2339 if a:spec.tag !=# tag && a:spec.tag !~ '\*'
2340 let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
2341 \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
2342 endif
2343 " Check branch
2344 elseif origin_branch !=# current_branch
2345 let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
2346 \ current_branch, origin_branch)
2347 endif
2348 if empty(err)
2349 let [ahead, behind] = split(s:lastline(s:system([
2350 \ 'git', 'rev-list', '--count', '--left-right',
2351 \ printf('HEAD...origin/%s', origin_branch)
2352 \ ], a:spec.dir)), '\t')
2353 if !v:shell_error && ahead
2354 if behind
2355 " Only mention PlugClean if diverged, otherwise it's likely to be
2356 " pushable (and probably not that messed up).
2357 let err = printf(
2358 \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
2359 \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
2360 else
2361 let err = printf("Ahead of origin/%s by %d commit(s).\n"
2362 \ .'Cannot update until local changes are pushed.',
2363 \ origin_branch, ahead)
2364 endif
2365 endif
2366 endif
2367 endif
2368 else
2369 let err = 'Not found'
2370 endif
2371 return [err, err =~# 'PlugClean']
2372endfunction
2373
2374function! s:rm_rf(dir)
2375 if isdirectory(a:dir)
2376 return s:system(s:is_win
2377 \ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
2378 \ : ['rm', '-rf', a:dir])
2379 endif
2380endfunction
2381
2382function! s:clean(force)
2383 call s:prepare()
2384 call append(0, 'Searching for invalid plugins in '.g:plug_home)
2385 call append(1, '')
2386
2387 " List of valid directories
2388 let dirs = []
2389 let errs = {}
2390 let [cnt, total] = [0, len(g:plugs)]
2391 for [name, spec] in items(g:plugs)
2392 if !s:is_managed(name)
2393 call add(dirs, spec.dir)
2394 else
2395 let [err, clean] = s:git_validate(spec, 1)
2396 if clean
2397 let errs[spec.dir] = s:lines(err)[0]
2398 else
2399 call add(dirs, spec.dir)
2400 endif
2401 endif
2402 let cnt += 1
2403 call s:progress_bar(2, repeat('=', cnt), total)
2404 normal! 2G
2405 redraw
2406 endfor
2407
2408 let allowed = {}
2409 for dir in dirs
2410 let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
2411 let allowed[dir] = 1
2412 for child in s:glob_dir(dir)
2413 let allowed[child] = 1
2414 endfor
2415 endfor
2416
2417 let todo = []
2418 let found = sort(s:glob_dir(g:plug_home))
2419 while !empty(found)
2420 let f = remove(found, 0)
2421 if !has_key(allowed, f) && isdirectory(f)
2422 call add(todo, f)
2423 call append(line('$'), '- ' . f)
2424 if has_key(errs, f)
2425 call append(line('$'), ' ' . errs[f])
2426 endif
2427 let found = filter(found, 'stridx(v:val, f) != 0')
2428 end
2429 endwhile
2430
2431 4
2432 redraw
2433 if empty(todo)
2434 call append(line('$'), 'Already clean.')
2435 else
2436 let s:clean_count = 0
2437 call append(3, ['Directories to delete:', ''])
2438 redraw!
2439 if a:force || s:ask_no_interrupt('Delete all directories?')
2440 call s:delete([6, line('$')], 1)
2441 else
2442 call setline(4, 'Cancelled.')
2443 nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
2444 nmap <silent> <buffer> dd d_
2445 xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
2446 echo 'Delete the lines (d{motion}) to delete the corresponding directories'
2447 endif
2448 endif
2449 4
2450 setlocal nomodifiable
2451endfunction
2452
2453function! s:delete_op(type, ...)
2454 call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
2455endfunction
2456
2457function! s:delete(range, force)
2458 let [l1, l2] = a:range
2459 let force = a:force
2460 let err_count = 0
2461 while l1 <= l2
2462 let line = getline(l1)
2463 if line =~ '^- ' && isdirectory(line[2:])
2464 execute l1
2465 redraw!
2466 let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
2467 let force = force || answer > 1
2468 if answer
2469 let err = s:rm_rf(line[2:])
2470 setlocal modifiable
2471 if empty(err)
2472 call setline(l1, '~'.line[1:])
2473 let s:clean_count += 1
2474 else
2475 delete _
2476 call append(l1 - 1, s:format_message('x', line[1:], err))
2477 let l2 += len(s:lines(err))
2478 let err_count += 1
2479 endif
2480 let msg = printf('Removed %d directories.', s:clean_count)
2481 if err_count > 0
2482 let msg .= printf(' Failed to remove %d directories.', err_count)
2483 endif
2484 call setline(4, msg)
2485 setlocal nomodifiable
2486 endif
2487 endif
2488 let l1 += 1
2489 endwhile
2490endfunction
2491
2492function! s:upgrade()
2493 echo 'Downloading the latest version of vim-plug'
2494 redraw
2495 let tmp = s:plug_tempname()
2496 let new = tmp . '/plug.vim'
2497
2498 try
2499 let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
2500 if v:shell_error
2501 return s:err('Error upgrading vim-plug: '. out)
2502 endif
2503
2504 if readfile(s:me) ==# readfile(new)
2505 echo 'vim-plug is already up-to-date'
2506 return 0
2507 else
2508 call rename(s:me, s:me . '.old')
2509 call rename(new, s:me)
2510 unlet g:loaded_plug
2511 echo 'vim-plug has been upgraded'
2512 return 1
2513 endif
2514 finally
2515 silent! call s:rm_rf(tmp)
2516 endtry
2517endfunction
2518
2519function! s:upgrade_specs()
2520 for spec in values(g:plugs)
2521 let spec.frozen = get(spec, 'frozen', 0)
2522 endfor
2523endfunction
2524
2525function! s:status()
2526 call s:prepare()
2527 call append(0, 'Checking plugins')
2528 call append(1, '')
2529
2530 let ecnt = 0
2531 let unloaded = 0
2532 let [cnt, total] = [0, len(g:plugs)]
2533 for [name, spec] in items(g:plugs)
2534 let is_dir = isdirectory(spec.dir)
2535 if has_key(spec, 'uri')
2536 if is_dir
2537 let [err, _] = s:git_validate(spec, 1)
2538 let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
2539 else
2540 let [valid, msg] = [0, 'Not found. Try PlugInstall.']
2541 endif
2542 else
2543 if is_dir
2544 let [valid, msg] = [1, 'OK']
2545 else
2546 let [valid, msg] = [0, 'Not found.']
2547 endif
2548 endif
2549 let cnt += 1
2550 let ecnt += !valid
2551 " `s:loaded` entry can be missing if PlugUpgraded
2552 if is_dir && get(s:loaded, name, -1) == 0
2553 let unloaded = 1
2554 let msg .= ' (not loaded)'
2555 endif
2556 call s:progress_bar(2, repeat('=', cnt), total)
2557 call append(3, s:format_message(valid ? '-' : 'x', name, msg))
2558 normal! 2G
2559 redraw
2560 endfor
2561 call setline(1, 'Finished. '.ecnt.' error(s).')
2562 normal! gg
2563 setlocal nomodifiable
2564 if unloaded
2565 echo "Press 'L' on each line to load plugin, or 'U' to update"
2566 nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
2567 xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
2568 end
2569endfunction
2570
2571function! s:extract_name(str, prefix, suffix)
2572 return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
2573endfunction
2574
2575function! s:status_load(lnum)
2576 let line = getline(a:lnum)
2577 let name = s:extract_name(line, '-', '(not loaded)')
2578 if !empty(name)
2579 call plug#load(name)
2580 setlocal modifiable
2581 call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
2582 setlocal nomodifiable
2583 endif
2584endfunction
2585
2586function! s:status_update() range
2587 let lines = getline(a:firstline, a:lastline)
2588 let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
2589 if !empty(names)
2590 echo
2591 execute 'PlugUpdate' join(names)
2592 endif
2593endfunction
2594
2595function! s:is_preview_window_open()
2596 silent! wincmd P
2597 if &previewwindow
2598 wincmd p
2599 return 1
2600 endif
2601endfunction
2602
2603function! s:find_name(lnum)
2604 for lnum in reverse(range(1, a:lnum))
2605 let line = getline(lnum)
2606 if empty(line)
2607 return ''
2608 endif
2609 let name = s:extract_name(line, '-', '')
2610 if !empty(name)
2611 return name
2612 endif
2613 endfor
2614 return ''
2615endfunction
2616
2617function! s:preview_commit()
2618 if b:plug_preview < 0
2619 let b:plug_preview = !s:is_preview_window_open()
2620 endif
2621
2622 let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
2623 if empty(sha)
2624 let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
2625 if empty(name)
2626 return
2627 endif
2628 let title = 'HEAD@{1}..'
2629 let command = 'git diff --no-color HEAD@{1}'
2630 else
2631 let title = sha
2632 let command = 'git show --no-color --pretty=medium '.sha
2633 let name = s:find_name(line('.'))
2634 endif
2635
2636 if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
2637 return
2638 endif
2639
2640 if exists('g:plug_pwindow') && !s:is_preview_window_open()
2641 execute g:plug_pwindow
2642 execute 'e' title
2643 else
2644 execute 'pedit' title
2645 wincmd P
2646 endif
2647 setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
2648 let batchfile = ''
2649 try
2650 let [sh, shellcmdflag, shrd] = s:chsh(1)
2651 let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
2652 if s:is_win
2653 let [batchfile, cmd] = s:batchfile(cmd)
2654 endif
2655 execute 'silent %!' cmd
2656 finally
2657 let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
2658 if s:is_win && filereadable(batchfile)
2659 call delete(batchfile)
2660 endif
2661 endtry
2662 setlocal nomodifiable
2663 nnoremap <silent> <buffer> q :q<cr>
2664 wincmd p
2665endfunction
2666
2667function! s:section(flags)
2668 call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
2669endfunction
2670
2671function! s:format_git_log(line)
2672 let indent = ' '
2673 let tokens = split(a:line, nr2char(1))
2674 if len(tokens) != 5
2675 return indent.substitute(a:line, '\s*$', '', '')
2676 endif
2677 let [graph, sha, refs, subject, date] = tokens
2678 let tag = matchstr(refs, 'tag: [^,)]\+')
2679 let tag = empty(tag) ? ' ' : ' ('.tag.') '
2680 return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
2681endfunction
2682
2683function! s:append_ul(lnum, text)
2684 call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
2685endfunction
2686
2687function! s:diff()
2688 call s:prepare()
2689 call append(0, ['Collecting changes ...', ''])
2690 let cnts = [0, 0]
2691 let bar = ''
2692 let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
2693 call s:progress_bar(2, bar, len(total))
2694 for origin in [1, 0]
2695 let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
2696 if empty(plugs)
2697 continue
2698 endif
2699 call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
2700 for [k, v] in plugs
2701 let branch = s:git_origin_branch(v)
2702 if len(branch)
2703 let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
2704 let cmd = ['git', 'log', '--graph', '--color=never']
2705 if s:git_version_requirement(2, 10, 0)
2706 call add(cmd, '--no-show-signature')
2707 endif
2708 call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
2709 if has_key(v, 'rtp')
2710 call extend(cmd, ['--', v.rtp])
2711 endif
2712 let diff = s:system_chomp(cmd, v.dir)
2713 if !empty(diff)
2714 let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
2715 call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
2716 let cnts[origin] += 1
2717 endif
2718 endif
2719 let bar .= '='
2720 call s:progress_bar(2, bar, len(total))
2721 normal! 2G
2722 redraw
2723 endfor
2724 if !cnts[origin]
2725 call append(5, ['', 'N/A'])
2726 endif
2727 endfor
2728 call setline(1, printf('%d plugin(s) updated.', cnts[0])
2729 \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
2730
2731 if cnts[0] || cnts[1]
2732 nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
2733 if empty(maparg("\<cr>", 'n'))
2734 nmap <buffer> <cr> <plug>(plug-preview)
2735 endif
2736 if empty(maparg('o', 'n'))
2737 nmap <buffer> o <plug>(plug-preview)
2738 endif
2739 endif
2740 if cnts[0]
2741 nnoremap <silent> <buffer> X :call <SID>revert()<cr>
2742 echo "Press 'X' on each block to revert the update"
2743 endif
2744 normal! gg
2745 setlocal nomodifiable
2746endfunction
2747
2748function! s:revert()
2749 if search('^Pending updates', 'bnW')
2750 return
2751 endif
2752
2753 let name = s:find_name(line('.'))
2754 if empty(name) || !has_key(g:plugs, name) ||
2755 \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
2756 return
2757 endif
2758
2759 call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
2760 setlocal modifiable
2761 normal! "_dap
2762 setlocal nomodifiable
2763 echo 'Reverted'
2764endfunction
2765
2766function! s:snapshot(force, ...) abort
2767 call s:prepare()
2768 setf vim
2769 call append(0, ['" Generated by vim-plug',
2770 \ '" '.strftime("%c"),
2771 \ '" :source this file in vim to restore the snapshot',
2772 \ '" or execute: vim -S snapshot.vim',
2773 \ '', '', 'PlugUpdate!'])
2774 1
2775 let anchor = line('$') - 3
2776 let names = sort(keys(filter(copy(g:plugs),
2777 \'has_key(v:val, "uri") && isdirectory(v:val.dir)')))
2778 for name in reverse(names)
2779 let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
2780 if !empty(sha)
2781 call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
2782 redraw
2783 endif
2784 endfor
2785
2786 if a:0 > 0
2787 let fn = s:plug_expand(a:1)
2788 if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
2789 return
2790 endif
2791 call writefile(getline(1, '$'), fn)
2792 echo 'Saved as '.a:1
2793 silent execute 'e' s:esc(fn)
2794 setf vim
2795 endif
2796endfunction
2797
2798function! s:split_rtp()
2799 return split(&rtp, '\\\@<!,')
2800endfunction
2801
2802let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
2803let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
2804
2805if exists('g:plugs')
2806 let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
2807 call s:upgrade_specs()
2808 call s:define_commands()
2809endif
2810
2811let &cpo = s:cpo_save
2812unlet s:cpo_save
diff --git a/home-config/spotify-player/app.toml b/home-config/spotify-player/app.toml
deleted file mode 100644
index 4eac5e4..0000000
--- a/home-config/spotify-player/app.toml
+++ /dev/null
@@ -1,34 +0,0 @@
1theme = "dracula"
2client_id = "4b1219bdc29945bc8ca914f80a8a6a47"
3client_port = 8888
4playback_format = """
5{track} • {artists}
6{album}
7{metadata}"""
8tracks_playback_limit = 50
9app_refresh_duration_in_ms = 32
10playback_refresh_duration_in_ms = 0
11cover_image_refresh_duration_in_ms = 2000
12page_size_in_rows = 20
13play_icon = "▶"
14pause_icon = "▌▌"
15liked_icon = "♥"
16border_type = "Plain"
17progress_bar_type = "Rectangle"
18playback_window_position = "Top"
19cover_img_length = 9
20cover_img_width = 5
21cover_img_scale = 1.0
22playback_window_width = 6
23enable_media_control = true
24enable_streaming = "DaemonOnly"
25enable_cover_image_cache = true
26default_device = "RyanThinkpad"
27
28[copy_command]
29command = "wlcopy"
30args = []
31
32[notify_format]
33summary = "{track} • {artists}"
34body = "{album}"
diff --git a/home-config/ssh/config b/home-config/ssh/config
deleted file mode 100644
index 90db93a..0000000
--- a/home-config/ssh/config
+++ /dev/null
@@ -1,24 +0,0 @@
1Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
2
3Host rocApex
4 HostName 129.158.232.104
5 User root
6
7Host linode
8 HostName 97.107.142.58
9 User root
10
11Host hetzner
12 HostName 5.161.207.21
13 User root
14
15Host rncorepub
16 Hostname 5.161.89.186
17 User root
18
19Host 192.168.216.1
20 HostkeyAlgorithms +ssh-rsa
21 PubkeyAcceptedAlgorithms +ssh-rsa
22
23Host *
24 KexAlgorithms -sntrup761x25519-sha512@openssh.com
diff --git a/home-config/tridactyl/native_main b/home-config/tridactyl/native_main
deleted file mode 100755
index 2104875..0000000
--- a/home-config/tridactyl/native_main
+++ /dev/null
Binary files differ
diff --git a/home-config/tridactyl/tridactyl.json b/home-config/tridactyl/tridactyl.json
deleted file mode 100644
index 0764f98..0000000
--- a/home-config/tridactyl/tridactyl.json
+++ /dev/null
@@ -1,7 +0,0 @@
1{
2 "name": "tridactyl",
3 "description": "Tridactyl native command handler",
4 "path": "/home/ryan/.local/share/tridactyl/native_main",
5 "type": "stdio",
6 "allowed_extensions": [ "tridactyl.vim@cmcaine.co.uk","tridactyl.vim.betas@cmcaine.co.uk", "tridactyl.vim.betas.nonewtab@cmcaine.co.uk" ]
7}
diff --git a/home-config/waybar/config b/home-config/waybar/config
deleted file mode 100644
index 62e6b20..0000000
--- a/home-config/waybar/config
+++ /dev/null
@@ -1,167 +0,0 @@
1{
2 "layer": "top",
3 "position": "top",
4 "height": 30,
5
6 "modules-left": ["hyprland/workspaces", "hyprland/submap"],
7 "modules-center": ["hyprland/window"],
8 "modules-right": ["tray", "custom/spotify", "privacy", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "battery#num2", "clock"],
9 "hyprland/submap": {
10 "format": " {}"
11 },
12 "hyprland/workspaces": {
13 "format": "{id}",
14 "all-outputs": false,
15 "disable-scroll": true
16 },
17 "hyprland/window": {
18 "max-length": 80,
19 "tooltip": false,
20 "separate-outputs": true
21 },
22 "clock": {
23 "format": "{:%a %d %b %H:%M}",
24 "tooltip": false
25 },
26 "battery": {
27 "format": "{capacity}% {icon}",
28 "format-alt": "{time} {icon}",
29 "format-icons": ["", "", "", "", ""],
30 "format-charging": "{capacity}% ",
31 "interval": 30,
32 "states": {
33 "warning": 25,
34 "critical": 10
35 },
36 "tooltip": false,
37 "bat":"BAT0"
38 },
39 "battery#num2": {
40 "format": "{capacity}% {icon}",
41 "format-alt": "{time} {icon}",
42 "format-icons": ["", "", "", "", ""],
43 "format-charging": "{capacity}% ",
44 "interval": 30,
45 "states": {
46 "warning": 25,
47 "critical": 10
48 },
49 "tooltip": false,
50 "bat":"BAT1"
51 },
52 "bluetooth": {
53 "format": "󰂯",
54 "format-disabled": "󰂲",
55 "format-connected": "󰂯",
56 "format-connected-battery": "󰂱 {device_battery_percentage}%",
57 "on-click": "foot bluetui",
58 "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
59 "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
60 "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
61 "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%"
62 },
63 "network": {
64 "format-alt": "{ipaddr}/{cidr} {icon} {bandwidthTotalBytes}󰹹",
65 "format": "{ipaddr}/{cidr} {icon}",
66 "format-alt-click": "click-right",
67 "format-icons": {
68 "wifi": ["󰤟", "󰤢" ,"󰤥", "󰤨"],
69 "ethernet": [""],
70 "disconnected": ["󰤭"]
71 },
72 "on-click": "foot -t alacritty doas nmtui",
73 "tooltip": false
74 },
75 "privacy": {
76 "icon-spacing":4,
77 "icon-size":18,
78 "transition-duration":250,
79 "modules": [
80 {
81 "type":"screenshare",
82 "tooltip":true,
83 "tooltip-icon-size":24
84 },
85 {
86 "type":"audio-in",
87 "tooltip":true,
88 "tooltip-icon-size":24
89 }
90 ]
91 },
92 "pulseaudio": {
93 "format-alt": "{icon}",
94 "format": "{volume} {icon}",
95 "format-alt-click": "click-right",
96 "format-muted": "",
97 "format-icons": {
98 "phone": [" ", " ", " ", " "],
99 "default": ["", "", "", ""]
100 },
101 "scroll-step": 1,
102 "on-click": "pavucontrol",
103 "tooltip": false
104 },
105 "custom/spotify": {
106 "interval": 2,
107 "return-type": "json",
108 "exec": "~/.config/waybar/modules/spotify.sh",
109 "exec-if": "~/.config/waybar/modules/check-for-music.sh",
110 "escape": true,
111 "on-click": "playerctl play-pause"
112 },
113 "custom/storage": {
114 "format-alt": "{} ",
115 "format": "{percentage}% ",
116 "format-alt-click": "click-right",
117 "return-type": "json",
118 "interval": 60,
119 "exec": "~/.config/waybar/modules/storage.sh"
120 },
121 "backlight": {
122 "format-alt": "{icon}",
123 "format": "{percent}% {icon}",
124 "format-alt-click": "click-right",
125 "format-icons": ["", ""],
126 "on-scroll-up": "light -A 1",
127 "on-scroll-down": "light -U 1"
128 },
129 "custom/weather_OLD": {
130 "format-alt": "{}",
131 "format": "{alt}: {}",
132 "format-alt-click": "click-right",
133 "interval": 1800,
134 "return-type": "json",
135 "on-click": "foot -a ala-wttr -H curl https://v2.wttr.in",
136 "exec": "~/.config/waybar/modules/weather.sh",
137 "exec-if": "ping wttr.in -c1"
138 },
139 "custom/weather": {
140 "format": "{} °F",
141 "tooltip": true,
142 "interval": 3600,
143 "exec": "exit=101; while [ $exit = 101 ]; do wttrbar --main-indicator temp_F --fahrenheit; exit=$(echo $?); sleep 1; done",
144 "on-click": "foot -a ala-wttr -H curl https://v2.wttr.in",
145 "return-type": "json"
146 },
147 "idle_inhibitor": {
148 "format": "{icon}",
149 "format-icons": {
150 "activated": "",
151 "deactivated": ""
152 },
153 "tooltip": false
154 },
155 "custom/mail": {
156 "format": "",
157 "format-alt": "{alt} ",
158 "format-alt-click": "click-right",
159 "interval": 60,
160 "return-type": "json",
161 "exec": "~/.config/waybar/modules/mail.py",
162 "tooltip": false
163 },
164 "tray": {
165 "icon-size": 18
166 }
167}
diff --git a/home-config/waybar/modules/check-for-music.sh b/home-config/waybar/modules/check-for-music.sh
deleted file mode 100755
index 3b735a2..0000000
--- a/home-config/waybar/modules/check-for-music.sh
+++ /dev/null
@@ -1,7 +0,0 @@
1#!/bin/sh
2
3if [[ $(playerctl metadata --format '{{lc(status)}}' | grep playing) -eq 0 ]]; then
4 exit 0
5else
6 exit 1
7fi
diff --git a/home-config/waybar/modules/spotify.sh b/home-config/waybar/modules/spotify.sh
deleted file mode 100755
index fc732a1..0000000
--- a/home-config/waybar/modules/spotify.sh
+++ /dev/null
@@ -1,19 +0,0 @@
1#!/bin/sh
2
3class=$(playerctl metadata --format '{{lc(status)}}')
4icon="󰎆"
5
6if [[ $class == "playing" ]]; then
7 info=$(playerctl metadata --format '{{artist}} - {{title}}')
8 if [[ ${#info} > 40 ]]; then
9 info=$(playerctl metadata --format '{{title}}' | cut -c1-40)"..."
10 fi
11 text=$info" "$icon
12elif [[ $class == "paused" ]]; then
13 text=$icon
14elif [[ $class == "stopped" ]]; then
15 text=""
16fi
17
18echo -e "{\"text\":\""$text"\", \"class\":\""$class"\"}"
19
diff --git a/home-config/waybar/modules/storage.sh b/home-config/waybar/modules/storage.sh
deleted file mode 100755
index 90cc3dc..0000000
--- a/home-config/waybar/modules/storage.sh
+++ /dev/null
@@ -1,25 +0,0 @@
1#!/bin/sh
2
3mount="/"
4warning=20
5critical=10
6
7df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical '
8/\/.*/ {
9 text=$4
10 tooltip="Filesystem: "$1"\rSize: "$2"\rUsed: "$3"\rAvail: "$4"\rUse%: "$5"\rMounted on: "$6
11 use=$5
12 exit 0
13}
14END {
15 class=""
16 gsub(/%$/,"",use)
17 if ((100 - use) < critical) {
18 class="critical"
19 } else if ((100 - use) < warning) {
20 class="warning"
21 }
22 print "{\"text\":\""text"\", \"percentage\":"use",\"tooltip\":\""tooltip"\", \"class\":\""class"\"}"
23}
24'
25
diff --git a/home-config/waybar/modules/weather.sh b/home-config/waybar/modules/weather.sh
deleted file mode 100755
index 01faffc..0000000
--- a/home-config/waybar/modules/weather.sh
+++ /dev/null
@@ -1,77 +0,0 @@
1cachedir=~/.cache/rbn
2cachefile=${0##*/}-$1
3
4if [ ! -d $cachedir ]; then
5 mkdir -p $cachedir
6fi
7
8if [ ! -f $cachedir/$cachefile ]; then
9 touch $cachedir/$cachefile
10fi
11
12# Save current IFS
13SAVEIFS=$IFS
14# Change IFS to new line.
15IFS=$'\n'
16
17cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile")))
18if [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ]; then
19 data=($(curl -s https://en.wttr.in/$1\?0qnT 2>&1))
20 echo ${data[0]} | cut -f1 -d, > $cachedir/$cachefile
21 echo ${data[1]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
22 echo ${data[2]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
23fi
24
25weather=($(cat $cachedir/$cachefile))
26
27# Restore IFSClear
28IFS=$SAVEIFS
29
30temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]]+)\.\./\1 to /g')
31
32#echo ${weather[1]##*,}
33
34# https://fontawesome.com/icons?s=solid&c=weather
35case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in
36"clear" | "sunny")
37 condition=""
38 ;;
39"partly cloudy")
40 condition=""
41 ;;
42"cloudy")
43 condition=""
44 ;;
45"overcast")
46 condition=""
47 ;;
48"mist" | "fog" | "freezing fog")
49 condition="敖"
50 ;;
51"patchy rain possible" | "patchy light drizzle" | "light drizzle" | "patchy light rain" | "light rain" | "light rain shower" | "rain")
52 condition="殺"
53 ;;
54"moderate rain at times" | "moderate rain" | "heavy rain at times" | "heavy rain" | "moderate or heavy rain shower" | "torrential rain shower" | "rain shower")
55 condition=""
56 ;;
57"patchy snow possible" | "patchy sleet possible" | "patchy freezing drizzle possible" | "freezing drizzle" | "heavy freezing drizzle" | "light freezing rain" | "moderate or heavy freezing rain" | "light sleet" | "ice pellets" | "light sleet showers" | "moderate or heavy sleet showers")
58 condition="流"
59 ;;
60"blowing snow" | "moderate or heavy sleet" | "patchy light snow" | "light snow" | "light snow showers")
61 condition="ﰕ"
62 ;;
63"blizzard" | "patchy moderate snow" | "moderate snow" | "patchy heavy snow" | "heavy snow" | "moderate or heavy snow with thunder" | "moderate or heavy snow showers")
64 condition=""
65 ;;
66"thundery outbreaks possible" | "patchy light rain with thunder" | "moderate or heavy rain with thunder" | "patchy light snow with thunder")
67 condition=""
68 ;;
69*)
70 condition=""
71 echo -e "{\"text\":\""$condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
72 ;;
73esac
74
75#echo $temp $condition
76
77echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
diff --git a/home-config/waybar/style.css b/home-config/waybar/style.css
deleted file mode 100644
index 682a14e..0000000
--- a/home-config/waybar/style.css
+++ /dev/null
@@ -1,77 +0,0 @@
1* {
2 border: none;
3 border-radius: 0;
4 font-family: AnonymicePro Nerd Font;
5 font-size: 15px;
6 box-shadow: none;
7 text-shadow: none;
8 transition-duration: 0s;
9 color: white;
10}
11
12#waybar {
13 background-color:rgba(0,0,0,0.25);
14 color: white;
15}
16
17window {
18 color: rgba(217, 216, 216, 1);
19 background: rgba(35, 31, 32, 0.00);
20}
21
22window#waybar.solo {
23 color: rgba(217, 216, 216, 1);
24 background: rgba(35, 31, 32, 0.85);
25}
26
27#workspaces {
28 margin: 0 5px;
29}
30
31#workspaces button {
32 padding: 0 5px;
33 color: rgba(217, 216, 216, 0.4);
34}
35
36#workspaces button.visible {
37 color: rgba(217, 216, 216, 1);
38}
39
40#workspaces button.active {
41 border-top: 3px solid rgba(217, 216, 216, 1);
42 border-bottom: 3px solid rgba(217, 216, 216, 0);
43}
44
45#workspaces button.urgent {
46 color: rgba(238, 46, 36, 1);
47}
48
49#mode, #battery, #cpu, #memory, #network, #bluetooth, #pulseaudio, #idle_inhibitor, #backlight, #custom-storage, #custom-spotify, #custom-weather, #custom-mail {
50 margin: 0px 6px 0px 10px;
51 min-width: 25px;
52}
53
54#clock {
55 margin: 0px 16px 0px 10px;
56 min-width: 140px;
57}
58
59#battery.warning #battery.num2.warning {
60 color: rgba(255, 210, 4, 1);
61}
62
63#battery.critical #battery.bat2.critical {
64 color: rgba(238, 46, 36, 1);
65}
66
67#battery.charging #battery.bat2.charging {
68 color: rgba(217, 216, 216, 1);
69}
70
71#custom-storage.warning {
72 color: rgba(255, 210, 4, 1);
73}
74
75#custom-storage.critical {
76 color: rgba(238, 46, 36, 1);
77}
diff --git a/home-config/wpaperd/config.toml b/home-config/wpaperd/config.toml
deleted file mode 100644
index 9947370..0000000
--- a/home-config/wpaperd/config.toml
+++ /dev/null
@@ -1,4 +0,0 @@
1[default]
2duration = "30m"
3path = "~/.config/hypr/Wallpapers/static/"
4transition-time = 2000