Compare
af94b1b40df3144c7e4a7ae77425b6aecb17845c
…
main
· 250 commits
Commits
@@ -1,2 +1,4 @@
current
home-config/sway/monitors
+*.gif
+home-config/fish/fish_variables
@@ -0,0 +1,3 @@
+[submodule "home-config/nix-files"]
+ path = home-config/nix-files
+ url = ssh://git@git.rschanz.org/nix-combined.git
@@ -2,7 +2,27 @@
## Installing Guix
-### Instructions
+### New Instructions
+
+- Boot from Bootable media
+- Setup network and partitions with graphical installer
+- bail out before installation, go to terminal
+ - mount cow-store using `herd start cow-store /mnt`
+ - download latest personal config
+ - add authorization keys
+ - use guix time-machine with `env GUILE_LOAD_PATH='' GUILD_LOAD_COMPILED_PATH='' ...` to init system
+ - place copy of config in /mnt to copy over later. MAKE SURE TO INCLUDE .git FOLDER!!
+ - reboot into new system
+- assign root and ryan pw
+- login to ryan
+ - place config into ~/.config/guix
+ - run `guix pull -C ~/.config/guix/channels.scm`
+ - run `sudo -E guix system -L ~/.config/guix/modules reconfigure ...`
+ - run `guix home -L ~/.config/guix/modules reconfigure ...`
+ - run `nix run --no-write-lock-file github:nix-community/home-manager/ -- --flake ".#$USER" switch`
+- you may have a system now
+
+### Instructions (old, for reference)
- Create USB with Guix installation image
- Boot and create partitions using graphical installer
@@ -0,0 +1,34 @@
+(use-modules (ryan-config base-system)
+ (ryan-bootloader uki)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (kernel-arguments (append (list "intel_iommu=on")
+ %default-kernel-arguments))
+ (initrd-modules (cons* "vfio_pci" "vfio" "vfio_iommu_type1"
+ %base-initrd-modules))
+ (host-name "RyanThinkpad")
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "40a2c899-a54f-400b-b3b8-9f83b8378c61"))
+ (target "sysroot")
+ (type luks-device-mapping))))
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/sysroot")
+ (type "ext4")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "A73D-7D13"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (bootloader (bootloader-configuration
+ (bootloader (uefi-uki-signed-bootloader
+ "/var/lib/sbctl/keys/db/db.pem" "/var/lib/sbctl/keys/db/db.key"))
+ (targets (list "/boot/efi"))
+ (keyboard-layout (keyboard-layout "us"))))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "87b91351-93b6-4dcc-814f-64c0f901c4f3"))))))
@@ -0,0 +1,39 @@
+(use-modules (ryan-config base-system)
+ (ryan-bootloader uki)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (kernel-arguments (append (list "amd_iommu=on"
+ "iommu=pt"
+ "pci=noats"
+ "pcie_aspm=off"
+ "modprobe.blacklist=nouveau"
+ "vfio-pci.disable_idle_d3=1"
+ "vfio-pci.ids=10de:13f1,10de:0fbb")
+ %default-kernel-arguments))
+ (initrd-modules (cons* "vfio_pci" "vfio" "vfio_iommu_type1"
+ %base-initrd-modules))
+ (host-name "RyanTower")
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "e9f000b6-5532-499b-8278-bba30c1a2673"))
+ (target "sysroot")
+ (type luks-device-mapping))))
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/sysroot")
+ (type "ext4")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "89A8-89B0"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (bootloader (bootloader-configuration
+ (bootloader uefi-uki-bootloader)
+ (targets (list "/boot/efi"))
+ (keyboard-layout (keyboard-layout "us"))))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "e9f000b6-5532-499b-8278-bba30c1a2673"))))))
@@ -0,0 +1,30 @@
+(use-modules (ryan-config base-system)
+ (ryan-bootloader uki)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (host-name "SmallLaptop")
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "f2daabc9-543e-4128-8c61-dd5278988781"))
+ (target "sysroot")
+ (type luks-device-mapping))))
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/sysroot")
+ (type "ext4")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "1E29-F197"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (bootloader (bootloader-configuration
+ (bootloader (uefi-uki-signed-bootloader
+ "/var/lib/sbctl/keys/db/db.pem" "/var/lib/sbctl/keys/db/db.key"))
+ (targets (list "/boot/efi"))
+ (keyboard-layout (keyboard-layout "us"))))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "93ded2d1-da41-4b74-a1ca-697fe99b7efb"))))))
@@ -1,9 +1,9 @@
(list (channel
(name 'guix)
- (url "https://git.savannah.gnu.org/git/guix.git")
+ (url "https://codeberg.org/guix/guix.git")
(branch "master")
(commit
- "d43b53c476b4e9322b31274b788e851d37e72302")
+ "85a7d902c039d82a646f771f661d6935f0a6a1cf")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
@@ -14,7 +14,7 @@
(url "https://gitlab.com/nonguix/nonguix")
(branch "master")
(commit
- "1a3082c574077aaf6771ff927e725fc390a2d531")
+ "a3f4e7bff779da4593a2922516064a8edaafa3e6")
(introduction
(make-channel-introduction
"897c1a470da759236cc11798f4e0a5f7d4d59fbc"
@@ -25,7 +25,7 @@
(url "https://codeberg.org/hako/rosenthal.git")
(branch "trunk")
(commit
- "129ca6fe164bf8b5a37357bab8c5229b611f1df2")
+ "9e60a11917cbdca57e10c51e174dfa56379e74cc")
(introduction
(make-channel-introduction
"7677db76330121a901604dfbad19077893865f35"
@@ -0,0 +1,113 @@
+#!/run/current-system/profile/bin/bash
+
+gather_env() {
+ # Gather needed information
+ echo -n "Type 'eb' for encrypted w/ boot, 'en' for encrypted w/o boot, or 'd' for decrypted install: "
+ read install_type
+
+ echo -n "Type system hostname: "
+ read install_hostname
+
+ echo -n "Type device file for ROOT data: "
+ read root_dev
+
+ echo -n "Type device file for BOOT data: "
+ read boot_dev
+
+ echo -n "Type device file for SWAP: "
+ read swap_dev
+
+ echo -n "Add local device on network as substitute server? (y/n): "
+ read add_local_sub
+ if [ "$add_local_sub" == "y" ]
+ then
+ echo -n "Enter IP address of server: "
+ read substitute_ip
+ fi
+}
+
+copy_and_prepare() {
+ # Associate devs with uuids
+ root_uuid=`blkid $root_dev | awk -F\" '{print $2}'`
+ boot_uuid=`blkid $boot_dev | awk -F\" '{print $2}'`
+ swap_uuid=`blkid $swap_dev | awk -F\" '{print $2}'`
+ # Let's a go!
+ echo "Information gathered. Deploying Guix on $root_dev ($root_uuid) with boot on $boot_dev ($boot_uuid) and swap on $swap_dev ($swap_uuid)"
+ echo -n "Proceed? (y/n): "
+ read install_choice
+
+ if [ "$install_choice" != "y" ]
+ then
+ echo "Bailing!"
+ exit 1
+ fi
+
+ # We are installing!
+ # Copy template to root of repo
+ if [ "$install_type" == "eb" ]
+ then
+ cp ./modules/ryan-config/deploy-templates/HostTemplateEncrypted ./$install_hostname.scm
+ elif [ "$install_type" == "d" ]
+ then
+ cp ./modules/ryan-config/deploy-templates/HostTemplate ./$install_hostname.scm
+ else
+ echo "Invalid install type (not eb, en, or d), bailing!"
+ exit 1
+ fi
+
+ # Correct the information
+ sed -i "s/ChangeMe_ROOT/$root_uuid/" ./$install_hostname.scm
+ sed -i "s/ChangeMe_BOOTEFI/$boot_uuid/" ./$install_hostname.scm
+ sed -i "s/ChangeMe_SWAP/$swap_uuid/" ./$install_hostname.scm
+ sed -i "s/ChangeMe_HOST/$install_hostname/" ./$install_hostname.scm
+
+ # Install!
+ echo "Mounting /gnu/store to destination disk..."
+ herd start cow-store /mnt
+
+ # Install the non-guix signing keys
+ echo "Installing non-guix signing keys for substitutes..."
+ curl -o sign-key.pub https://substitutes.nonguix.org/signing-key.pub
+ guix archive --authorize < sign-key.pub
+
+ if [ "$add_local_sub" == "y" ]
+ then
+ echo "Installing local substitute server's signing keys"
+ curl -o local-sign.pub http://$substitute_ip/signing-key.pub
+ guix archive --authorize < local-sign.pub
+ fi
+}
+
+install_system() {
+ echo "Beginning install!"
+ if [ "$add_local_sub" == "y"]
+ then
+ guix time-machine -C ./channels.scm -- system -L ./modules --substitute-urls="http://$substitute_ip https://substitutes.nonguix.org https://bordeaux.guix.gnu.org https://ci.guix.gnu.org" init $install_hostname.scm /mnt
+ else
+ guix time-machine -C ./channels.scm -- system -L ./modules --substitute-urls="https://substitutes.nonguix.org https://bordeaux.guix.gnu.org https://ci.guix.gnu.org" init $install_hostname.scm /mnt
+ fi
+
+}
+
+install_user_env() {
+ # System should be installed now, we can chroot in and configure the user profile now
+ # NOTE: This assumes the user "ryan" for things, so change the USER var if you change your username
+
+ # Copy some files over to prepare for reboot
+ USER=ryan
+ guix shell git -- git clone --recurse-submodules https://git.stationery.faith/ryan77627/guix-dotfiles /mnt/home/$USER/.config/guix
+
+ cp ~/guix-dotfiles/$install_hostname.scm /mnt/home/$USER/.config/guix/$install_hostname.scm
+ cp ~/guix-dotfiles/modules/ryan-config/user_first_run.sh /mnt/home/$USER/.bashrc
+
+ chown 1000:1000 -R /mnt/home/ryan
+
+}
+
+gather_env
+copy_and_prepare
+install_system
+install_user_env
+
+# Reboot the machine at this point!
+reboot
@@ -1,21 +0,0 @@
-[Personal]
-source = imaps://ryan%40rschanz.org@mail.rschanz.org:993
-source-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
-outgoing = smtps://ryan%40rschanz.org@mail.rschanz.org:465
-outgoing-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
-default = INBOX
-from = Ryan Schanzenbacher <ryan@rschanz.org>
-copy-to = Sent
-signature-file = ~/.config/aerc/signature_personal
-check-mail = 5m
-
-[School]
-source = 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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
-source-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
-outgoing = 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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
-outgoing-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
-from = Ryan Schanzenbacher <rjs1877@rit.edu>
-signature-file = ~/.config/aerc/signature_rit_personal
-check-mail = 5m
-default = INBOX
-copy-to = [Gmail]/Sent Mail
@@ -1,566 +0,0 @@
-#
-# aerc main configuration
-
-[general]
-#
-# Used as a default path for save operations if no other path is specified.
-# ~ is expanded to the current user home dir.
-#
-default-save-path=~/Downloads/
-
-# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
-# operations. If set to "internal", the internal openpgp keyring will be used.
-# If set to "auto", the system gpg will be preferred unless the internal
-# keyring already exists, in which case the latter will be used.
-#
-# Default: auto
-pgp-provider=gpg
-
-# By default, the file permissions of accounts.conf must be restrictive and
-# only allow reading by the file owner (0600). Set this option to true to
-# ignore this permission check. Use this with care as it may expose your
-# credentials.
-#
-# Default: false
-unsafe-accounts-conf=true # I don't store my creds in this
-
-# Output log messages to specified file. A path starting with ~/ is expanded to
-# the user home dir. When redirecting aerc's output to a file using > shell
-# redirection, this setting is ignored and log messages are printed to stdout.
-#
-#log-file=~/aerc_log
-
-# Only log messages above the specified level to log-file. Supported levels
-# are: trace, debug, info, warn and error. When redirecting aerc's output to
-# a file using > shell redirection, this setting is ignored and the log level
-# is forced to trace.
-#
-# Default: info
-log-level=trace
-
-# Set the $TERM environment variable used for the embedded terminal.
-#
-# Default: xterm-256color
-#term=xterm-256color
-
-# Display OSC8 strings in the embedded terminal
-#
-# Default: false
-#enable-osc8=false
-
-[ui]
-#
-# Describes the format for each row in a mailbox view. This is a comma
-# separated list of column names with an optional align and width suffix. After
-# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment
-# characters can be added (by default, left) followed by an optional width
-# specifier. The width is either an integer representing a fixed number of
-# characters, or a percentage between 1% and 99% representing a fraction of the
-# terminal width. It can also be one of the '*' (auto) or '=' (fit) special
-# width specifiers. Auto width columns will be equally attributed the remaining
-# terminal width. Fit width columns take the width of their contents. If no
-# width specifier is set, '*' is used by default.
-#
-# Default: date<20,name<17,flags>4,subject<*
-#index-columns=date<20,name<17,flags>4,subject<*
-
-#
-# Each name in index-columns must have a corresponding column-$name setting.
-# All column-$name settings accept golang text/template syntax. See
-# aerc-templates(7) for available template attributes and functions.
-#
-# Default settings
-#column-date={{.DateAutoFormat .Date.Local}}
-#column-name={{index (.From | names) 0}}
-#column-flags={{.Flags | join ""}}
-#column-subject={{.ThreadPrefix}}{{.Subject}}
-
-#
-# String separator inserted between columns. When the column width specifier is
-# an exact number of characters, the separator is added to it (i.e. the exact
-# width will be fully available for the column contents).
-#
-# Default: " "
-#column-separator=" "
-
-#
-# See time.Time#Format at https://godoc.org/time#Time.Format
-#
-# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
-#timestamp-format=2006-01-02 03:04 PM
-
-#
-# Index-only time format for messages that were received/sent today.
-# If this is not specified, timestamp-format is used instead.
-#
-#this-day-time-format=
-
-#
-# Index-only time format for messages that were received/sent within the last
-# 7 days. If this is not specified, timestamp-format is used instead.
-#
-#this-week-time-format=
-
-#
-# Index-only time format for messages that were received/sent this year.
-# If this is not specified, timestamp-format is used instead.
-#
-#this-year-time-format=
-
-#
-# Width of the sidebar, including the border.
-#
-# Default: 20
-#sidebar-width=20
-
-#
-# Message to display when viewing an empty folder.
-#
-# Default: (no messages)
-#empty-message=(no messages)
-
-# Message to display when no folders exists or are all filtered
-#
-# Default: (no folders)
-#empty-dirlist=(no folders)
-
-# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
-#
-# Default: false
-#mouse-enabled=false
-
-#
-# Ring the bell when new messages are received
-#
-# Default: true
-#new-message-bell=true
-
-#
-# Template to use for Account tab titles
-#
-# Default: {{.Account}}
-#tab-title-account={{.Account}}
-
-# Marker to show before a pinned tab's name.
-#
-# Default: `
-#pinned-tab-marker='`'
-
-# Template for the left side of the directory list.
-# See aerc-templates(7) for all available fields and functions.
-#
-# Default: {{.Folder}}
-#dirlist-left={{.Folder}}
-
-# Template for the right side of the directory list.
-# See aerc-templates(7) for all available fields and functions.
-#
-# Default: {{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
-#dirlist-right={{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
-
-# Delay after which the messages are actually listed when entering a directory.
-# This avoids loading messages when skipping over folders and makes the UI more
-# responsive. If you do not want that, set it to 0s.
-#
-# Default: 200ms
-#dirlist-delay=200ms
-
-# Display the directory list as a foldable tree that allows to collapse and
-# expand the folders.
-#
-# Default: false
-#dirlist-tree=false
-
-# If dirlist-tree is enabled, set level at which folders are collapsed by
-# default. Set to 0 to disable.
-#
-# Default: 0
-#dirlist-collapse=0
-
-# List of space-separated criteria to sort the messages by, see *sort*
-# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
-# reverses that criterion.
-#
-# Example: "from -r date"
-#
-#sort=
-
-# Moves to next message when the current message is deleted
-#
-# Default: true
-#next-message-on-delete=true
-
-# Automatically set the "seen" flag when a message is opened in the message
-# viewer.
-#
-# Default: true
-#auto-mark-read=true
-
-# The directories where the stylesets are stored. It takes a colon-separated
-# list of directories. If this is unset or if a styleset cannot be found, the
-# following paths will be used as a fallback in that order:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
-# /usr/local/share/aerc/stylesets
-# /usr/share/aerc/stylesets
-#
-#stylesets-dirs=
-
-# Uncomment to use box-drawing characters for vertical and horizontal borders.
-#
-# Default: " "
-#border-char-vertical=" "
-#border-char-horizontal=" "
-
-# Sets the styleset to use for the aerc ui elements.
-#
-# Default: default
-#styleset-name=default
-
-# Activates fuzzy search in commands and their arguments: the typed string is
-# searched in the command or option in any position, and need not be
-# consecutive characters in the command or option.
-#
-# Default: false
-#fuzzy-complete=false
-
-# How long to wait after the last input before auto-completion is triggered.
-#
-# Default: 250ms
-#completion-delay=250ms
-
-# The minimum required characters to allow auto-completion to be triggered after
-# completion-delay.
-#
-# Default: 1
-#completion-min-chars=1
-
-#
-# Global switch for completion popovers
-#
-# Default: true
-#completion-popovers=true
-
-# Uncomment to use UTF-8 symbols to indicate PGP status of messages
-#
-# Default: ASCII
-#icon-unencrypted=
-#icon-encrypted=✔
-#icon-signed=✔
-#icon-signed-encrypted=✔
-#icon-unknown=✘
-#icon-invalid=⚠
-
-# Reverses the order of the message list. By default, the message list is
-# ordered with the newest (highest UID) message on top. Reversing the order
-# will put the oldest (lowest UID) message on top. This can be useful in cases
-# where the backend does not support sorting.
-#
-# Default: false
-#reverse-msglist-order = false
-
-# Reverse display of the mesage threads. Default order is the the intial
-# message is on the top with all the replies being displayed below. The
-# reverse option will put the initial message at the bottom with the
-# replies on top.
-#
-# Default: false
-#reverse-thread-order=false
-
-# Sort the thread siblings according to the sort criteria for the messages. If
-# sort-thread-siblings is false, the thread siblings will be sorted based on
-# the message UID in ascending order. This option is only applicable for
-# client-side threading with a backend that enables sorting. Note that there's
-# a performance impact when sorting is activated.
-#
-# Default: false
-#sort-thread-siblings=false
-
-#[ui:account=Personal]
-#
-# Enable a threaded view of messages. If this is not supported by the backend
-# (IMAP server or notmuch), threads will be built by the client.
-#
-# Default: false
-threading-enabled=true
-
-# Force client-side thread building
-#
-# Default: false
-#force-client-threads=false
-
-# Debounce client-side thread building
-#
-# Default: 50ms
-#client-threads-delay=50ms
-
-[statusline]
-#
-# Describes the format for the status line. This is a comma separated list of
-# column names with an optional align and width suffix. See [ui].index-columns
-# for more details. To completely mute the status line except for push
-# notifications, explicitly set status-columns to an empty string.
-#
-# Default: left<*,center:=,right>*
-#status-columns=left<*,center:=,right>*
-
-#
-# Each name in status-columns must have a corresponding column-$name setting.
-# All column-$name settings accept golang text/template syntax. See
-# aerc-templates(7) for available template attributes and functions.
-#
-# Default settings
-#column-left=[{{.Account}}] {{.StatusInfo}}
-#column-center={{.PendingKeys}}
-#column-right={{.TrayInfo}}
-
-#
-# String separator inserted between columns.
-# See [ui].column-separator for more details.
-#
-#column-separator=" "
-
-# Specifies the separator between grouped statusline elements.
-#
-# Default: " | "
-#separator=" | "
-
-# Defines the mode for displaying the status elements.
-# Options: text, icon
-#
-# Default: text
-#display-mode=text
-
-[viewer]
-#
-# Specifies the pager to use when displaying emails. Note that some filters
-# may add ANSI codes to add color to rendered emails, so you may want to use a
-# pager which supports ANSI codes.
-#
-# Default: less -R
-#pager=less -R
-
-#
-# If an email offers several versions (multipart), you can configure which
-# mimetype to prefer. For example, this can be used to prefer plaintext over
-# html emails.
-#
-# Default: text/plain,text/html
-#alternatives=text/plain,text/html
-
-#
-# Default setting to determine whether to show full headers or only parsed
-# ones in message viewer.
-#
-# Default: false
-#show-headers=false
-
-#
-# Layout of headers when viewing a message. To display multiple headers in the
-# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
-# none of their specified headers are present in the message.
-#
-# Default: From|To,Cc|Bcc,Date,Subject
-#header-layout=From|To,Cc|Bcc,Date,Subject
-
-# Whether to always show the mimetype of an email, even when it is just a single part
-#
-# Default: false
-#always-show-mime=false
-
-# Parses and extracts http links when viewing a message. Links can then be
-# accessed with the open-link command.
-#
-# Default: true
-#parse-http-links=true
-
-[compose]
-#
-# Specifies the command to run the editor with. It will be shown in an embedded
-# terminal, though it may also launch a graphical window if the environment
-# supports it. Defaults to $EDITOR, or vi.
-#editor=
-
-# Address book command
-address-book-cmd = sh -c 'abook --mutt-query "%s" | tail -n +2'
-
-#
-# Default header fields to display when composing a message. To display
-# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
-#
-# Default: To|From,Subject
-#header-layout=To|From,Subject
-
-#
-# Specifies the command to be used to tab-complete email addresses. Any
-# occurrence of "%s" in the address-book-cmd will be replaced with what the
-# user has typed so far.
-#
-# The command must output the completions to standard output, one completion
-# per line. Each line must be tab-delimited, with an email address occurring as
-# the first field. Only the email address field is required. The second field,
-# if present, will be treated as the contact name. Additional fields are
-# ignored.
-#
-# This parameter can also be set per account in accounts.conf.
-#address-book-cmd=
-
-# Specifies the command to be used to select attachments. Any occurence of '%s'
-# in the file-picker-cmd will be replaced the argument <arg> to :attach -m
-# <arg>.
-#
-# The command must output the selected files to standard output, one file per
-# line.
-file-picker-cmd=fzf --multi --query=%s
-
-#
-# Allow to address yourself when replying
-#
-# Default: true
-#reply-to-self=true
-
-#
-# Warn before sending an email that matches the specified regexp but does not
-# have any attachments. Leave empty to disable this feature.
-#
-# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
-# "(?im)" flags are set by default (case-insensitive and multi-line).
-#
-# Example:
-# no-attachment-warning=^[^>]*attach(ed|ment)
-#
-#no-attachment-warning=
-
-#
-# When set, aerc will generate "format=flowed" bodies with a content type of
-# "text/plain; format=flowed" as described in RFC3676. This format is easier to
-# handle for some mailing software, and generally just looks like ordinary
-# text. To actually make use of this format's features, you'll need support in
-# your editor.
-#
-format-flowed=true
-
-[multipart-converters]
-#
-# Converters allow to generate multipart/alternative messages by converting the
-# main text/plain part into any other MIME type. Only exact MIME types are
-# accepted. The commands are invoked with sh -c and are expected to output
-# valid UTF-8 text.
-#
-# Example (obviously, this requires that you write your main text/plain body
-# using the markdown syntax):
-text/html=pandoc --wrap=preserve -f gfm+hard_line_breaks -t html --standalone
-
-[filters]
-#
-# Filters allow you to pipe an email body through a shell command to render
-# certain emails differently, e.g. highlighting them with ANSI escape codes.
-#
-# The commands are invoked with sh -c. The following folders are appended to
-# the system $PATH to allow referencing filters from their name only:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
-# $PREFIX/share/aerc/filters
-# /usr/share/aerc/filters
-#
-# The following variables are defined in the filter command environment:
-#
-# AERC_MIME_TYPE the part MIME type/subtype
-# AERC_FORMAT the part content type format= parameter
-# AERC_FILENAME the attachment filename (if any)
-# AERC_SUBJECT the message Subject header value
-# AERC_FROM the message From header value
-#
-# The first filter which matches the email's mimetype will be used, so order
-# them from most to least specific.
-#
-# You can also match on non-mimetypes, by prefixing with the header to match
-# against (non-case-sensitive) and a comma, e.g. subject,text will match a
-# subject which contains "text". Use header,~regex to match against a regex.
-#
-#text/plain=colorize
-#text/calendar=calendar
-message/delivery-status=bat -fn
-message/rfc822=bat -fn
-text/html=pandoc -f html -t plain | bat -fn
-#text/html=html | colorize
-text/*=bat -fn --file-name="$AERC_FILENAME"
-application/x-sh=bat -fn -l sh
-#image/*=catimg -w $(tput cols) -
-#subject,~Git(hub|lab)=lolcat -f
-#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize
-
-# This special filter is only used to post-process email headers when
-# [viewer].show-headers=true
-# By default, headers are piped directly into the pager.
-#
-#.headers=bat -fp
-
-[openers]
-#
-# Openers allow you to specify the command to use for the :open and :open-link
-# actions on a per-MIME-type basis. The :open-link URL scheme is used to
-# determine the MIME type as follows: x-scheme-handler/<scheme>.
-#
-# {} is expanded as the temporary filename to be opened. If it is not
-# encountered in the command, the temporary filename will be appened to the end
-# of the command.
-#
-# Like [filters], openers support basic shell globbing. The first opener which
-# matches the part's MIME type (or URL scheme handler MIME type) will be used,
-# so order them from most to least specific.
-#
-# Examples:
-# x-scheme-handler/irc=hexchat
-# x-scheme-handler/http*=firefox
-# text/html=surf -dfgms
-# text/plain=gvim {} +125
-# message/rfc822=thunderbird
-
-[hooks]
-#
-# Hooks are triggered whenever the associated event occurs.
-
-#
-# Executed when a new email arrives in the selected folder
-mail-received=notify-send "$AERC_FROM_NAME" "$AERC_SUBJECT"
-
-#
-# Executed when aerc starts
-#aerc-startup=aerc :terminal calcurse && aerc :next-tab
-
-#
-# Executed when aerc shuts down.
-#aerc-shutdown=
-
-[templates]
-# Templates are used to populate email bodies automatically.
-#
-
-# The directories where the templates are stored. It takes a colon-separated
-# list of directories. If this is unset or if a template cannot be found, the
-# following paths will be used as a fallback in that order:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
-# /usr/local/share/aerc/templates
-# /usr/share/aerc/templates
-#
-#template-dirs=
-
-# The default template to be used for new messages.
-#
-# default: new_message
-#new-message=new_message
-
-# The default template to be used for quoted replies.
-#
-# default: quoted_reply
-#quoted-reply=quoted_reply
-
-# The default template to be used for forward as body.
-#
-# default: forward_as_body
-#forwards=forward_as_body
@@ -1,143 +0,0 @@
-# Binds are of the form <key sequence> = <command to run>
-# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
-# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-t> = :term<Enter>
-? = :help keys<Enter>
-
-[messages]
-q = :quit<Enter>
-
-j = :next<Enter>
-<Down> = :next<Enter>
-<C-d> = :next 50%<Enter>
-<C-f> = :next 100%<Enter>
-<PgDn> = :next 100%<Enter>
-
-k = :prev<Enter>
-<Up> = :prev<Enter>
-<C-u> = :prev 50%<Enter>
-<C-b> = :prev 100%<Enter>
-<PgUp> = :prev 100%<Enter>
-g = :select 0<Enter>
-G = :select -1<Enter>
-<C-r> = :read<Enter>
-<C-u> = :unread<Enter>
-
-J = :next-folder<Enter>
-K = :prev-folder<Enter>
-H = :collapse-folder<Enter>
-L = :expand-folder<Enter>
-
-v = :mark -t<Enter>
-V = :mark -v<Enter>
-
-T = :toggle-threads<Enter>
-
-<Enter> = :view<Enter>
-dd = :mv Trash<Enter>
-dg = :mv [Gmail]/Trash<Enter>
-D = :delete<Enter>
-A = :archive year<Enter>
-
-C = :compose<Enter>
-
-rr = :reply -a<Enter>
-rq = :reply -aq<Enter>
-Rr = :reply<Enter>
-Rq = :reply -q<Enter>
-f = :forward -A<Enter>
-
-c = :cf<space>
-$ = :term<space>
-! = :term<space>
-| = :pipe<space>
-
-/ = :search<space>
-\ = :filter<space>
-n = :next-result<Enter>
-N = :prev-result<Enter>
-<Esc> = :clear<Enter>
-
-[messages:folder=Drafts]
-<Enter> = :recall<Enter>
-
-[view]
-/ = :toggle-key-passthrough<Enter>/
-q = :close<Enter>
-O = :open<Enter>
-S = :save<space>
-| = :pipe<space>
-D = :delete<Enter>
-dd = :mv Trash<Enter>
-dg = :mv [Gmail]/Trash<Enter>
-A = :archive year<Enter>
-
-<C-l> = :open-link <space>
-
-f = :forward -A<Enter>
-rr = :reply -a<Enter>
-rq = :reply -aq<Enter>
-Rr = :reply<Enter>
-Rq = :reply -q<Enter>
-
-H = :toggle-headers<Enter>
-<C-k> = :prev-part<Enter>
-<C-j> = :next-part<Enter>
-J = :next<Enter>
-K = :prev<Enter>
-
-[view::passthrough]
-$noinherit = true
-$ex = <C-x>
-<Esc> = :toggle-key-passthrough<Enter>
-
-[compose]
-# Keybindings used when the embedded terminal is not selected in the compose
-# view
-$noinherit = true
-$ex = <C-x>
-<C-k> = :prev-field<Enter>
-<C-j> = :next-field<Enter>
-<A-p> = :switch-account -p<Enter>
-<A-n> = :switch-account -n<Enter>
-<tab> = :next-field<Enter>
-<backtab> = :prev-field<Enter>
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-c> = :cc<Enter>
-<C-b> = :bcc<Enter>
-<C-q> = :abort<Enter>
-
-[compose::editor]
-# Keybindings used when the embedded terminal is selected in the compose view
-$noinherit = true
-$ex = <C-x>
-<C-k> = :prev-field<Enter>
-<C-j> = :next-field<Enter>
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-q> = :abort<Enter>
-
-[compose::review]
-# Keybindings used when reviewing a message to be sent
-y = :send<Enter>
-n = :abort<Enter>
-v = :preview<Enter>
-p = :postpone<Enter>
-q = :choose -o d discard abort -o p postpone postpone<Enter>
-e = :edit<Enter>
-a = :attach<space>
-d = :detach<space>
-S = :sign<Enter>
-E = :encrypt<Enter>
-A = :attach-key<Enter>
-C = :multipart text/html<Enter>
-
-[terminal]
-$noinherit = true
-$ex = <C-x>
-
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
@@ -1,3 +0,0 @@
-Best,
-Ryan Schanzenbacher
@@ -1,5 +0,0 @@
-Best,
-Ryan Schanzenbacher
-Rochester Institute of Technology
-Cybersecurity BS/MS Student
@@ -1,13 +0,0 @@
-font:
- size: 15
- normal:
- family: "Monofur for Powerline"
- style: Regular
-
- bold:
- family: "Monofur for Powerline"
- style: Bold
-
- italic:
- family: "Monofur for Powerline"
- style: Italic
@@ -1,11 +1,13 @@
export MOZ_ENABLE_WAYLAND=1
-export XDG_CURRENT_DESKTOP=sway
-export XDG_SESSION_DESKTOP=sway
-export _JAVA_AWT_WM_NONREPEATING=1
-
export XDG_DATA_DIRS=$XDG_DATA_DIRS:~/.nix-profile/share
-export PATH=$PATH:~/.nix-profile/bin
+export PATH=~/.local/bin:$PATH:~/.nix-profile/bin:~/.go/bin
+export GOPATH=~/.go
# Honor per-interactive-shell startup file
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
+
+if [ -z "$SSH_CLIENT" ] && [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
+ exec nixGLIntel Hyprland
+fi
+
@@ -38,9 +38,30 @@ alias grep='grep --color=auto'
alias quit='exit'
export EDITOR=nvim
alias cat='bat --paging=never'
+alias ds='sudo -E guix system -L ~/.config/guix/modules reconfigure ~/.config/guix/$(hostname).scm'
+alias dh='guix home -L ~/.config/guix/modules reconfigure ~/.config/guix/home-config/home-configuration.scm && home-manager switch'
+alias gc='git -C ~/.config/guix add . && git -C ~/.config/guix commit && git -C ~/.config/guix push all && curl --fail-early --connect-timeout 2 -d "Guix repo updated, re-deploy!" https://ntfy.in.rschanz.org/guix_deployments'
+alias cg='git -C ~/.config/guix pull'
+alias cgh='git -C ~/.config/guix pull stationeryh main'
+alias gencs="awk 'BEGIN {print \"# Crib Sheet\"} /<!-- START CS -->/,/<!-- END CS -->/ {if (! /<!-- START CS -->/ && ! /<!-- END CS -->/) print; if (/<!-- END CS -->/) print \"\"}' notes.mkd | pandoc -f gfm -t pdf | zathura -"
+alias dockerg="docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix"
+
export XDG_DATA_DIRS=$XDG_DATA_DIRS:/var/lib/flatpak/exports/share:/home/ryan/.local/share/flatpak/exports/share
# GPG SETUP FOR SSH
#export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
#gpgconf --launch gpg-agent
export GPG_TTY=$(tty)
+
+# eza
+alias ls='eza --icons=always -Gx'
+
+# Delta
+alias diff='delta'
+
+# Starship
+eval "$(starship init bash)"
+
+# Zoxide
+eval "$(zoxide init --cmd cd bash)"
+
Binary files /dev/null and b/home-config/docker/cli-plugins/docker-compose differ
@@ -0,0 +1,7 @@
+complete --command fisher --exclusive --long help --description "Print help"
+complete --command fisher --exclusive --long version --description "Print version"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins"
+complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex"
+complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)"
@@ -0,0 +1,8 @@
+complete fzf_configure_bindings --no-files
+complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h"
+complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory"
+complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log"
+complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status"
+complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history"
+complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes"
+complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables"
@@ -0,0 +1,13 @@
+complete tide --no-files
+
+set -l subcommands bug-report configure reload
+
+complete tide -x -n __fish_use_subcommand -a bug-report -d "Print info for use in bug reports"
+complete tide -x -n __fish_use_subcommand -a configure -d "Run the configuration wizard"
+complete tide -x -n __fish_use_subcommand -a reload -d "Reload tide configuration"
+
+complete tide -x -n "not __fish_seen_subcommand_from $subcommands" -s h -l help -d "Print help message"
+complete tide -x -n "not __fish_seen_subcommand_from $subcommands" -s v -l version -d "Print tide version"
+
+complete tide -x -n '__fish_seen_subcommand_from bug-report' -l clean -d "Run clean Fish instance and install Tide"
+complete tide -x -n '__fish_seen_subcommand_from bug-report' -l verbose -d "Print full Tide configuration"
@@ -0,0 +1,44 @@
+function _tide_init_install --on-event _tide_init_install
+ set -U VIRTUAL_ENV_DISABLE_PROMPT true
+
+ source (functions --details _tide_sub_configure)
+ _load_config lean
+ _tide_finish
+
+ if status is-interactive
+ tide bug-report --check || sleep 4
+
+ if contains ilancosman/tide (string lower $_fisher_plugins)
+ set_color bryellow
+ echo "ilancosman/tide is a development branch. Please install from a release tag:"
+ _tide_fish_colorize "fisher install ilancosman/tide@v6"
+ sleep 3
+ end
+
+ switch (read --prompt-str="Configure tide prompt? [Y/n] " | string lower)
+ case y ye yes ''
+ tide configure
+ case '*'
+ echo -s \n 'Run ' (_tide_fish_colorize "tide configure") ' to customize your prompt.'
+ end
+ end
+end
+
+function _tide_init_update --on-event _tide_init_update
+ # Warn users who install from main branch
+ if contains ilancosman/tide (string lower $_fisher_plugins)
+ set_color bryellow
+ echo "ilancosman/tide is a development branch. Please install from a release tag:"
+ _tide_fish_colorize "fisher install ilancosman/tide@v6"
+ sleep 3
+ end
+
+ # Set (disable) the new jobs variable
+ set -q tide_jobs_number_threshold || set -U tide_jobs_number_threshold 1000
+end
+
+function _tide_init_uninstall --on-event _tide_init_uninstall
+ set -e VIRTUAL_ENV_DISABLE_PROMPT
+ set -e (set -U --names | string match --entire -r '^_?tide')
+ functions --erase (functions --all | string match --entire -r '^_?tide')
+end
@@ -0,0 +1,28 @@
+# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup
+if not status is-interactive && test "$CI" != true
+ exit
+end
+
+# Because of scoping rules, to capture the shell variables exactly as they are, we must read
+# them before even executing _fzf_search_variables. We use psub to store the
+# variables' info in temporary files and pass in the filenames as arguments.
+# This variable is global so that it can be referenced by fzf_configure_bindings and in tests
+set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)'
+
+
+# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings
+fzf_configure_bindings
+
+# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased
+function _fzf_uninstall --on-event fzf_uninstall
+ _fzf_uninstall_bindings
+
+ set --erase _fzf_search_vars_command
+ functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings
+ complete --erase fzf_configure_bindings
+
+ set_color cyan
+ echo "fzf.fish uninstalled."
+ echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings."
+ set_color normal
+end
@@ -0,0 +1,138 @@
+# Setup Nix
+
+# We need to distinguish between single-user and multi-user installs.
+# This is difficult because there's no official way to do this.
+# We could look for the presence of /nix/var/nix/daemon-socket/socket but this will fail if the
+# daemon hasn't started yet. /nix/var/nix/daemon-socket will exist if the daemon has ever run, but
+# I don't think there's any protection against accidentally running `nix-daemon` as a user.
+# We also can't just look for /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh because
+# older single-user installs used the default profile instead of a per-user profile.
+# We can still check for it first, because all multi-user installs should have it, and so if it's
+# not present that's a pretty big indicator that this is a single-user install. If it does exist,
+# we still need to verify the install type. To that end we'll look for a root owner and sticky bit
+# on /nix/store. Multi-user installs set both, single-user installs don't. It's certainly possible
+# someone could do a single-user install as root and then manually set the sticky bit but that
+# would be extremely unusual.
+
+set -l nix_profile_path /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
+set -l single_user_profile_path ~/.nix-profile/etc/profile.d/nix.sh
+if test -e $nix_profile_path
+ # The path exists. Double-check that this is a multi-user install.
+ # We can't just check for ~/.nix-profile/… because this may be a single-user install running as
+ # the wrong user.
+
+ # stat is not portable. Splitting the output of ls -nd is reliable on most platforms.
+ set -l owner (string split -n ' ' (command ls -nd /nix/store 2>/dev/null))[3]
+ if not test -k /nix/store -a $owner -eq 0
+ # /nix/store is either not owned by root or not sticky. Assume single-user.
+ set nix_profile_path $single_user_profile_path
+ end
+else
+ # The path doesn't exist. Assume single-user
+ set nix_profile_path $single_user_profile_path
+end
+
+if test -e $nix_profile_path
+ # Source the nix setup script
+ # We're going to run the regular Nix profile under bash and then print out a few variables
+ for line in (command env -u BASH_ENV bash -c '. "$0"; for name in PATH "${!NIX_@}"; do printf "%s=%s\0" "$name" "${!name}"; done' $nix_profile_path | string split0)
+ set -xg (string split -m 1 = $line)
+ end
+
+ # Insert Nix's fish share directories into fish's special variables.
+ # nixpkgs-installed fish tries to set these up already if NIX_PROFILES is defined, which won't
+ # be the case when sourcing $__fish_data_dir/share/config.fish normally, but might be for a
+ # recursive invocation. To guard against that, we'll only insert paths that don't already exit.
+ # Furthermore, for the vendor_conf.d sourcing, we'll use the pre-existing presence of a path in
+ # $fish_function_path to determine whether we want to source the relevant vendor_conf.d folder.
+
+ # To start, let's locally define NIX_PROFILES if it doesn't already exist.
+ set -al NIX_PROFILES
+ if test (count $NIX_PROFILES) -eq 0
+ set -a NIX_PROFILES $HOME/.nix-profile
+ end
+ # Replicate the logic from nixpkgs version of $__fish_data_dir/__fish_build_paths.fish.
+ set -l __nix_profile_paths (string split ' ' -- $NIX_PROFILES)[-1..1]
+ set -l __extra_completionsdir \
+ $__nix_profile_paths/etc/fish/completions \
+ $__nix_profile_paths/share/fish/vendor_completions.d
+ set -l __extra_functionsdir \
+ $__nix_profile_paths/etc/fish/functions \
+ $__nix_profile_paths/share/fish/vendor_functions.d
+ set -l __extra_confdir \
+ $__nix_profile_paths/etc/fish/conf.d \
+ $__nix_profile_paths/share/fish/vendor_conf.d \
+
+ ### Configure fish_function_path ###
+ # Remove any of our extra paths that may already exist.
+ # Record the equivalent __extra_confdir path for any function path that exists.
+ set -l existing_conf_paths
+ for path in $__extra_functionsdir
+ if set -l idx (contains --index -- $path $fish_function_path)
+ set -e fish_function_path[$idx]
+ set -a existing_conf_paths $__extra_confdir[(contains --index -- $path $__extra_functionsdir)]
+ end
+ end
+ # Insert the paths before $__fish_data_dir.
+ if set -l idx (contains --index -- $__fish_data_dir/functions $fish_function_path)
+ # Fish has no way to simply insert into the middle of an array.
+ set -l new_path $fish_function_path[1..$idx]
+ set -e new_path[$idx]
+ set -a new_path $__extra_functionsdir
+ set fish_function_path $new_path $fish_function_path[$idx..-1]
+ else
+ set -a fish_function_path $__extra_functionsdir
+ end
+
+ ### Configure fish_complete_path ###
+ # Remove any of our extra paths that may already exist.
+ for path in $__extra_completionsdir
+ if set -l idx (contains --index -- $path $fish_complete_path)
+ set -e fish_complete_path[$idx]
+ end
+ end
+ # Insert the paths before $__fish_data_dir.
+ if set -l idx (contains --index -- $__fish_data_dir/completions $fish_complete_path)
+ set -l new_path $fish_complete_path[1..$idx]
+ set -e new_path[$idx]
+ set -a new_path $__extra_completionsdir
+ set fish_complete_path $new_path $fish_complete_path[$idx..-1]
+ else
+ set -a fish_complete_path $__extra_completionsdir
+ end
+
+ ### Source conf directories ###
+ # The built-in directories were already sourced during shell initialization.
+ # Any __extra_confdir that came from $__fish_data_dir/__fish_build_paths.fish was also sourced.
+ # As explained above, we're using the presence of pre-existing paths in $fish_function_path as a
+ # signal that the corresponding conf dir has also already been sourced.
+ # In order to simulate this, we'll run through the same algorithm as found in
+ # $__fish_data_dir/config.fish except we'll avoid sourcing the file if it comes from an
+ # already-sourced location.
+ # Caveats:
+ # * Files will be sourced in a different order than we'd ideally do (because we're coming in
+ # after the fact to source them).
+ # * If there are existing extra conf paths, files in them may have been sourced that should have
+ # been suppressed by paths we're inserting in front.
+ # * Similarly any files in $__fish_data_dir/vendor_conf.d that should have been suppressed won't
+ # have been.
+ set -l sourcelist
+ for file in $__fish_config_dir/conf.d/*.fish $__fish_sysconf_dir/conf.d/*.fish
+ # We know these paths were sourced already. Just record them.
+ set -l basename (string replace -r '^.*/' '' -- $file)
+ contains -- $basename $sourcelist
+ or set -a sourcelist $basename
+ end
+ for root in $__extra_confdir
+ for file in $root/*.fish
+ set -l basename (string replace -r '^.*/' '' -- $file)
+ contains -- $basename $sourcelist
+ and continue
+ set -a sourcelist $basename
+ contains -- $root $existing_conf_paths
+ and continue # this is a pre-existing path, it will have been sourced already
+ [ -f $file -a -r $file ]
+ and source $file
+ end
+ end
+end
@@ -0,0 +1,43 @@
+if status is-login
+ eval "$(guix package --search-paths \
+ -p ~/.config/guix/current \
+ -p ~/.guix-profile \
+ -p /run/current-system/profile)"
+
+ fenv source /etc/profile
+ set -gx HOME_ENVIRONMENT $HOME/.guix-home
+ fenv source $HOME_ENVIRONMENT/setup-environment
+ fenv $HOME_ENVIRONMENT/on-first-login
+ fish_add_path -Pp ~/.local/bin
+ fish_add_path -Pp ~/.guix-home/profile/bin
+ fish_add_path -Pp /run/setuid-programs
+ fish_add_path -Pp ~/.nix-profile/bin
+ fish_add_path -Pp ~/.go/bin
+ set -gx GOPATH ~/.go
+ set -gx EDITOR nvim
+ set -gax --path XDG_DATA_DIRS ~/.nix-profile/share
+ # Bad
+ find ~/.config/fish/ -name "*tmp*" -exec rm {} +
+end
+if status is-interactive
+ set -gax --path XDG_DATA_DIRS ~/.local/share/flatpak/exports/share
+
+ set GPG_TTY $(tty)
+ export GPG_TTY
+ # Commands to run in interactive sessions can go here
+ alias quit exit
+ alias cat "bat --paging=never"
+ alias ds "sudo -E guix system -L ~/.config/guix/modules reconfigure ~/.config/guix/$(prompt_hostname).scm"
+ alias dh "guix home -L ~/.config/guix/modules reconfigure ~/.config/guix/home-config/home-configuration.scm && home-manager switch"
+ alias gc "git -C ~/.config/guix add . && git -C ~/.config/guix commit && git -C ~/.config/guix push all"
+ alias cg "git -C ~/.config/guix pull"
+ alias cgh "git -C ~/.config/guix pull stationeryh main"
+ alias python "python3"
+ alias spt "spotify_player"
+ alias ls "ls -p --color=auto"
+ alias grep "grep --color=auto"
+ alias ll "ls -l"
+
+ zoxide init --cmd cd fish | source
+
+end
@@ -0,0 +1,43 @@
+function _fzf_configure_bindings_help --description "Prints the help message for fzf_configure_bindings."
+ echo "\
+USAGE:
+ fzf_configure_bindings [--COMMAND=[KEY_SEQUENCE]...]
+
+DESCRIPTION
+ fzf_configure_bindings installs key bindings for fzf.fish's commands and erases any bindings it
+ previously installed. It installs bindings for both default and insert modes. fzf.fish executes
+ it without options on fish startup to install the out-of-the-box key bindings.
+
+ By default, commands are bound to a mnemonic key sequence, shown below. Each command's binding
+ can be configured using a namesake corresponding option:
+ COMMAND | DEFAULT KEY SEQUENCE | CORRESPONDING OPTION
+ Search Directory | Ctrl+Alt+F (F for file) | --directory
+ Search Git Log | Ctrl+Alt+L (L for log) | --git_log
+ Search Git Status | Ctrl+Alt+S (S for status) | --git_status
+ Search History | Ctrl+R (R for reverse) | --history
+ Search Processes | Ctrl+Alt+P (P for process) | --processes
+ Search Variables | Ctrl+V (V for variable) | --variables
+ Override a command's binding by specifying its corresponding option with the desired key
+ sequence. Disable a command's binding by specifying its corresponding option with no value.
+
+ Because fzf_configure_bindings erases bindings it previously installed, it can be cleanly
+ executed multiple times. Once the desired fzf_configure_bindings command has been found, add it
+ to your config.fish in order to persist the customized bindings.
+
+ In terms of validation, fzf_configure_bindings fails if passed unknown options. It expects an
+ equals sign between an option's name and value. However, it does not validate key sequences.
+
+ Pass -h or --help to print this help message and exit.
+
+EXAMPLES
+ Default bindings but bind Search Directory to Ctrl+F and Search Variables to Ctrl+Alt+V
+ \$ fzf_configure_bindings --directory=\cf --variables=\e\cv
+ Default bindings but disable Search History
+ \$ fzf_configure_bindings --history=
+ An agglomeration of different options
+ \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables= --processes=
+
+SEE Also
+ To learn more about fish key bindings, see bind(1) and fish_key_reader(1).
+"
+end
@@ -0,0 +1,15 @@
+# helper function for _fzf_search_variables
+function _fzf_extract_var_info --argument-names variable_name set_show_output --description "Extract and reformat lines pertaining to \$variable_name from \$set_show_output."
+ # Extract only the lines about the variable, all of which begin with either
+ # $variable_name: ...or... $variable_name[
+ string match --regex "^\\\$$variable_name(?::|\[).*" <$set_show_output |
+
+ # Strip the variable name prefix, including ": " for scope info lines
+ string replace --regex "^\\\$$variable_name(?:: )?" '' |
+
+ # Distill the lines of values, replacing...
+ # [1]: |value|
+ # ...with...
+ # [1] value
+ string replace --regex ": \|(.*)\|" ' $1'
+end
@@ -0,0 +1,49 @@
+# helper for _fzf_search_git_status
+# arg should be a line from git status --short, e.g.
+# MM functions/_fzf_preview_changed_file.fish
+# D README.md
+# R LICENSE -> "New License"
+function _fzf_preview_changed_file --argument-names path_status --description "Show the git diff of the given file."
+ # remove quotes because they'll be interpreted literally by git diff
+ # no need to requote when referencing $path because fish does not perform word splitting
+ # https://fishshell.com/docs/current/fish_for_bash_users.html
+ set -f path (string unescape (string sub --start 4 $path_status))
+ # first letter of short format shows index, second letter shows working tree
+ # https://git-scm.com/docs/git-status/2.35.0#_short_format
+ set -f index_status (string sub --length 1 $path_status)
+ set -f working_tree_status (string sub --start 2 --length 1 $path_status)
+
+ set -f diff_opts --color=always
+
+ if test $index_status = '?'
+ _fzf_report_diff_type Untracked
+ _fzf_preview_file $path
+ else if contains {$index_status}$working_tree_status DD AU UD UA DU AA UU
+ # Unmerged statuses taken directly from git status help's short format table
+ # Unmerged statuses are mutually exclusive with other statuses, so if we see
+ # these, then safe to assume the path is unmerged
+ _fzf_report_diff_type Unmerged
+ git diff $diff_opts -- $path
+ else
+ if test $index_status != ' '
+ _fzf_report_diff_type Staged
+
+ # renames are only detected in the index, never working tree, so only need to test for it here
+ # https://stackoverflow.com/questions/73954214
+ if test $index_status = R
+ # diff the post-rename path with the original path, otherwise the diff will show the entire file as being added
+ set -f orig_and_new_path (string split --max 1 -- ' -> ' $path)
+ git diff --staged $diff_opts -- $orig_and_new_path[1] $orig_and_new_path[2]
+ # path currently has the form of "original -> current", so we need to correct it before it's used below
+ set path $orig_and_new_path[2]
+ else
+ git diff --staged $diff_opts -- $path
+ end
+ end
+
+ if test $working_tree_status != ' '
+ _fzf_report_diff_type Unstaged
+ git diff $diff_opts -- $path
+ end
+ end
+end
@@ -0,0 +1,43 @@
+# helper function for _fzf_search_directory and _fzf_search_git_status
+function _fzf_preview_file --description "Print a preview for the given file based on its file type."
+ # because there's no way to guarantee that _fzf_search_directory passes the path to _fzf_preview_file
+ # as one argument, we collect all the arguments into one single variable and treat that as the path
+ set -f file_path $argv
+
+ if test -L "$file_path" # symlink
+ # notify user and recurse on the target of the symlink, which can be any of these file types
+ set -l target_path (realpath "$file_path")
+
+ set_color yellow
+ echo "'$file_path' is a symlink to '$target_path'."
+ set_color normal
+
+ _fzf_preview_file "$target_path"
+ else if test -f "$file_path" # regular file
+ if set --query fzf_preview_file_cmd
+ # need to escape quotes to make sure eval receives file_path as a single arg
+ eval "$fzf_preview_file_cmd '$file_path'"
+ else
+ bat --style=numbers --color=always "$file_path"
+ end
+ else if test -d "$file_path" # directory
+ if set --query fzf_preview_dir_cmd
+ # see above
+ eval "$fzf_preview_dir_cmd '$file_path'"
+ else
+ # -A list hidden files as well, except for . and ..
+ # -F helps classify files by appending symbols after the file name
+ command ls -A -F "$file_path"
+ end
+ else if test -c "$file_path"
+ _fzf_report_file_type "$file_path" "character device file"
+ else if test -b "$file_path"
+ _fzf_report_file_type "$file_path" "block device file"
+ else if test -S "$file_path"
+ _fzf_report_file_type "$file_path" socket
+ else if test -p "$file_path"
+ _fzf_report_file_type "$file_path" "named pipe"
+ else
+ echo "$file_path doesn't exist." >&2
+ end
+end
@@ -0,0 +1,18 @@
+# helper for _fzf_preview_changed_file
+# prints out something like
+# ╭────────╮
+# │ Staged │
+# ╰────────╯
+function _fzf_report_diff_type --argument-names diff_type --description "Print a distinct colored header meant to preface a git patch."
+ # number of "-" to draw is the length of the string to box + 2 for padding
+ set -f repeat_count (math 2 + (string length $diff_type))
+ set -f line (string repeat --count $repeat_count ─)
+ set -f top_border ╭$line╮
+ set -f btm_border ╰$line╯
+
+ set_color yellow
+ echo $top_border
+ echo "│ $diff_type │"
+ echo $btm_border
+ set_color normal
+end
@@ -0,0 +1,6 @@
+# helper function for _fzf_preview_file
+function _fzf_report_file_type --argument-names file_path file_type --description "Explain the file type for a file."
+ set_color red
+ echo "Cannot preview '$file_path': it is a $file_type."
+ set_color normal
+end
@@ -0,0 +1,33 @@
+function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths."
+ # Directly use fd binary to avoid output buffering delay caused by a fd alias, if any.
+ # Debian-based distros install fd as fdfind and the fd package is something else, so
+ # check for fdfind first. Fall back to "fd" for a clear error message.
+ set -f fd_cmd (command -v fdfind || command -v fd || echo "fd")
+ set -f --append fd_cmd --color=always $fzf_fd_opts
+
+ set -f fzf_arguments --multi --ansi $fzf_directory_opts
+ set -f token (commandline --current-token)
+ # expand any variables or leading tilde (~) in the token
+ set -f expanded_token (eval echo -- $token)
+ # unescape token because it's already quoted so backslashes will mess up the path
+ set -f unescaped_exp_token (string unescape -- $expanded_token)
+
+ # If the current token is a directory and has a trailing slash,
+ # then use it as fd's base directory.
+ if string match --quiet -- "*/" $unescaped_exp_token && test -d "$unescaped_exp_token"
+ set --append fd_cmd --base-directory=$unescaped_exp_token
+ # use the directory name as fzf's prompt to indicate the search is limited to that directory
+ set --prepend fzf_arguments --prompt="Directory $unescaped_exp_token> " --preview="_fzf_preview_file $expanded_token{}"
+ set -f file_paths_selected $unescaped_exp_token($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ else
+ set --prepend fzf_arguments --prompt="Directory> " --query="$unescaped_exp_token" --preview='_fzf_preview_file {}'
+ set -f file_paths_selected ($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ end
+
+
+ if test $status -eq 0
+ commandline --current-token --replace -- (string escape -- $file_paths_selected | string join ' ')
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,36 @@
+function _fzf_search_git_log --description "Search the output of git log and preview commits. Replace the current token with the selected commit hash."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_log: Not in a git repository.' >&2
+ else
+ if not set --query fzf_git_log_format
+ # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below
+ set -f fzf_git_log_format '%C(bold blue)%h%C(reset) - %C(cyan)%ad%C(reset) %C(yellow)%d%C(reset) %C(normal)%s%C(reset) %C(dim normal)[%an]%C(reset)'
+ end
+
+ set -f preview_cmd 'git show --color=always --stat --patch {1}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_log_lines (
+ git log --no-show-signature --color=always --format=format:$fzf_git_log_format --date=short | \
+ _fzf_wrapper --ansi \
+ --multi \
+ --scheme=history \
+ --prompt="Git Log> " \
+ --preview=$preview_cmd \
+ --query=(commandline --current-token) \
+ $fzf_git_log_opts
+ )
+ if test $status -eq 0
+ for line in $selected_log_lines
+ set -f abbreviated_commit_hash (string split --field 1 " " $line)
+ set -f full_commit_hash (git rev-parse $abbreviated_commit_hash)
+ set -f --append commit_hashes $full_commit_hash
+ end
+ commandline --current-token --replace (string join ' ' $commit_hashes)
+ end
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,41 @@
+function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_status: Not in a git repository.' >&2
+ else
+ set -f preview_cmd '_fzf_preview_changed_file {}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_paths (
+ # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe
+ git -c color.status=always status --short |
+ _fzf_wrapper --ansi \
+ --multi \
+ --prompt="Git Status> " \
+ --query=(commandline --current-token) \
+ --preview=$preview_cmd \
+ --nth="2.." \
+ $fzf_git_status_opts
+ )
+ if test $status -eq 0
+ # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle
+ # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping")
+ set -f cleaned_paths
+
+ for path in $selected_paths
+ if test (string sub --length 1 $path) = R
+ # path has been renamed and looks like "R LICENSE -> LICENSE.md"
+ # extract the path to use from after the arrow
+ set --append cleaned_paths (string split -- "-> " $path)[-1]
+ else
+ set --append cleaned_paths (string sub --start=4 $path)
+ end
+ end
+
+ commandline --current-token --replace -- (string join ' ' $cleaned_paths)
+ end
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,39 @@
+function _fzf_search_history --description "Search command history. Replace the command line with the selected command."
+ # history merge incorporates history changes from other fish sessions
+ # it errors out if called in private mode
+ if test -z "$fish_private_mode"
+ builtin history merge
+ end
+
+ if not set --query fzf_history_time_format
+ # Reference https://devhints.io/strftime to understand strftime format symbols
+ set -f fzf_history_time_format "%m-%d %H:%M:%S"
+ end
+
+ # Delinate time from command in history entries using the vertical box drawing char (U+2502).
+ # Then, to get raw command from history entries, delete everything up to it. The ? on regex is
+ # necessary to make regex non-greedy so it won't match into commands containing the char.
+ set -f time_prefix_regex '^.*? │ '
+ # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+ set -f commands_selected (
+ builtin history --null --show-time="$fzf_history_time_format │ " |
+ _fzf_wrapper --read0 \
+ --print0 \
+ --multi \
+ --scheme=history \
+ --prompt="History> " \
+ --query=(commandline) \
+ --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \
+ --preview-window="bottom:3:wrap" \
+ $fzf_history_opts |
+ string split0 |
+ # remove timestamps from commands selected
+ string replace --regex $time_prefix_regex ''
+ )
+
+ if test $status -eq 0
+ commandline --replace -- $commands_selected
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,32 @@
+function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
+ # Directly use ps command because it is often aliased to a different command entirely
+ # or with options that dirty the search results and preview output
+ set -f ps_cmd (command -v ps || echo "ps")
+ # use all caps to be consistent with ps default format
+ # snake_case because ps doesn't seem to allow spaces in the field names
+ set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
+ set -f processes_selected (
+ $ps_cmd -A -opid,command | \
+ _fzf_wrapper --multi \
+ --prompt="Processes> " \
+ --query (commandline --current-token) \
+ --ansi \
+ # first line outputted by ps is a header, so we need to mark it as so
+ --header-lines=1 \
+ # ps uses exit code 1 if the process was not found, in which case show an message explaining so
+ --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \
+ --preview-window="bottom:4:wrap" \
+ $fzf_processes_opts
+ )
+
+ if test $status -eq 0
+ for process in $processes_selected
+ set -f --append pids_selected (string split --no-empty --field=1 -- " " $process)
+ end
+
+ # string join to replace the newlines outputted by string split with spaces
+ commandline --current-token --replace -- (string join ' ' $pids_selected)
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,47 @@
+# This function expects the following two arguments:
+# argument 1 = output of (set --show | psub), i.e. a file with the scope info and values of all variables
+# argument 2 = output of (set --names | psub), i.e. a file with all variable names
+function _fzf_search_variables --argument-names set_show_output set_names_output --description "Search and preview shell variables. Replace the current token with the selected variable."
+ if test -z "$set_names_output"
+ printf '%s\n' '_fzf_search_variables requires 2 arguments.' >&2
+
+ commandline --function repaint
+ return 22 # 22 means invalid argument in POSIX
+ end
+
+ # Exclude the history variable from being piped into fzf because
+ # 1. it's not included in $set_names_output
+ # 2. it tends to be a very large value => increases computation time
+ # 3._fzf_search_history is a much better way to examine history anyway
+ set -f all_variable_names (string match --invert history <$set_names_output)
+
+ set -f current_token (commandline --current-token)
+ # Use the current token to pre-populate fzf's query. If the current token begins
+ # with a $, remove it from the query so that it will better match the variable names
+ set -f cleaned_curr_token (string replace -- '$' '' $current_token)
+
+ set -f variable_names_selected (
+ printf '%s\n' $all_variable_names |
+ _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \
+ --prompt="Variables> " \
+ --preview-window="wrap" \
+ --multi \
+ --query=$cleaned_curr_token \
+ $fzf_variables_opts
+ )
+
+ if test $status -eq 0
+ # If the current token begins with a $, do not overwrite the $ when
+ # replacing the current token with the selected variable.
+ # Uses brace expansion to prepend $ to each variable name.
+ commandline --current-token --replace (
+ if string match --quiet -- '$*' $current_token
+ string join " " \${$variable_names_selected}
+ else
+ string join " " $variable_names_selected
+ end
+ )
+ end
+
+ commandline --function repaint
+end
@@ -0,0 +1,20 @@
+function _fzf_wrapper --description "Prepares some environment variables before executing fzf."
+ # Make sure fzf uses fish to execute preview commands, some of which
+ # are autoloaded fish functions so don't exist in other shells.
+ # Use --function so that it doesn't clobber SHELL outside this function.
+ set -f --export SHELL (command --search fish)
+
+ # If FZF_DEFAULT_OPTS is not set, then set some sane defaults.
+ # See https://github.com/junegunn/fzf#environment-variables
+ if not set --query FZF_DEFAULT_OPTS
+ # cycle allows jumping between the first and last results, making scrolling faster
+ # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env
+ # border shows where the fzf window begins and ends
+ # height=90% leaves space to see the current command and some scrollback, maintaining context of work
+ # preview-window=wrap wraps long lines in the preview window, making reading easier
+ # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >)
+ set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"'
+ end
+
+ fzf $argv
+end
@@ -0,0 +1,19 @@
+function _tide_1_line_prompt
+ set -g add_prefix
+ _tide_side=left for item in $_tide_left_items
+ _tide_item_$item
+ end
+ set_color $prev_bg_color -b normal
+ echo $tide_left_prompt_suffix
+
+ set -g add_prefix
+ _tide_side=right for item in $_tide_right_items
+ _tide_item_$item
+ end
+ set_color $prev_bg_color -b normal
+ echo $tide_right_prompt_suffix
+end
+
+function _tide_item_pwd
+ _tide_print_item pwd @PWD@
+end
@@ -0,0 +1,31 @@
+function _tide_2_line_prompt
+ set -g add_prefix
+ _tide_side=left for item in $_tide_left_items
+ _tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo $tide_left_prompt_suffix
+ end
+
+ echo
+
+ set -g add_prefix
+ _tide_side=right for item in $_tide_right_items
+ _tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo $tide_right_prompt_suffix
+ end
+end
+
+function _tide_item_pwd
+ _tide_print_item pwd @PWD@
+end
+
+function _tide_item_newline
+ set_color $prev_bg_color -b normal
+ v=tide_"$_tide_side"_prompt_suffix echo $$v
+ set -g add_prefix
+end
@@ -0,0 +1,17 @@
+function _tide_cache_variables
+ # Same-color-separator color
+ set_color $tide_prompt_color_separator_same_color | read -gx _tide_color_separator_same_color
+
+ # git
+ contains git $_tide_left_items $_tide_right_items && set_color $tide_git_color_branch | read -gx _tide_location_color
+
+ # private_mode
+ if contains private_mode $_tide_left_items $_tide_right_items && test -n "$fish_private_mode"
+ set -gx _tide_private_mode
+ else
+ set -e _tide_private_mode
+ end
+
+ # item padding
+ test "$tide_prompt_pad_items" = true && set -gx _tide_pad ' ' || set -e _tide_pad
+end
@@ -0,0 +1,77 @@
+# Outputs icon, color, bg_color
+function _tide_detect_os
+ set -lx defaultColor 080808 CED7CF
+ switch (uname | string lower)
+ case darwin
+ printf %s\n D6D6D6 333333 # from apple.com header
+ case freebsd openbsd dragonfly
+ printf %s\n FFFFFF AB2B28 # https://freebsdfoundation.org/about-us/about-the-foundation/project/
+ case 'cygwin*' 'mingw*_nt*' 'msys_nt*'
+ printf %s\n FFFFFF 00CCFF # https://answers.microsoft.com/en-us/windows/forum/all/what-is-the-official-windows-8-blue-rgb-or-hex/fd57144b-f69b-42d8-8c21-6ca911646e44
+ case linux
+ if test (uname -o) = Android
+ echo ﲎ # This character is evil and messes up code display, so it's put on its own line
+ # https://developer.android.com/distribute/marketing-tools/brand-guidelines
+ printf %s\n 3DDC84 3C3F41 # fg is from above link, bg is from Android Studio default dark theme
+ else
+ _tide_detect_os_linux_cases /etc/os-release ID ||
+ _tide_detect_os_linux_cases /etc/os-release ID_LIKE ||
+ _tide_detect_os_linux_cases /etc/lsb-release DISTRIB_ID ||
+ printf %s\n $defaultColor
+ end
+ case '*'
+ echo -ns '?'
+ end
+end
+
+function _tide_detect_os_linux_cases -a file key
+ test -e $file || return
+ set -l split_file (string split '=' <$file)
+ set -l key_index (contains --index $key $split_file) || return
+ set -l value (string trim --chars='"' $split_file[(math $key_index + 1)])
+
+ # Anything which would have pure white background has been changed to D4D4D4
+ # It was just too bright otherwise
+ switch (string lower $value)
+ case alpine
+ printf %s\n FFFFFF 0D597F # from alpine logo
+ case arch
+ printf %s\n 1793D1 4D4D4D # from arch wiki header
+ case centos
+ printf %s\n 000000 D4D4D4 # https://wiki.centos.org/ArtWork/Brand/Logo, monochromatic
+ case debian
+ printf %s\n C70036 D4D4D4 # from debian logo https://www.debian.org/logos/openlogo-nd-100.png
+ case devuan
+ printf %s\n $defaultColor # logo is monochromatic
+ case elementary
+ printf %s\n 000000 D4D4D4 # https://elementary.io/brand, encouraged to be monochromatic
+ case fedora
+ printf %s\n FFFFFF 294172 # from logo https://fedoraproject.org/w/uploads/2/2d/Logo_fedoralogo.png
+ case gentoo
+ printf %s\n FFFFFF 54487A # https://wiki.gentoo.org/wiki/Project:Artwork/Colors
+ case mageia
+ printf %s\n FFFFFF 262F45 # https://wiki.mageia.org/en/Artwork_guidelines
+ case manjaro
+ printf %s\n FFFFFF 35BF5C # from https://gitlab.manjaro.org/artwork/branding/logo/-/blob/master/logo.svg
+ case mint linuxmint
+ printf %s\n FFFFFF 69B53F # extracted from https://linuxmint.com/web/img/favicon.ico
+ case nixos
+ printf %s\n FFFFFF 5277C3 # https://github.com/NixOS/nixos-artwork/tree/master/logo
+ case opensuse-leap opensuse-tumbleweed opensuse-microos
+ printf %s\n 73BA25 173f4f # https://en.opensuse.org/openSUSE:Artwork_brand
+ case raspbian
+ printf %s\n FFFFFF A22846 # https://static.raspberrypi.org/files/Raspberry_Pi_Visual_Guidelines_2020.pdf
+ case rhel
+ printf %s\n EE0000 000000 # https://www.redhat.com/en/about/brand/standards/color
+ case sabayon
+ printf %s\n $defaultColor # Can't find colors, and they are rebranding anyway
+ case slackware
+ printf %s\n $defaultColor # Doesn't really have a logo, and the colors are too close to PWD blue anyway
+ case ubuntu
+ printf %s\n E95420 D4D4D4 # https://design.ubuntu.com/brand/
+ case void
+ printf %s\n FFFFFF 478061 # from https://alpha.de.repo.voidlinux.org/logos/void.svg
+ case '*'
+ return 1
+ end
+end
@@ -0,0 +1,3 @@
+function _tide_find_and_remove -a name list --no-scope-shadowing
+ contains --index $name $$list | read -l index && set -e "$list"[$index]
+end
@@ -0,0 +1,7 @@
+function _tide_fish_colorize
+ if command -q fish_indent
+ echo -ns "$argv" | fish_indent --ansi
+ else
+ echo -ns "$argv"
+ end
+end
@@ -0,0 +1,11 @@
+function _tide_item_aws
+ # AWS_PROFILE overrides AWS_DEFAULT_PROFILE, AWS_REGION overrides AWS_DEFAULT_REGION
+ set -q AWS_PROFILE && set -l AWS_DEFAULT_PROFILE $AWS_PROFILE
+ set -q AWS_REGION && set -l AWS_DEFAULT_REGION $AWS_REGION
+
+ if test -n "$AWS_DEFAULT_PROFILE" && test -n "$AWS_DEFAULT_REGION"
+ _tide_print_item aws $tide_aws_icon' ' "$AWS_DEFAULT_PROFILE/$AWS_DEFAULT_REGION"
+ else if test -n "$AWS_DEFAULT_PROFILE$AWS_DEFAULT_REGION"
+ _tide_print_item aws $tide_aws_icon' ' "$AWS_DEFAULT_PROFILE$AWS_DEFAULT_REGION"
+ end
+end
@@ -0,0 +1,17 @@
+function _tide_item_character
+ test $_tide_status = 0 && set_color $tide_character_color || set_color $tide_character_color_failure
+
+ set -q add_prefix || echo -ns ' '
+
+ test "$fish_key_bindings" = fish_default_key_bindings && echo -ns $tide_character_icon ||
+ switch $fish_bind_mode
+ case insert
+ echo -ns $tide_character_icon
+ case default
+ echo -ns $tide_character_vi_icon_default
+ case replace replace_one
+ echo -ns $tide_character_vi_icon_replace
+ case visual
+ echo -ns $tide_character_vi_icon_visual
+ end
+end
@@ -0,0 +1,12 @@
+function _tide_item_cmd_duration
+ test $CMD_DURATION -gt $tide_cmd_duration_threshold && t=(
+ math -s0 "$CMD_DURATION/3600000" # Hours
+ math -s0 "$CMD_DURATION/60000"%60 # Minutes
+ math -s$tide_cmd_duration_decimals "$CMD_DURATION/1000"%60) if test $t[1] != 0
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[1]h $t[2]m $t[3]s"
+ else if test $t[2] != 0
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[2]m $t[3]s"
+ else
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[3]s"
+ end
+end
@@ -0,0 +1,14 @@
+function _tide_item_context
+ if set -q SSH_TTY
+ set -fx tide_context_color $tide_context_color_ssh
+ else if test "$EUID" = 0
+ set -fx tide_context_color $tide_context_color_root
+ else if test "$tide_context_always_display" = true
+ set -fx tide_context_color $tide_context_color_default
+ else
+ return
+ end
+
+ string match -qr "^(?<h>(\.?[^\.]*){0,$tide_context_hostname_parts})" @$hostname
+ _tide_print_item context $USER$h
+end
@@ -0,0 +1,6 @@
+function _tide_item_crystal
+ if path is $_tide_parent_dirs/shard.yml
+ crystal --version | string match -qr "(?<v>[\d.]+)"
+ _tide_print_item crystal $tide_crystal_icon' ' $v
+ end
+end
@@ -0,0 +1,7 @@
+function _tide_item_direnv
+ set -q DIRENV_DIR || return
+ direnv status | string match -q 'Found RC allowed false' &&
+ set -lx tide_direnv_color $tide_direnv_color_denied &&
+ set -lx tide_direnv_bg_color $tide_direnv_bg_color_denied
+ _tide_print_item direnv $tide_direnv_icon
+end
@@ -0,0 +1,4 @@
+function _tide_item_distrobox
+ test -e /etc/profile.d/distrobox_profile.sh && test -e /run/.containerenv &&
+ _tide_print_item distrobox $tide_distrobox_icon' ' (string match -rg 'name="(.*)"' </run/.containerenv)
+end
@@ -0,0 +1,5 @@
+function _tide_item_docker
+ docker context inspect --format '{{.Name}}' | read -l context
+ contains -- "$context" $tide_docker_default_contexts ||
+ _tide_print_item docker $tide_docker_icon' ' $context
+end
@@ -0,0 +1,4 @@
+function _tide_item_elixir
+ path is $_tide_parent_dirs/mix.exs &&
+ _tide_print_item elixir $tide_elixir_icon' ' (elixir --short-version)
+end
@@ -0,0 +1,8 @@
+function _tide_item_gcloud
+ set -q CLOUDSDK_CONFIG || set -l CLOUDSDK_CONFIG ~/.config/gcloud
+ path is $CLOUDSDK_CONFIG/active_config &&
+ read -l config <$CLOUDSDK_CONFIG/active_config &&
+ path is $CLOUDSDK_CONFIG/configurations/config_$config &&
+ string match -qr '^\s*project\s*=\s*(?<project>.*)' <$CLOUDSDK_CONFIG/configurations/config_$config &&
+ _tide_print_item gcloud $tide_gcloud_icon' ' $project
+end
@@ -0,0 +1,72 @@
+function _tide_item_git
+ if git branch --show-current 2>/dev/null | string shorten -"$tide_git_truncation_strategy"m$tide_git_truncation_length | read -l location
+ git rev-parse --git-dir --is-inside-git-dir | read -fL gdir in_gdir
+ set location $_tide_location_color$location
+ else if test $pipestatus[1] != 0
+ return
+ else if git tag --points-at HEAD | string shorten -"$tide_git_truncation_strategy"m$tide_git_truncation_length | read location
+ git rev-parse --git-dir --is-inside-git-dir | read -fL gdir in_gdir
+ set location '#'$_tide_location_color$location
+ else
+ git rev-parse --git-dir --is-inside-git-dir --short HEAD | read -fL gdir in_gdir location
+ set location @$_tide_location_color$location
+ end
+
+ # Operation
+ if test -d $gdir/rebase-merge
+ # Turn ANY into ALL, via double negation
+ if not path is -v $gdir/rebase-merge/{msgnum,end}
+ read -f step <$gdir/rebase-merge/msgnum
+ read -f total_steps <$gdir/rebase-merge/end
+ end
+ test -f $gdir/rebase-merge/interactive && set -f operation rebase-i || set -f operation rebase-m
+ else if test -d $gdir/rebase-apply
+ if not path is -v $gdir/rebase-apply/{next,last}
+ read -f step <$gdir/rebase-apply/next
+ read -f total_steps <$gdir/rebase-apply/last
+ end
+ if test -f $gdir/rebase-apply/rebasing
+ set -f operation rebase
+ else if test -f $gdir/rebase-apply/applying
+ set -f operation am
+ else
+ set -f operation am/rebase
+ end
+ else if test -f $gdir/MERGE_HEAD
+ set -f operation merge
+ else if test -f $gdir/CHERRY_PICK_HEAD
+ set -f operation cherry-pick
+ else if test -f $gdir/REVERT_HEAD
+ set -f operation revert
+ else if test -f $gdir/BISECT_LOG
+ set -f operation bisect
+ end
+
+ # Git status/stash + Upstream behind/ahead
+ test $in_gdir = true && set -l _set_dir_opt -C $gdir/..
+ # Suppress errors in case we are in a bare repo or there is no upstream
+ set -l stat (git $_set_dir_opt --no-optional-locks status --porcelain 2>/dev/null)
+ string match -qr '(0|(?<stash>.*))\n(0|(?<conflicted>.*))\n(0|(?<staged>.*))
+(0|(?<dirty>.*))\n(0|(?<untracked>.*))(\n(0|(?<behind>.*))\t(0|(?<ahead>.*)))?' \
+ "$(git $_set_dir_opt stash list 2>/dev/null | count
+ string match -r ^UU $stat | count
+ string match -r ^[ADMR]. $stat | count
+ string match -r ^.[ADMR] $stat | count
+ string match -r '^\?\?' $stat | count
+ git rev-list --count --left-right @{upstream}...HEAD 2>/dev/null)"
+
+ if test -n "$operation$conflicted"
+ set -g tide_git_bg_color $tide_git_bg_color_urgent
+ else if test -n "$staged$dirty$untracked"
+ set -g tide_git_bg_color $tide_git_bg_color_unstable
+ end
+
+ _tide_print_item git $_tide_location_color$tide_git_icon' ' (set_color white; echo -ns $location
+ set_color $tide_git_color_operation; echo -ns ' '$operation ' '$step/$total_steps
+ set_color $tide_git_color_upstream; echo -ns ' ⇣'$behind ' ⇡'$ahead
+ set_color $tide_git_color_stash; echo -ns ' *'$stash
+ set_color $tide_git_color_conflicted; echo -ns ' ~'$conflicted
+ set_color $tide_git_color_staged; echo -ns ' +'$staged
+ set_color $tide_git_color_dirty; echo -ns ' !'$dirty
+ set_color $tide_git_color_untracked; echo -ns ' ?'$untracked)
+end
@@ -0,0 +1,6 @@
+function _tide_item_go
+ if path is $_tide_parent_dirs/go.mod
+ go version | string match -qr "(?<v>[\d.]+)"
+ _tide_print_item go $tide_go_icon' ' $v
+ end
+end
@@ -0,0 +1,6 @@
+function _tide_item_java
+ if path is $_tide_parent_dirs/pom.xml
+ java -version &| string match -qr "(?<v>[\d.]+)"
+ _tide_print_item java $tide_java_icon' ' $v
+ end
+end
@@ -0,0 +1,7 @@
+function _tide_item_jobs
+ set -q _tide_jobs && if test $_tide_jobs -ge $tide_jobs_number_threshold
+ _tide_print_item jobs $tide_jobs_icon' ' $_tide_jobs
+ else
+ _tide_print_item jobs $tide_jobs_icon
+ end
+end
@@ -0,0 +1,4 @@
+function _tide_item_kubectl
+ kubectl config view --minify --output 'jsonpath={.current-context}/{..namespace}' 2>/dev/null | read -l context &&
+ _tide_print_item kubectl $tide_kubectl_icon' ' (string replace -r '/(|default)$' '' $context)
+end
@@ -0,0 +1,3 @@
+function _tide_item_nix_shell
+ set -q IN_NIX_SHELL && _tide_print_item nix_shell $tide_nix_shell_icon' ' $IN_NIX_SHELL
+end
@@ -0,0 +1,6 @@
+function _tide_item_node
+ if path is $_tide_parent_dirs/package.json
+ node --version | string match -qr "v(?<v>.*)"
+ _tide_print_item node $tide_node_icon' ' $v
+ end
+end
@@ -0,0 +1,3 @@
+function _tide_item_os
+ _tide_print_item os $tide_os_icon
+end
@@ -0,0 +1,6 @@
+function _tide_item_php
+ if path is $_tide_parent_dirs/composer.json
+ php --version | string match -qr "(?<v>[\d.]+)"
+ _tide_print_item php $tide_php_icon' ' $v
+ end
+end
@@ -0,0 +1,3 @@
+function _tide_item_private_mode
+ set -q _tide_private_mode && _tide_print_item private_mode $tide_private_mode_icon
+end
@@ -0,0 +1,19 @@
+function _tide_item_pulumi
+ if path filter $_tide_parent_dirs/Pulumi.yaml | read -l yaml_path
+ if command -q sha1sum
+ echo -n "$yaml_path" | sha1sum | string match -qr "(?<path_hash>.{40})"
+ else if command -q shasum
+ echo -n "$yaml_path" | shasum | string match -qr "(?<path_hash>.{40})"
+ else
+ return
+ end
+
+ string match -qr 'name: *(?<project_name>.*)' <$yaml_path
+ set -l workspace_file "$HOME/.pulumi/workspaces/$project_name-$path_hash-workspace.json"
+
+ if test -e $workspace_file
+ string match -qr '"stack": *"(?<stack>.*)"' <$workspace_file
+ _tide_print_item pulumi $tide_pulumi_icon' ' $stack
+ end
+ end
+end
@@ -0,0 +1,27 @@
+function _tide_item_python
+ if test -n "$VIRTUAL_ENV"
+ if command -q python3
+ python3 --version | string match -qr "(?<v>[\d.]+)"
+ else
+ python --version | string match -qr "(?<v>[\d.]+)"
+ end
+ string match -qr "^.*/(?<dir>.*)/(?<base>.*)" $VIRTUAL_ENV
+ # pipenv $VIRTUAL_ENV looks like /home/ilan/.local/share/virtualenvs/pipenv_project-EwRYuc3l
+ # Detect whether we are using pipenv by looking for 'virtualenvs'. If so, remove the hash at the end.
+ if test "$dir" = virtualenvs
+ string match -qr "(?<base>.*)-.*" $base
+ _tide_print_item python $tide_python_icon' ' "$v ($base)"
+ else if contains -- "$base" virtualenv venv .venv env # avoid generic names
+ _tide_print_item python $tide_python_icon' ' "$v ($dir)"
+ else
+ _tide_print_item python $tide_python_icon' ' "$v ($base)"
+ end
+ else if path is .python-version Pipfile __init__.py pyproject.toml requirements.txt setup.py
+ if command -q python3
+ python3 --version | string match -qr "(?<v>[\d.]+)"
+ else
+ python --version | string match -qr "(?<v>[\d.]+)"
+ end
+ _tide_print_item python $tide_python_icon' ' $v
+ end
+end
@@ -0,0 +1,6 @@
+function _tide_item_ruby
+ if path is $_tide_parent_dirs/{*.gemspec,Gemfile,Rakefile,.ruby-version}
+ ruby --version | string match -qr "(?<v>[\d.]+)"
+ _tide_print_item ruby $tide_ruby_icon' ' $v
+ end
+end
@@ -0,0 +1,6 @@
+function _tide_item_rustc
+ if path is $_tide_parent_dirs/Cargo.toml
+ rustc --version | string match -qr "(?<v>[\d.]+)"
+ _tide_print_item rustc $tide_rustc_icon' ' $v
+ end
+end
@@ -0,0 +1,4 @@
+function _tide_item_shlvl
+ # Non-interactive shells do not increment SHLVL, so we don't need to subtract 1
+ test $SHLVL -gt $tide_shlvl_threshold && _tide_print_item shlvl $tide_shlvl_icon' ' $SHLVL
+end
@@ -0,0 +1,15 @@
+function _tide_item_status
+ if string match -qv 0 $_tide_pipestatus # If there is a failure anywhere in the pipestatus
+ if test "$_tide_pipestatus" = 1 # If simple failure
+ contains character $_tide_left_items || tide_status_bg_color=$tide_status_bg_color_failure \
+ tide_status_color=$tide_status_color_failure _tide_print_item status $tide_status_icon_failure' ' 1
+ else
+ fish_status_to_signal $_tide_pipestatus | string replace SIG '' | string join '|' | read -l out
+ test $_tide_status = 0 && _tide_print_item status $tide_status_icon' ' $out ||
+ tide_status_bg_color=$tide_status_bg_color_failure tide_status_color=$tide_status_color_failure \
+ _tide_print_item status $tide_status_icon_failure' ' $out
+ end
+ else if not contains character $_tide_left_items
+ _tide_print_item status $tide_status_icon
+ end
+end
@@ -0,0 +1,5 @@
+function _tide_item_terraform
+ path is $_tide_parent_dirs/.terraform &&
+ terraform workspace show | string match -v default | read -l w &&
+ _tide_print_item terraform $tide_terraform_icon' ' $w
+end
@@ -0,0 +1,3 @@
+function _tide_item_time
+ _tide_print_item time (date +$tide_time_format)
+end
@@ -0,0 +1,4 @@
+function _tide_item_toolbox
+ test -e /run/.toolboxenv &&
+ _tide_print_item toolbox $tide_toolbox_icon' ' (string match -rg 'name="(.*)"' </run/.containerenv)
+end
@@ -0,0 +1,16 @@
+function _tide_item_vi_mode
+ test "$fish_key_bindings" != fish_default_key_bindings && switch $fish_bind_mode
+ case default
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_default tide_vi_mode_color=$tide_vi_mode_color_default \
+ _tide_print_item vi_mode $tide_vi_mode_icon_default
+ case insert
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_insert tide_vi_mode_color=$tide_vi_mode_color_insert \
+ _tide_print_item vi_mode $tide_vi_mode_icon_insert
+ case replace replace_one
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_replace tide_vi_mode_color=$tide_vi_mode_color_replace \
+ _tide_print_item vi_mode $tide_vi_mode_icon_replace
+ case visual
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_visual tide_vi_mode_color=$tide_vi_mode_color_visual \
+ _tide_print_item vi_mode $tide_vi_mode_icon_visual
+ end
+end
@@ -0,0 +1,6 @@
+function _tide_item_zig
+ if path is $_tide_parent_dirs/build.zig
+ zig version | string match -qr "(?<v>[\d.]+(-dev)?)"
+ _tide_print_item zig $tide_zig_icon' ' $v
+ end
+end
@@ -0,0 +1,7 @@
+function _tide_parent_dirs --on-variable PWD
+ set -g _tide_parent_dirs (string escape (
+ for dir in (string split / -- $PWD)
+ set -la parts $dir
+ string join / -- $parts
+ end))
+end
@@ -0,0 +1,22 @@
+function _tide_print_item -a item
+ v=tide_"$item"_bg_color set -f item_bg_color $$v
+
+ if set -e add_prefix
+ set_color $item_bg_color -b normal
+ v=tide_"$_tide_side"_prompt_prefix echo -ns $$v
+ else if test "$item_bg_color" = "$prev_bg_color"
+ v=tide_"$_tide_side"_prompt_separator_same_color echo -ns $_tide_color_separator_same_color$$v
+ else if test $_tide_side = left
+ set_color $prev_bg_color -b $item_bg_color
+ echo -ns $tide_left_prompt_separator_diff_color
+ else
+ set_color $item_bg_color -b $prev_bg_color
+ echo -ns $tide_right_prompt_separator_diff_color
+ end
+
+ v=tide_"$item"_color set_color $$v -b $item_bg_color
+
+ echo -ns $_tide_pad $argv[2..] $_tide_pad
+
+ set -g prev_bg_color $item_bg_color
+end
@@ -0,0 +1,42 @@
+set_color -o $tide_pwd_color_anchors | read -l color_anchors
+set_color $tide_pwd_color_truncated_dirs | read -l color_truncated
+set -l reset_to_color_dirs (set_color normal -b $tide_pwd_bg_color; set_color $tide_pwd_color_dirs)
+
+set -l unwritable_icon $tide_pwd_icon_unwritable' '
+set -l home_icon $tide_pwd_icon_home' '
+set -l pwd_icon $tide_pwd_icon' '
+
+eval "function _tide_pwd
+ if set -l split_pwd (string replace -r '^$HOME' '~' -- \$PWD | string split /)
+ test -w . && set -f split_output \"$pwd_icon\$split_pwd[1]\" \$split_pwd[2..] ||
+ set -f split_output \"$unwritable_icon\$split_pwd[1]\" \$split_pwd[2..]
+ set split_output[-1] \"$color_anchors\$split_output[-1]$reset_to_color_dirs\"
+ else
+ set -f split_output \"$home_icon$color_anchors~\"
+ end
+
+ string join / -- \$split_output | string length -V | read -g _tide_pwd_len
+
+ i=1 for dir_section in \$split_pwd[2..-2]
+ string join -- / \$split_pwd[..\$i] | string replace '~' $HOME | read -l parent_dir # Uses i before increment
+
+ math \$i+1 | read i
+
+ if path is \$parent_dir/\$dir_section/\$tide_pwd_markers
+ set split_output[\$i] \"$color_anchors\$dir_section$reset_to_color_dirs\"
+ else if test \$_tide_pwd_len -gt \$dist_btwn_sides
+ string match -qr \"(?<trunc>\..|.)\" \$dir_section
+
+ set -l glob \$parent_dir/\$trunc*/
+ set -e glob[(contains -i \$parent_dir/\$dir_section/ \$glob)] # This is faster than inverse string match
+
+ while string match -qr \"^\$parent_dir/\$(string escape --style=regex \$trunc)\" \$glob &&
+ string match -qr \"(?<trunc>\$(string escape --style=regex \$trunc).)\" \$dir_section
+ end
+ test -n \"\$trunc\" && set split_output[\$i] \"$color_truncated\$trunc$reset_to_color_dirs\" &&
+ string join / \$split_output | string length -V | read _tide_pwd_len
+ end
+ end
+
+ string join -- / \"$reset_to_color_dirs\$split_output[1]\" \$split_output[2..]
+end"
@@ -0,0 +1,25 @@
+function _tide_remove_unusable_items
+ # Remove tool-specific items for tools the machine doesn't have installed
+ set -l removed_items
+ for item in aws crystal direnv distrobox docker elixir gcloud git go java kubectl nix_shell node php pulumi python ruby rustc terraform toolbox zig
+ contains $item $tide_left_prompt_items $tide_right_prompt_items || continue
+
+ set -l cli_names $item
+ switch $item
+ case distrobox # there is no 'distrobox' command inside the container
+ set cli_names distrobox-export # 'distrobox-export' and 'distrobox-host-exec' are available
+ case nix_shell
+ set cli_names nix nix-shell
+ case python
+ set cli_names python python3
+ end
+ type --query $cli_names || set -a removed_items $item
+ end
+
+ set -U _tide_left_items (for item in $tide_left_prompt_items
+ contains $item $removed_items || echo $item
+ end)
+ set -U _tide_right_items (for item in $tide_right_prompt_items
+ contains $item $removed_items || echo $item
+ end)
+end
@@ -0,0 +1,73 @@
+function _tide_sub_bug-report
+ argparse c/clean v/verbose check -- $argv
+
+ set -l fish_path (status fish-path)
+
+ if set -q _flag_clean
+ HOME=(mktemp -d) $fish_path --init-command "curl --silent \
+ https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish |
+ source && fisher install ilancosman/tide@v6"
+ else if set -q _flag_verbose
+ set --long | string match -r "^_?tide.*" | # Get only tide variables
+ string match -r --invert "^_tide_prompt_var.*" # Remove _tide_prompt_var
+ else
+ set -l fish_version ($fish_path --version | string match -r "fish, version (\d\.\d\.\d)")[2]
+ _tide_check_version Fish fish-shell/fish-shell "(\d\.\d\.\d)" $fish_version || return
+
+ set -l tide_version (tide --version | string match -r "tide, version (\d\.\d\.\d)")[2]
+ _tide_check_version Tide IlanCosman/tide "v(\d\.\d\.\d)" $tide_version || return
+
+ if command --query git
+ test (git --version | string match -r "git version ([\d\.]*)" | string replace --all . '')[2] -gt 2220
+ _tide_check_condition \
+ "Your git version is too old." \
+ "Tide requires at least version 2.22." \
+ "Please update before submitting a bug report." || return
+ end
+
+ # Check that omf is not installed
+ not functions --query omf
+ _tide_check_condition \
+ "Tide does not work with oh-my-fish installed." \
+ "Please uninstall it before submitting a bug report." || return
+
+ if not set -q _flag_check
+ set -l fish_startup_time ($fish_path -ic "time $fish_path -c exit" 2>|
+ string match -r "Executed in(.*)fish" | string trim)[2]
+
+ read --local --prompt-str "What operating system are you using? (e.g Ubuntu 20.04): " os
+ read --local --prompt-str "What terminal emulator are you using? (e.g Kitty): " terminal_emulator
+
+ printf '%b\n' "\nPlease copy the following information into the issue:\n" \
+ "fish version: $fish_version" \
+ "tide version: $tide_version" \
+ "term: $TERM" \
+ "os: $os" \
+ "terminal emulator: $terminal_emulator" \
+ "fish startup: $fish_startup_time" \
+ "fisher plugins: $_fisher_plugins"
+ end
+ end
+end
+
+function _tide_check_version -a program_name repo_name regex_to_get_version current_version
+ curl --silent https://github.com/$repo_name/releases/latest |
+ string match -r ".*$repo_name/releases/tag/$regex_to_get_version.*" |
+ read --local --line __ latestVersion
+
+ string match --quiet -r "^$latestVersion" "$current_version"
+ _tide_check_condition \
+ "Your $program_name version is out of date." \
+ "The latest is $latestVersion. You have $current_version." \
+ "Please update before submitting a bug report."
+end
+
+function _tide_check_condition
+ if test "$status" != 0
+ set_color red
+ printf '%s\n' $argv
+ set_color normal
+ return 1
+ end
+ return 0
+end
@@ -0,0 +1,156 @@
+set -g _tide_color_dark_blue 0087AF
+set -g _tide_color_dark_green 5FAF00
+set -g _tide_color_gold D7AF00
+set -g _tide_color_green 5FD700
+set -g _tide_color_light_blue 00AFFF
+
+# Create an empty fake function for each item
+for func in _fake(functions --all | string match --entire _tide_item)
+ function $func
+ end
+end
+
+for file in (status dirname)/tide/configure/{choices, functions}/**.fish
+ source $file
+end
+
+function _tide_sub_configure
+ set -l choices (path basename (status dirname)/tide/configure/choices/**.fish | path change-extension '')
+ argparse auto $choices= -- $argv
+
+ for var in (set -l --names | string match -e _flag)
+ set -x $var $$var
+ end
+
+ if set -q _flag_auto
+ set -fx _flag_finish 'Overwrite your current tide config'
+ else if test $COLUMNS -lt 55 -o $LINES -lt 21
+ echo 'Terminal size too small; must be at least 55 x 21'
+ return 1
+ end
+
+ _tide_detect_os | read -g --line os_branding_icon os_branding_color os_branding_bg_color
+
+ set -g fake_columns $COLUMNS
+ test $fake_columns -gt 90 && set fake_columns 90
+ set -g fake_lines $LINES
+
+ set -g _tide_selected_option
+ _next_choice all/style
+end
+
+function _next_choice -a nextChoice
+ set -q _tide_selected_option || return 0
+ set -l cmd (string split '/' $nextChoice)[2]
+ $cmd
+end
+
+function _tide_title -a text
+ set -q _flag_auto && return
+
+ command -q clear && clear
+ set_color -o
+ string pad --width (math --scale=0 "$fake_columns/2" + (string length $text)/2) $text
+ set_color normal
+
+ set -g _tide_configure_first_option_after_title
+end
+
+function _tide_option -a symbol text
+ set -ga _tide_symbol_list $symbol
+ set -ga _tide_option_list $text
+
+ if not set -q _flag_auto
+ set -g _tide_configure_first_prompt_after_option
+
+ set_color -o
+ set -e _tide_configure_first_option_after_title || echo
+ echo "($symbol) $text"
+ set_color normal
+ end
+end
+
+function _tide_menu -a func
+ if set -q _flag_auto
+ set -l flag_var_name _flag_$func
+ set -g _tide_selected_option $$flag_var_name
+
+ if test -z "$_tide_selected_option"
+ echo "Missing input for choice '$func'"
+ _tide_exit_configure
+ else if not contains $_tide_selected_option $_tide_option_list
+ echo "Invalid input '$_tide_selected_option' for choice '$func'"
+ _tide_exit_configure
+ else
+ set -e _tide_symbol_list
+ set -e _tide_option_list
+ end
+ return
+ end
+
+ argparse no-restart -- $argv # Add no-restart option for first menu
+
+ echo
+ if not set -q _flag_no_restart
+ set -f r r
+ echo '(r) Restart from the beginning'
+ end
+ echo '(q) Quit and do nothing'\n
+
+ while read --nchars 1 --prompt-str \
+ "$(set_color -o)Choice [$(string join '/' $_tide_symbol_list $r q)] $(set_color normal)" input
+ switch $input
+ case r
+ set -q _flag_no_restart && continue
+ set -e _tide_symbol_list
+ set -e _tide_option_list
+ _next_choice all/style
+ break
+ case q
+ _tide_exit_configure
+ set -e _tide_symbol_list
+ set -e _tide_option_list
+ command -q clear && clear
+ break
+ case $_tide_symbol_list
+ set -g _tide_selected_option $_tide_option_list[(contains -i $input $_tide_symbol_list)]
+ test "$func" != finish &&
+ set -a _tide_configure_current_options --$func=(string escape $_tide_selected_option)
+ set -e _tide_symbol_list
+ set -e _tide_option_list
+ break
+ end
+ end
+end
+
+function _tide_display_prompt
+ set -q _flag_auto && return
+
+ _fake_tide_cache_variables
+ set -l prompt (_fake_tide_prompt)
+
+ set -l bottom_left_prompt_string_length (string length --visible $prompt[-1])
+ set -l right_prompt_string (string pad --width (math $fake_columns-$bottom_left_prompt_string_length) $prompt[1])
+ set -l prompt[-1] "$prompt[-1]$right_prompt_string"
+
+ if set -q _configure_transient
+ if contains newline $fake_tide_left_prompt_items
+ string unescape $prompt[3..]
+ else
+ _fake_tide_item_character
+ echo
+ end
+ else
+ if not set -q _tide_configure_first_prompt_after_option
+ test "$fake_tide_prompt_add_newline_before" = true && echo
+ end
+ string unescape $prompt[2..]
+ end
+
+ set -e _tide_configure_first_prompt_after_option
+ set_color normal
+end
+
+function _tide_exit_configure
+ set -e _tide_selected_option # Skip through all switch and _next_choice
+end
@@ -0,0 +1,3 @@
+function _tide_sub_reload
+ source (functions --details fish_prompt)
+end
@@ -0,0 +1,36 @@
+# The MIT License (MIT)
+
+# Copyright (c) 2015 Derek Willian Stavis
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+function fenv -d "Run bash scripts and import variables modified by them"
+ if count $argv >/dev/null
+ if string trim -- $argv | string length -q
+ fenv.main $argv
+ return $status
+ end
+ return 0
+ else
+ echo (set_color red)'error:' (set_color normal)'parameter missing'
+ echo (set_color cyan)'usage:' (set_color normal)'fenv <bash command>'
+ return 23 # EINVAL
+ end
+end
@@ -0,0 +1,39 @@
+# The MIT License (MIT)
+
+# Copyright (c) 2015 Derek Willian Stavis
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+
+function fenv.main
+ bash -c "$argv && env -0 >&31" 31>| while read -l -z env_var
+ set -l kv (string split -m 1 = $env_var); or continue
+ # Skip read-only variables
+ contains $kv[1] _ SHLVL PWD; and continue
+ string match -rq '^BASH_.*%%$' $kv[1]; and continue
+ # Variable
+ # - is not defined
+ # - OR variable differs
+ # - OR variable is not exported
+ if not set -q $kv[1]; or test "$$kv[1]" != $kv[2]; or not set -qx $kv[1]
+ set -gx $kv
+ end
+ end
+ return $pipestatus[1]
+end
@@ -0,0 +1 @@
+# Disable default vi prompt
@@ -0,0 +1,171 @@
+function fish_prompt
+end # In case this file gets loaded non-interactively, e.g by conda
+status is-interactive || exit
+
+_tide_remove_unusable_items
+_tide_cache_variables
+_tide_parent_dirs
+source (functions --details _tide_pwd)
+
+set -l prompt_var _tide_prompt_$fish_pid
+set -U $prompt_var # Set var here so if we erase $prompt_var, bg job won't set a uvar
+
+set_color normal | read -l color_normal
+status fish-path | read -l fish_path
+
+# _tide_repaint prevents us from creating a second background job
+function _tide_refresh_prompt --on-variable $prompt_var --on-variable COLUMNS
+ set -g _tide_repaint
+ commandline -f repaint
+end
+
+if contains newline $_tide_left_items # two line prompt initialization
+ test "$tide_prompt_add_newline_before" = true && set -l add_newline '\n'
+
+ set_color $tide_prompt_color_frame_and_connection -b normal | read -l prompt_and_frame_color
+
+ set -l column_offset 5
+ test "$tide_left_prompt_frame_enabled" = true &&
+ set -l top_left_frame "$prompt_and_frame_color╭─" &&
+ set -l bot_left_frame "$prompt_and_frame_color╰─" &&
+ set column_offset (math $column_offset-2)
+ test "$tide_right_prompt_frame_enabled" = true &&
+ set -l top_right_frame "$prompt_and_frame_color─╮" &&
+ set -l bot_right_frame "$prompt_and_frame_color─╯" &&
+ set column_offset (math $column_offset-2)
+
+ if test "$tide_prompt_transient_enabled" = true
+ eval "
+function fish_prompt
+ _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && jobs -p | count | read -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+set _tide_parent_dirs \$_tide_parent_dirs
+PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_2_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ if not set -q _tide_transient
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides
+
+ echo -n $add_newline'$top_left_frame'(string replace @PWD@ (_tide_pwd) \"\$$prompt_var[1][1]\")'$prompt_and_frame_color'
+ string repeat -Nm(math max 0, \$dist_btwn_sides-\$_tide_pwd_len) '$tide_prompt_icon_connection'
+
+ echo \"\$$prompt_var[1][3]$top_right_frame\"
+ end
+ echo -n \e\[0J\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
+end
+
+function fish_right_prompt
+ set -e _tide_transient || string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
+end"
+ else
+ eval "
+function fish_prompt
+ _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && jobs -p | count | read -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+set _tide_parent_dirs \$_tide_parent_dirs
+PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_2_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides
+
+ echo -ns $add_newline'$top_left_frame'(string replace @PWD@ (_tide_pwd) \"\$$prompt_var[1][1]\")'$prompt_and_frame_color'
+ string repeat -Nm(math max 0, \$dist_btwn_sides-\$_tide_pwd_len) '$tide_prompt_icon_connection'
+ echo -ns \"\$$prompt_var[1][3]$top_right_frame\"\n\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
+end
+
+function fish_right_prompt
+ string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
+end"
+ end
+else # one line prompt initialization
+ test "$tide_prompt_add_newline_before" = true && set -l add_newline '\0'
+
+ math 5 -$tide_prompt_min_cols | read -l column_offset
+ test $column_offset -ge 0 && set column_offset "+$column_offset"
+
+ if test "$tide_prompt_transient_enabled" = true
+ eval "
+function fish_prompt
+ set -lx _tide_status \$status
+ _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && jobs -p | count | read -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+set _tide_parent_dirs \$_tide_parent_dirs
+PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_1_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ if set -q _tide_transient
+ echo -n \e\[0J
+ add_prefix= _tide_item_character
+ echo -n '$color_normal '
+ else
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][2]\")$column_offset | read -lx dist_btwn_sides
+ string replace @PWD@ (_tide_pwd) $add_newline \$$prompt_var[1][1]'$color_normal '
+ end
+end
+
+function fish_right_prompt
+ set -e _tide_transient || string unescape \"\$$prompt_var[1][2]$color_normal\"
+end"
+ else
+ eval "
+function fish_prompt
+ _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && jobs -p | count | read -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+set _tide_parent_dirs \$_tide_parent_dirs
+PATH=\$(string escape \"\$PATH\") CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_1_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][2]\")$column_offset | read -lx dist_btwn_sides
+ string replace @PWD@ (_tide_pwd) $add_newline \$$prompt_var[1][1]'$color_normal '
+end
+
+function fish_right_prompt
+ string unescape \"\$$prompt_var[1][2]$color_normal\"
+end"
+ end
+end
+
+eval "function _tide_on_fish_exit --on-event fish_exit
+ set -e $prompt_var
+end"
+
+if test "$tide_prompt_transient_enabled" = true
+ function _tide_enter_transient
+ # If the commandline will be executed, or is empty
+ if commandline --is-valid || test -z "$(commandline)"
+ # Pager open usually means selecting, not running
+ # Can be untrue, but it's better than the alternative
+ if not commandline --paging-mode
+ set -g _tide_transient
+ set -g _tide_repaint
+ commandline -f repaint
+ end
+ end
+ commandline -f execute
+ end
+
+ bind \r _tide_enter_transient
+ bind \n _tide_enter_transient
+ bind -M insert \r _tide_enter_transient
+ bind -M insert \n _tide_enter_transient
+end
@@ -0,0 +1,240 @@
+function fisher --argument-names cmd --description "A plugin manager for Fish"
+ set --query fisher_path || set --local fisher_path $__fish_config_dir
+ set --local fisher_version 4.4.4
+ set --local fish_plugins $__fish_config_dir/fish_plugins
+
+ switch "$cmd"
+ case -v --version
+ echo "fisher, version $fisher_version"
+ case "" -h --help
+ echo "Usage: fisher install <plugins...> Install plugins"
+ echo " fisher remove <plugins...> Remove installed plugins"
+ echo " fisher update <plugins...> Update installed plugins"
+ echo " fisher update Update all installed plugins"
+ echo " fisher list [<regex>] List installed plugins matching regex"
+ echo "Options:"
+ echo " -v, --version Print version"
+ echo " -h, --help Print this help message"
+ echo "Variables:"
+ echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
+ case ls list
+ string match --entire --regex -- "$argv[2]" $_fisher_plugins
+ case install update remove
+ isatty || read --local --null --array stdin && set --append argv $stdin
+
+ set --local install_plugins
+ set --local update_plugins
+ set --local remove_plugins
+ set --local arg_plugins $argv[2..-1]
+ set --local old_plugins $_fisher_plugins
+ set --local new_plugins
+
+ test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins)
+
+ if ! set --query argv[2]
+ if test "$cmd" != update
+ echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1
+ else if ! set --query file_plugins
+ echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1
+ end
+ set arg_plugins $file_plugins
+ end
+
+ for plugin in $arg_plugins
+ set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin)
+ contains -- "$plugin" $new_plugins || set --append new_plugins $plugin
+ end
+
+ if set --query argv[2]
+ for plugin in $new_plugins
+ if contains -- "$plugin" $old_plugins
+ test "$cmd" = remove &&
+ set --append remove_plugins $plugin ||
+ set --append update_plugins $plugin
+ else if test "$cmd" = install
+ set --append install_plugins $plugin
+ else
+ echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1
+ end
+ end
+ else
+ for plugin in $new_plugins
+ contains -- "$plugin" $old_plugins &&
+ set --append update_plugins $plugin ||
+ set --append install_plugins $plugin
+ end
+
+ for plugin in $old_plugins
+ contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin
+ end
+ end
+
+ set --local pid_list
+ set --local source_plugins
+ set --local fetch_plugins $update_plugins $install_plugins
+ set --local fish_path (status fish-path)
+
+ echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal)
+
+ for plugin in $fetch_plugins
+ set --local source (command mktemp -d)
+ set --append source_plugins $source
+
+ command mkdir -p $source/{completions,conf.d,themes,functions}
+
+ $fish_path --command "
+ if test -e $plugin
+ command cp -Rf $plugin/* $source
+ else
+ set temp (command mktemp -d)
+ set repo (string split -- \@ $plugin) || set repo[2] HEAD
+
+ if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1])
+ set name (string split -- / \$path)[-1]
+ set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz
+ else
+ set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2]
+ end
+
+ echo Fetching (set_color --underline)\$url(set_color normal)
+
+ if command curl -q --silent -L \$url | command tar -xzC \$temp -f - 2>/dev/null
+ command cp -Rf \$temp/*/* $source
+ else
+ echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
+ command rm -rf $source
+ end
+
+ command rm -rf \$temp
+ end
+
+ set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
+ " &
+
+ set --append pid_list (jobs --last --pid)
+ end
+
+ wait $pid_list 2>/dev/null
+
+ for plugin in $fetch_plugins
+ if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
+ if set --local index (contains --index -- "$plugin" $install_plugins)
+ set --erase install_plugins[$index]
+ else
+ set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
+ end
+ end
+ end
+
+ for plugin in $update_plugins $remove_plugins
+ if set --local index (contains --index -- "$plugin" $_fisher_plugins)
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ if contains -- "$plugin" $remove_plugins
+ for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ emit {$name}_uninstall
+ end
+ printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+ set --erase _fisher_plugins[$index]
+ end
+
+ command rm -rf (string replace -- \~ ~ $$plugin_files_var)
+
+ functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+
+ for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ complete --erase --command $name
+ end
+
+ set --erase $plugin_files_var
+ end
+ end
+
+ if set --query update_plugins[1] || set --query install_plugins[1]
+ command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
+ end
+
+ for plugin in $update_plugins $install_plugins
+ set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
+ set --local files $source/{functions,themes,conf.d,completions}/*
+
+ if set --local index (contains --index -- $plugin $install_plugins)
+ set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
+ set --local conflict_files
+
+ for file in (string replace -- $source/ $fisher_path/ $files)
+ contains -- $file $user_files && set --append conflict_files $file
+ end
+
+ if set --query conflict_files[1] && set --erase install_plugins[$index]
+ echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
+ continue
+ end
+ end
+
+ for file in (string replace -- $source/ "" $files)
+ command cp -RLf $source/$file $fisher_path/$file
+ end
+
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
+
+ set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
+
+ contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
+ contains -- $plugin $install_plugins && set --local event install || set --local event update
+
+ printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+
+ for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
+ source $file
+ if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
+ emit {$name}_$event
+ end
+ end
+ end
+
+ command rm -rf $source_plugins
+
+ if set --query _fisher_plugins[1]
+ set --local commit_plugins
+
+ for plugin in $file_plugins
+ contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
+ end
+
+ for plugin in $_fisher_plugins
+ contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
+ end
+
+ printf "%s\n" $commit_plugins >$fish_plugins
+ else
+ set --erase _fisher_plugins
+ command rm -f $fish_plugins
+ end
+
+ set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
+
+ test "$total" != "0 0 0" && echo (string join ", " (
+ test $total[1] = 0 || echo "Installed $total[1]") (
+ test $total[2] = 0 || echo "Updated $total[2]") (
+ test $total[3] = 0 || echo "Removed $total[3]")
+ ) plugin/s
+ case \*
+ echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1
+ end
+end
+
+if ! set --query _fisher_upgraded_to_4_4
+ set --universal _fisher_upgraded_to_4_4
+ if functions --query _fisher_list
+ set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share
+ command rm -rf $XDG_DATA_HOME/fisher
+ functions --erase _fisher_{list,plugin_parse}
+ fisher update >/dev/null 2>/dev/null
+ else
+ for var in (set --names | string match --entire --regex '^_fisher_.+_files$')
+ set $var (string replace -- ~ \~ $$var)
+ end
+ functions --erase _fisher_fish_postexec
+ end
+end
@@ -0,0 +1,46 @@
+# Always installs bindings for insert and default mode for simplicity and b/c it has almost no side-effect
+# https://gitter.im/fish-shell/fish-shell?at=60a55915ee77a74d685fa6b1
+function fzf_configure_bindings --description "Installs the default key bindings for fzf.fish with user overrides passed as options."
+ # no need to install bindings if not in interactive mode or running tests
+ status is-interactive || test "$CI" = true; or return
+
+ set -f options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'processes=?' 'variables=?'
+ argparse --max-args=0 --ignore-unknown $options_spec -- $argv 2>/dev/null
+ if test $status -ne 0
+ echo "Invalid option or a positional argument was provided." >&2
+ _fzf_configure_bindings_help
+ return 22
+ else if set --query _flag_help
+ _fzf_configure_bindings_help
+ return
+ else
+ # Initialize with default key sequences and then override or disable them based on flags
+ # index 1 = directory, 2 = git_log, 3 = git_status, 4 = history, 5 = processes, 6 = variables
+ set -f key_sequences \e\cf \e\cl \e\cs \cr \e\cp \cv # \c = control, \e = escape
+ set --query _flag_directory && set key_sequences[1] "$_flag_directory"
+ set --query _flag_git_log && set key_sequences[2] "$_flag_git_log"
+ set --query _flag_git_status && set key_sequences[3] "$_flag_git_status"
+ set --query _flag_history && set key_sequences[4] "$_flag_history"
+ set --query _flag_processes && set key_sequences[5] "$_flag_processes"
+ set --query _flag_variables && set key_sequences[6] "$_flag_variables"
+
+ # If fzf bindings already exists, uninstall it first for a clean slate
+ if functions --query _fzf_uninstall_bindings
+ _fzf_uninstall_bindings
+ end
+
+ for mode in default insert
+ test -n $key_sequences[1] && bind --mode $mode $key_sequences[1] _fzf_search_directory
+ test -n $key_sequences[2] && bind --mode $mode $key_sequences[2] _fzf_search_git_log
+ test -n $key_sequences[3] && bind --mode $mode $key_sequences[3] _fzf_search_git_status
+ test -n $key_sequences[4] && bind --mode $mode $key_sequences[4] _fzf_search_history
+ test -n $key_sequences[5] && bind --mode $mode $key_sequences[5] _fzf_search_processes
+ test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] "$_fzf_search_vars_command"
+ end
+
+ function _fzf_uninstall_bindings --inherit-variable key_sequences
+ bind --erase -- $key_sequences
+ bind --erase --mode insert -- $key_sequences
+ end
+ end
+end
@@ -0,0 +1,28 @@
+function tide --description 'Manage your Tide prompt'
+ argparse --stop-nonopt v/version h/help -- $argv
+
+ if set -q _flag_version
+ echo 'tide, version 6.1.1'
+ else if set -q _flag_help
+ _tide_help
+ else if functions --query _tide_sub_$argv[1]
+ _tide_sub_$argv[1] $argv[2..]
+ else
+ _tide_help
+ return 1
+ end
+end
+
+function _tide_help
+ printf %s\n \
+ 'Usage: tide [options] subcommand [options]' \
+ '' \
+ 'Options:' \
+ ' -v or --version print tide version number' \
+ ' -h or --help print this help message' \
+ '' \
+ 'Subcommands:' \
+ ' configure run interactive configuration wizard' \
+ ' reload reload tide configuration' \
+ ' bug-report print info for use in bug reports'
+end
@@ -0,0 +1,46 @@
+function finish
+ _tide_title Finish
+
+ echo
+ set_color red
+ _tide_option y 'Overwrite your current tide config'
+ set_color normal
+ echo
+
+ _tide_option p 'Exit and print the config you just generated'
+ echo
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case 'Overwrite your current tide config'
+ _tide_finish
+ command -q clear && clear
+ set -q _flag_auto || _tide_print_configure_current_options
+ case 'Exit and print the config you just generated'
+ _tide_exit_configure
+ command -q clear && clear
+ _tide_print_configure_current_options
+ end
+end
+
+function _tide_finish
+ _tide_exit_configure
+
+ # Deal with prompt char/vi mode
+ contains character $fake_tide_left_prompt_items || set -p fake_tide_left_prompt_items vi_mode
+
+ # Set the real variables
+ for fakeVar in (set --names | string match -r "^fake_tide.*")
+ set -U (string replace 'fake_' '' $fakeVar) $$fakeVar
+ end
+
+ # Make sure old prompt won't display
+ set -e $_tide_prompt_var 2>/dev/null
+
+ # Re-initialize the prompt
+ tide reload
+end
+
+function _tide_print_configure_current_options
+ _tide_fish_colorize "tide configure --auto $_tide_configure_current_options"
+end
@@ -0,0 +1,33 @@
+function icons
+ _tide_title Icons
+
+ _tide_option 1 'Few icons'
+ _tide_display_prompt
+
+ _tide_option 2 'Many icons'
+ _enable_icons
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case 'Few icons'
+ _disable_icons
+ end
+ _next_choice all/transient
+end
+
+function _enable_icons
+ set -p fake_tide_left_prompt_items os
+ set -g fake_tide_pwd_icon
+ set -g fake_tide_pwd_icon_home
+ set -g fake_tide_cmd_duration_icon
+ set -g fake_tide_git_icon
+end
+
+function _disable_icons
+ _tide_find_and_remove os fake_tide_left_prompt_items
+ set fake_tide_pwd_icon
+ set fake_tide_pwd_icon_home
+ set fake_tide_cmd_duration_icon
+ set fake_tide_git_icon
+end
@@ -0,0 +1,26 @@
+function prompt_colors
+ _tide_title 'Prompt Colors'
+
+ _tide_option 1 'True color'
+ _tide_display_prompt
+
+ _tide_option 2 '16 colors'
+ _load_config "$_tide_configure_style"_16color
+ set -g _tide_16color true
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case 'True color'
+ _load_config "$_tide_configure_style"
+ set -e _tide_16color
+ switch $_tide_configure_style
+ case lean rainbow
+ _next_choice all/show_time
+ case classic
+ _next_choice classic/classic_prompt_color
+ end
+ case '16 colors'
+ _next_choice all/show_time
+ end
+end
@@ -0,0 +1,31 @@
+function prompt_connection
+ _tide_title 'Prompt Connection'
+
+ _tide_option 1 Disconnected
+ set -g fake_tide_prompt_icon_connection ' '
+ _tide_display_prompt
+
+ _tide_option 2 Dotted
+ set -g fake_tide_prompt_icon_connection '·'
+ _tide_display_prompt
+
+ _tide_option 3 Solid
+ set -g fake_tide_prompt_icon_connection '─'
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Disconnected
+ set -g fake_tide_prompt_icon_connection ' '
+ case Dotted
+ set -g fake_tide_prompt_icon_connection '·'
+ case Solid
+ set -g fake_tide_prompt_icon_connection '─'
+ end
+ switch $_tide_configure_style
+ case lean
+ _next_choice all/prompt_connection_andor_frame_color
+ case classic rainbow
+ _next_choice powerline/powerline_right_prompt_frame
+ end
+end
@@ -0,0 +1,40 @@
+function prompt_connection_andor_frame_color
+ if test "$_tide_16color" = true ||
+ test "$fake_tide_left_prompt_frame_enabled" = false -a \
+ "$fake_tide_right_prompt_frame_enabled" = false -a \
+ "$fake_tide_prompt_icon_connection" = ' '
+ _next_choice all/prompt_spacing
+ return 0
+ end
+
+ _tide_title "Connection & Frame Color"
+
+ _tide_option 1 Lightest
+ set -g fake_tide_prompt_color_frame_and_connection 808080
+ _tide_display_prompt
+
+ _tide_option 2 Light
+ set -g fake_tide_prompt_color_frame_and_connection 6C6C6C
+ _tide_display_prompt
+
+ _tide_option 3 Dark
+ set -g fake_tide_prompt_color_frame_and_connection 585858
+ _tide_display_prompt
+
+ _tide_option 4 Darkest
+ set -g fake_tide_prompt_color_frame_and_connection 444444
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Lightest
+ set -g fake_tide_prompt_color_frame_and_connection 808080
+ case Light
+ set -g fake_tide_prompt_color_frame_and_connection 6C6C6C
+ case Dark
+ set -g fake_tide_prompt_color_frame_and_connection 585858
+ case Darkest
+ set -g fake_tide_prompt_color_frame_and_connection 444444
+ end
+ _next_choice all/prompt_spacing
+end
@@ -0,0 +1,22 @@
+function prompt_spacing
+ _tide_title 'Prompt Spacing'
+
+ _tide_option 1 Compact
+ set -g fake_tide_prompt_add_newline_before false
+ _tide_display_prompt
+ _tide_display_prompt
+
+ _tide_option 2 Sparse
+ set -g fake_tide_prompt_add_newline_before true
+ _tide_display_prompt
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Compact
+ set -g fake_tide_prompt_add_newline_before false
+ case Sparse
+ set -g fake_tide_prompt_add_newline_before true
+ end
+ _next_choice all/icons
+end
@@ -0,0 +1,33 @@
+function show_time
+ _tide_title 'Show current time?'
+
+ _tide_option 1 No
+ _tide_display_prompt
+
+ set -a fake_tide_right_prompt_items time
+
+ _tide_option 2 '24-hour format'
+ set -g fake_tide_time_format %T
+ _tide_display_prompt
+
+ _tide_option 3 '12-hour format'
+ set -g fake_tide_time_format %r
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case No
+ set -g fake_tide_time_format ''
+ set -e fake_tide_right_prompt_items[-1]
+ case '24-hour format'
+ set -g fake_tide_time_format %T
+ case '12-hour format'
+ set -g fake_tide_time_format %r
+ end
+ switch $_tide_configure_style
+ case lean
+ _next_choice "$_tide_configure_style"/"$_tide_configure_style"_prompt_height
+ case classic rainbow
+ _next_choice "$_tide_configure_style"/"$_tide_configure_style"_prompt_separators
+ end
+end
@@ -0,0 +1,36 @@
+function style
+ set -g _tide_configure_current_options
+
+ _tide_title 'Prompt Style'
+
+ _tide_option 1 Lean
+ _load_config lean
+ _tide_display_prompt
+
+ _tide_option 2 Classic
+ _load_config classic
+ _tide_display_prompt
+
+ _tide_option 3 Rainbow
+ _load_config rainbow
+ _tide_display_prompt
+
+ _tide_menu (status function) --no-restart
+ switch $_tide_selected_option
+ case Lean
+ _load_config lean
+ set -g _tide_configure_style lean
+ case Classic
+ _load_config classic
+ set -g _tide_configure_style classic
+ case Rainbow
+ _load_config rainbow
+ set -g _tide_configure_style rainbow
+ end
+ _next_choice all/prompt_colors
+end
+
+function _load_config -a name
+ string replace -r '^' 'set -g fake_' <(status dirname)/../../icons.fish | source
+ string replace -r '^' 'set -g fake_' <(status dirname)/../../configs/$name.fish | source
+end
@@ -0,0 +1,22 @@
+function transient
+ _tide_title 'Enable transient prompt?'
+
+ _tide_option 1 No
+ _tide_display_prompt
+ _tide_display_prompt
+ _tide_display_prompt
+
+ _tide_option 2 Yes
+ _configure_transient= _tide_display_prompt
+ _configure_transient= _tide_display_prompt
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case No
+ set fake_tide_prompt_transient_enabled false
+ case Yes
+ set fake_tide_prompt_transient_enabled true
+ end
+ _next_choice all/finish
+end
@@ -0,0 +1,38 @@
+function classic_prompt_color
+ _tide_title 'Prompt Color'
+
+ _tide_option 1 Lightest
+ _set_all_items_bg_color 585858
+ _tide_display_prompt
+
+ _tide_option 2 Light
+ _set_all_items_bg_color 444444
+ _tide_display_prompt
+
+ _tide_option 3 Dark
+ _set_all_items_bg_color 303030
+ _tide_display_prompt
+
+ _tide_option 4 Darkest
+ _set_all_items_bg_color 1C1C1C
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Lightest
+ _set_all_items_bg_color 585858
+ case Light
+ _set_all_items_bg_color 444444
+ case Dark
+ _set_all_items_bg_color 303030
+ case Darkest
+ _set_all_items_bg_color 1C1C1C
+ end
+ _next_choice all/show_time
+end
+
+function _set_all_items_bg_color -a color
+ for var in (set --names | string match -r "fake_.*_bg_color.*")
+ set $var $color
+ end
+end
@@ -0,0 +1,40 @@
+function classic_prompt_separators
+ _tide_title 'Prompt Separators'
+
+ _tide_option 1 Angled
+ set -g fake_tide_left_prompt_separator_same_color
+ set -g fake_tide_right_prompt_separator_same_color
+ _tide_display_prompt
+
+ _tide_option 2 Vertical
+ set -g fake_tide_left_prompt_separator_same_color │
+ set -g fake_tide_right_prompt_separator_same_color │
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_separator_same_color ╱
+ set -g fake_tide_right_prompt_separator_same_color ╱
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_separator_same_color
+ set -g fake_tide_right_prompt_separator_same_color
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Angled
+ set -g fake_tide_left_prompt_separator_same_color
+ set -g fake_tide_right_prompt_separator_same_color
+ case Vertical
+ set -g fake_tide_left_prompt_separator_same_color │
+ set -g fake_tide_right_prompt_separator_same_color │
+ case Slanted
+ set -g fake_tide_left_prompt_separator_same_color ╱
+ set -g fake_tide_right_prompt_separator_same_color ╱
+ case Round
+ set -g fake_tide_left_prompt_separator_same_color
+ set -g fake_tide_right_prompt_separator_same_color
+ end
+ _next_choice powerline/powerline_prompt_heads
+end
@@ -0,0 +1,26 @@
+function lean_prompt_height
+ _tide_title 'Prompt Height'
+
+ _tide_option 1 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set -g fake_tide_left_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_option 2 'Two lines'
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items[1..-2] newline $fake_tide_left_prompt_items[-1]
+ set -g fake_tide_left_prompt_suffix ' '
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set fake_tide_left_prompt_suffix ''
+ _next_choice all/prompt_connection_andor_frame_color
+ case 'Two lines'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items[1..-2] newline $fake_tide_left_prompt_items[-1]
+ set -g fake_tide_left_prompt_suffix ' '
+ _next_choice all/prompt_connection
+ end
+end
@@ -0,0 +1,32 @@
+function powerline_prompt_heads
+ _tide_title 'Prompt Heads'
+
+ _tide_option 1 Sharp
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ _tide_display_prompt
+
+ _tide_option 2 Slanted
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ _tide_display_prompt
+
+ _tide_option 3 Round
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Sharp
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ case Slanted
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ case Round
+ set -g fake_tide_left_prompt_suffix
+ set -g fake_tide_right_prompt_prefix
+ end
+ _next_choice powerline/powerline_prompt_tails
+end
@@ -0,0 +1,51 @@
+function powerline_prompt_style
+ _tide_title 'Powerline Prompt Style'
+
+ _tide_option 1 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ _tide_find_and_remove character fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _tide_display_prompt
+
+ set -a fake_tide_left_prompt_items newline
+
+ _tide_option 2 'Two lines, character'
+ set -a fake_tide_left_prompt_items character
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _tide_display_prompt
+
+ _tide_option 3 'Two lines, frame'
+ _tide_find_and_remove character fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _tide_display_prompt
+
+ _tide_option 4 'Two lines, character and frame'
+ set -a fake_tide_left_prompt_items character
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ _tide_find_and_remove character fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _next_choice all/prompt_connection_andor_frame_color
+ case 'Two lines, character'
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _next_choice all/prompt_connection
+ case 'Two lines, frame'
+ _tide_find_and_remove character fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _next_choice all/prompt_connection
+ case 'Two lines, character and frame'
+ _next_choice all/prompt_connection
+ end
+end
@@ -0,0 +1,40 @@
+function powerline_prompt_tails
+ _tide_title 'Prompt Tails'
+
+ _tide_option 1 Flat
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_option 2 Sharp
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Flat
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ case Sharp
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ case Slanted
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ case Round
+ set -g fake_tide_left_prompt_prefix
+ set -g fake_tide_right_prompt_suffix
+ end
+ _next_choice powerline/powerline_prompt_style
+end
@@ -0,0 +1,20 @@
+function powerline_right_prompt_frame
+ _tide_title 'Right Prompt Frame'
+
+ _tide_option 1 No
+ set fake_tide_right_prompt_frame_enabled false
+ _tide_display_prompt
+
+ _tide_option 2 Yes
+ set fake_tide_right_prompt_frame_enabled true
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case No
+ set fake_tide_right_prompt_frame_enabled false
+ case Yes
+ set fake_tide_right_prompt_frame_enabled true
+ end
+ _next_choice all/prompt_connection_andor_frame_color
+end
@@ -0,0 +1,40 @@
+function rainbow_prompt_separators
+ _tide_title 'Prompt Separators'
+
+ _tide_option 1 Angled
+ set -g fake_tide_left_prompt_separator_diff_color
+ set -g fake_tide_right_prompt_separator_diff_color
+ _tide_display_prompt
+
+ _tide_option 2 Vertical
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_menu (status function)
+ switch $_tide_selected_option
+ case Angled
+ set -g fake_tide_left_prompt_separator_diff_color
+ set -g fake_tide_right_prompt_separator_diff_color
+ case Vertical
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ case Slanted
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ case Round
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ end
+ _next_choice powerline/powerline_prompt_heads
+end
@@ -0,0 +1,116 @@
+tide_aws_bg_color 444444
+tide_aws_color FF9900
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_cmd_duration_bg_color 444444
+tide_cmd_duration_color 87875F
+tide_cmd_duration_decimals 0
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color 444444
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_context_hostname_parts 1
+tide_crystal_bg_color 444444
+tide_crystal_color FFFFFF
+tide_direnv_bg_color 444444
+tide_direnv_bg_color_denied 444444
+tide_direnv_color $_tide_color_gold
+tide_direnv_color_denied FF0000
+tide_distrobox_bg_color 444444
+tide_distrobox_color FF00FF
+tide_docker_bg_color 444444
+tide_docker_color 2496ED
+tide_docker_default_contexts default colima
+tide_elixir_bg_color 444444
+tide_elixir_color 4E2A8E
+tide_gcloud_bg_color 444444
+tide_gcloud_color 4285F4
+tide_git_bg_color 444444
+tide_git_bg_color_unstable 444444
+tide_git_bg_color_urgent 444444
+tide_git_color_branch $_tide_color_green
+tide_git_color_conflicted FF0000
+tide_git_color_dirty $_tide_color_gold
+tide_git_color_operation FF0000
+tide_git_color_staged $_tide_color_gold
+tide_git_color_stash $_tide_color_green
+tide_git_color_untracked $_tide_color_light_blue
+tide_git_color_upstream $_tide_color_green
+tide_git_truncation_length 24
+tide_git_truncation_strategy
+tide_go_bg_color 444444
+tide_go_color 00ACD7
+tide_java_bg_color 444444
+tide_java_color ED8B00
+tide_jobs_bg_color 444444
+tide_jobs_color $_tide_color_dark_green
+tide_jobs_number_threshold 1000
+tide_kubectl_bg_color 444444
+tide_kubectl_color 326CE5
+tide_left_prompt_frame_enabled true
+tide_left_prompt_items pwd git newline
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color
+tide_left_prompt_separator_same_color
+tide_left_prompt_suffix
+tide_nix_shell_bg_color 444444
+tide_nix_shell_color 7EBAE4
+tide_node_bg_color 444444
+tide_node_color 44883E
+tide_os_bg_color 444444
+tide_os_color EEEEEE
+tide_php_bg_color 444444
+tide_php_color 617CBE
+tide_private_mode_bg_color 444444
+tide_private_mode_color FFFFFF
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_min_cols 34
+tide_prompt_pad_items true
+tide_prompt_transient_enabled false
+tide_pulumi_bg_color 444444
+tide_pulumi_color F7BF2A
+tide_pwd_bg_color 444444
+tide_pwd_color_anchors $_tide_color_light_blue
+tide_pwd_color_dirs $_tide_color_dark_blue
+tide_pwd_color_truncated_dirs 8787AF
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json build.zig
+tide_python_bg_color 444444
+tide_python_color 00AFAF
+tide_right_prompt_frame_enabled true
+tide_right_prompt_items status cmd_duration context jobs direnv node python rustc java php pulumi ruby go gcloud kubectl distrobox toolbox terraform aws nix_shell crystal elixir zig
+tide_right_prompt_prefix
+tide_right_prompt_separator_diff_color
+tide_right_prompt_separator_same_color
+tide_right_prompt_suffix ''
+tide_ruby_bg_color 444444
+tide_ruby_color B31209
+tide_rustc_bg_color 444444
+tide_rustc_color F74C00
+tide_shlvl_bg_color 444444
+tide_shlvl_color d78700
+tide_shlvl_threshold 1
+tide_status_bg_color 444444
+tide_status_bg_color_failure 444444
+tide_status_color $_tide_color_dark_green
+tide_status_color_failure D70000
+tide_terraform_bg_color 444444
+tide_terraform_color 844FBA
+tide_time_bg_color 444444
+tide_time_color 5F8787
+tide_time_format %T
+tide_toolbox_bg_color 444444
+tide_toolbox_color 613583
+tide_vi_mode_bg_color_default 444444
+tide_vi_mode_bg_color_insert 444444
+tide_vi_mode_bg_color_replace 444444
+tide_vi_mode_bg_color_visual 444444
+tide_vi_mode_color_default 949494
+tide_vi_mode_color_insert 87AFAF
+tide_vi_mode_color_replace 87AF87
+tide_vi_mode_color_visual FF8700
+tide_zig_bg_color 444444
+tide_zig_color F7A41D
@@ -0,0 +1,89 @@
+tide_aws_bg_color black
+tide_aws_color yellow
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_cmd_duration_bg_color black
+tide_cmd_duration_color brblack
+tide_context_bg_color black
+tide_context_color_default yellow
+tide_context_color_root bryellow
+tide_context_color_ssh yellow
+tide_crystal_bg_color black
+tide_crystal_color brwhite
+tide_direnv_bg_color black
+tide_direnv_bg_color_denied black
+tide_direnv_color bryellow
+tide_direnv_color_denied brred
+tide_distrobox_bg_color black
+tide_distrobox_color brmagenta
+tide_docker_bg_color black
+tide_docker_color blue
+tide_elixir_bg_color black
+tide_elixir_color magenta
+tide_gcloud_bg_color black
+tide_gcloud_color blue
+tide_git_bg_color black
+tide_git_bg_color_unstable black
+tide_git_bg_color_urgent black
+tide_git_color_branch brgreen
+tide_git_color_conflicted brred
+tide_git_color_dirty bryellow
+tide_git_color_operation brred
+tide_git_color_staged bryellow
+tide_git_color_stash brgreen
+tide_git_color_untracked brblue
+tide_git_color_upstream brgreen
+tide_go_bg_color black
+tide_go_color brcyan
+tide_java_bg_color black
+tide_java_color yellow
+tide_jobs_bg_color black
+tide_jobs_color green
+tide_kubectl_bg_color black
+tide_kubectl_color blue
+tide_nix_shell_bg_color black
+tide_nix_shell_color brblue
+tide_node_bg_color black
+tide_node_color green
+tide_os_bg_color black
+tide_os_color brwhite
+tide_php_bg_color black
+tide_php_color blue
+tide_private_mode_bg_color black
+tide_private_mode_color brwhite
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pulumi_bg_color black
+tide_pulumi_color yellow
+tide_pwd_bg_color black
+tide_pwd_color_anchors brcyan
+tide_pwd_color_dirs cyan
+tide_pwd_color_truncated_dirs magenta
+tide_python_bg_color black
+tide_python_color cyan
+tide_ruby_bg_color black
+tide_ruby_color red
+tide_rustc_bg_color black
+tide_rustc_color red
+tide_shlvl_bg_color black
+tide_shlvl_color yellow
+tide_status_bg_color black
+tide_status_bg_color_failure black
+tide_status_color green
+tide_status_color_failure red
+tide_terraform_bg_color black
+tide_terraform_color magenta
+tide_time_bg_color black
+tide_time_color brblack
+tide_toolbox_bg_color black
+tide_toolbox_color magenta
+tide_vi_mode_bg_color_default black
+tide_vi_mode_bg_color_insert black
+tide_vi_mode_bg_color_replace black
+tide_vi_mode_bg_color_visual black
+tide_vi_mode_color_default white
+tide_vi_mode_color_insert cyan
+tide_vi_mode_color_replace green
+tide_vi_mode_color_visual yellow
+tide_zig_bg_color black
+tide_zig_color yellow
@@ -0,0 +1,116 @@
+tide_aws_bg_color normal
+tide_aws_color FF9900
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_cmd_duration_bg_color normal
+tide_cmd_duration_color 87875F
+tide_cmd_duration_decimals 0
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color normal
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_context_hostname_parts 1
+tide_crystal_bg_color normal
+tide_crystal_color FFFFFF
+tide_direnv_bg_color normal
+tide_direnv_bg_color_denied normal
+tide_direnv_color $_tide_color_gold
+tide_direnv_color_denied FF0000
+tide_distrobox_bg_color normal
+tide_distrobox_color FF00FF
+tide_docker_bg_color normal
+tide_docker_color 2496ED
+tide_docker_default_contexts default colima
+tide_elixir_bg_color normal
+tide_elixir_color 4E2A8E
+tide_gcloud_bg_color normal
+tide_gcloud_color 4285F4
+tide_git_bg_color normal
+tide_git_bg_color_unstable normal
+tide_git_bg_color_urgent normal
+tide_git_color_branch $_tide_color_green
+tide_git_color_conflicted FF0000
+tide_git_color_dirty $_tide_color_gold
+tide_git_color_operation FF0000
+tide_git_color_staged $_tide_color_gold
+tide_git_color_stash $_tide_color_green
+tide_git_color_untracked $_tide_color_light_blue
+tide_git_color_upstream $_tide_color_green
+tide_git_truncation_length 24
+tide_git_truncation_strategy
+tide_go_bg_color normal
+tide_go_color 00ACD7
+tide_java_bg_color normal
+tide_java_color ED8B00
+tide_jobs_bg_color normal
+tide_jobs_color $_tide_color_dark_green
+tide_jobs_number_threshold 1000
+tide_kubectl_bg_color normal
+tide_kubectl_color 326CE5
+tide_left_prompt_frame_enabled false
+tide_left_prompt_items pwd git newline character
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color ' '
+tide_left_prompt_separator_same_color ' '
+tide_left_prompt_suffix ' '
+tide_nix_shell_bg_color normal
+tide_nix_shell_color 7EBAE4
+tide_node_bg_color normal
+tide_node_color 44883E
+tide_os_bg_color normal
+tide_os_color normal
+tide_php_bg_color normal
+tide_php_color 617CBE
+tide_private_mode_bg_color normal
+tide_private_mode_color FFFFFF
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_min_cols 34
+tide_prompt_pad_items false
+tide_prompt_transient_enabled false
+tide_pulumi_bg_color normal
+tide_pulumi_color F7BF2A
+tide_pwd_bg_color normal
+tide_pwd_color_anchors $_tide_color_light_blue
+tide_pwd_color_dirs $_tide_color_dark_blue
+tide_pwd_color_truncated_dirs 8787AF
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json build.zig
+tide_python_bg_color normal
+tide_python_color 00AFAF
+tide_right_prompt_frame_enabled false
+tide_right_prompt_items status cmd_duration context jobs direnv node python rustc java php pulumi ruby go gcloud kubectl distrobox toolbox terraform aws nix_shell crystal elixir zig
+tide_right_prompt_prefix ' '
+tide_right_prompt_separator_diff_color ' '
+tide_right_prompt_separator_same_color ' '
+tide_right_prompt_suffix ''
+tide_ruby_bg_color normal
+tide_ruby_color B31209
+tide_rustc_bg_color normal
+tide_rustc_color F74C00
+tide_shlvl_bg_color normal
+tide_shlvl_color d78700
+tide_shlvl_threshold 1
+tide_status_bg_color normal
+tide_status_bg_color_failure normal
+tide_status_color $_tide_color_dark_green
+tide_status_color_failure D70000
+tide_terraform_bg_color normal
+tide_terraform_color 844FBA
+tide_time_bg_color normal
+tide_time_color 5F8787
+tide_time_format %T
+tide_toolbox_bg_color normal
+tide_toolbox_color 613583
+tide_vi_mode_bg_color_default normal
+tide_vi_mode_bg_color_insert normal
+tide_vi_mode_bg_color_replace normal
+tide_vi_mode_bg_color_visual normal
+tide_vi_mode_color_default 949494
+tide_vi_mode_color_insert 87AFAF
+tide_vi_mode_color_replace 87AF87
+tide_vi_mode_color_visual FF8700
+tide_zig_bg_color normal
+tide_zig_color F7A41D
@@ -0,0 +1,89 @@
+tide_aws_bg_color normal
+tide_aws_color yellow
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_cmd_duration_bg_color normal
+tide_cmd_duration_color brblack
+tide_context_bg_color normal
+tide_context_color_default yellow
+tide_context_color_root bryellow
+tide_context_color_ssh yellow
+tide_crystal_bg_color normal
+tide_crystal_color brwhite
+tide_direnv_bg_color normal
+tide_direnv_bg_color_denied normal
+tide_direnv_color bryellow
+tide_direnv_color_denied brred
+tide_distrobox_bg_color normal
+tide_distrobox_color brmagenta
+tide_docker_bg_color normal
+tide_docker_color blue
+tide_elixir_bg_color normal
+tide_elixir_color magenta
+tide_gcloud_bg_color normal
+tide_gcloud_color blue
+tide_git_bg_color normal
+tide_git_bg_color_unstable normal
+tide_git_bg_color_urgent normal
+tide_git_color_branch brgreen
+tide_git_color_conflicted brred
+tide_git_color_dirty bryellow
+tide_git_color_operation brred
+tide_git_color_staged bryellow
+tide_git_color_stash brgreen
+tide_git_color_untracked brblue
+tide_git_color_upstream brgreen
+tide_go_bg_color normal
+tide_go_color brcyan
+tide_java_bg_color normal
+tide_java_color yellow
+tide_jobs_bg_color normal
+tide_jobs_color green
+tide_kubectl_bg_color normal
+tide_kubectl_color blue
+tide_nix_shell_bg_color normal
+tide_nix_shell_color brblue
+tide_node_bg_color normal
+tide_node_color green
+tide_os_bg_color normal
+tide_os_color brwhite
+tide_php_bg_color normal
+tide_php_color blue
+tide_private_mode_bg_color normal
+tide_private_mode_color brwhite
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pulumi_bg_color normal
+tide_pulumi_color yellow
+tide_pwd_bg_color normal
+tide_pwd_color_anchors brcyan
+tide_pwd_color_dirs cyan
+tide_pwd_color_truncated_dirs magenta
+tide_python_bg_color normal
+tide_python_color cyan
+tide_ruby_bg_color normal
+tide_ruby_color red
+tide_rustc_bg_color normal
+tide_rustc_color red
+tide_shlvl_bg_color normal
+tide_shlvl_color yellow
+tide_status_bg_color normal
+tide_status_bg_color_failure normal
+tide_status_color green
+tide_status_color_failure red
+tide_terraform_bg_color normal
+tide_terraform_color magenta
+tide_time_bg_color normal
+tide_time_color brblack
+tide_toolbox_bg_color normal
+tide_toolbox_color magenta
+tide_vi_mode_bg_color_default normal
+tide_vi_mode_bg_color_insert normal
+tide_vi_mode_bg_color_replace normal
+tide_vi_mode_bg_color_visual normal
+tide_vi_mode_color_default white
+tide_vi_mode_color_insert cyan
+tide_vi_mode_color_replace green
+tide_vi_mode_color_visual yellow
+tide_zig_bg_color normal
+tide_zig_color yellow
@@ -0,0 +1,116 @@
+tide_aws_bg_color FF9900
+tide_aws_color 232F3E
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_cmd_duration_bg_color C4A000
+tide_cmd_duration_color 000000
+tide_cmd_duration_decimals 0
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color 444444
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_context_hostname_parts 1
+tide_crystal_bg_color FFFFFF
+tide_crystal_color 000000
+tide_direnv_bg_color $_tide_color_gold
+tide_direnv_bg_color_denied FF0000
+tide_direnv_color 000000
+tide_direnv_color_denied 000000
+tide_distrobox_bg_color FF00FF
+tide_distrobox_color 000000
+tide_docker_bg_color 2496ED
+tide_docker_color 000000
+tide_docker_default_contexts default colima
+tide_elixir_bg_color 4E2A8E
+tide_elixir_color 000000
+tide_gcloud_bg_color 4285F4
+tide_gcloud_color 000000
+tide_git_bg_color 4E9A06
+tide_git_bg_color_unstable C4A000
+tide_git_bg_color_urgent CC0000
+tide_git_color_branch 000000
+tide_git_color_conflicted 000000
+tide_git_color_dirty 000000
+tide_git_color_operation 000000
+tide_git_color_staged 000000
+tide_git_color_stash 000000
+tide_git_color_untracked 000000
+tide_git_color_upstream 000000
+tide_git_truncation_length 24
+tide_git_truncation_strategy
+tide_go_bg_color 00ACD7
+tide_go_color 000000
+tide_java_bg_color ED8B00
+tide_java_color 000000
+tide_jobs_bg_color 444444
+tide_jobs_color 4E9A06
+tide_jobs_number_threshold 1000
+tide_kubectl_bg_color 326CE5
+tide_kubectl_color 000000
+tide_left_prompt_frame_enabled true
+tide_left_prompt_items pwd git newline
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color
+tide_left_prompt_separator_same_color
+tide_left_prompt_suffix
+tide_nix_shell_bg_color 7EBAE4
+tide_nix_shell_color 000000
+tide_node_bg_color 44883E
+tide_node_color 000000
+tide_os_bg_color $os_branding_bg_color
+tide_os_color $os_branding_color
+tide_php_bg_color 617CBE
+tide_php_color 000000
+tide_private_mode_bg_color F1F3F4
+tide_private_mode_color 000000
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_min_cols 34
+tide_prompt_pad_items true
+tide_prompt_transient_enabled false
+tide_pulumi_bg_color F7BF2A
+tide_pulumi_color 000000
+tide_pwd_bg_color 3465A4
+tide_pwd_color_anchors E4E4E4
+tide_pwd_color_dirs E4E4E4
+tide_pwd_color_truncated_dirs BCBCBC
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json build.zig
+tide_python_bg_color 444444
+tide_python_color 00AFAF
+tide_right_prompt_frame_enabled true
+tide_right_prompt_items status cmd_duration context jobs direnv node python rustc java php pulumi ruby go gcloud kubectl distrobox toolbox terraform aws nix_shell crystal elixir zig
+tide_right_prompt_prefix
+tide_right_prompt_separator_diff_color
+tide_right_prompt_separator_same_color
+tide_right_prompt_suffix ''
+tide_ruby_bg_color B31209
+tide_ruby_color 000000
+tide_rustc_bg_color F74C00
+tide_rustc_color 000000
+tide_shlvl_bg_color 808000
+tide_shlvl_color 000000
+tide_shlvl_threshold 1
+tide_status_bg_color 2E3436
+tide_status_bg_color_failure CC0000
+tide_status_color 4E9A06
+tide_status_color_failure FFFF00
+tide_terraform_bg_color 800080
+tide_terraform_color 000000
+tide_time_bg_color D3D7CF
+tide_time_color 000000
+tide_time_format %T
+tide_toolbox_bg_color 613583
+tide_toolbox_color 000000
+tide_vi_mode_bg_color_default 949494
+tide_vi_mode_bg_color_insert 87AFAF
+tide_vi_mode_bg_color_replace 87AF87
+tide_vi_mode_bg_color_visual FF8700
+tide_vi_mode_color_default 000000
+tide_vi_mode_color_insert 000000
+tide_vi_mode_color_replace 000000
+tide_vi_mode_color_visual 000000
+tide_zig_bg_color F7A41D
+tide_zig_color 000000
@@ -0,0 +1,93 @@
+tide_aws_bg_color yellow
+tide_aws_color brblack
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_cmd_duration_bg_color yellow
+tide_cmd_duration_color black
+tide_context_bg_color brblack
+tide_context_color_default yellow
+tide_context_color_root yellow
+tide_context_color_ssh yellow
+tide_crystal_bg_color brwhite
+tide_crystal_color black
+tide_direnv_bg_color bryellow
+tide_direnv_bg_color_denied brred
+tide_direnv_color black
+tide_direnv_color_denied black
+tide_distrobox_bg_color brmagenta
+tide_distrobox_color black
+tide_docker_bg_color blue
+tide_docker_color black
+tide_elixir_bg_color magenta
+tide_elixir_color black
+tide_gcloud_bg_color blue
+tide_gcloud_color black
+tide_git_bg_color green
+tide_git_bg_color_unstable yellow
+tide_git_bg_color_urgent red
+tide_git_color_branch black
+tide_git_color_conflicted black
+tide_git_color_dirty black
+tide_git_color_operation black
+tide_git_color_staged black
+tide_git_color_stash black
+tide_git_color_untracked black
+tide_git_color_upstream black
+tide_go_bg_color brcyan
+tide_go_color black
+tide_java_bg_color yellow
+tide_java_color black
+tide_jobs_bg_color brblack
+tide_jobs_color green
+tide_kubectl_bg_color blue
+tide_kubectl_color black
+tide_nix_shell_bg_color brblue
+tide_nix_shell_color black
+tide_node_bg_color green
+tide_node_color black
+tide_os_bg_color white
+tide_os_color black
+tide_php_bg_color blue
+tide_php_color black
+tide_private_mode_bg_color brwhite
+tide_private_mode_color black
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pulumi_bg_color yellow
+tide_pulumi_color black
+tide_pwd_bg_color blue
+tide_pwd_color_anchors brwhite
+tide_pwd_color_dirs brwhite
+tide_pwd_color_truncated_dirs white
+tide_python_bg_color brblack
+tide_python_color cyan
+tide_ruby_bg_color red
+tide_ruby_color black
+tide_rustc_bg_color red
+tide_rustc_color black
+tide_shlvl_bg_color yellow
+tide_shlvl_color black
+tide_status_bg_color black
+tide_status_bg_color_failure red
+tide_status_color green
+tide_status_color_failure bryellow
+tide_terraform_bg_color magenta
+tide_terraform_color black
+tide_time_bg_color white
+tide_time_color black
+tide_toolbox_bg_color magenta
+tide_toolbox_color black
+tide_vi_mode_bg_color_default white
+tide_vi_mode_bg_color_insert cyan
+tide_vi_mode_bg_color_replace green
+tide_vi_mode_bg_color_visual yellow
+tide_vi_mode_color_default black
+tide_vi_mode_color_insert black
+tide_vi_mode_color_replace black
+tide_vi_mode_color_visual black
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_zig_bg_color yellow
+tide_zig_color black
@@ -0,0 +1,41 @@
+function _fake_tide_cache_variables
+ # pwd
+ set_color -o $fake_tide_pwd_color_anchors | read -gx _fake_tide_color_anchors
+ set -gx _fake_tide_color_truncated_dirs "$(set_color $fake_tide_pwd_color_truncated_dirs)"
+ set -gx _fake_tide_reset_to_color_dirs (set_color normal -b $fake_tide_pwd_bg_color; set_color $fake_tide_pwd_color_dirs)
+
+ # git
+ contains git $fake_tide_left_prompt_items $fake_tide_right_prompt_items &&
+ set -gx _fake_tide_location_color "$(set_color $fake_tide_git_color_branch)"
+
+ # private_mode
+ if contains private_mode $fake_tide_left_prompt_items $fake_tide_right_prompt_items && test -n "$fish_private_mode"
+ set -gx _fake_tide_private_mode
+ else
+ set -e _fake_tide_private_mode
+ end
+
+ # Same-color-separator color
+ set -gx _fake_tide_color_separator_same_color "$(set_color $fake_tide_prompt_color_separator_same_color)"
+
+ # two line prompt
+ if contains newline $fake_tide_left_prompt_items
+ set_color $fake_tide_prompt_color_frame_and_connection -b normal | read -gx _fake_tide_prompt_and_frame_color
+ else
+ set -e _fake_tide_prompt_and_frame_color
+ end
+
+ # newline before
+ if test "$fake_tide_prompt_add_newline_before" = true
+ set -g _fake_tide_add_newline ''
+ else
+ set -e _fake_tide_add_newline
+ end
+
+ # item padding
+ if test "$fake_tide_prompt_pad_items" = true
+ set -gx _fake_tide_pad ' '
+ else
+ set -e _fake_tide_pad
+ end
+end
@@ -0,0 +1,8 @@
+function _fake_tide_item_character
+ set_color $fake_tide_character_color
+ if contains newline $fake_tide_left_prompt_items || set -q _configure_transient
+ echo -ns $fake_tide_character_icon
+ else
+ echo -ns ' '$fake_tide_character_icon
+ end
+end
@@ -0,0 +1,3 @@
+function _fake_tide_item_cmd_duration
+ _fake_tide_print_item cmd_duration $fake_tide_cmd_duration_icon' ' 5s
+end
@@ -0,0 +1,3 @@
+function _fake_tide_item_git
+ _fake_tide_print_item git (set_color $fake_tide_git_color_branch) $fake_tide_git_icon' ' main
+end
@@ -0,0 +1,5 @@
+function _fake_tide_item_newline
+ set_color $prev_bg_color -b normal
+ var=fake_tide_"$_fake_tide_side"_prompt_suffix echo $$var
+ set -g add_prefix
+end
@@ -0,0 +1,3 @@
+function _fake_tide_item_os
+ _fake_tide_print_item os $fake_tide_os_icon
+end
@@ -0,0 +1,3 @@
+function _fake_tide_item_time
+ _fake_tide_print_item time (date +$fake_tide_time_format)
+end
@@ -0,0 +1,22 @@
+function _fake_tide_print_item -a item
+ var=fake_tide_"$item"_bg_color set -f item_bg_color $$var
+
+ if set -e add_prefix
+ set_color $item_bg_color -b normal
+ var=fake_tide_"$_fake_tide_side"_prompt_prefix echo -ns $$var
+ else if test "$item_bg_color" = "$prev_bg_color"
+ var=fake_tide_"$_fake_tide_side"_prompt_separator_same_color echo -ns $_fake_tide_color_separator_same_color$$var
+ else if test "$_fake_tide_side" = left
+ set_color $prev_bg_color -b $item_bg_color
+ echo -ns $fake_tide_left_prompt_separator_diff_color
+ else
+ set_color $item_bg_color -b $prev_bg_color
+ echo -ns $fake_tide_right_prompt_separator_diff_color
+ end
+
+ var=fake_tide_"$item"_color set_color $$var -b $item_bg_color
+
+ echo -ns $_fake_tide_pad $argv[2..] $_fake_tide_pad
+
+ set -g prev_bg_color $item_bg_color
+end
@@ -0,0 +1,42 @@
+function _fake_tide_prompt
+ set -g add_prefix
+ _fake_tide_side=left set -f left (for item in $fake_tide_left_prompt_items
+ _fake_tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo -ns $fake_tide_left_prompt_suffix
+ end)
+
+ set -g add_prefix
+ _fake_tide_side=right set -f right (for item in $fake_tide_right_prompt_items
+ _fake_tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo -ns $fake_tide_right_prompt_suffix
+ end)
+
+ if set -q _fake_tide_prompt_and_frame_color # If prompt is two lines
+ test "$fake_tide_left_prompt_frame_enabled" = true &&
+ set left[1] "$_fake_tide_prompt_and_frame_color╭─$left[1]" &&
+ set left[2] "$_fake_tide_prompt_and_frame_color╰─$left[2]"
+ test "$fake_tide_right_prompt_frame_enabled" = true &&
+ set right[1] "$right[1]$_fake_tide_prompt_and_frame_color─╮" &&
+ set right[2] "$right[2]$_fake_tide_prompt_and_frame_color─╯"
+
+ # 5 = @PWD@ length which will be replaced
+ math $fake_columns+5-(string length --visible "$left[1]$right[1]") | read -lx dist_btwn_sides
+ echo -ns "$right[2]"\n(string replace @PWD@ (_fake_tide_pwd) "$left[1]")$_fake_tide_prompt_and_frame_color
+
+ string repeat --no-newline --max (math max 0, $dist_btwn_sides-$_tide_pwd_len) $fake_tide_prompt_icon_connection
+ echo -ns "$right[1]"\n"$left[2] "
+ else
+ math $fake_columns+5-(string length --visible "$left[1]$right[1]") -$fake_tide_prompt_min_cols | read -lx dist_btwn_sides
+ string replace @PWD@ (_fake_tide_pwd) "$right[1]" "$left[1] "
+ end
+end
+
+function _fake_tide_item_pwd
+ _fake_tide_print_item pwd @PWD@
+end
@@ -0,0 +1,11 @@
+function _fake_tide_pwd
+ set -l out (
+ set_color $fake_tide_pwd_color_dirs
+ echo -ns $fake_tide_pwd_icon' ' '~/'
+ set_color -o $fake_tide_pwd_color_anchors
+ echo -ns src
+ set_color normal -b $fake_tide_pwd_bg_color
+ )
+ set -g _tide_pwd_len (string length --visible $out)
+ echo -ns $out
+end
@@ -0,0 +1,40 @@
+tide_aws_icon # Actual aws glyph is harder to see
+tide_character_icon ❯
+tide_character_vi_icon_default ❮
+tide_character_vi_icon_replace ▶
+tide_character_vi_icon_visual V
+tide_cmd_duration_icon
+tide_crystal_icon
+tide_direnv_icon ▼
+tide_distrobox_icon
+tide_docker_icon
+tide_elixir_icon
+tide_gcloud_icon # Actual google cloud glyph is harder to see
+tide_git_icon
+tide_go_icon
+tide_java_icon
+tide_jobs_icon
+tide_kubectl_icon
+tide_nix_shell_icon
+tide_node_icon # Actual nodejs glyph is harder to see
+tide_os_icon $os_branding_icon
+tide_php_icon
+tide_private_mode_icon
+tide_prompt_icon_connection ' '
+tide_pulumi_icon
+tide_pwd_icon
+tide_pwd_icon_home
+tide_pwd_icon_unwritable
+tide_python_icon
+tide_ruby_icon
+tide_rustc_icon
+tide_shlvl_icon
+tide_status_icon ✔
+tide_status_icon_failure ✘
+tide_terraform_icon
+tide_toolbox_icon
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_zig_icon
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttf and /dev/null differ
@@ -1,93 +0,0 @@
-Copyright (c) 2019, The Lilex Project Authors (https://github.com/mishamyrt/lilex)
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
\ No newline at end of file
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Mono Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Mono.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Bold Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Mono Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Mono.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Light Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Mono Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Mono.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Medium Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Mono Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Mono.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Windows Compatible.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete.otf and /dev/null differ
Binary files a/home-config/fonts/Lilex/Lilex Regular Nerd Font Complete.ttf and /dev/null differ
@@ -1,8 +0,0 @@
-
-# Nerd Fonts
-
-This is an archived font from a Nerd Fonts release.
-
-For more information see:
-* https://github.com/ryanoasis/nerd-fonts/
-* https://github.com/ryanoasis/nerd-fonts/releases/latest/
Binary files a/home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttf and /dev/null differ
Binary files a/home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttf and /dev/null differ
Binary files a/home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttf and /dev/null differ
@@ -0,0 +1,28 @@
+[user]
+ email = ryan@rschanz.org
+ name = Ryan Schanzenbacher
+[commit]
+ gpgSign = true
+[filter "lfs"]
+ clean = git-lfs clean -- %f
+ smudge = git-lfs smudge -- %f
+ process = git-lfs filter-process
+ required = true
+[core]
+ pager = delta
+[interactive]
+ diffFilter = delta --color-only
+[delta]
+ navigate = true
+ side-by-side = true
+[merge]
+ conflictStyle = zdiff3
+[color]
+ ui = auto
+[init]
+ defaultBranch = main
+[sendemail]
+ smtpserver = mail.rschanz.org
+ smtpuser = ryan@rschanz.org
+ smtpencryption = ssl
+ smtpserverport = 465
@@ -1,3 +0,0 @@
-enable-ssh-support
-
-pinentry-program /run/current-system/profile/bin/pinentry
@@ -1,10 +0,0 @@
-# List of allowed ssh keys. Only keys present in this file are used
-# in the SSH protocol. The ssh-add tool may add new entries to this
-# file to enable them; you may also add them manually. Comment
-# lines, like this one, as well as empty lines are ignored. Lines do
-# have a certain length limit but this is not serious limitation as
-# the format of the entries is fixed and checked by gpg-agent. A
-# non-comment line starts with optional white spaces, followed by the
-# keygrip of the key given as 40 hex digits, optionally followed by a
-# caching TTL in seconds, and another optional field for arbitrary
-# flags. Prepend the keygrip with an '!' mark to disable it.
@@ -15,79 +15,135 @@
(gnu home services shells)
(gnu home services desktop)
(gnu home services gnupg)
+ (gnu home services fontutils)
(gnu home services)
- (ryan-services pipewire))
+ (ryan-services pipewire)
+ (ryan-services spotify)
+ (ryan-services file-manager)
+ (ryan-config utils)
+ (ryan-packages freedesktop)
+ (ryan-packages calcurse)
+ ;(ryan-packages binaries)
+ (rosenthal packages binaries)
+ (ryan-packages mozilla))
-(define my-neovim
- (package
- (inherit neovim)
- (native-inputs
- (modify-inputs (package-native-inputs neovim)
- (prepend gcc-12)))))
+; (define my-neovim
+; (package
+; (inherit neovim)
+; (native-inputs
+; (modify-inputs (package-native-inputs neovim)
+; (prepend gcc-13)))))
+
+ (define %home-symlinks
+; `((".config/guix/home-config/fish" ".config/fish")
+; (".config/guix/home-config/nix-config" ".config/nix")
+ `((".config/guix/home-config/nix-files" ".config/home-manager")))
+
+(home-symlinks %home-symlinks)
(home-environment
;; Below is the list of packages that will show up in your
;; Home profile, under ~/.guix-home/profile.
- (packages (append (specifications->packages (list "bat"
- "xdg-utils"
- "abook"
- "libnotify"
- "fzf"
- "qrencode"
- "binutils"
- "gcc-toolchain"
- "borg"
- "restic"
- "python-msgpack"
- "libreoffice"
- "flatpak"
- "gnupg"
- "lsof"
- "pavucontrol"
- "bind:utils"
- "font-cns11643"
- "syncthing"
- "imv"
- "perl"
- "tor"
- "unzip"
- "alacritty"
- "htop"
- "curl"
- "pandoc"
- "texlive-bin"
- "texlive-scheme-basic"
- "texlive-txfonts"
- "texlive-amsfonts"
- "texlive-lm"
- "texlive-lm-math"
- "texlive-iftex"
- "texlive-unicode-math"
- "texlive-fontspec"
- "texlive-xcolor"
- "texlive-geometry"
- "texlive-hyperref"
- "texlive-parskip"
- "texlive-etoolbox"
- "zathura"
- "zathura-pdf-mupdf"
- "fzf"
- "weechat"
- "gimp"
- "python"
- "python:tk"
- "file"
- "python-lsp-server"
- "kdenlive"
- "sqlite"
- "mpv"
- "playerctl"
- "aerc"
- "tcpdump"
- "pamixer"
- "git"
- "git-lfs"))
- (list my-neovim)))
+ ;(packages (append (specifications->packages (list ;"bat"
+ ;"fd"
+ ;"fish"
+ ;"xdg-utils"
+ ;"abook"
+ ;"libnotify"
+ ;"fzf"
+ ;"waypipe"
+ ;"foot"
+ ;"pulseaudio" ;only for pactl
+ ;"qpwgraph"
+ ;"gnunet"
+ ;"ffmpeg" ; removed for mpv prop input
+ ;"qrencode"
+ ;"tmux"
+ ;"binutils"
+ ;"gcc-toolchain"
+ ;"borg"
+ ;"restic"
+ ;"rsync"
+ ;"cloc"
+ ;"sc-im"
+ ;"pv"
+ ;"jq"
+ ;"gpgme"
+ ;"bombadillo"
+ ;"python-msgpack"
+ ;"wdisplays"
+ ;"kanshi"
+ ;"libreoffice"
+ ;"flatpak"
+ ;"gnupg"
+ ;"spotifyd"
+ ;"lsof"
+ ;"pavucontrol"
+ ;"netcat"
+ ;"bind:utils"
+ ;"font-cns11643-swjz"
+ ;"font-google-noto-emoji"
+ ;"syncthing"
+ ;"taskwarrior"
+ ;"tasksh"
+ ;"imv" ; Nix pkg now for MESA stuff
+ ;"perl"
+ ;"tor"
+ ;"unzip"
+ ;"htop"
+ ;"curl"
+ ;"pandoc"
+ ;"texlive-bin"
+ ;"texlive-scheme-basic"
+ ;"texlive-txfonts"
+ ;"texlive-amsfonts"
+ ;"texlive-lm"
+ ;"texlive-lm-math"
+ ;"texlive-iftex"
+ ;"texlive-unicode-math"
+ ;"texlive-fontspec"
+ ;"texlive-xcolor"
+ ;"texlive-geometry"
+ ;"texlive-hyperref"
+ ;"texlive-parskip"
+ ;"texlive-etoolbox"
+ ;"texlive-setspace"
+ ;"texlive-booktabs"
+ ;"texlive-mdwtools"
+ ;"texlive-caption"
+ ;"texlive-diagbox"
+ ;"texlive-pict2e"
+ ;"texlive-ulem"
+ ;"texlive-pgf"
+ ;"zathura"
+ ;"zathura-pdf-mupdf"
+ ;"go"
+ ;"fzf"
+ ;"weechat"
+ ;"gimp"
+ ;"python"
+ ;"python:tk"
+ ;"file"
+ ;"python-lsp-server"
+ ;"kdenlive"
+ ;"sqlite"
+ ;"mpv" ; Now a nix pkg for MESA stuff
+ ;"qbittorrent"
+ ;"playerctl"
+ ;"aerc"
+ ;"tcpdump"
+ ;"pamixer"
+ ;"git"
+ ;"git:send-email"
+ ;"password-store"
+ ;"node"
+ ;"kanshi"
+ ;"firefox"
+ ;"signal-desktop"
+ ;"sc-im"
+ ;"tree-sitter-cli"
+ ;"git-lfs"))
+ ;(list calcurse-fixed )))
;; Below is the list of Home services. To search for available
;; services, run 'guix home search KEYWORD' in a terminal.
@@ -96,31 +152,83 @@
(home-bash-configuration
(aliases '(("grep" . "grep --color=auto") ("ll" . "ls -l")
("ls" . "ls -p --color=auto")
- ("python" . "python3")))
+ ;("spt" . "spotify_player")
+ ;("python" . "python3")))
+ ))
(bashrc (list (local-file
"bashrc")))
(bash-profile (list (local-file
"bash_profile")))))
- (service home-xdg-configuration-files-service-type
- `(("nvim/init.vim" ,(local-file "nvim/config/init.vim"))
- ("nvim/after/ftplugin/markdown/custom.vim" ,(local-file "nvim/config/after/ftplugin/markdown/custom.vim"))
- ("sway" ,(local-file "sway" #:recursive? #t))
- ("hypr" ,(local-file "hypr" #:recursive? #t))
- ("waybar" ,(local-file "waybar" #:recursive? #t))
- ("alacritty" ,(local-file "alacritty" #:recursive? #t))
- ("aerc" ,(local-file "aerc" #:recursive? #t))
- ("home-manager" ,(local-file "nix-home-manager" #:recursive? #t)) ))
- (service home-files-service-type
- `((".local/share/nvim/site/autoload/plug.vim" ,(local-file "nvim/plugin-manager/plug.vim"))
- (".ssh/config" ,(local-file "ssh/config"))
+ ;(service home-xdg-configuration-files-service-type
+ ; Migrated to nix
+ ;`(("nvim/init.vim" ,(local-file "nvim/config/init.vim"))
+ ;("nvim/after/ftplugin/markdown/custom.vim" ,(local-file "nvim/config/after/ftplugin/markdown/custom.vim"))
+ ;("nvim/after/ftplugin/mail/custom.vim" ,(local-file "nvim/config/after/ftplugin/mail/custom.vim"))
+ ;("sway" ,(local-file "sway" #:recursive? #t))
+ ;("hypr" ,(local-file "hypr" #:recursive? #t))
+ ;("hypr/monitors.conf", (local-file "hypr/monitors.conf"))
+ ;("hypr/pyprland.toml", (local-file "hypr/pyprland.toml"))
+ ;("hypr/family_guy.mp4", (local-file "hypr/family_guy.mp4"))
+ ;("hypr/hyprlock.conf", (local-file "hypr/hyprlock.conf"))
+ ;("hypr/hypridle.conf", (local-file "hypr/hypridle.conf"))
+ ;("hypr/kanshi.conf", (local-file "hypr/kanshi.conf"))
+ ;("hypr/subwaysurfer.webm", (local-file "hypr/subwaysurfer.webm"))
+ ;("hypr/Wallpapers", (local-file "hypr/Wallpapers" #:recursive? #t))
+ ;("hypr/scripts", (local-file "hypr/scripts" #:recursive? #t))
+ ;("wpaperd" ,(local-file "wpaperd" #:recursive? #t))
+ ;("mpv" ,(local-file "mpv" #:recursive? #t))
+ ;("foot" ,(local-file "foot" #:recursive? #t))
+ ;("pulse/client.conf" ,(local-file "pulseaudio/client.conf"))
+ ;("waybar" ,(local-file "waybar" #:recursive? #t))
+ ;("alacritty" ,(local-file "alacritty" #:recursive? #t))
+ ;("aerc" ,(local-file "aerc" #:recursive? #t)) ))
+ ;(service home-files-service-type
+ ;l`(;(".local/share/nvim/site/autoload/plug.vim" ,(local-file "nvim/plugin-manager/plug.vim"))
+ ;(".ssh/config" ,(local-file "ssh/config"))
+ ;(".icons" ,(local-file "icons" #:recursive? #t))
+ ;(".mozilla/native-messaging-hosts/gpgmejson.json" ,(local-file "mailvelope/gpgmejson.json"))
+ ;(".local/share/mailvelope" ,(local-file "mailvelope" #:recursive? #t))
+ ;(".mozilla/native-messaging-hosts/tridactyl.json" ,(local-file "tridactyl/tridactyl.json"))
+ ;(".local/share/tridactyl" ,(local-file "tridactyl" #:recursive? #t))
;(".gnupg/sshcontrol" ,(local-file "gnupg/sshcontrol"))
;(".gnupg/gpg-agent.conf" ,(local-file "gnupg/gpg-agent.conf"))
- (".fonts" ,(local-file "fonts" #:recursive? #t))
- (".nix-channels" ,(local-file "nix-channels"))))
+ ;(".gnupg/gpg.conf" ,(local-file "gnupg/gpg.conf"))
+ ;(".local/share/fonts" ,(local-file "fonts" #:recursive? #t))
+ ;(".gitconfig" ,(local-file "gitconfig"))
+ ;(".docker/cli-plugins" ,(local-file "docker/cli-plugins" #:recursive? #t))
+ ;(".nix-channels" ,(local-file "nix-channels"))))
(service home-pipewire-service-type)
+ ;(service home-spotifyd-service-type)
+ ; font things for nix to play nice
+ ; (simple-service 'additional-fonts-service
+ ; home-fontconfig-service-type
+ ; (list "~/.nix-profile/share/fonts"
+ ; '(match (@ (target "pattern"))
+ ; (edit (@ (name "family") (mode "prepend"))
+ ; (string "DejaVu Sans")))
+ ; '(alias
+ ; (family "serif")
+ ; (prefer
+ ; (family "DejaVu Serif")))
+ ; '(alias
+ ; (family "sans")
+ ; (prefer
+ ; (family "DejaVu Sans")))
+ ; '(alias
+ ; (family "monospace")
+ ; (prefer
+ ; (family "DejaVu Sans Mono")))))
(service home-dbus-service-type)
- (service home-gpg-agent-service-type
- (home-gpg-agent-configuration
- (pinentry-program
- (file-append pinentry "/bin/pinentry"))
- (ssh-support? #t))) )))
+ (service downloads-garbage-collector-service-type
+ (downloads-garbage-collector-configuration
+ (user "ryan")))
+ ;;; trying some changes
+ ;(template-files "."
+ ;'("spotify-player/app.toml"
+ ;;;
+ ;(service home-gpg-agent-service-type
+ ; (home-gpg-agent-configuration
+ ; (pinentry-program
+ ; (file-append pinentry "/bin/pinentry"))
+ ; (ssh-support? #t))) )))
+)))
Binary files a/home-config/hypr/Wallpapers/mountains.jpg and /dev/null differ
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-
-hash dbus-update-activation-environment 2>/dev/null && dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP &
-
-waybar &
-
-mako &
-
-swaybg -i ~/.config/hypr/Wallpapers/mountains.jpg &
-
-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' &
-
-syncthing serve --no-browser &
@@ -1,221 +0,0 @@
-exec-once = dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=Hyprland
-
-#
-# Please note not all available settings / options are set here.
-# For a full list, see the wiki
-#
-
-# See https://wiki.hyprland.org/Configuring/Monitors/
-monitor=,preferred,auto,1
-
-
-# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-
-# Execute your favorite apps at launch
-# exec-once = waybar & hyprpaper & firefox
-
-# Source a file (multi-file configs)
-source = ~/.config/hypr/monitors.conf
-
-# Some default env vars.
-env = XCURSOR_SIZE,24
-
-# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
-input {
- kb_layout = us
- kb_variant =
- kb_model =
- kb_options =
- kb_rules =
- numlock_by_default = true
-
- follow_mouse = 1
-
- touchpad {
- natural_scroll = no
- }
-
- sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
-}
-
-general {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
-
- gaps_in = 5
- gaps_out = 10
- border_size = 2
- col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
- col.inactive_border = rgba(595959aa)
-
- layout = dwindle
-}
-
-decoration {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
-
- rounding = 5
- blur {
- enabled = yes
- size = 3
- passes = 1
- new_optimizations = on
- }
-
- drop_shadow = yes
- shadow_range = 4
- shadow_render_power = 3
- col.shadow = rgba(1a1a1aee)
-}
-
-animations {
- enabled = yes
-
- # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
-
- bezier = myBezier, 0.05, 0.9, 0.1, 1.05
-
- animation = windows, 1, 7, myBezier
- animation = windowsOut, 1, 7, default, popin 80%
- animation = border, 1, 10, default
- animation = borderangle, 1, 8, default
- animation = fade, 1, 7, default
- animation = workspaces, 1, 6, default
-}
-
-dwindle {
- # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
- pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
- preserve_split = yes # you probably want this
-}
-
-master {
- # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
- new_is_master = true
-}
-
-gestures {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
- workspace_swipe = off
-}
-
-# Example per-device config
-# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
-device:epic-mouse-v1 {
- sensitivity = -0.5
-}
-
-# Example windowrule v1
-# windowrule = float, ^(kitty)$
-# Example windowrule v2
-# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
-# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
-
-
-# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-$mainMod = SUPER
-
-# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
-bind = $mainMod, Return, exec, alacritty
-bind = $mainMod SHIFT, Q, killactive
-bind = $mainMod SHIFT, E, exit
-bind = $mainMod SHIFT, Space, togglefloating
-bind = $mainMod, D, exec, fuzzel --width=35 --font='Hack:weight=bold:size=12' --background-color='282a36fa' --selection-color='3d4460fa' --line-height=20 --border-radius=20
-bind = $mainMod, P, pseudo, # dwindle
-bind = $mainMod, J, togglesplit, # dwindle
-bind = $mainMod, F, fullscreen, 1
-bind = $mainMod SHIFT, F, fullscreen
-bind = ,XF86MonBrightnessUp, exec, light -A 10
-bind = ,XF86MonBrightnessDown, exec, light -U 10
-bind = ,XF86AudioRaiseVolume, exec, pamixer -i 5
-bind = ,XF86AudioLowerVolume, exec, pamixer -d 5
-bind = ,XF86AudioMute, exec, pamixer -t
-bind = ,XF86AudioPlay, exec, playerctl play-pause
-bind = ,XF86AudioPause, exec, playerctl play-pause
-bind = ,XF86AudioNext, exec, playerctl next
-bind = ,XF86AudioPrev, exec, playerctl previous
-bind = ,XF86AudioStop, exec, playerctl stop
-
-# Move workspace between monitors
-bind = $mainMod CTRL SHIFT, left, movecurrentworkspacetomonitor, l
-bind = $mainMod CTRL SHIFT, right, movecurrentworkspacetomonitor, r
-bind = $mainMod CTRL SHIFT, up, movecurrentworkspacetomonitor, u
-bind = $mainMod CTRL SHIFT, down, movecurrentworkspacetomonitor, d
-
-# Move focus with mainMod + arrow keys
-bind = $mainMod, left, movefocus, l
-bind = $mainMod, right, movefocus, r
-bind = $mainMod, up, movefocus, u
-bind = $mainMod, down, movefocus, d
-
-# Move window with mainMod + SHIFT + arrow keys
-bind = $mainMod SHIFT, left, movewindow, l
-bind = $mainMod SHIFT, right, movewindow, r
-bind = $mainMod SHIFT, up, movewindow, u
-bind = $mainMod SHIFT, down, movewindow, d
-
-# Switch workspaces with mainMod + [0-9]
-bind = $mainMod, 1, workspace, 1
-bind = $mainMod, 2, workspace, 2
-bind = $mainMod, 3, workspace, 3
-bind = $mainMod, 4, workspace, 4
-bind = $mainMod, 5, workspace, 5
-bind = $mainMod, 6, workspace, 6
-bind = $mainMod, 7, workspace, 7
-bind = $mainMod, 8, workspace, 8
-bind = $mainMod, 9, workspace, 9
-bind = $mainMod, 0, workspace, 10
-
-# Move active window to a workspace with mainMod + SHIFT + [0-9]
-bind = $mainMod SHIFT, 1, movetoworkspace, 1
-bind = $mainMod SHIFT, 2, movetoworkspace, 2
-bind = $mainMod SHIFT, 3, movetoworkspace, 3
-bind = $mainMod SHIFT, 4, movetoworkspace, 4
-bind = $mainMod SHIFT, 5, movetoworkspace, 5
-bind = $mainMod SHIFT, 6, movetoworkspace, 6
-bind = $mainMod SHIFT, 7, movetoworkspace, 7
-bind = $mainMod SHIFT, 8, movetoworkspace, 8
-bind = $mainMod SHIFT, 9, movetoworkspace, 9
-bind = $mainMod SHIFT, 0, movetoworkspace, 10
-
-# Scroll through existing workspaces with mainMod + scroll
-bind = $mainMod, mouse_down, workspace, e+1
-bind = $mainMod, mouse_up, workspace, e-1
-
-# Move/resize windows with mainMod + LMB/RMB and dragging
-bindm = $mainMod, mouse:272, movewindow
-bindm = $mainMod, mouse:273, resizewindow
-
-# Bind mainMod + L to screenlocker
-bind = $mainMod, L, exec, swaylock --screenshots --clock --indicator --fade-in 1 --effect-blur 7x5 --effect-greyscale
-
-# Keybind for screenshot
-bind = $mainMod SHIFT, S, exec, grimblast copy area
-bind = $mainMod SHIFT, Print, exec, grimblast edit area
-
-# Notifications keybinds
-bind = $mainMod, N, exec, makoctl dismiss
-bind = $mainMod SHIFT, N, exec, makoctl dismiss -a
-
-# Window Rules
-
-# Firefox PiP
-windowrulev2 = float, class:^(firefox)$, title:^(Picture-in-Picture)$
-windowrulev2 = pin, class:^(firefox)$, title:^(Picture-in-Picture)$
-windowrulev2 = size 578 326, class:^(firefox)$, title:^(Picture-in-Picture)$
-
-# Firefox Sharing Indicator
-windowrulev2 = float, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = size 56 31, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = move 50% 0, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = nomaximizerequest, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = nofullscreenrequest, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-
-# Weather
-windowrulev2 = float,class:^(ala-wttr)$
-windowrulev2 = size 740 712, class:^(ala-wttr)$
-
-exec-once = ~/.config/hypr/autostart.sh
-
-misc {
- disable_hyprland_logo = true
-}
@@ -1,2 +0,0 @@
-monitor=eDP-1,1920x1080, 0x0, 1
-monitor=HDMI-A-1,1920x1080, 1920x0, 1
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/X_cursor.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bd_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_left_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_right_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/center_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/circle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/context-menu.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/copy.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/cross.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/crossed_circle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/crosshair.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-ask.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-copy.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-link.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd_no_drop.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dotbox.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/fd_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/grabbing.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/hand1.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/hand2.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_ptr_watch.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/link.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ll_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/lr_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/move.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/pencil.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/plus.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/pointer-move.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/question_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_down_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_h_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_left_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_right_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_up_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_v_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/tcross.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_left_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_right_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ul_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ur_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/vertical-text.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/wait.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/wayland-cursor.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/xterm.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/zoom-in.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/zoom-out.hlc differ
@@ -0,0 +1,4 @@
+name = Bibata-Modern-Classic-Hyprland
+description = Generated Bibata repository
+version = 0.1
+cursors_directory = hyprcursors
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023-2024 Abdulkaiz Khatri
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
@@ -0,0 +1,35 @@
+[::] Bibata Cursor
+TLDR; This cursor set is a masterpiece of cursors available on the internet,
+hand-designed by Abdulkaiz Khatri(https://twitter.com/ful1e5).
+
+Bibata is an open source, compact, and material designed cursor set that aims
+to improve the cursor experience for users. It is one of the most popular cursor sets
+in the Linux community and is now available for free on Windows as well, with multiple color
+and size options. Its goal is to offer personalized cursors to users.
+
+[::] What does "Bibata" mean?
+The sweetest word I ever spoke was "BI-Buh," which, coincidentally, is also the word for peanuts.
+To make it more pronounceable and not sound like a baby's words, I added the suffix "Ta."
+And with that, my journey in the world of open source began.
+
+[::] Become Sponsor
+https://github.com/sponsors/ful1e5
+
+[::] LICENSE
+MIT License
+
+[::] Bug Reports & Contact
+https://github.com/ful1e5/bibata/issues
+
+[::] Installation
+```bash
+tar -xvf Bibata.tar.gz # extract `Bibata.tar.gz`
+mv Bibata-* ~/.icons/ # Install to local users
+sudo mv Bibata-* /usr/share/icons/ # Install to all users
+```
+
+[::] Uninstallation
+```bash
+rm ~/.icons/Bibata-* # Remove from local users
+sudo rm /usr/share/icons/Bibata-* # Remove from all users
+```
\ No newline at end of file
@@ -0,0 +1,4 @@
+ID=daed906f-99d6-4fb8-ae03-623d988962e3
+Author=Abdualkaiz Khatri <kaizmandhu@gmail.com>
+Type=Bibata-Modern
+Version=1.0.2
\ No newline at end of file
@@ -0,0 +1,3 @@
+[Icon Theme]
+Name=Bibata-Modern-daed9-v1.0.2-x11
+Inherits="Bibata-Modern-daed9-v1.0.2-x11"
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/X_cursor differ
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+dnd-link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bd_double_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_left_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_right_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_tee differ
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+plus
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/center_ptr differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/circle differ
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+tcross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/context-menu differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/copy differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/cross differ
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/crossed_circle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/crosshair differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-ask differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-copy differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-link differ
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd_no_drop differ
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dotbox differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_down_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+pencil
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+right_side
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/fd_double_arrow differ
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+circle
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/grabbing differ
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/hand1 differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/hand2 differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+sb_left_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_ptr differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_ptr_watch differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_tee differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/link differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ll_angle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/lr_angle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/move differ
@@ -0,0 +1 @@
+top_side
\ No newline at end of file
@@ -0,0 +1 @@
+top_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+dnd_no_drop
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+top_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/pencil differ
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/plus differ
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/pointer-move differ
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/question_arrow differ
@@ -0,0 +1 @@
+sb_right_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_ptr differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_tee differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_down_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_h_double_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_left_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_right_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_up_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_v_double_arrow differ
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/tcross differ
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_left_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_right_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_tee differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ul_angle differ
@@ -0,0 +1 @@
+sb_up_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ur_angle differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/vertical-text differ
@@ -0,0 +1 @@
+left_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/wait differ
@@ -0,0 +1 @@
+wait
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/wayland-cursor differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/xterm differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/zoom-in differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/zoom-out differ
@@ -0,0 +1,4 @@
+[Icon Theme]
+Name=Bibata-Modern-daed9-v1.0.2-x11
+Comment=Bibata XCursors
+Inherits="hicolor"
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/X_cursor.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/all-scroll.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/bottom_left_corner.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/bottom_right_corner.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/bottom_tee.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/center_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/context-menu.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/copy.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/cross.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/crossed_circle.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/crosshair.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/dnd_no_drop.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/dotbox.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/hand1.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/hand2.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/left_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/left_ptr_watch.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/left_side.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/left_tee.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/link.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/ll_angle.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/lr_angle.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/move.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/pencil.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/person.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/pin.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/plus.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/question_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/right_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/right_tee.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_down_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_h_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_left_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_right_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_up_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/sb_v_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/top_side.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/top_tee.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/ul_angle.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/ur_angle.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/vertical-text.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/wait.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/wayland-cursor.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/xterm.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/zoom-in.hlc differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark-Hyprcursor/hyprcursors/zoom-out.hlc differ
@@ -0,0 +1,4 @@
+name = XCursor-Pro-Dark-Hyprcursor
+description = XCursor-Pro-Dark Hyprcursor version
+version = 1.0
+cursors_directory = hyprcursors
@@ -0,0 +1,3 @@
+[Icon Theme]
+Name=XCursor-Pro-Dark
+Inherits="XCursor-Pro-Dark"
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/X_cursor differ
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/all-scroll differ
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/bottom_left_corner differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/bottom_right_corner differ
@@ -0,0 +1 @@
+top_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/bottom_tee differ
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+plus
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/center_ptr differ
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/context-menu differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/copy differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/cross differ
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/crossed_circle differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/crosshair differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+cross
\ No newline at end of file
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/dnd_no_drop differ
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/dotbox differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_down_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+pencil
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+left_side
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+all-scroll
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/hand1 differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/hand2 differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+sb_left_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/left_ptr differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/left_ptr_watch differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/left_side differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/left_tee differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/link differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/ll_angle differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/lr_angle differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/move differ
@@ -0,0 +1 @@
+top_side
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+dnd_no_drop
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/pencil differ
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/plus differ
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/question_arrow differ
@@ -0,0 +1 @@
+sb_right_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/right_ptr differ
@@ -0,0 +1 @@
+left_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/right_tee differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+top_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_down_arrow differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_h_double_arrow differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_left_arrow differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_right_arrow differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_up_arrow differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/sb_v_double_arrow differ
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+all-scroll
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+cross
\ No newline at end of file
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/top_side differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/top_tee differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/ul_angle differ
@@ -0,0 +1 @@
+sb_up_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/ur_angle differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/vertical-text differ
@@ -0,0 +1 @@
+left_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/wait differ
@@ -0,0 +1 @@
+wait
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/wayland-cursor differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/xterm differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/zoom-in differ
Binary files /dev/null and b/home-config/icons/XCursor-Pro-Dark/cursors/zoom-out differ
@@ -0,0 +1,4 @@
+[Icon Theme]
+Name=XCursor-Pro-Dark
+Comment=Modern, Proffesional Dark (v2.0.2) XCursors
+Inherits="hicolor"
\ No newline at end of file
@@ -1,2 +0,0 @@
-https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
-https://nixos.org/channels/nixpkgs-unstable nixpkgs
@@ -0,0 +1 @@
+Subproject commit 2e30121671a730a2b4bc2f82d2e30ed5c9ff70e5
@@ -1,79 +0,0 @@
-{ config, pkgs, ... }:
-
-{
- # Home Manager needs a bit of information about you and the paths it should
- # manage.
- home.username = "ryan";
- home.homeDirectory = "/home/ryan";
-
- # This value determines the Home Manager release that your configuration is
- # compatible with. This helps avoid breakage when a new Home Manager release
- # introduces backwards incompatible changes.
- #
- # You should not change this value, even if you update Home Manager. If you do
- # want to update the value, then make sure to first check the Home Manager
- # release notes.
- home.stateVersion = "22.11"; # Please read the comment before changing.
-
- # This value will set some environment variables to allow home-manager to
- # function better outside of NixOS
- nixpkgs.config.allowUnfree = true;
- targets.genericLinux.enable = true;
- fonts.fontconfig.enable = true;
-
- # The home.packages option allows you to install Nix packages into your
- # environment.
- home.packages = with pkgs; [
- # # Adds the 'hello' command to your environment. It prints a friendly
- # # "Hello, world!" when run.
- # pkgs.hello
- yt-dlp
- xdg-desktop-portal-hyprland
- pass
-
- # # It is sometimes useful to fine-tune packages, for example, by applying
- # # overrides. You can do that directly here, just don't forget the
- # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
- # # fonts?
- # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
-
- # # You can also create simple shell scripts directly inside your
- # # configuration. For example, this adds a command 'my-hello' to your
- # # environment:
- # (pkgs.writeShellScriptBin "my-hello" ''
- # echo "Hello, ${config.home.username}!"
- # '')
- ];
-
- # Home Manager is pretty good at managing dotfiles. The primary way to manage
- # plain files is through 'home.file'.
- home.file = {
- # # Building this configuration will create a copy of 'dotfiles/screenrc' in
- # # the Nix store. Activating the configuration will then make '~/.screenrc' a
- # # symlink to the Nix store copy.
- # ".screenrc".source = dotfiles/screenrc;
-
- # # You can also set the file content immediately.
- # ".gradle/gradle.properties".text = ''
- # org.gradle.console=verbose
- # org.gradle.daemon.idletimeout=3600000
- # '';
- };
-
- # You can also manage environment variables but you will have to manually
- # source
- #
- # ~/.nix-profile/etc/profile.d/hm-session-vars.sh
- #
- # or
- #
- # /etc/profiles/per-user/ryan/etc/profile.d/hm-session-vars.sh
- #
- # if you don't want to manage your shell through Home Manager.
- home.sessionVariables = {
- # EDITOR = "emacs";
- };
-
- # Let Home Manager install and manage itself.
- programs.home-manager.enable = true;
-}
@@ -1,2 +0,0 @@
-"Used to overwrite table behavior in markdown files
-let b:table_mode_corner='+'
@@ -1,77 +0,0 @@
-set nu rnu
-imap kj <Esc>
-set ts=4
-set sw=4
-set sts=4
-set et
-set mouse=
-
-call plug#begin(stdpath('data') . '/plugged')
-"Plug 'prabirshrestha/vim-lsp'
-"Plug 'mattn/vim-lsp-settings'
-"Plug 'prabirshrestha/asyncomplete.vim'
-"Plug 'prabirshrestha/asyncomplete-lsp.vim'
-"Plug 'Yggdroot/indentLine'
-Plug 'nvim-treesitter/nvim-treesitter', {'do':':TSUpdate'}
-Plug 'vim-pandoc/vim-pandoc'
-Plug 'vim-pandoc/vim-pandoc-syntax'
-Plug 'dhruvasagar/vim-table-mode'
-Plug '~/.config/nvim/after'
-Plug 'skywind3000/asyncrun.vim'
-Plug 'folke/tokyonight.nvim', {'branch':'main'}
-Plug 'nvim-lualine/lualine.nvim'
-Plug 'nvim-tree/nvim-web-devicons'
-Plug 'ms-jpq/coq_nvim', {'branch':'coq'}
-Plug 'ms-jpq/coq.artifacts', {'branch':'artifacts'}
-Plug 'nvim-orgmode/orgmode'
-call plug#end()
-
-"Load Theme
-colorscheme tokyonight-night
-
-"Load COQ Autocomplete
-let g:coq_settings = {'auto_start':'shut-up'}
-
-"Load LuaLine, COQ, and nvim-orgmode
-lua << END
-require('lualine').setup()
-require('coq')
-require('orgmode').setup_ts_grammar()
-require('nvim-treesitter.configs').setup {
- highlight = {
- enable = true,
- additional_vim_regex_highlighting = {'org'},
- },
- ensure_installed = {'org', 'vim'},
-}
-
-require('orgmode').setup({
- org_agenda_files = {'~/Sync/org/**/*'},
- org_default_notes_file = '~/Sync/org/refile.org',
-})
-
-vim.opt.conceallevel = 2
-vim.opt.concealcursor = nc
-
-END
-
-"asynccomplete Auto Complete Config
-"inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
-"inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
-"inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
-
-"vim-pandoc config
-let g:pandoc#modules#disabled = ['spell', 'folding']
-
-"vim-table-mode config
-let g:table_mode_corner_corner='+'
-let g:table_mode_header_fillchar='='
-
-"pandoc render and open preview
-command Pv AsyncRun zathura '%:r.pdf'
-command Rd silent exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
-command Rr exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
-
-"Auto-rerender markdown files to pdf
-autocmd BufWritePost *.mkd :Rd
@@ -1,2812 +0,0 @@
-" vim-plug: Vim plugin manager
-" ============================
-"
-" Download plug.vim and put it in ~/.vim/autoload
-"
-" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
-" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
-"
-" Edit your .vimrc
-"
-" call plug#begin('~/.vim/plugged')
-"
-" " Make sure you use single quotes
-"
-" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
-" Plug 'junegunn/vim-easy-align'
-"
-" " Any valid git URL is allowed
-" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
-"
-" " Multiple Plug commands can be written in a single line using | separators
-" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
-"
-" " On-demand loading
-" Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
-" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
-"
-" " Using a non-default branch
-" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
-"
-" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
-" Plug 'fatih/vim-go', { 'tag': '*' }
-"
-" " Plugin options
-" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
-"
-" " Plugin outside ~/.vim/plugged with post-update hook
-" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
-"
-" " Unmanaged plugin (manually installed and updated)
-" Plug '~/my-prototype-plugin'
-"
-" " Initialize plugin system
-" call plug#end()
-"
-" Then reload .vimrc and :PlugInstall to install plugins.
-"
-" Plug options:
-"
-"| Option | Description |
-"| ----------------------- | ------------------------------------------------ |
-"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
-"| `rtp` | Subdirectory that contains Vim plugin |
-"| `dir` | Custom directory for the plugin |
-"| `as` | Use different name for the plugin |
-"| `do` | Post-update hook (string or funcref) |
-"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
-"| `for` | On-demand loading: File types |
-"| `frozen` | Do not update unless explicitly specified |
-"
-" More information: https://github.com/junegunn/vim-plug
-"
-"
-" Copyright (c) 2017 Junegunn Choi
-"
-" MIT License
-"
-" Permission is hereby granted, free of charge, to any person obtaining
-" a copy of this software and associated documentation files (the
-" "Software"), to deal in the Software without restriction, including
-" without limitation the rights to use, copy, modify, merge, publish,
-" distribute, sublicense, and/or sell copies of the Software, and to
-" permit persons to whom the Software is furnished to do so, subject to
-" the following conditions:
-"
-" The above copyright notice and this permission notice shall be
-" included in all copies or substantial portions of the Software.
-"
-" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-if exists('g:loaded_plug')
- finish
-endif
-let g:loaded_plug = 1
-
-let s:cpo_save = &cpo
-set cpo&vim
-
-let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
-let s:plug_tab = get(s:, 'plug_tab', -1)
-let s:plug_buf = get(s:, 'plug_buf', -1)
-let s:mac_gui = has('gui_macvim') && has('gui_running')
-let s:is_win = has('win32')
-let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
-let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
-if s:is_win && &shellslash
- set noshellslash
- let s:me = resolve(expand('<sfile>:p'))
- set shellslash
-else
- let s:me = resolve(expand('<sfile>:p'))
-endif
-let s:base_spec = { 'branch': '', 'frozen': 0 }
-let s:TYPE = {
-\ 'string': type(''),
-\ 'list': type([]),
-\ 'dict': type({}),
-\ 'funcref': type(function('call'))
-\ }
-let s:loaded = get(s:, 'loaded', {})
-let s:triggers = get(s:, 'triggers', {})
-
-function! s:is_powershell(shell)
- return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
-endfunction
-
-function! s:isabsolute(dir) abort
- return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
-endfunction
-
-function! s:git_dir(dir) abort
- let gitdir = s:trim(a:dir) . '/.git'
- if isdirectory(gitdir)
- return gitdir
- endif
- if !filereadable(gitdir)
- return ''
- endif
- let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
- if len(gitdir) && !s:isabsolute(gitdir)
- let gitdir = a:dir . '/' . gitdir
- endif
- return isdirectory(gitdir) ? gitdir : ''
-endfunction
-
-function! s:git_origin_url(dir) abort
- let gitdir = s:git_dir(a:dir)
- let config = gitdir . '/config'
- if empty(gitdir) || !filereadable(config)
- return ''
- endif
- return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
-endfunction
-
-function! s:git_revision(dir) abort
- let gitdir = s:git_dir(a:dir)
- let head = gitdir . '/HEAD'
- if empty(gitdir) || !filereadable(head)
- return ''
- endif
-
- let line = get(readfile(head), 0, '')
- let ref = matchstr(line, '^ref: \zs.*')
- if empty(ref)
- return line
- endif
-
- if filereadable(gitdir . '/' . ref)
- return get(readfile(gitdir . '/' . ref), 0, '')
- endif
-
- if filereadable(gitdir . '/packed-refs')
- for line in readfile(gitdir . '/packed-refs')
- if line =~# ' ' . ref
- return matchstr(line, '^[0-9a-f]*')
- endif
- endfor
- endif
-
- return ''
-endfunction
-
-function! s:git_local_branch(dir) abort
- let gitdir = s:git_dir(a:dir)
- let head = gitdir . '/HEAD'
- if empty(gitdir) || !filereadable(head)
- return ''
- endif
- let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
- return len(branch) ? branch : 'HEAD'
-endfunction
-
-function! s:git_origin_branch(spec)
- if len(a:spec.branch)
- return a:spec.branch
- endif
-
- " The file may not be present if this is a local repository
- let gitdir = s:git_dir(a:spec.dir)
- let origin_head = gitdir.'/refs/remotes/origin/HEAD'
- if len(gitdir) && filereadable(origin_head)
- return matchstr(get(readfile(origin_head), 0, ''),
- \ '^ref: refs/remotes/origin/\zs.*')
- endif
-
- " The command may not return the name of a branch in detached HEAD state
- let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
- return v:shell_error ? '' : result[-1]
-endfunction
-
-if s:is_win
- function! s:plug_call(fn, ...)
- let shellslash = &shellslash
- try
- set noshellslash
- return call(a:fn, a:000)
- finally
- let &shellslash = shellslash
- endtry
- endfunction
-else
- function! s:plug_call(fn, ...)
- return call(a:fn, a:000)
- endfunction
-endif
-
-function! s:plug_getcwd()
- return s:plug_call('getcwd')
-endfunction
-
-function! s:plug_fnamemodify(fname, mods)
- return s:plug_call('fnamemodify', a:fname, a:mods)
-endfunction
-
-function! s:plug_expand(fmt)
- return s:plug_call('expand', a:fmt, 1)
-endfunction
-
-function! s:plug_tempname()
- return s:plug_call('tempname')
-endfunction
-
-function! plug#begin(...)
- if a:0 > 0
- let s:plug_home_org = a:1
- let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
- elseif exists('g:plug_home')
- let home = s:path(g:plug_home)
- elseif has('nvim')
- let home = stdpath('data') . '/plugged'
- elseif !empty(&rtp)
- let home = s:path(split(&rtp, ',')[0]) . '/plugged'
- else
- return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
- endif
- if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
- return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
- endif
-
- let g:plug_home = home
- let g:plugs = {}
- let g:plugs_order = []
- let s:triggers = {}
-
- call s:define_commands()
- return 1
-endfunction
-
-function! s:define_commands()
- command! -nargs=+ -bar Plug call plug#(<args>)
- if !executable('git')
- return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
- endif
- if has('win32')
- \ && &shellslash
- \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
- return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
- endif
- if !has('nvim')
- \ && (has('win32') || has('win32unix'))
- \ && !has('multi_byte')
- return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
- endif
- command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
- command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
- command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
- command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
- command! -nargs=0 -bar PlugStatus call s:status()
- command! -nargs=0 -bar PlugDiff call s:diff()
- command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
-endfunction
-
-function! s:to_a(v)
- return type(a:v) == s:TYPE.list ? a:v : [a:v]
-endfunction
-
-function! s:to_s(v)
- return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
-endfunction
-
-function! s:glob(from, pattern)
- return s:lines(globpath(a:from, a:pattern))
-endfunction
-
-function! s:source(from, ...)
- let found = 0
- for pattern in a:000
- for vim in s:glob(a:from, pattern)
- execute 'source' s:esc(vim)
- let found = 1
- endfor
- endfor
- return found
-endfunction
-
-function! s:assoc(dict, key, val)
- let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
-endfunction
-
-function! s:ask(message, ...)
- call inputsave()
- echohl WarningMsg
- let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
- echohl None
- call inputrestore()
- echo "\r"
- return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
-endfunction
-
-function! s:ask_no_interrupt(...)
- try
- return call('s:ask', a:000)
- catch
- return 0
- endtry
-endfunction
-
-function! s:lazy(plug, opt)
- return has_key(a:plug, a:opt) &&
- \ (empty(s:to_a(a:plug[a:opt])) ||
- \ !isdirectory(a:plug.dir) ||
- \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
- \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
-endfunction
-
-function! plug#end()
- if !exists('g:plugs')
- return s:err('plug#end() called without calling plug#begin() first')
- endif
-
- if exists('#PlugLOD')
- augroup PlugLOD
- autocmd!
- augroup END
- augroup! PlugLOD
- endif
- let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
-
- if get(g:, 'did_load_filetypes', 0)
- filetype off
- endif
- for name in g:plugs_order
- if !has_key(g:plugs, name)
- continue
- endif
- let plug = g:plugs[name]
- if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
- let s:loaded[name] = 1
- continue
- endif
-
- if has_key(plug, 'on')
- let s:triggers[name] = { 'map': [], 'cmd': [] }
- for cmd in s:to_a(plug.on)
- if cmd =~? '^<Plug>.\+'
- if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
- call s:assoc(lod.map, cmd, name)
- endif
- call add(s:triggers[name].map, cmd)
- elseif cmd =~# '^[A-Z]'
- let cmd = substitute(cmd, '!*$', '', '')
- if exists(':'.cmd) != 2
- call s:assoc(lod.cmd, cmd, name)
- endif
- call add(s:triggers[name].cmd, cmd)
- else
- call s:err('Invalid `on` option: '.cmd.
- \ '. Should start with an uppercase letter or `<Plug>`.')
- endif
- endfor
- endif
-
- if has_key(plug, 'for')
- let types = s:to_a(plug.for)
- if !empty(types)
- augroup filetypedetect
- call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
- augroup END
- endif
- for type in types
- call s:assoc(lod.ft, type, name)
- endfor
- endif
- endfor
-
- for [cmd, names] in items(lod.cmd)
- execute printf(
- \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
- \ cmd, string(cmd), string(names))
- endfor
-
- for [map, names] in items(lod.map)
- for [mode, map_prefix, key_prefix] in
- \ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
- execute printf(
- \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
- \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
- endfor
- endfor
-
- for [ft, names] in items(lod.ft)
- augroup PlugLOD
- execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
- \ ft, string(ft), string(names))
- augroup END
- endfor
-
- call s:reorg_rtp()
- filetype plugin indent on
- if has('vim_starting')
- if has('syntax') && !exists('g:syntax_on')
- syntax enable
- end
- else
- call s:reload_plugins()
- endif
-endfunction
-
-function! s:loaded_names()
- return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
-endfunction
-
-function! s:load_plugin(spec)
- call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
-endfunction
-
-function! s:reload_plugins()
- for name in s:loaded_names()
- call s:load_plugin(g:plugs[name])
- endfor
-endfunction
-
-function! s:trim(str)
- return substitute(a:str, '[\/]\+$', '', '')
-endfunction
-
-function! s:version_requirement(val, min)
- for idx in range(0, len(a:min) - 1)
- let v = get(a:val, idx, 0)
- if v < a:min[idx] | return 0
- elseif v > a:min[idx] | return 1
- endif
- endfor
- return 1
-endfunction
-
-function! s:git_version_requirement(...)
- if !exists('s:git_version')
- let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)')
- endif
- return s:version_requirement(s:git_version, a:000)
-endfunction
-
-function! s:progress_opt(base)
- return a:base && !s:is_win &&
- \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
-endfunction
-
-function! s:rtp(spec)
- return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
-endfunction
-
-if s:is_win
- function! s:path(path)
- return s:trim(substitute(a:path, '/', '\', 'g'))
- endfunction
-
- function! s:dirpath(path)
- return s:path(a:path) . '\'
- endfunction
-
- function! s:is_local_plug(repo)
- return a:repo =~? '^[a-z]:\|^[%~]'
- endfunction
-
- " Copied from fzf
- function! s:wrap_cmds(cmds)
- let cmds = [
- \ '@echo off',
- \ 'setlocal enabledelayedexpansion']
- \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
- \ + ['endlocal']
- if has('iconv')
- if !exists('s:codepage')
- let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
- endif
- return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
- endif
- return map(cmds, 'v:val."\r"')
- endfunction
-
- function! s:batchfile(cmd)
- let batchfile = s:plug_tempname().'.bat'
- call writefile(s:wrap_cmds(a:cmd), batchfile)
- let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
- if s:is_powershell(&shell)
- let cmd = '& ' . cmd
- endif
- return [batchfile, cmd]
- endfunction
-else
- function! s:path(path)
- return s:trim(a:path)
- endfunction
-
- function! s:dirpath(path)
- return substitute(a:path, '[/\\]*$', '/', '')
- endfunction
-
- function! s:is_local_plug(repo)
- return a:repo[0] =~ '[/$~]'
- endfunction
-endif
-
-function! s:err(msg)
- echohl ErrorMsg
- echom '[vim-plug] '.a:msg
- echohl None
-endfunction
-
-function! s:warn(cmd, msg)
- echohl WarningMsg
- execute a:cmd 'a:msg'
- echohl None
-endfunction
-
-function! s:esc(path)
- return escape(a:path, ' ')
-endfunction
-
-function! s:escrtp(path)
- return escape(a:path, ' ,')
-endfunction
-
-function! s:remove_rtp()
- for name in s:loaded_names()
- let rtp = s:rtp(g:plugs[name])
- execute 'set rtp-='.s:escrtp(rtp)
- let after = globpath(rtp, 'after')
- if isdirectory(after)
- execute 'set rtp-='.s:escrtp(after)
- endif
- endfor
-endfunction
-
-function! s:reorg_rtp()
- if !empty(s:first_rtp)
- execute 'set rtp-='.s:first_rtp
- execute 'set rtp-='.s:last_rtp
- endif
-
- " &rtp is modified from outside
- if exists('s:prtp') && s:prtp !=# &rtp
- call s:remove_rtp()
- unlet! s:middle
- endif
-
- let s:middle = get(s:, 'middle', &rtp)
- let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
- let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
- let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
- \ . ','.s:middle.','
- \ . join(map(afters, 'escape(v:val, ",")'), ',')
- let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
- let s:prtp = &rtp
-
- if !empty(s:first_rtp)
- execute 'set rtp^='.s:first_rtp
- execute 'set rtp+='.s:last_rtp
- endif
-endfunction
-
-function! s:doautocmd(...)
- if exists('#'.join(a:000, '#'))
- execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
- endif
-endfunction
-
-function! s:dobufread(names)
- for name in a:names
- let path = s:rtp(g:plugs[name])
- for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
- if len(finddir(dir, path))
- if exists('#BufRead')
- doautocmd BufRead
- endif
- return
- endif
- endfor
- endfor
-endfunction
-
-function! plug#load(...)
- if a:0 == 0
- return s:err('Argument missing: plugin name(s) required')
- endif
- if !exists('g:plugs')
- return s:err('plug#begin was not called')
- endif
- let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
- let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
- if !empty(unknowns)
- let s = len(unknowns) > 1 ? 's' : ''
- return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
- end
- let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
- if !empty(unloaded)
- for name in unloaded
- call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- endfor
- call s:dobufread(unloaded)
- return 1
- end
- return 0
-endfunction
-
-function! s:remove_triggers(name)
- if !has_key(s:triggers, a:name)
- return
- endif
- for cmd in s:triggers[a:name].cmd
- execute 'silent! delc' cmd
- endfor
- for map in s:triggers[a:name].map
- execute 'silent! unmap' map
- execute 'silent! iunmap' map
- endfor
- call remove(s:triggers, a:name)
-endfunction
-
-function! s:lod(names, types, ...)
- for name in a:names
- call s:remove_triggers(name)
- let s:loaded[name] = 1
- endfor
- call s:reorg_rtp()
-
- for name in a:names
- let rtp = s:rtp(g:plugs[name])
- for dir in a:types
- call s:source(rtp, dir.'/**/*.vim')
- endfor
- if a:0
- if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
- execute 'runtime' a:1
- endif
- call s:source(rtp, a:2)
- endif
- call s:doautocmd('User', name)
- endfor
-endfunction
-
-function! s:lod_ft(pat, names)
- let syn = 'syntax/'.a:pat.'.vim'
- call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
- execute 'autocmd! PlugLOD FileType' a:pat
- call s:doautocmd('filetypeplugin', 'FileType')
- call s:doautocmd('filetypeindent', 'FileType')
-endfunction
-
-function! s:lod_cmd(cmd, bang, l1, l2, args, names)
- call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- call s:dobufread(a:names)
- execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
-endfunction
-
-function! s:lod_map(map, names, with_prefix, prefix)
- call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- call s:dobufread(a:names)
- let extra = ''
- while 1
- let c = getchar(0)
- if c == 0
- break
- endif
- let extra .= nr2char(c)
- endwhile
-
- if a:with_prefix
- let prefix = v:count ? v:count : ''
- let prefix .= '"'.v:register.a:prefix
- if mode(1) == 'no'
- if v:operator == 'c'
- let prefix = "\<esc>" . prefix
- endif
- let prefix .= v:operator
- endif
- call feedkeys(prefix, 'n')
- endif
- call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
-endfunction
-
-function! plug#(repo, ...)
- if a:0 > 1
- return s:err('Invalid number of arguments (1..2)')
- endif
-
- try
- let repo = s:trim(a:repo)
- let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
- let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
- let spec = extend(s:infer_properties(name, repo), opts)
- if !has_key(g:plugs, name)
- call add(g:plugs_order, name)
- endif
- let g:plugs[name] = spec
- let s:loaded[name] = get(s:loaded, name, 0)
- catch
- return s:err(repo . ' ' . v:exception)
- endtry
-endfunction
-
-function! s:parse_options(arg)
- let opts = copy(s:base_spec)
- let type = type(a:arg)
- let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
- if type == s:TYPE.string
- if empty(a:arg)
- throw printf(opt_errfmt, 'tag', 'string')
- endif
- let opts.tag = a:arg
- elseif type == s:TYPE.dict
- for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
- if has_key(a:arg, opt)
- \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
- throw printf(opt_errfmt, opt, 'string')
- endif
- endfor
- for opt in ['on', 'for']
- if has_key(a:arg, opt)
- \ && type(a:arg[opt]) != s:TYPE.list
- \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
- throw printf(opt_errfmt, opt, 'string or list')
- endif
- endfor
- if has_key(a:arg, 'do')
- \ && type(a:arg.do) != s:TYPE.funcref
- \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
- throw printf(opt_errfmt, 'do', 'string or funcref')
- endif
- call extend(opts, a:arg)
- if has_key(opts, 'dir')
- let opts.dir = s:dirpath(s:plug_expand(opts.dir))
- endif
- else
- throw 'Invalid argument type (expected: string or dictionary)'
- endif
- return opts
-endfunction
-
-function! s:infer_properties(name, repo)
- let repo = a:repo
- if s:is_local_plug(repo)
- return { 'dir': s:dirpath(s:plug_expand(repo)) }
- else
- if repo =~ ':'
- let uri = repo
- else
- if repo !~ '/'
- throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
- endif
- let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
- let uri = printf(fmt, repo)
- endif
- return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
- endif
-endfunction
-
-function! s:install(force, names)
- call s:update_impl(0, a:force, a:names)
-endfunction
-
-function! s:update(force, names)
- call s:update_impl(1, a:force, a:names)
-endfunction
-
-function! plug#helptags()
- if !exists('g:plugs')
- return s:err('plug#begin was not called')
- endif
- for spec in values(g:plugs)
- let docd = join([s:rtp(spec), 'doc'], '/')
- if isdirectory(docd)
- silent! execute 'helptags' s:esc(docd)
- endif
- endfor
- return 1
-endfunction
-
-function! s:syntax()
- syntax clear
- syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
- syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
- syn match plugNumber /[0-9]\+[0-9.]*/ contained
- syn match plugBracket /[[\]]/ contained
- syn match plugX /x/ contained
- syn match plugDash /^-\{1}\ /
- syn match plugPlus /^+/
- syn match plugStar /^*/
- syn match plugMessage /\(^- \)\@<=.*/
- syn match plugName /\(^- \)\@<=[^ ]*:/
- syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
- syn match plugTag /(tag: [^)]\+)/
- syn match plugInstall /\(^+ \)\@<=[^:]*/
- syn match plugUpdate /\(^* \)\@<=[^:]*/
- syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
- syn match plugEdge /^ \X\+$/
- syn match plugEdge /^ \X*/ contained nextgroup=plugSha
- syn match plugSha /[0-9a-f]\{7,9}/ contained
- syn match plugRelDate /([^)]*)$/ contained
- syn match plugNotLoaded /(not loaded)$/
- syn match plugError /^x.*/
- syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
- syn match plugH2 /^.*:\n-\+$/
- syn match plugH2 /^-\{2,}/
- syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
- hi def link plug1 Title
- hi def link plug2 Repeat
- hi def link plugH2 Type
- hi def link plugX Exception
- hi def link plugBracket Structure
- hi def link plugNumber Number
-
- hi def link plugDash Special
- hi def link plugPlus Constant
- hi def link plugStar Boolean
-
- hi def link plugMessage Function
- hi def link plugName Label
- hi def link plugInstall Function
- hi def link plugUpdate Type
-
- hi def link plugError Error
- hi def link plugDeleted Ignore
- hi def link plugRelDate Comment
- hi def link plugEdge PreProc
- hi def link plugSha Identifier
- hi def link plugTag Constant
-
- hi def link plugNotLoaded Comment
-endfunction
-
-function! s:lpad(str, len)
- return a:str . repeat(' ', a:len - len(a:str))
-endfunction
-
-function! s:lines(msg)
- return split(a:msg, "[\r\n]")
-endfunction
-
-function! s:lastline(msg)
- return get(s:lines(a:msg), -1, '')
-endfunction
-
-function! s:new_window()
- execute get(g:, 'plug_window', 'vertical topleft new')
-endfunction
-
-function! s:plug_window_exists()
- let buflist = tabpagebuflist(s:plug_tab)
- return !empty(buflist) && index(buflist, s:plug_buf) >= 0
-endfunction
-
-function! s:switch_in()
- if !s:plug_window_exists()
- return 0
- endif
-
- if winbufnr(0) != s:plug_buf
- let s:pos = [tabpagenr(), winnr(), winsaveview()]
- execute 'normal!' s:plug_tab.'gt'
- let winnr = bufwinnr(s:plug_buf)
- execute winnr.'wincmd w'
- call add(s:pos, winsaveview())
- else
- let s:pos = [winsaveview()]
- endif
-
- setlocal modifiable
- return 1
-endfunction
-
-function! s:switch_out(...)
- call winrestview(s:pos[-1])
- setlocal nomodifiable
- if a:0 > 0
- execute a:1
- endif
-
- if len(s:pos) > 1
- execute 'normal!' s:pos[0].'gt'
- execute s:pos[1] 'wincmd w'
- call winrestview(s:pos[2])
- endif
-endfunction
-
-function! s:finish_bindings()
- nnoremap <silent> <buffer> R :call <SID>retry()<cr>
- nnoremap <silent> <buffer> D :PlugDiff<cr>
- nnoremap <silent> <buffer> S :PlugStatus<cr>
- nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
- xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
- nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
- nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
-endfunction
-
-function! s:prepare(...)
- if empty(s:plug_getcwd())
- throw 'Invalid current working directory. Cannot proceed.'
- endif
-
- for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
- if exists(evar)
- throw evar.' detected. Cannot proceed.'
- endif
- endfor
-
- call s:job_abort()
- if s:switch_in()
- if b:plug_preview == 1
- pc
- endif
- enew
- else
- call s:new_window()
- endif
-
- nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
- if a:0 == 0
- call s:finish_bindings()
- endif
- let b:plug_preview = -1
- let s:plug_tab = tabpagenr()
- let s:plug_buf = winbufnr(0)
- call s:assign_name()
-
- for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
- execute 'silent! unmap <buffer>' k
- endfor
- setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
- if exists('+colorcolumn')
- setlocal colorcolumn=
- endif
- setf vim-plug
- if exists('g:syntax_on')
- call s:syntax()
- endif
-endfunction
-
-function! s:close_pane()
- if b:plug_preview == 1
- pc
- let b:plug_preview = -1
- else
- bd
- endif
-endfunction
-
-function! s:assign_name()
- " Assign buffer name
- let prefix = '[Plugins]'
- let name = prefix
- let idx = 2
- while bufexists(name)
- let name = printf('%s (%s)', prefix, idx)
- let idx = idx + 1
- endwhile
- silent! execute 'f' fnameescape(name)
-endfunction
-
-function! s:chsh(swap)
- let prev = [&shell, &shellcmdflag, &shellredir]
- if !s:is_win
- set shell=sh
- endif
- if a:swap
- if s:is_powershell(&shell)
- let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
- elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
- set shellredir=>%s\ 2>&1
- endif
- endif
- return prev
-endfunction
-
-function! s:bang(cmd, ...)
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(a:0)
- " FIXME: Escaping is incomplete. We could use shellescape with eval,
- " but it won't work on Windows.
- let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
- if s:is_win
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
- execute "normal! :execute g:_plug_bang\<cr>\<cr>"
- finally
- unlet g:_plug_bang
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
- return v:shell_error ? 'Exit status: ' . v:shell_error : ''
-endfunction
-
-function! s:regress_bar()
- let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
- call s:progress_bar(2, bar, len(bar))
-endfunction
-
-function! s:is_updated(dir)
- return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
-endfunction
-
-function! s:do(pull, force, todo)
- for [name, spec] in items(a:todo)
- if !isdirectory(spec.dir)
- continue
- endif
- let installed = has_key(s:update.new, name)
- let updated = installed ? 0 :
- \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
- if a:force || installed || updated
- execute 'cd' s:esc(spec.dir)
- call append(3, '- Post-update hook for '. name .' ... ')
- let error = ''
- let type = type(spec.do)
- if type == s:TYPE.string
- if spec.do[0] == ':'
- if !get(s:loaded, name, 0)
- let s:loaded[name] = 1
- call s:reorg_rtp()
- endif
- call s:load_plugin(spec)
- try
- execute spec.do[1:]
- catch
- let error = v:exception
- endtry
- if !s:plug_window_exists()
- cd -
- throw 'Warning: vim-plug was terminated by the post-update hook of '.name
- endif
- else
- let error = s:bang(spec.do)
- endif
- elseif type == s:TYPE.funcref
- try
- call s:load_plugin(spec)
- let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
- call spec.do({ 'name': name, 'status': status, 'force': a:force })
- catch
- let error = v:exception
- endtry
- else
- let error = 'Invalid hook type'
- endif
- call s:switch_in()
- call setline(4, empty(error) ? (getline(4) . 'OK')
- \ : ('x' . getline(4)[1:] . error))
- if !empty(error)
- call add(s:update.errors, name)
- call s:regress_bar()
- endif
- cd -
- endif
- endfor
-endfunction
-
-function! s:hash_match(a, b)
- return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
-endfunction
-
-function! s:checkout(spec)
- let sha = a:spec.commit
- let output = s:git_revision(a:spec.dir)
- if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
- let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
- let output = s:system(
- \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
- endif
- return output
-endfunction
-
-function! s:finish(pull)
- let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
- if new_frozen
- let s = new_frozen > 1 ? 's' : ''
- call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
- endif
- call append(3, '- Finishing ... ') | 4
- redraw
- call plug#helptags()
- call plug#end()
- call setline(4, getline(4) . 'Done!')
- redraw
- let msgs = []
- if !empty(s:update.errors)
- call add(msgs, "Press 'R' to retry.")
- endif
- if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
- \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
- call add(msgs, "Press 'D' to see the updated changes.")
- endif
- echo join(msgs, ' ')
- call s:finish_bindings()
-endfunction
-
-function! s:retry()
- if empty(s:update.errors)
- return
- endif
- echo
- call s:update_impl(s:update.pull, s:update.force,
- \ extend(copy(s:update.errors), [s:update.threads]))
-endfunction
-
-function! s:is_managed(name)
- return has_key(g:plugs[a:name], 'uri')
-endfunction
-
-function! s:names(...)
- return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
-endfunction
-
-function! s:check_ruby()
- silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
- if !exists('g:plug_ruby')
- redraw!
- return s:warn('echom', 'Warning: Ruby interface is broken')
- endif
- let ruby_version = split(g:plug_ruby, '\.')
- unlet g:plug_ruby
- return s:version_requirement(ruby_version, [1, 8, 7])
-endfunction
-
-function! s:update_impl(pull, force, args) abort
- let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
- let args = filter(copy(a:args), 'v:val != "--sync"')
- let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
- \ remove(args, -1) : get(g:, 'plug_threads', 16)
-
- let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
- let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
- \ filter(managed, 'index(args, v:key) >= 0')
-
- if empty(todo)
- return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
- endif
-
- if !s:is_win && s:git_version_requirement(2, 3)
- let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
- let $GIT_TERMINAL_PROMPT = 0
- for plug in values(todo)
- let plug.uri = substitute(plug.uri,
- \ '^https://git::@github\.com', 'https://github.com', '')
- endfor
- endif
-
- if !isdirectory(g:plug_home)
- try
- call mkdir(g:plug_home, 'p')
- catch
- return s:err(printf('Invalid plug directory: %s. '.
- \ 'Try to call plug#begin with a valid directory', g:plug_home))
- endtry
- endif
-
- if has('nvim') && !exists('*jobwait') && threads > 1
- call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
- endif
-
- let use_job = s:nvim || s:vim8
- let python = (has('python') || has('python3')) && !use_job
- let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
-
- let s:update = {
- \ 'start': reltime(),
- \ 'all': todo,
- \ 'todo': copy(todo),
- \ 'errors': [],
- \ 'pull': a:pull,
- \ 'force': a:force,
- \ 'new': {},
- \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
- \ 'bar': '',
- \ 'fin': 0
- \ }
-
- call s:prepare(1)
- call append(0, ['', ''])
- normal! 2G
- silent! redraw
-
- " Set remote name, overriding a possible user git config's clone.defaultRemoteName
- let s:clone_opt = ['--origin', 'origin']
- if get(g:, 'plug_shallow', 1)
- call extend(s:clone_opt, ['--depth', '1'])
- if s:git_version_requirement(1, 7, 10)
- call add(s:clone_opt, '--no-single-branch')
- endif
- endif
-
- if has('win32unix') || has('wsl')
- call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
- endif
-
- let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
-
- " Python version requirement (>= 2.7)
- if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
- redir => pyv
- silent python import platform; print platform.python_version()
- redir END
- let python = s:version_requirement(
- \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
- endif
-
- if (python || ruby) && s:update.threads > 1
- try
- let imd = &imd
- if s:mac_gui
- set noimd
- endif
- if ruby
- call s:update_ruby()
- else
- call s:update_python()
- endif
- catch
- let lines = getline(4, '$')
- let printed = {}
- silent! 4,$d _
- for line in lines
- let name = s:extract_name(line, '.', '')
- if empty(name) || !has_key(printed, name)
- call append('$', line)
- if !empty(name)
- let printed[name] = 1
- if line[0] == 'x' && index(s:update.errors, name) < 0
- call add(s:update.errors, name)
- end
- endif
- endif
- endfor
- finally
- let &imd = imd
- call s:update_finish()
- endtry
- else
- call s:update_vim()
- while use_job && sync
- sleep 100m
- if s:update.fin
- break
- endif
- endwhile
- endif
-endfunction
-
-function! s:log4(name, msg)
- call setline(4, printf('- %s (%s)', a:msg, a:name))
- redraw
-endfunction
-
-function! s:update_finish()
- if exists('s:git_terminal_prompt')
- let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
- endif
- if s:switch_in()
- call append(3, '- Updating ...') | 4
- for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
- let [pos, _] = s:logpos(name)
- if !pos
- continue
- endif
- if has_key(spec, 'commit')
- call s:log4(name, 'Checking out '.spec.commit)
- let out = s:checkout(spec)
- elseif has_key(spec, 'tag')
- let tag = spec.tag
- if tag =~ '\*'
- let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
- if !v:shell_error && !empty(tags)
- let tag = tags[0]
- call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
- call append(3, '')
- endif
- endif
- call s:log4(name, 'Checking out '.tag)
- let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
- else
- let branch = s:git_origin_branch(spec)
- call s:log4(name, 'Merging origin/'.s:esc(branch))
- let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
- \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
- endif
- if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
- \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
- call s:log4(name, 'Updating submodules. This may take a while.')
- let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
- endif
- let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
- if v:shell_error
- call add(s:update.errors, name)
- call s:regress_bar()
- silent execute pos 'd _'
- call append(4, msg) | 4
- elseif !empty(out)
- call setline(pos, msg[0])
- endif
- redraw
- endfor
- silent 4 d _
- try
- call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
- catch
- call s:warn('echom', v:exception)
- call s:warn('echo', '')
- return
- endtry
- call s:finish(s:update.pull)
- call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
- call s:switch_out('normal! gg')
- endif
-endfunction
-
-function! s:job_abort()
- if (!s:nvim && !s:vim8) || !exists('s:jobs')
- return
- endif
-
- for [name, j] in items(s:jobs)
- if s:nvim
- silent! call jobstop(j.jobid)
- elseif s:vim8
- silent! call job_stop(j.jobid)
- endif
- if j.new
- call s:rm_rf(g:plugs[name].dir)
- endif
- endfor
- let s:jobs = {}
-endfunction
-
-function! s:last_non_empty_line(lines)
- let len = len(a:lines)
- for idx in range(len)
- let line = a:lines[len-idx-1]
- if !empty(line)
- return line
- endif
- endfor
- return ''
-endfunction
-
-function! s:job_out_cb(self, data) abort
- let self = a:self
- let data = remove(self.lines, -1) . a:data
- let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
- call extend(self.lines, lines)
- " To reduce the number of buffer updates
- let self.tick = get(self, 'tick', -1) + 1
- if !self.running || self.tick % len(s:jobs) == 0
- let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
- let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
- call s:log(bullet, self.name, result)
- endif
-endfunction
-
-function! s:job_exit_cb(self, data) abort
- let a:self.running = 0
- let a:self.error = a:data != 0
- call s:reap(a:self.name)
- call s:tick()
-endfunction
-
-function! s:job_cb(fn, job, ch, data)
- if !s:plug_window_exists() " plug window closed
- return s:job_abort()
- endif
- call call(a:fn, [a:job, a:data])
-endfunction
-
-function! s:nvim_cb(job_id, data, event) dict abort
- return (a:event == 'stdout' || a:event == 'stderr') ?
- \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
- \ s:job_cb('s:job_exit_cb', self, 0, a:data)
-endfunction
-
-function! s:spawn(name, cmd, opts)
- let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
- \ 'new': get(a:opts, 'new', 0) }
- let s:jobs[a:name] = job
-
- if s:nvim
- if has_key(a:opts, 'dir')
- let job.cwd = a:opts.dir
- endif
- let argv = a:cmd
- call extend(job, {
- \ 'on_stdout': function('s:nvim_cb'),
- \ 'on_stderr': function('s:nvim_cb'),
- \ 'on_exit': function('s:nvim_cb'),
- \ })
- let jid = s:plug_call('jobstart', argv, job)
- if jid > 0
- let job.jobid = jid
- else
- let job.running = 0
- let job.error = 1
- let job.lines = [jid < 0 ? argv[0].' is not executable' :
- \ 'Invalid arguments (or job table is full)']
- endif
- elseif s:vim8
- let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
- if has_key(a:opts, 'dir')
- let cmd = s:with_cd(cmd, a:opts.dir, 0)
- endif
- let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
- let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
- \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
- \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]),
- \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
- \ 'err_mode': 'raw',
- \ 'out_mode': 'raw'
- \})
- if job_status(jid) == 'run'
- let job.jobid = jid
- else
- let job.running = 0
- let job.error = 1
- let job.lines = ['Failed to start job']
- endif
- else
- let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
- let job.error = v:shell_error != 0
- let job.running = 0
- endif
-endfunction
-
-function! s:reap(name)
- let job = s:jobs[a:name]
- if job.error
- call add(s:update.errors, a:name)
- elseif get(job, 'new', 0)
- let s:update.new[a:name] = 1
- endif
- let s:update.bar .= job.error ? 'x' : '='
-
- let bullet = job.error ? 'x' : '-'
- let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
- call s:log(bullet, a:name, empty(result) ? 'OK' : result)
- call s:bar()
-
- call remove(s:jobs, a:name)
-endfunction
-
-function! s:bar()
- if s:switch_in()
- let total = len(s:update.all)
- call setline(1, (s:update.pull ? 'Updating' : 'Installing').
- \ ' plugins ('.len(s:update.bar).'/'.total.')')
- call s:progress_bar(2, s:update.bar, total)
- call s:switch_out()
- endif
-endfunction
-
-function! s:logpos(name)
- let max = line('$')
- for i in range(4, max > 4 ? max : 4)
- if getline(i) =~# '^[-+x*] '.a:name.':'
- for j in range(i + 1, max > 5 ? max : 5)
- if getline(j) !~ '^ '
- return [i, j - 1]
- endif
- endfor
- return [i, i]
- endif
- endfor
- return [0, 0]
-endfunction
-
-function! s:log(bullet, name, lines)
- if s:switch_in()
- let [b, e] = s:logpos(a:name)
- if b > 0
- silent execute printf('%d,%d d _', b, e)
- if b > winheight('.')
- let b = 4
- endif
- else
- let b = 4
- endif
- " FIXME For some reason, nomodifiable is set after :d in vim8
- setlocal modifiable
- call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
- call s:switch_out()
- endif
-endfunction
-
-function! s:update_vim()
- let s:jobs = {}
-
- call s:bar()
- call s:tick()
-endfunction
-
-function! s:tick()
- let pull = s:update.pull
- let prog = s:progress_opt(s:nvim || s:vim8)
-while 1 " Without TCO, Vim stack is bound to explode
- if empty(s:update.todo)
- if empty(s:jobs) && !s:update.fin
- call s:update_finish()
- let s:update.fin = 1
- endif
- return
- endif
-
- let name = keys(s:update.todo)[0]
- let spec = remove(s:update.todo, name)
- let new = empty(globpath(spec.dir, '.git', 1))
-
- call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
- redraw
-
- let has_tag = has_key(spec, 'tag')
- if !new
- let [error, _] = s:git_validate(spec, 0)
- if empty(error)
- if pull
- let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
- if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
- call extend(cmd, ['--depth', '99999999'])
- endif
- if !empty(prog)
- call add(cmd, prog)
- endif
- call s:spawn(name, cmd, { 'dir': spec.dir })
- else
- let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
- endif
- else
- let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
- endif
- else
- let cmd = ['git', 'clone']
- if !has_tag
- call extend(cmd, s:clone_opt)
- endif
- if !empty(prog)
- call add(cmd, prog)
- endif
- call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
- endif
-
- if !s:jobs[name].running
- call s:reap(name)
- endif
- if len(s:jobs) >= s:update.threads
- break
- endif
-endwhile
-endfunction
-
-function! s:update_python()
-let py_exe = has('python') ? 'python' : 'python3'
-execute py_exe "<< EOF"
-import datetime
-import functools
-import os
-try:
- import queue
-except ImportError:
- import Queue as queue
-import random
-import re
-import shutil
-import signal
-import subprocess
-import tempfile
-import threading as thr
-import time
-import traceback
-import vim
-
-G_NVIM = vim.eval("has('nvim')") == '1'
-G_PULL = vim.eval('s:update.pull') == '1'
-G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
-G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
-G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
-G_PROGRESS = vim.eval('s:progress_opt(1)')
-G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
-G_STOP = thr.Event()
-G_IS_WIN = vim.eval('s:is_win') == '1'
-
-class PlugError(Exception):
- def __init__(self, msg):
- self.msg = msg
-class CmdTimedOut(PlugError):
- pass
-class CmdFailed(PlugError):
- pass
-class InvalidURI(PlugError):
- pass
-class Action(object):
- INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
-
-class Buffer(object):
- def __init__(self, lock, num_plugs, is_pull):
- self.bar = ''
- self.event = 'Updating' if is_pull else 'Installing'
- self.lock = lock
- self.maxy = int(vim.eval('winheight(".")'))
- self.num_plugs = num_plugs
-
- def __where(self, name):
- """ Find first line with name in current buffer. Return line num. """
- found, lnum = False, 0
- matcher = re.compile('^[-+x*] {0}:'.format(name))
- for line in vim.current.buffer:
- if matcher.search(line) is not None:
- found = True
- break
- lnum += 1
-
- if not found:
- lnum = -1
- return lnum
-
- def header(self):
- curbuf = vim.current.buffer
- curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
-
- num_spaces = self.num_plugs - len(self.bar)
- curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
-
- with self.lock:
- vim.command('normal! 2G')
- vim.command('redraw')
-
- def write(self, action, name, lines):
- first, rest = lines[0], lines[1:]
- msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
- msg.extend([' ' + line for line in rest])
-
- try:
- if action == Action.ERROR:
- self.bar += 'x'
- vim.command("call add(s:update.errors, '{0}')".format(name))
- elif action == Action.DONE:
- self.bar += '='
-
- curbuf = vim.current.buffer
- lnum = self.__where(name)
- if lnum != -1: # Found matching line num
- del curbuf[lnum]
- if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
- lnum = 3
- else:
- lnum = 3
- curbuf.append(msg, lnum)
-
- self.header()
- except vim.error:
- pass
-
-class Command(object):
- CD = 'cd /d' if G_IS_WIN else 'cd'
-
- def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
- self.cmd = cmd
- if cmd_dir:
- self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
- self.timeout = timeout
- self.callback = cb if cb else (lambda msg: None)
- self.clean = clean if clean else (lambda: None)
- self.proc = None
-
- @property
- def alive(self):
- """ Returns true only if command still running. """
- return self.proc and self.proc.poll() is None
-
- def execute(self, ntries=3):
- """ Execute the command with ntries if CmdTimedOut.
- Returns the output of the command if no Exception.
- """
- attempt, finished, limit = 0, False, self.timeout
-
- while not finished:
- try:
- attempt += 1
- result = self.try_command()
- finished = True
- return result
- except CmdTimedOut:
- if attempt != ntries:
- self.notify_retry()
- self.timeout += limit
- else:
- raise
-
- def notify_retry(self):
- """ Retry required for command, notify user. """
- for count in range(3, 0, -1):
- if G_STOP.is_set():
- raise KeyboardInterrupt
- msg = 'Timeout. Will retry in {0} second{1} ...'.format(
- count, 's' if count != 1 else '')
- self.callback([msg])
- time.sleep(1)
- self.callback(['Retrying ...'])
-
- def try_command(self):
- """ Execute a cmd & poll for callback. Returns list of output.
- Raises CmdFailed -> return code for Popen isn't 0
- Raises CmdTimedOut -> command exceeded timeout without new output
- """
- first_line = True
-
- try:
- tfile = tempfile.NamedTemporaryFile(mode='w+b')
- preexec_fn = not G_IS_WIN and os.setsid or None
- self.proc = subprocess.Popen(self.cmd, stdout=tfile,
- stderr=subprocess.STDOUT,
- stdin=subprocess.PIPE, shell=True,
- preexec_fn=preexec_fn)
- thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
- thrd.start()
-
- thread_not_started = True
- while thread_not_started:
- try:
- thrd.join(0.1)
- thread_not_started = False
- except RuntimeError:
- pass
-
- while self.alive:
- if G_STOP.is_set():
- raise KeyboardInterrupt
-
- if first_line or random.random() < G_LOG_PROB:
- first_line = False
- line = '' if G_IS_WIN else nonblock_read(tfile.name)
- if line:
- self.callback([line])
-
- time_diff = time.time() - os.path.getmtime(tfile.name)
- if time_diff > self.timeout:
- raise CmdTimedOut(['Timeout!'])
-
- thrd.join(0.5)
-
- tfile.seek(0)
- result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
-
- if self.proc.returncode != 0:
- raise CmdFailed([''] + result)
-
- return result
- except:
- self.terminate()
- raise
-
- def terminate(self):
- """ Terminate process and cleanup. """
- if self.alive:
- if G_IS_WIN:
- os.kill(self.proc.pid, signal.SIGINT)
- else:
- os.killpg(self.proc.pid, signal.SIGTERM)
- self.clean()
-
-class Plugin(object):
- def __init__(self, name, args, buf_q, lock):
- self.name = name
- self.args = args
- self.buf_q = buf_q
- self.lock = lock
- self.tag = args.get('tag', 0)
-
- def manage(self):
- try:
- if os.path.exists(self.args['dir']):
- self.update()
- else:
- self.install()
- with self.lock:
- thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
- except PlugError as exc:
- self.write(Action.ERROR, self.name, exc.msg)
- except KeyboardInterrupt:
- G_STOP.set()
- self.write(Action.ERROR, self.name, ['Interrupted!'])
- except:
- # Any exception except those above print stack trace
- msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
- self.write(Action.ERROR, self.name, msg.split('\n'))
- raise
-
- def install(self):
- target = self.args['dir']
- if target[-1] == '\\':
- target = target[0:-1]
-
- def clean(target):
- def _clean():
- try:
- shutil.rmtree(target)
- except OSError:
- pass
- return _clean
-
- self.write(Action.INSTALL, self.name, ['Installing ...'])
- callback = functools.partial(self.write, Action.INSTALL, self.name)
- cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
- '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
- esc(target))
- com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
- result = com.execute(G_RETRIES)
- self.write(Action.DONE, self.name, result[-1:])
-
- def repo_uri(self):
- cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
- command = Command(cmd, self.args['dir'], G_TIMEOUT,)
- result = command.execute(G_RETRIES)
- return result[-1]
-
- def update(self):
- actual_uri = self.repo_uri()
- expect_uri = self.args['uri']
- regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
- ma = regex.match(actual_uri)
- mb = regex.match(expect_uri)
- if ma is None or mb is None or ma.groups() != mb.groups():
- msg = ['',
- 'Invalid URI: {0}'.format(actual_uri),
- 'Expected {0}'.format(expect_uri),
- 'PlugClean required.']
- raise InvalidURI(msg)
-
- if G_PULL:
- self.write(Action.UPDATE, self.name, ['Updating ...'])
- callback = functools.partial(self.write, Action.UPDATE, self.name)
- fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
- cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
- com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
- result = com.execute(G_RETRIES)
- self.write(Action.DONE, self.name, result[-1:])
- else:
- self.write(Action.DONE, self.name, ['Already installed'])
-
- def write(self, action, name, msg):
- self.buf_q.put((action, name, msg))
-
-class PlugThread(thr.Thread):
- def __init__(self, tname, args):
- super(PlugThread, self).__init__()
- self.tname = tname
- self.args = args
-
- def run(self):
- thr.current_thread().name = self.tname
- buf_q, work_q, lock = self.args
-
- try:
- while not G_STOP.is_set():
- name, args = work_q.get_nowait()
- plug = Plugin(name, args, buf_q, lock)
- plug.manage()
- work_q.task_done()
- except queue.Empty:
- pass
-
-class RefreshThread(thr.Thread):
- def __init__(self, lock):
- super(RefreshThread, self).__init__()
- self.lock = lock
- self.running = True
-
- def run(self):
- while self.running:
- with self.lock:
- thread_vim_command('noautocmd normal! a')
- time.sleep(0.33)
-
- def stop(self):
- self.running = False
-
-if G_NVIM:
- def thread_vim_command(cmd):
- vim.session.threadsafe_call(lambda: vim.command(cmd))
-else:
- def thread_vim_command(cmd):
- vim.command(cmd)
-
-def esc(name):
- return '"' + name.replace('"', '\"') + '"'
-
-def nonblock_read(fname):
- """ Read a file with nonblock flag. Return the last line. """
- fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
- buf = os.read(fread, 100000).decode('utf-8', 'replace')
- os.close(fread)
-
- line = buf.rstrip('\r\n')
- left = max(line.rfind('\r'), line.rfind('\n'))
- if left != -1:
- left += 1
- line = line[left:]
-
- return line
-
-def main():
- thr.current_thread().name = 'main'
- nthreads = int(vim.eval('s:update.threads'))
- plugs = vim.eval('s:update.todo')
- mac_gui = vim.eval('s:mac_gui') == '1'
-
- lock = thr.Lock()
- buf = Buffer(lock, len(plugs), G_PULL)
- buf_q, work_q = queue.Queue(), queue.Queue()
- for work in plugs.items():
- work_q.put(work)
-
- start_cnt = thr.active_count()
- for num in range(nthreads):
- tname = 'PlugT-{0:02}'.format(num)
- thread = PlugThread(tname, (buf_q, work_q, lock))
- thread.start()
- if mac_gui:
- rthread = RefreshThread(lock)
- rthread.start()
-
- while not buf_q.empty() or thr.active_count() != start_cnt:
- try:
- action, name, msg = buf_q.get(True, 0.25)
- buf.write(action, name, ['OK'] if not msg else msg)
- buf_q.task_done()
- except queue.Empty:
- pass
- except KeyboardInterrupt:
- G_STOP.set()
-
- if mac_gui:
- rthread.stop()
- rthread.join()
-
-main()
-EOF
-endfunction
-
-function! s:update_ruby()
- ruby << EOF
- module PlugStream
- SEP = ["\r", "\n", nil]
- def get_line
- buffer = ''
- loop do
- char = readchar rescue return
- if SEP.include? char.chr
- buffer << $/
- break
- else
- buffer << char
- end
- end
- buffer
- end
- end unless defined?(PlugStream)
-
- def esc arg
- %["#{arg.gsub('"', '\"')}"]
- end
-
- def killall pid
- pids = [pid]
- if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
- pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
- else
- unless `which pgrep 2> /dev/null`.empty?
- children = pids
- until children.empty?
- children = children.map { |pid|
- `pgrep -P #{pid}`.lines.map { |l| l.chomp }
- }.flatten
- pids += children
- end
- end
- pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
- end
- end
-
- def compare_git_uri a, b
- regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
- regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
- end
-
- require 'thread'
- require 'fileutils'
- require 'timeout'
- running = true
- iswin = VIM::evaluate('s:is_win').to_i == 1
- pull = VIM::evaluate('s:update.pull').to_i == 1
- base = VIM::evaluate('g:plug_home')
- all = VIM::evaluate('s:update.todo')
- limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
- tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
- nthr = VIM::evaluate('s:update.threads').to_i
- maxy = VIM::evaluate('winheight(".")').to_i
- vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
- cd = iswin ? 'cd /d' : 'cd'
- tot = VIM::evaluate('len(s:update.todo)') || 0
- bar = ''
- skip = 'Already installed'
- mtx = Mutex.new
- take1 = proc { mtx.synchronize { running && all.shift } }
- logh = proc {
- cnt = bar.length
- $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
- $curbuf[2] = '[' + bar.ljust(tot) + ']'
- VIM::command('normal! 2G')
- VIM::command('redraw')
- }
- where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
- log = proc { |name, result, type|
- mtx.synchronize do
- ing = ![true, false].include?(type)
- bar += type ? '=' : 'x' unless ing
- b = case type
- when :install then '+' when :update then '*'
- when true, nil then '-' else
- VIM::command("call add(s:update.errors, '#{name}')")
- 'x'
- end
- result =
- if type || type.nil?
- ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
- elsif result =~ /^Interrupted|^Timeout/
- ["#{b} #{name}: #{result}"]
- else
- ["#{b} #{name}"] + result.lines.map { |l| " " << l }
- end
- if lnum = where.call(name)
- $curbuf.delete lnum
- lnum = 4 if ing && lnum > maxy
- end
- result.each_with_index do |line, offset|
- $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
- end
- logh.call
- end
- }
- bt = proc { |cmd, name, type, cleanup|
- tried = timeout = 0
- begin
- tried += 1
- timeout += limit
- fd = nil
- data = ''
- if iswin
- Timeout::timeout(timeout) do
- tmp = VIM::evaluate('tempname()')
- system("(#{cmd}) > #{tmp}")
- data = File.read(tmp).chomp
- File.unlink tmp rescue nil
- end
- else
- fd = IO.popen(cmd).extend(PlugStream)
- first_line = true
- log_prob = 1.0 / nthr
- while line = Timeout::timeout(timeout) { fd.get_line }
- data << line
- log.call name, line.chomp, type if name && (first_line || rand < log_prob)
- first_line = false
- end
- fd.close
- end
- [$? == 0, data.chomp]
- rescue Timeout::Error, Interrupt => e
- if fd && !fd.closed?
- killall fd.pid
- fd.close
- end
- cleanup.call if cleanup
- if e.is_a?(Timeout::Error) && tried < tries
- 3.downto(1) do |countdown|
- s = countdown > 1 ? 's' : ''
- log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
- sleep 1
- end
- log.call name, 'Retrying ...', type
- retry
- end
- [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
- end
- }
- main = Thread.current
- threads = []
- watcher = Thread.new {
- if vim7
- while VIM::evaluate('getchar(1)')
- sleep 0.1
- end
- else
- require 'io/console' # >= Ruby 1.9
- nil until IO.console.getch == 3.chr
- end
- mtx.synchronize do
- running = false
- threads.each { |t| t.raise Interrupt } unless vim7
- end
- threads.each { |t| t.join rescue nil }
- main.kill
- }
- refresh = Thread.new {
- while true
- mtx.synchronize do
- break unless running
- VIM::command('noautocmd normal! a')
- end
- sleep 0.2
- end
- } if VIM::evaluate('s:mac_gui') == 1
-
- clone_opt = VIM::evaluate('s:clone_opt').join(' ')
- progress = VIM::evaluate('s:progress_opt(1)')
- nthr.times do
- mtx.synchronize do
- threads << Thread.new {
- while pair = take1.call
- name = pair.first
- dir, uri, tag = pair.last.values_at *%w[dir uri tag]
- exists = File.directory? dir
- ok, result =
- if exists
- chdir = "#{cd} #{iswin ? dir : esc(dir)}"
- ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
- current_uri = data.lines.to_a.last
- if !ret
- if data =~ /^Interrupted|^Timeout/
- [false, data]
- else
- [false, [data.chomp, "PlugClean required."].join($/)]
- end
- elsif !compare_git_uri(current_uri, uri)
- [false, ["Invalid URI: #{current_uri}",
- "Expected: #{uri}",
- "PlugClean required."].join($/)]
- else
- if pull
- log.call name, 'Updating ...', :update
- fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
- bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
- else
- [true, skip]
- end
- end
- else
- d = esc dir.sub(%r{[\\/]+$}, '')
- log.call name, 'Installing ...', :install
- bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
- FileUtils.rm_rf dir
- }
- end
- mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
- log.call name, result, ok
- end
- } if running
- end
- end
- threads.each { |t| t.join rescue nil }
- logh.call
- refresh.kill if refresh
- watcher.kill
-EOF
-endfunction
-
-function! s:shellesc_cmd(arg, script)
- let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
- return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
-endfunction
-
-function! s:shellesc_ps1(arg)
- return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
-endfunction
-
-function! s:shellesc_sh(arg)
- return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
-endfunction
-
-" Escape the shell argument based on the shell.
-" Vim and Neovim's shellescape() are insufficient.
-" 1. shellslash determines whether to use single/double quotes.
-" Double-quote escaping is fragile for cmd.exe.
-" 2. It does not work for powershell.
-" 3. It does not work for *sh shells if the command is executed
-" via cmd.exe (ie. cmd.exe /c sh -c command command_args)
-" 4. It does not support batchfile syntax.
-"
-" Accepts an optional dictionary with the following keys:
-" - shell: same as Vim/Neovim 'shell' option.
-" If unset, fallback to 'cmd.exe' on Windows or 'sh'.
-" - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
-function! plug#shellescape(arg, ...)
- if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
- return a:arg
- endif
- let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
- let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
- let script = get(opts, 'script', 1)
- if shell =~# 'cmd\(\.exe\)\?$'
- return s:shellesc_cmd(a:arg, script)
- elseif s:is_powershell(shell)
- return s:shellesc_ps1(a:arg)
- endif
- return s:shellesc_sh(a:arg)
-endfunction
-
-function! s:glob_dir(path)
- return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
-endfunction
-
-function! s:progress_bar(line, bar, total)
- call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
-endfunction
-
-function! s:compare_git_uri(a, b)
- " See `git help clone'
- " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
- " [git@] github.com[:port] : junegunn/vim-plug [.git]
- " file:// / junegunn/vim-plug [/]
- " / junegunn/vim-plug [/]
- let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
- let ma = matchlist(a:a, pat)
- let mb = matchlist(a:b, pat)
- return ma[1:2] ==# mb[1:2]
-endfunction
-
-function! s:format_message(bullet, name, message)
- if a:bullet != 'x'
- return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
- else
- let lines = map(s:lines(a:message), '" ".v:val')
- return extend([printf('x %s:', a:name)], lines)
- endif
-endfunction
-
-function! s:with_cd(cmd, dir, ...)
- let script = a:0 > 0 ? a:1 : 1
- return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
-endfunction
-
-function! s:system(cmd, ...)
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(1)
- if type(a:cmd) == s:TYPE.list
- " Neovim's system() supports list argument to bypass the shell
- " but it cannot set the working directory for the command.
- " Assume that the command does not rely on the shell.
- if has('nvim') && a:0 == 0
- return system(a:cmd)
- endif
- let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
- if s:is_powershell(&shell)
- let cmd = '& ' . cmd
- endif
- else
- let cmd = a:cmd
- endif
- if a:0 > 0
- let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
- endif
- if s:is_win && type(a:cmd) != s:TYPE.list
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- return system(cmd)
- finally
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
-endfunction
-
-function! s:system_chomp(...)
- let ret = call('s:system', a:000)
- return v:shell_error ? '' : substitute(ret, '\n$', '', '')
-endfunction
-
-function! s:git_validate(spec, check_branch)
- let err = ''
- if isdirectory(a:spec.dir)
- let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
- let remote = result[-1]
- if empty(remote)
- let err = join([remote, 'PlugClean required.'], "\n")
- elseif !s:compare_git_uri(remote, a:spec.uri)
- let err = join(['Invalid URI: '.remote,
- \ 'Expected: '.a:spec.uri,
- \ 'PlugClean required.'], "\n")
- elseif a:check_branch && has_key(a:spec, 'commit')
- let sha = s:git_revision(a:spec.dir)
- if empty(sha)
- let err = join(add(result, 'PlugClean required.'), "\n")
- elseif !s:hash_match(sha, a:spec.commit)
- let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
- \ a:spec.commit[:6], sha[:6]),
- \ 'PlugUpdate required.'], "\n")
- endif
- elseif a:check_branch
- let current_branch = result[0]
- " Check tag
- let origin_branch = s:git_origin_branch(a:spec)
- if has_key(a:spec, 'tag')
- let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
- if a:spec.tag !=# tag && a:spec.tag !~ '\*'
- let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
- \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
- endif
- " Check branch
- elseif origin_branch !=# current_branch
- let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
- \ current_branch, origin_branch)
- endif
- if empty(err)
- let [ahead, behind] = split(s:lastline(s:system([
- \ 'git', 'rev-list', '--count', '--left-right',
- \ printf('HEAD...origin/%s', origin_branch)
- \ ], a:spec.dir)), '\t')
- if !v:shell_error && ahead
- if behind
- " Only mention PlugClean if diverged, otherwise it's likely to be
- " pushable (and probably not that messed up).
- let err = printf(
- \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
- \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
- else
- let err = printf("Ahead of origin/%s by %d commit(s).\n"
- \ .'Cannot update until local changes are pushed.',
- \ origin_branch, ahead)
- endif
- endif
- endif
- endif
- else
- let err = 'Not found'
- endif
- return [err, err =~# 'PlugClean']
-endfunction
-
-function! s:rm_rf(dir)
- if isdirectory(a:dir)
- return s:system(s:is_win
- \ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
- \ : ['rm', '-rf', a:dir])
- endif
-endfunction
-
-function! s:clean(force)
- call s:prepare()
- call append(0, 'Searching for invalid plugins in '.g:plug_home)
- call append(1, '')
-
- " List of valid directories
- let dirs = []
- let errs = {}
- let [cnt, total] = [0, len(g:plugs)]
- for [name, spec] in items(g:plugs)
- if !s:is_managed(name)
- call add(dirs, spec.dir)
- else
- let [err, clean] = s:git_validate(spec, 1)
- if clean
- let errs[spec.dir] = s:lines(err)[0]
- else
- call add(dirs, spec.dir)
- endif
- endif
- let cnt += 1
- call s:progress_bar(2, repeat('=', cnt), total)
- normal! 2G
- redraw
- endfor
-
- let allowed = {}
- for dir in dirs
- let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
- let allowed[dir] = 1
- for child in s:glob_dir(dir)
- let allowed[child] = 1
- endfor
- endfor
-
- let todo = []
- let found = sort(s:glob_dir(g:plug_home))
- while !empty(found)
- let f = remove(found, 0)
- if !has_key(allowed, f) && isdirectory(f)
- call add(todo, f)
- call append(line('$'), '- ' . f)
- if has_key(errs, f)
- call append(line('$'), ' ' . errs[f])
- endif
- let found = filter(found, 'stridx(v:val, f) != 0')
- end
- endwhile
-
- 4
- redraw
- if empty(todo)
- call append(line('$'), 'Already clean.')
- else
- let s:clean_count = 0
- call append(3, ['Directories to delete:', ''])
- redraw!
- if a:force || s:ask_no_interrupt('Delete all directories?')
- call s:delete([6, line('$')], 1)
- else
- call setline(4, 'Cancelled.')
- nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
- nmap <silent> <buffer> dd d_
- xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
- echo 'Delete the lines (d{motion}) to delete the corresponding directories'
- endif
- endif
- 4
- setlocal nomodifiable
-endfunction
-
-function! s:delete_op(type, ...)
- call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
-endfunction
-
-function! s:delete(range, force)
- let [l1, l2] = a:range
- let force = a:force
- let err_count = 0
- while l1 <= l2
- let line = getline(l1)
- if line =~ '^- ' && isdirectory(line[2:])
- execute l1
- redraw!
- let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
- let force = force || answer > 1
- if answer
- let err = s:rm_rf(line[2:])
- setlocal modifiable
- if empty(err)
- call setline(l1, '~'.line[1:])
- let s:clean_count += 1
- else
- delete _
- call append(l1 - 1, s:format_message('x', line[1:], err))
- let l2 += len(s:lines(err))
- let err_count += 1
- endif
- let msg = printf('Removed %d directories.', s:clean_count)
- if err_count > 0
- let msg .= printf(' Failed to remove %d directories.', err_count)
- endif
- call setline(4, msg)
- setlocal nomodifiable
- endif
- endif
- let l1 += 1
- endwhile
-endfunction
-
-function! s:upgrade()
- echo 'Downloading the latest version of vim-plug'
- redraw
- let tmp = s:plug_tempname()
- let new = tmp . '/plug.vim'
-
- try
- let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
- if v:shell_error
- return s:err('Error upgrading vim-plug: '. out)
- endif
-
- if readfile(s:me) ==# readfile(new)
- echo 'vim-plug is already up-to-date'
- return 0
- else
- call rename(s:me, s:me . '.old')
- call rename(new, s:me)
- unlet g:loaded_plug
- echo 'vim-plug has been upgraded'
- return 1
- endif
- finally
- silent! call s:rm_rf(tmp)
- endtry
-endfunction
-
-function! s:upgrade_specs()
- for spec in values(g:plugs)
- let spec.frozen = get(spec, 'frozen', 0)
- endfor
-endfunction
-
-function! s:status()
- call s:prepare()
- call append(0, 'Checking plugins')
- call append(1, '')
-
- let ecnt = 0
- let unloaded = 0
- let [cnt, total] = [0, len(g:plugs)]
- for [name, spec] in items(g:plugs)
- let is_dir = isdirectory(spec.dir)
- if has_key(spec, 'uri')
- if is_dir
- let [err, _] = s:git_validate(spec, 1)
- let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
- else
- let [valid, msg] = [0, 'Not found. Try PlugInstall.']
- endif
- else
- if is_dir
- let [valid, msg] = [1, 'OK']
- else
- let [valid, msg] = [0, 'Not found.']
- endif
- endif
- let cnt += 1
- let ecnt += !valid
- " `s:loaded` entry can be missing if PlugUpgraded
- if is_dir && get(s:loaded, name, -1) == 0
- let unloaded = 1
- let msg .= ' (not loaded)'
- endif
- call s:progress_bar(2, repeat('=', cnt), total)
- call append(3, s:format_message(valid ? '-' : 'x', name, msg))
- normal! 2G
- redraw
- endfor
- call setline(1, 'Finished. '.ecnt.' error(s).')
- normal! gg
- setlocal nomodifiable
- if unloaded
- echo "Press 'L' on each line to load plugin, or 'U' to update"
- nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
- xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
- end
-endfunction
-
-function! s:extract_name(str, prefix, suffix)
- return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
-endfunction
-
-function! s:status_load(lnum)
- let line = getline(a:lnum)
- let name = s:extract_name(line, '-', '(not loaded)')
- if !empty(name)
- call plug#load(name)
- setlocal modifiable
- call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
- setlocal nomodifiable
- endif
-endfunction
-
-function! s:status_update() range
- let lines = getline(a:firstline, a:lastline)
- let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
- if !empty(names)
- echo
- execute 'PlugUpdate' join(names)
- endif
-endfunction
-
-function! s:is_preview_window_open()
- silent! wincmd P
- if &previewwindow
- wincmd p
- return 1
- endif
-endfunction
-
-function! s:find_name(lnum)
- for lnum in reverse(range(1, a:lnum))
- let line = getline(lnum)
- if empty(line)
- return ''
- endif
- let name = s:extract_name(line, '-', '')
- if !empty(name)
- return name
- endif
- endfor
- return ''
-endfunction
-
-function! s:preview_commit()
- if b:plug_preview < 0
- let b:plug_preview = !s:is_preview_window_open()
- endif
-
- let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
- if empty(sha)
- let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
- if empty(name)
- return
- endif
- let title = 'HEAD@{1}..'
- let command = 'git diff --no-color HEAD@{1}'
- else
- let title = sha
- let command = 'git show --no-color --pretty=medium '.sha
- let name = s:find_name(line('.'))
- endif
-
- if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
- return
- endif
-
- if exists('g:plug_pwindow') && !s:is_preview_window_open()
- execute g:plug_pwindow
- execute 'e' title
- else
- execute 'pedit' title
- wincmd P
- endif
- setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(1)
- let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
- if s:is_win
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- execute 'silent %!' cmd
- finally
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
- setlocal nomodifiable
- nnoremap <silent> <buffer> q :q<cr>
- wincmd p
-endfunction
-
-function! s:section(flags)
- call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
-endfunction
-
-function! s:format_git_log(line)
- let indent = ' '
- let tokens = split(a:line, nr2char(1))
- if len(tokens) != 5
- return indent.substitute(a:line, '\s*$', '', '')
- endif
- let [graph, sha, refs, subject, date] = tokens
- let tag = matchstr(refs, 'tag: [^,)]\+')
- let tag = empty(tag) ? ' ' : ' ('.tag.') '
- return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
-endfunction
-
-function! s:append_ul(lnum, text)
- call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
-endfunction
-
-function! s:diff()
- call s:prepare()
- call append(0, ['Collecting changes ...', ''])
- let cnts = [0, 0]
- let bar = ''
- let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
- call s:progress_bar(2, bar, len(total))
- for origin in [1, 0]
- let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
- if empty(plugs)
- continue
- endif
- call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
- for [k, v] in plugs
- let branch = s:git_origin_branch(v)
- if len(branch)
- let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
- let cmd = ['git', 'log', '--graph', '--color=never']
- if s:git_version_requirement(2, 10, 0)
- call add(cmd, '--no-show-signature')
- endif
- call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
- if has_key(v, 'rtp')
- call extend(cmd, ['--', v.rtp])
- endif
- let diff = s:system_chomp(cmd, v.dir)
- if !empty(diff)
- let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
- call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
- let cnts[origin] += 1
- endif
- endif
- let bar .= '='
- call s:progress_bar(2, bar, len(total))
- normal! 2G
- redraw
- endfor
- if !cnts[origin]
- call append(5, ['', 'N/A'])
- endif
- endfor
- call setline(1, printf('%d plugin(s) updated.', cnts[0])
- \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
-
- if cnts[0] || cnts[1]
- nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
- if empty(maparg("\<cr>", 'n'))
- nmap <buffer> <cr> <plug>(plug-preview)
- endif
- if empty(maparg('o', 'n'))
- nmap <buffer> o <plug>(plug-preview)
- endif
- endif
- if cnts[0]
- nnoremap <silent> <buffer> X :call <SID>revert()<cr>
- echo "Press 'X' on each block to revert the update"
- endif
- normal! gg
- setlocal nomodifiable
-endfunction
-
-function! s:revert()
- if search('^Pending updates', 'bnW')
- return
- endif
-
- let name = s:find_name(line('.'))
- if empty(name) || !has_key(g:plugs, name) ||
- \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
- return
- endif
-
- call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
- setlocal modifiable
- normal! "_dap
- setlocal nomodifiable
- echo 'Reverted'
-endfunction
-
-function! s:snapshot(force, ...) abort
- call s:prepare()
- setf vim
- call append(0, ['" Generated by vim-plug',
- \ '" '.strftime("%c"),
- \ '" :source this file in vim to restore the snapshot',
- \ '" or execute: vim -S snapshot.vim',
- \ '', '', 'PlugUpdate!'])
- 1
- let anchor = line('$') - 3
- let names = sort(keys(filter(copy(g:plugs),
- \'has_key(v:val, "uri") && isdirectory(v:val.dir)')))
- for name in reverse(names)
- let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
- if !empty(sha)
- call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
- redraw
- endif
- endfor
-
- if a:0 > 0
- let fn = s:plug_expand(a:1)
- if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
- return
- endif
- call writefile(getline(1, '$'), fn)
- echo 'Saved as '.a:1
- silent execute 'e' s:esc(fn)
- setf vim
- endif
-endfunction
-
-function! s:split_rtp()
- return split(&rtp, '\\\@<!,')
-endfunction
-
-let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
-let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
-
-if exists('g:plugs')
- let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
- call s:upgrade_specs()
- call s:define_commands()
-endif
-
-let &cpo = s:cpo_save
-unlet s:cpo_save
@@ -0,0 +1 @@
+autospawn = no
@@ -1,16 +0,0 @@
-Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
-
-Host rocApex
- HostName 129.158.232.104
- User root
-
-Host linode
- HostName 97.107.142.58
- User root
-
-Host hetzner
- HostName 5.161.207.21
- User root
-
-Host *
- KexAlgorithms -sntrup761x25519-sha512@openssh.com
@@ -1,128 +0,0 @@
-{
- "layer": "top",
- "position": "top",
- "height": 30,
-
- "modules-left": ["wlr/workspaces", "hyprland/submap"],
- "modules-center": ["hyprland/window"],
- "modules-right": ["tray", "custom/spotify", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "clock"],
- "hyprland/submap": {
- "format": " {}"
- },
- "wlr/workspaces": {
- "format": "{name}",
- "disable-scroll": true
- },
- "hyprland/window": {
- "max-length": 80,
- "tooltip": false,
- "separate-outputs": true
- },
- "clock": {
- "format": "{:%a %d %b %H:%M}",
- "tooltip": false
- },
- "battery": {
- "format": "{capacity}% {icon}",
- "format-alt": "{time} {icon}",
- "format-icons": ["", "", "", "", ""],
- "format-charging": "{capacity}% ",
- "interval": 30,
- "states": {
- "warning": 25,
- "critical": 10
- },
- "tooltip": false,
- "bat":"BAT1"
- },
- "bluetooth": {
- "format": "",
- "format-disabled": "",
- "format-connected": "",
- "format-connected-battery": " {device_battery_percentage}%",
- "on-click": "blueman-manager",
- "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
- "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
- "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
- "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%"
- },
- "network": {
- "format-alt": "{ipaddr}/{cidr} {icon} {bandwidthTotalBytes}",
- "format": "{ipaddr}/{cidr} {icon}",
- "format-alt-click": "click-right",
- "format-icons": {
- "wifi": ["", "" ,"", ""],
- "ethernet": [""],
- "disconnected": [""]
- },
- "on-click": "alacritty -e doas nmtui",
- "tooltip": false
- },
- "pulseaudio": {
- "format-alt": "{icon}",
- "format": "{volume} {icon}",
- "format-alt-click": "click-right",
- "format-muted": "",
- "format-icons": {
- "phone": [" ", " ", " ", " "],
- "default": ["", "", "", ""]
- },
- "scroll-step": 1,
- "on-click": "pavucontrol",
- "tooltip": false
- },
- "custom/spotify": {
- "interval": 2,
- "return-type": "json",
- "exec": "~/.config/waybar/modules/spotify.sh",
- "exec-if": "pgrep spotifyd",
- "escape": true,
- "on-click": "~/.config/waybar/modules/spotify-play-pause.sh play-pause"
- },
- "custom/storage": {
- "format-alt": "{} ",
- "format": "{percentage}% ",
- "format-alt-click": "click-right",
- "return-type": "json",
- "interval": 60,
- "exec": "~/.config/waybar/modules/storage.sh"
- },
- "backlight": {
- "format-alt": "{icon}",
- "format": "{percent}% {icon}",
- "format-alt-click": "click-right",
- "format-icons": ["", ""],
- "on-scroll-down": "light -A 1",
- "on-scroll-up": "light -U 1"
- },
- "custom/weather": {
- "format-alt": "{}",
- "format": "{alt}: {}",
- "format-alt-click": "click-right",
- "interval": 1800,
- "return-type": "json",
- "on-click": "alacritty --class ala-wttr --hold -e curl https://v2.wttr.in",
- "exec": "~/.config/waybar/modules/weather.sh",
- "exec-if": "ping wttr.in -c1"
- },
- "idle_inhibitor": {
- "format": "{icon}",
- "format-icons": {
- "activated": "",
- "deactivated": ""
- },
- "tooltip": false
- },
- "custom/mail": {
- "format": "",
- "format-alt": "{alt} ",
- "format-alt-click": "click-right",
- "interval": 60,
- "return-type": "json",
- "exec": "~/.config/waybar/modules/mail.py",
- "tooltip": false
- },
- "tray": {
- "icon-size": 18
- }
-}
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-class=$(playerctl metadata --player=spotifyd --format '{{lc(status)}}')
-icon=""
-
-if [[ $class == "playing" ]]; then
- info=$(playerctl metadata --player=spotifyd --format '{{artist}} - {{title}}')
- if [[ ${#info} > 40 ]]; then
- info=$(echo $info | cut -c1-40)"..."
- fi
- text=$info" "$icon
-elif [[ $class == "paused" ]]; then
- text=$icon
-elif [[ $class == "stopped" ]]; then
- text=""
-fi
-
-echo -e "{\"text\":\""$text"\", \"class\":\""$class"\"}"
-
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-mount="/"
-warning=20
-critical=10
-
-df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical '
-/\/.*/ {
- text=$4
- tooltip="Filesystem: "$1"\rSize: "$2"\rUsed: "$3"\rAvail: "$4"\rUse%: "$5"\rMounted on: "$6
- use=$5
- exit 0
-}
-END {
- class=""
- gsub(/%$/,"",use)
- if ((100 - use) < critical) {
- class="critical"
- } else if ((100 - use) < warning) {
- class="warning"
- }
- print "{\"text\":\""text"\", \"percentage\":"use",\"tooltip\":\""tooltip"\", \"class\":\""class"\"}"
-}
-'
-
@@ -1,77 +0,0 @@
-cachedir=~/.cache/rbn
-cachefile=${0##*/}-$1
-
-if [ ! -d $cachedir ]; then
- mkdir -p $cachedir
-fi
-
-if [ ! -f $cachedir/$cachefile ]; then
- touch $cachedir/$cachefile
-fi
-
-# Save current IFS
-SAVEIFS=$IFS
-# Change IFS to new line.
-IFS=$'\n'
-
-cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile")))
-if [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ]; then
- data=($(curl -s https://en.wttr.in/$1\?0qnT 2>&1))
- echo ${data[0]} | cut -f1 -d, > $cachedir/$cachefile
- echo ${data[1]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
- echo ${data[2]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
-fi
-
-weather=($(cat $cachedir/$cachefile))
-
-# Restore IFSClear
-IFS=$SAVEIFS
-
-temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]]+)\.\./\1 to /g')
-
-#echo ${weather[1]##*,}
-
-# https://fontawesome.com/icons?s=solid&c=weather
-case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in
-"clear" | "sunny")
- condition=""
- ;;
-"partly cloudy")
- condition=""
- ;;
-"cloudy")
- condition=""
- ;;
-"overcast")
- condition=""
- ;;
-"mist" | "fog" | "freezing fog")
- condition="敖"
- ;;
-"patchy rain possible" | "patchy light drizzle" | "light drizzle" | "patchy light rain" | "light rain" | "light rain shower" | "rain")
- condition="殺"
- ;;
-"moderate rain at times" | "moderate rain" | "heavy rain at times" | "heavy rain" | "moderate or heavy rain shower" | "torrential rain shower" | "rain shower")
- condition=""
- ;;
-"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")
- condition="流"
- ;;
-"blowing snow" | "moderate or heavy sleet" | "patchy light snow" | "light snow" | "light snow showers")
- condition="ﰕ"
- ;;
-"blizzard" | "patchy moderate snow" | "moderate snow" | "patchy heavy snow" | "heavy snow" | "moderate or heavy snow with thunder" | "moderate or heavy snow showers")
- condition=""
- ;;
-"thundery outbreaks possible" | "patchy light rain with thunder" | "moderate or heavy rain with thunder" | "patchy light snow with thunder")
- condition=""
- ;;
-*)
- condition=""
- echo -e "{\"text\":\""$condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
- ;;
-esac
-
-#echo $temp $condition
-
-echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
@@ -1,77 +0,0 @@
-* {
- border: none;
- border-radius: 0;
- font-family: Sans;
- font-size: 15px;
- box-shadow: none;
- text-shadow: none;
- transition-duration: 0s;
- color: white;
-}
-
-#waybar {
- background-color:rgba(0,0,0,0.25);
- color: white;
-}
-
-window {
- color: rgba(217, 216, 216, 1);
- background: rgba(35, 31, 32, 0.00);
-}
-
-window#waybar.solo {
- color: rgba(217, 216, 216, 1);
- background: rgba(35, 31, 32, 0.85);
-}
-
-#workspaces {
- margin: 0 5px;
-}
-
-#workspaces button {
- padding: 0 5px;
- color: rgba(217, 216, 216, 0.4);
-}
-
-#workspaces button.visible {
- color: rgba(217, 216, 216, 1);
-}
-
-#workspaces button.active {
- border-top: 3px solid rgba(217, 216, 216, 1);
- border-bottom: 3px solid rgba(217, 216, 216, 0);
-}
-
-#workspaces button.urgent {
- color: rgba(238, 46, 36, 1);
-}
-
-#mode, #battery, #cpu, #memory, #network, #bluetooth, #pulseaudio, #idle_inhibitor, #backlight, #custom-storage, #custom-spotify, #custom-weather, #custom-mail {
- margin: 0px 6px 0px 10px;
- min-width: 25px;
-}
-
-#clock {
- margin: 0px 16px 0px 10px;
- min-width: 140px;
-}
-
-#battery.warning {
- color: rgba(255, 210, 4, 1);
-}
-
-#battery.critical {
- color: rgba(238, 46, 36, 1);
-}
-
-#battery.charging {
- color: rgba(217, 216, 216, 1);
-}
-
-#custom-storage.warning {
- color: rgba(255, 210, 4, 1);
-}
-
-#custom-storage.critical {
- color: rgba(238, 46, 36, 1);
-}
@@ -0,0 +1,115 @@
+(define-module (ryan-bootloader uki)
+ #:use-module (gnu bootloader)
+ #:use-module (ryan-packages bootloaders)
+ #:use-module (gnu packages bootloaders)
+ #:use-module (gnu packages efi)
+ #:use-module (gnu packages linux)
+ #:use-module (guix gexp)
+ #:use-module (guix modules)
+ #:use-module (srfi srfi-1)
+ #:export (uefi-uki-bootloader uefi-uki-signed-bootloader))
+
+;; config generator makes script creating uki images
+;; install runs script
+;; install device is path to uefi dir
+(define vendor "Guix")
+(define script-loc "/boot/install-uki.scm")
+
+(define* (uefi-uki-configuration-file #:optional cert privkey)
+ (lambda* (config entries #:key (old-entries '()) #:allow-other-keys)
+
+ (define (menu-entry->args e)
+ (let* ((boot (bootloader-configuration-bootloader config))
+ (stub (bootloader-package boot)))
+ #~(list "--os-release" #$(menu-entry-label e)
+ "--linux" #$(menu-entry-linux e) "--initrd" #$(menu-entry-initrd e)
+ "--cmdline" (string-join (list #$@(menu-entry-linux-arguments e)))
+ "--stub" #$(file-append stub "/libexec/" (systemd-stub-name))
+ #$@(if cert #~("--secureboot-certificate" #$cert) #~())
+ #$@(if privkey #~("--secureboot-private-key" #$privkey) #~()))))
+
+ (define (enum-filenames . args) ; same args as iota
+ (map (lambda (n) (string-append (number->string n) ".efi"))
+ (apply iota (map length args))))
+
+ (program-file "install-uki"
+ (with-imported-modules (source-module-closure '((guix build syscalls)
+ (guix build utils)))
+ #~(let* ((target (cadr (command-line)))
+ (vendir (string-append target "/EFI/" #$vendor))
+ (schema (string-append vendir "/boot.mgr"))
+ (findmnt #$(file-append util-linux "/bin/findmnt"))
+ (efibootmgr #$(file-append efibootmgr "/sbin/efibootmgr")))
+ (use-modules (guix build syscalls) (guix build utils)
+ (ice-9 popen) (ice-9 textual-ports))
+
+ (define (out name) (string-append vendir "/" name))
+ (define disk
+ (call-with-port
+ (open-pipe* OPEN_READ findmnt "-fnro" "SOURCE" "-T" target)
+ (lambda (port) (get-line port)))) ; only 1 line: the device
+ (define part
+ (substring disk (- (string-length disk) 1)))
+
+ ;; delete all boot entries and files we control
+ (when (file-exists? schema)
+ (call-with-input-file schema
+ (lambda (port)
+ (for-each (lambda (l)
+ (unless (string-null? l)
+ (system* efibootmgr "-B" "-L" l "-q")))
+ (string-split (get-string-all port) #\lf)))))
+ (when (directory-exists? vendir) (delete-file-recursively vendir))
+ (mkdir-p vendir)
+
+ (define (install port boot? oos)
+ (lambda (args label name)
+ (let ((minbytes (* 2 (stat:size (stat #$script-loc)))))
+ (put-string port label)
+ (put-char port #\lf)
+ (force-output port) ; make sure space is alloc'd
+ (apply invoke #$(file-append ukify "/bin/ukify")
+ "build" "-o" (out name) args)
+ ;; make sure we have enough space for next install-uki.scm
+ (when (and oos (< (free-disk-space vendir) minbytes)) (oos))
+ (invoke efibootmgr (if boot? "-c" "-C") "-L" label "--disk" disk "--part" part
+ "--loader" (string-append "\\EFI\\" #$vendor "\\" name) "-q"))))
+
+ (call-with-output-file schema
+ (lambda (port) ; prioritize latest UKIs in limited ESP space
+ (for-each (install port #t #f)
+ (list #$@(map-in-order menu-entry->args entries))
+ (list #$@(map-in-order menu-entry-label entries))
+ (list #$@(enum-filenames entries)))
+ (for-each ; old-entries can fail (out of space) we don't care
+ (lambda (args label name)
+ (define (cleanup . _) ; do exit early if out of space tho
+ (when (file-exists? (out name)) (delete-file (out name)))
+ (exit))
+ (with-exception-handler cleanup
+ (lambda _ ((install port #f cleanup) args label name))))
+ (list #$@(map-in-order menu-entry->args old-entries))
+ (list #$@(map-in-order menu-entry-label old-entries))
+ (list #$@(enum-filenames old-entries entries))))))))))
+
+(define install-uefi-uki
+ #~(lambda (bootloader target mount-point)
+ (invoke (string-append mount-point #$script-loc)
+ (string-append mount-point target))))
+
+(define* (make-uefi-uki-bootloader #:optional cert privkey)
+ (bootloader
+ (name 'uefi-uki)
+ (package systemd-stub)
+ (installer install-uefi-uki)
+ (disk-image-installer #f)
+ (configuration-file script-loc)
+ (configuration-file-generator (uefi-uki-configuration-file cert privkey))))
+
+;; IMPORTANT NOTE: if bootloader install fails, do not turn off your computer! until
+;; install succeeds, your system is unbootable.
+(define uefi-uki-bootloader (make-uefi-uki-bootloader))
+;; use ukify genkey to generate cert and privkey. DO NOT include in store.
+(define (uefi-uki-signed-bootloader cert privkey)
+ (make-uefi-uki-bootloader cert privkey))
+
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIBxDCCAWqgAwIBAgIQWFilNnPPT41UBf3qhdFw3TAKBggqhkjOPQQDAjAsMRAw
+DgYDVQQKEwdBR0ZSIENBMRgwFgYDVQQDEw9BR0ZSIENBIFJvb3QgQ0EwHhcNMjQw
+MjIwMjE0MjMyWhcNMzQwMjE3MjE0MjMyWjA0MRAwDgYDVQQKEwdBR0ZSIENBMSAw
+HgYDVQQDExdBR0ZSIENBIEludGVybWVkaWF0ZSBDQTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABCZH+m/ZqIGUJetMA5+z8UnXinchd1nlTJLlCNuq9vyi/hPi1J7t
+wagseTAvP1Nx8qxs52R1Rr16ux4XC6wuM+KjZjBkMA4GA1UdDwEB/wQEAwIBBjAS
+BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTjq8ChYvI4z+pTz6c3xk9WPoWN
+gDAfBgNVHSMEGDAWgBRnwoWRDbqXsPp5wVsRD/CA4choijAKBggqhkjOPQQDAgNI
+ADBFAiEAyANEYJKlzPuj57XbIc1wT4Lg9la1DX3RI9GHMvHEePwCIC1kqVDWwY0g
+LgaVqlRoh7Tlj21DjneNcsJibFe/W+7g
+-----END CERTIFICATE-----
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBmTCCAUCgAwIBAgIPctsKjtg1OxvCt5Se83LXMAoGCCqGSM49BAMCMCwxEDAO
+BgNVBAoTB0FHRlIgQ0ExGDAWBgNVBAMTD0FHRlIgQ0EgUm9vdCBDQTAeFw0yNDAy
+MjAyMTQyMzFaFw0zNDAyMTcyMTQyMzFaMCwxEDAOBgNVBAoTB0FHRlIgQ0ExGDAW
+BgNVBAMTD0FHRlIgQ0EgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BCxmw8fgcVHhJrrm3zyUXCY0RUI/O3iS1a6v1soggEB/flAIvnyCWschmDnVr1Dx
+wvpI0R8SW9BjnpuEBXJpYfujRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8E
+CDAGAQH/AgEBMB0GA1UdDgQWBBRnwoWRDbqXsPp5wVsRD/CA4choijAKBggqhkjO
+PQQDAgNHADBEAiBy4WLk2dm50EJ08CJjqRYjrub41Px3lldVuzW545glngIgIx9u
+1SJsxDSFW5S7uC0DOOmpwfDWEsnT2i5QKgLfXRc=
+-----END CERTIFICATE-----
@@ -4,15 +4,24 @@
#:use-module (gnu system setuid)
#:use-module (gnu packages admin)
#:use-module (gnu packages avahi)
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages wm)
#:use-module (guix packages)
#:use-module (gnu packages shells)
#:use-module (guix build-system trivial)
#:use-module (guix licenses)
#:use-module (gnu packages tls)
+ #:use-module (gnu packages spice)
#:use-module (srfi srfi-1)
#:use-module (ryan-packages freedesktop)
+ ;#:use-module (ryan-packages hyprland)
#:use-module (ryan-packages wm)
- #:use-module (rosenthal packages wm)
+ #:use-module (ryan-packages virtualization)
+ #:use-module (ryan-packages linux)
+ #:use-module (ryan-packages login)
+ #:use-module (ryan-packages networking)
+ #:use-module (ryan-packages package-management)
+ #:use-module (rosenthal services networking)
#:use-module (gnu packages security-token)
#:use-module (gnu services security-token)
#:use-module (gnu services cups)
@@ -20,10 +29,12 @@
#:use-module (gnu services networking)
#:use-module (gnu services xorg)
#:use-module (gnu services ssh)
- #:use-module (gnu services nix)
+ #:use-module (ryan-services nix)
+ #:use-module (ryan-services networking)
#:use-module (gnu services sound)
#:use-module (gnu services docker)
#:use-module (gnu services avahi)
+ #:use-module (gnu services dbus)
#:use-module (gnu services virtualization))
; Define package that installs my root ca public keys
@@ -84,6 +95,15 @@
"ACTION==\"add\", SUBSYSTEM==\"backlight\", "
"RUN+=\"/run/current-system/profile/bin/chmod g+w /sys/class/backlight/%k/brightness\"")))
+(define %flipper-udev-rule
+ (udev-rule
+ "42-flipperzero.rules"
+ (string-append "SUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"0483\", ATTRS{idProduct}==\"5740\", ATTRS{manufacturer}==\"Flipper Devices Inc.\", TAG+=\"uaccess\""
+ "\n"
+ "SUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"0483\", ATTRS{idProduct}==\"df11\", ATTRS{manufacturer}==\"STMicroelectronics\", TAG+=\"uaccess\""
+ "\n"
+ "SUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"303a\", ATTRS{idProduct}==\"40??\", ATTRS{manufacturer}==\"Flipper Devices Inc.\", TAG+=\"uaccess\"")))
+
(define-public base-operating-system
(operating-system
(kernel linux)
@@ -98,54 +118,58 @@
(name "ryan")
(comment "Ryan")
(group "users")
- ;(shell (file-append zsh "/bin/zsh"))
+ (shell (file-append zsh "/bin/zsh"))
(home-directory "/home/ryan")
- (supplementary-groups '("wheel" "netdev" "audio" "video" "lp" "plugdev" "docker" "libvirt" "kvm")))
+ (supplementary-groups '("wheel" "netdev" "audio" "video" "lp" "plugdev" "docker" "libvirt" "kvm" "dialout")))
%base-user-accounts))
;; Packages installed system-wide. Users can also install packages
;; under their own account: use 'guix search KEYWORD' to search
;; for packages and 'guix install PACKAGE' to install a package.
- (packages (append (map specification->package (list "sway"
- "hyprland"
- "swaybg"
- "swayidle"
- ;"swaylock-effects"
- "fuzzel"
- "alacritty"
- "pinentry-qt"
- "adwaita-icon-theme"
- "hicolor-icon-theme"
- "git"
- "nss-certs"
- ;"waybar"
- "gnupg"
- "light"
- "avahi"
- "mako"
- "grim"
- "grimblast"
- "slurp"
- "wl-clipboard"
- "bluez"
- "blueman"
- "ldacbt"
- "libfreeaptx"
- "libfdk"
- "opendoas"
- ;"xdg-desktop-portal-wlr"
- "xdg-desktop-portal"
- "xdg-desktop-portal-gtk"
- "v4l2loopback-linux-module"
- "pipewire"
- "docker"
- "libvirt"
- "virt-manager"
- "wireplumber"
- "wireshark"
- "zsh"))
- (list my-ca-certs swaylock-effects-new waybar-new xdg-desktop-portal-hyprland)
- %my-base-packages ))
+ (packages (append (map specification->package (list ;"sway"
+ ;"hyprland"
+ ;"swaybg"
+ ;"swayidle"
+ ;"swaylock-effects"
+ ;"fuzzel"
+ ;"foot"
+ "linux-pam" ; installed directly to get libs in profile directly
+ ;"pinentry-qt"
+ "adwaita-icon-theme"
+ "hicolor-icon-theme"
+ ;"git"
+ ;"waybar-experimental"
+ ;"gnupg"
+ "light"
+ "avahi"
+ ;"mako"
+ ;"grim"
+ ;"grimblast"
+ ;"slurp"
+ ;"wl-clipboard"
+ ;"bluez"
+ ;"blueman"
+ "ldacbt"
+ "libfreeaptx"
+ "libfdk"
+ "opendoas"
+ ;"xdg-desktop-portal-wlr"
+ ;"xdg-desktop-portal"
+ ;"xdg-desktop-portal-gtk"
+ "v4l2loopback-linux-module"
+ "pipewire"
+ "docker"
+ ;"libvirt" ;New version inherited from service
+ ;"virt-manager"
+ "dconf"
+ "wireplumber"
+ "wireshark"
+ ;"openconnect"
+ ;"openconnect-sso"
+ ;"webkitgtk-with-libsoup2" ; Needed for Go wails development
+ "zsh"))
+ (list my-ca-certs virt-manager-ovmf bluez-ryan netbird-bin) ;neovim-ryan)
+ %my-base-packages ))
;; Below is the list of system services. To search for available
;; services, run 'guix system search KEYWORD' in a terminal.
@@ -165,12 +189,71 @@
(publish? #f) ;; do not advertise this machine
(publish-workstation? #f))) ;; do not advertise, I want this to be as silent as possible
(service docker-service-type)
- (service nix-service-type)
+ ; Tailscale daemon from rosenthal
+ ; (service tailscale-service-type
+ ; (tailscale-configuration
+ ; (socket "/var/run/tailscale/tailscaled.sock")))
+ (service netbird-service-type)
+ (service containerd-service-type)
+ (service nix-service-type
+ (nix-configuration
+ (package nix-ryan)))
+ (simple-service 'hyprlock-pam pam-root-service-type
+ (list
+ (pam-service
+ (name "hyprlock")
+ (auth
+ (list
+ (pam-entry (control "include")
+ (module "login")))))))
+ ; (simple-service 'ly-pam pam-root-service-type
+ ; (list
+ ; (pam-service
+ ; (name "ly")
+ ; (account
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so"))))
+ ; (auth
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so"))))
+ ; (password
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so")
+ ; (arguments (list "sha512" "shadow")))))
+ ; (session
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "/gnu/store/4lhhf88iz9pdr624z5hnq2avlk1ny4ga-elogind-255.17/lib/security/pam_elogind.so")
+ ; (arguments (list "debug=yes")))
+ ; (pam-entry (control "required")
+ ; (module "pam_env.so"))
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so")))))))
+ (service kmscon-service-type
+ (kmscon-configuration
+ (virtual-terminal "tty7")
+ (login-program #~(string-append #$ly "/bin/ly"))))
(service libvirt-service-type
(libvirt-configuration
+ (libvirt libvirt-ovmf)
(unix-sock-group "libvirt")))
(service virtlog-service-type)
- (service bluetooth-service-type)
+ ;(service screen-locker-service-type
+ ; (screen-locker-configuration
+ ; (name "hyprlock")
+ ; (program (file-append swaylock "/bin/swaylock"))
+ ; (using-pam? #t)))
+ (simple-service 'spice-polkit polkit-service-type (list spice-gtk))
+ (simple-service 'hwdb-creation etc-service-type (list `("udev-here-oneoneone" ,(plain-file "issue" "test\n"))))
+ (simple-service 'ly-config etc-service-type (list `("ly/config.ini" , (local-file "./lyconfig.ini"))))
+ (service bluetooth-service-type
+ (bluetooth-configuration
+ (bluez bluez-ryan)
+ (experimental #t)
+ (fast-connectable? #t)))
(udev-rules-service 'fido2 libfido2 #:groups '("plugdev")))
;; This is the default list of services we
@@ -193,8 +276,24 @@
(udev-service-type config =>
(udev-configuration
(inherit config)
- (rules (cons %backlight-udev-rule
+ (rules (cons* %backlight-udev-rule
+ %flipper-udev-rule
(udev-configuration-rules config)))))
+ (elogind-service-type config =>
+ (elogind-configuration
+ (inherit config)
+ (handle-power-key `ignore)
+ (handle-suspend-key `ignore)
+ (handle-hibernate-key 'ignore)
+ (handle-lid-switch `ignore)
+ (handle-lid-switch-docked 'ignore)
+ (handle-lid-switch-external-power 'ignore)
+ (kill-user-processes? #t)))
+ (network-manager-service-type config =>
+ (network-manager-configuration
+ (inherit config)
+ (vpn-plugins
+ (list network-manager-openconnect))))
(delete pulseaudio-service-type)
(delete gdm-service-type)
(delete avahi-service-type)
@@ -202,11 +301,11 @@
(delete alsa-service-type) )))
(name-service-switch %mdns-host-lookup-nss) ;; Enable .local lookup
(setuid-programs
- (append (list (file-like->setuid-program
- (file-append
+ (append (list ;(file-like->setuid-program
+ ;(file-append
;(specification->package "swaylock-effects")
- swaylock-effects-new
- "/bin/swaylock"))
+ ; swaylock-effects-new
+ ; "/bin/swaylock"))
(file-like->setuid-program
(file-append
(specification->package "wireshark")
@@ -0,0 +1,19 @@
+(use-modules (ryan-config base-system)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (host-name "ChangeMe_HOST")
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device (uuid "ChangeMe_ROOT"
+ 'ext4))
+ (type "ext4"))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "ChangeMe_BOOTEFI"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "ChangeMe_SWAP"))))))
@@ -3,10 +3,10 @@
(operating-system
(inherit base-operating-system)
- (host-name "RyanThinkpad")
+ (host-name "ChangeMe_HOST")
(mapped-devices (list (mapped-device
(source (uuid
- "adcaf322-7ee5-48ec-abf6-4a9b10643878"))
+ "ChangeMe_ROOT"))
(target "sysroot")
(type luks-device-mapping))))
(file-systems (cons* (file-system
@@ -16,9 +16,9 @@
(dependencies mapped-devices))
(file-system
(mount-point "/boot/efi")
- (device (uuid "DFE8-32EF"
+ (device (uuid "ChangeMe_BOOTEFI"
'fat32))
(type "vfat")) %base-file-systems))
(swap-devices
(list
- (swap-space (target (uuid "7e1bb7c5-da2a-4509-8263-f707fc752993"))))))
+ (swap-space (target (uuid "ChangeMe_SWAP"))))))
@@ -0,0 +1,10 @@
+animation = colormix
+colormix_col1 = 0x00631E61
+colormix_col2 = 0x0060631E
+colormix_col3 = 0x001E6063
+bigclock = en
+bigclock_12hr = false
+clock = %c
+waylandsessions=/run/current-system/profile/share/wayland-sessions
+custom_sessions=/home/ryan/sessions
+setup_cmd=/home/ryan/rysway-launch
@@ -0,0 +1,20 @@
+#!/run/current-system/profile/bin/bash
+
+# This should run on user first logon, so let's a go!
+# First, we should run a guix pull
+
+guix pull
+
+hash guix
+
+guix home -L ~/.config/guix/modules reconfigure ~/.config/guix/home-config/home-configuration.scm
+
+sudo herd restart nix-daemon
+
+nix-channel --update
+
+nix-shell '<home-manager>' -A install
+
+source ~/.bashrc
+
+home-manager switch
@@ -0,0 +1,33 @@
+(define-module (ryan-config utils)
+ #:use-module (gnu packages)
+ #:use-module (gnu services)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu services configuration)
+ #:use-module (guix gexp)
+ #:use-module (ice-9 regex)
+ #:use-module (ice-9 pretty-print)
+ #:use-module (ice-9 textual-ports)
+
+ #:export (gather-manifest-packages
+ apply-template-file))
+
+(define (apply-template template-string value-alist)
+ (regexp-substitute/global #f
+ "\\$\\{([A-Za-z/\\-]+)\\}"
+ template-string
+ 'pre
+ (lambda (m)
+ (let ((entry (assq (string->symbol (match:substring m 1))
+ value-alist)))
+ (if entry
+ (cdr entry)
+ "VALUE NOT FOUND")))
+ 'post))
+
+(define (apply-template-file file-path value-alist)
+ (call-with-input-file file-path
+ (lambda (port)
+ (apply-template (get-string-all port)
+ value-alist))))
@@ -0,0 +1,81 @@
+(define-module (ryan-packages audio)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix gexp)
+ #:use-module (guix build-system meson)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix utils)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages audio)
+ #:use-module (gnu packages pulseaudio)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages xiph)
+ #:use-module (gnu packages tbb)
+ #:use-module (gnu packages gettext)
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages pretty-print)
+ #:use-module (gnu packages algebra)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages maths)
+ #:use-module (gnu packages pkg-config))
+
+(define-public easyeffects
+ (package
+ (name "easyeffects")
+ (version "7.0.1")
+ (arguments
+ (list
+ #:modules
+ '((guix build utils)
+ (guix build meson-build-system))
+ #:imported-modules
+ (append %meson-build-system-modules)
+ #:tests? #f))
+ (native-inputs (list gettext-minimal
+ itstool
+ desktop-file-utils
+ `(,glib "bin")
+ `(,gtk+ "bin")
+ pkg-config
+ cmake
+ appstream-glib))
+ (inputs (list zita-convolver
+ rnnoise
+ tbb
+ fftwf
+ lilv
+ fmt
+ rubberband
+ speexdsp
+ nlohmann-json
+ pipewire
+ libadwaita
+ libsigc++
+ libbs2b
+ libsndfile
+ libsamplerate
+ libebur128
+ libportal
+ gsl
+ speex
+ `(,util-linux "lib")))
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://github.com/wwmm/easyeffects/archive/refs/tags/v" version
+ ".tar.gz"))
+ (sha256
+ (base32
+ "05j52fy51zjai7n0j23chydfgkfq9n82h2ih806z3b47zhk2h2j2"))))
+ (build-system meson-build-system)
+ (synopsis "Limiter, compressor, convolver, equalizer and auto volume and many other plugins for PipeWire applications")
+ (description "This package provides @code{easyeffects}, which is an audio application for use atop of @code{pipewire}
+ that allows effects that modify sound sources and sinks. This cannot be updated to the latest version (7.0.8) because
+ the packaged version of @code{gtk} is too old.")
+ (home-page "https://github.com/wwmm/easyeffects")
+ (license license:gpl3+)))
+
+easyeffects
@@ -0,0 +1,68 @@
+(define-module (ryan-packages binaries)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system copy)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages bootstrap)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages elf)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages glib))
+
+(define-public superfile-bin
+ (package
+ (name "superfile-bin")
+ (version "1.1.2")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://github.com/yorukot/superfile" "/releases/download/v"
+ version "/superfile-linux-v" version "-amd64.tar.gz"))
+ (sha256
+ (base32
+ "1hnhkd6ihp0wcrn54ipyki500xmz1kapaj8sykg7ykh1vv8y6hmm"))))
+ (build-system copy-build-system)
+ (arguments
+ (list #:install-plan #~'((#$(string-append
+ "superfile-linux-v" (package-version this-package) "-amd64/spf")
+ "bin/spf"))
+ #:phases
+ #~(modify-phases %standard-phases
+ (delete 'strip)
+ (add-after 'install 'patch-elf
+ (lambda _
+ (let ((spf (string-append #$output "/bin/spf")))
+ (invoke "patchelf" "--set-interpreter"
+ (string-append #$(this-package-input "glibc")
+ #$(glibc-dynamic-linker))
+ spf)
+ (invoke "patchelf" "--set-rpath"
+ (string-append (ungexp (this-package-input "gcc")
+ "lib")
+ "/lib")
+ spf)))))))
+ (supported-systems '("x86_64-linux"))
+ (native-inputs (list patchelf))
+ (inputs (list `(,gcc "lib") glibc))
+ (home-page "https://github.com/yorukot/superfile")
+ (synopsis "Pretty fancy and modern terminal file manager")
+ (description
+ "Terminal file-manager written in Go that is modern and extensible.")
+ (license license:expat)))
+
+(define-public brave-bin
+ (package
+ (name "brave-bin")
+ (version "nightly_1.72.12")
+ (source (origin
+ (method url-fetch)
+ (url (string-append "https://github.com/brave/brave-browser/releases/download/v1.72.12/brave-browser-" version "_amd64.deb"))
+ (sha256
+ (base32
+ "1ry62ck61gn4bxnkih3775pdlndp2ldxwifbjkxbj3wfd4f67xiv"))))
+ (build-system copy-build-system)
+ (arguments
+ (list #:install-plan
+ #~'(("bin" "bin" #:include ("wrap
@@ -0,0 +1,148 @@
+(define-module (ryan-packages bootloaders)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages efi)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages gperf)
+ #:use-module (gnu packages crypto)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages python-xyz)
+ #:use-module (gnu packages python-crypto)
+ #:use-module (gnu packages pkg-config)
+ ;below for cryptsetup
+ #:use-module (gnu packages password-utils)
+ #:use-module (gnu packages cryptsetup)
+ #:use-module (gnu packages security-token)
+ #:use-module (gnu packages web)
+ #:use-module (gnu packages gnupg)
+ #:use-module (gnu packages tls)
+ #:use-module (guix gexp)
+ #:use-module (guix utils)
+ #:use-module (guix modules)
+ #:use-module (guix packages)
+ #:use-module (guix git-download)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix build-system meson)
+ #:use-module (guix build-system python))
+
+(define systemd-version "258")
+(define systemd-source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/systemd/systemd")
+ (commit (string-append "v" systemd-version))))
+ (file-name (git-file-name "systemd" systemd-version))
+ (sha256
+ (base32
+ "18gnp45gl1154jra6qv95k8y7ny6phdm87yqi5jdq13cadlrklf6"))))
+
+(define-public (systemd-stub-name)
+ (let ((arch (cond ((target-x86-32?) "ia32")
+ ((target-x86-64?) "x64")
+ ((target-arm32?) "arm")
+ ((target-aarch64?) "aa64")
+ ((target-riscv64?) "riscv64"))))
+ (string-append "linux" arch ".efi.stub")))
+
+(define-public systemd-stub
+ (package
+ (name "systemd-stub")
+ (version systemd-version)
+ (source systemd-source)
+ (build-system meson-build-system)
+ (arguments
+ (list
+ #:configure-flags
+ `(list "-Defi=true" "-Dsbat-distro=guix"
+ "-Dsbat-distro-generation=1" ; package revision!
+ "-Dsbat-distro-summary=Guix System"
+ "-Dsbat-distro-url=https://guix.gnu.org"
+ ,(string-append "-Dsbat-distro-pkgname=" name)
+ ,(string-append "-Dsbat-distro-version=" version))
+ #:phases
+ #~(let ((stub #$(string-append "src/boot/" (systemd-stub-name))))
+ (modify-phases %standard-phases
+ (replace 'build
+ (lambda* (#:key parallel-build? #:allow-other-keys)
+ (invoke "ninja" stub
+ "-j" (if parallel-build?
+ (number->string (parallel-job-count)) "1"))))
+ (replace 'install
+ (lambda _
+ (install-file stub (string-append #$output "/libexec"))))
+ (delete 'check)))))
+ (inputs (list libcap python-pyelftools `(,util-linux "lib")))
+ (native-inputs (list libxcrypt gperf pkg-config python-3 python-jinja2))
+ (home-page "https://systemd.io")
+ (synopsis "Unified kernel image UEFI stub")
+ (description "Simple UEFi boot stub that loads a conjoined kernel image and
+supporting data to their proper locations, before chainloading to the kernel.
+Supports measured and/or verified boot environments.")
+ (license license:lgpl2.1+)))
+
+(define-public ukify
+ (package
+ (name "ukify")
+ (version systemd-version)
+ (source systemd-source)
+ (build-system python-build-system)
+ (arguments
+ (list #:phases
+ #~(modify-phases %standard-phases
+ (replace 'build
+ (lambda _
+ (substitute* "src/ukify/ukify.py" ; added in python 3.11
+ (("datetime\\.UTC") "datetime.timezone.utc"))))
+ (delete 'check)
+ (replace 'install
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let* ((bin (string-append #$output "/bin"))
+ (file (string-append bin "/ukify"))
+ (binutils (assoc-ref inputs "binutils"))
+ (sbsign (assoc-ref inputs "sbsigntools")))
+ (mkdir-p bin)
+ (copy-file "src/ukify/ukify.py" file)
+ (wrap-program file
+ `("PATH" ":" prefix
+ (,(string-append binutils "/bin")
+ ,(string-append sbsign "/bin"))))))))))
+ (inputs (list binutils python-cryptography python-pefile sbsigntools))
+ (home-page "https://systemd.io")
+ (synopsis "Unified kernel image UEFI tool")
+ (description "@command{ukify} joins together a UKI stub, linux kernel, initrd,
+kernel arguments, and optional secure boot signatures into a single, UEFI-bootable
+image.")
+ (license license:lgpl2.1+)))
+
+(define-public systemd-cryptsetup
+ (package
+ (name "systemd-cryptsetup")
+ (version systemd-version)
+ (source systemd-source)
+ (build-system meson-build-system)
+ (arguments
+ (list
+ #:build-type "release"
+ #:configure-flags
+ `(list "-Dlibcryptsetup=true" "-Dlibfido2=true"
+ "-Dopenssl=true")
+ #:phases
+ #~(modify-phases %standard-phases
+ (replace 'build
+ (lambda* (#:key parallel-build? #:allow-other-keys)
+ (invoke "ninja" "systemd-cryptsetup"
+ "-j" (if parallel-build?
+ (number->string (parallel-job-count)) "1"))))
+ (replace 'install
+ (lambda _
+ (install-file "systemd-cryptsetup" (string-append #$output "/libexec"))
+ (install-file "src/shared/libsystemd-shared-258.so" (string-append #$output "/lib"))))
+ (delete 'check))))
+ (native-inputs (list `(,util-linux "lib") eudev lvm2 cryptsetup libfido2 libxcrypt gperf pkg-config python-3 python-jinja2 libcap argon2 json-c libgcrypt openssl))
+ (home-page "test")
+ (synopsis "test")
+ (description "test")
+ (license license:lgpl2.1+)))
+
+systemd-cryptsetup
@@ -0,0 +1,29 @@
+(define-module (ryan-packages calcurse)
+ #:use-module (guix download)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages calcurse)
+ #:use-module (gnu packages python-web)
+ #:use-module (gnu packages rust)
+ #:use-module (gnu packages rust-apps)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages linux)
+ #:use-module (guix git-download)
+ #:use-module (guix utils))
+
+(define-public calcurse-fixed
+ (package
+ (inherit calcurse)
+ (version "4.8.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "https://calcurse.org/files/calcurse-"
+ version ".tar.gz"))
+ (sha256
+ (base32 "02l3spj2ai97b87winz3kvsxvf66g74lm46b7kcbhsgx2iqb6syq"))))
+ (propagated-inputs (list python-httplib2))))
+
@@ -3,7 +3,9 @@
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix gexp)
#:use-module (guix build-system meson)
+ #:use-module (guix build-system cmake)
#:use-module (guix build-system qt)
+ #:use-module (guix build utils)
#:use-module (guix packages)
#:use-module (guix git-download)
#:use-module (guix utils)
@@ -12,10 +14,15 @@
#:use-module (gnu packages linux)
#:use-module (gnu packages image)
#:use-module (gnu packages qt)
+ #:use-module (gnu packages bash)
#:use-module (gnu packages cmake)
+ #:use-module (gnu packages gcc)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages freedesktop)
- #:use-module (rosenthal packages wm)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages man)
+ ;#:use-module (rosenthal packages wm)
#:use-module (gnu packages wm))
(define-public xdg-desktop-portal-wlr-new
@@ -34,10 +41,10 @@
(native-inputs (modify-inputs (package-native-inputs xdg-desktop-portal-wlr)
(append wlroots)))))
-(define-public xdg-desktop-portal-hyprland
+(define-public xdg-desktop-portal-hyprland-ryan
(package
(name "xdg-desktop-portal-hyprland")
- (version "0.5.0")
+ (version "1.3.1")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -46,7 +53,44 @@
(file-name (git-file-name name version))
(sha256
(base32
- "1dmgc0w4wjj9hwqg17wg529v8sbxr6czp9s319d5407jm780x40b"))))
+ "0fdbzxanmmzrvb9wfzg1pdsnlg7dl6v5k8bl44w10n48s7bbbzn0"))))
+ (build-system qt-build-system)
+ (arguments
+ (list
+ #:tests? #f
+ #:configure-flags #~(list "-Dsystemd=disabled")
+ #:qtbase qtbase
+ #:phases
+ ;; After building the portal, we need to build the share selector using qt
+ #~(modify-phases %standard-phases
+ (add-after `unpack `fix-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* (find-files "." "\\.cp?*$")
+ (("/bin/sh") "sh")
+ (("\\<(sh|grim|hyprctl|slurp)\\>" _ cmd)
+ (search-input-file inputs (string-append "/bin/" cmd)))
+ (("\\<(hyprctl-share-picker)\\>" _ cmd)
+ (string-append #$output "/bin/" cmd))))))))
+ (native-inputs (list gcc-13 pkg-config wayland hyprlang))
+ (inputs (list bash-minimal grim hyprland hyprland-protocols mesa pipewire sdbus-c++ slurp wayland-protocols qtwayland))
+ (home-page "")
+ (synopsis "test")
+ (description "test")
+ (license license:bsd-3)))
+
+(define-public xdg-desktop-portal-hyprland-old
+ (package
+ (name "xdg-desktop-portal-hyprland")
+ (version "1.2.4")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/xdg-desktop-portal-hyprland")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1m82rrir2fg7h2cpch6wm3h1rkpnbh9pawlw1wdknw75mi6139r0"))))
(build-system meson-build-system)
(arguments
(list
@@ -90,11 +134,41 @@
(dirname (search-input-file
inputs (string-append "/bin/" program))))
'("slurp"))))))))))
- (native-inputs (list cmake pkg-config qtbase-5))
- (inputs (list elogind hyprland hyprland-protocols slurp pipewire wayland-protocols wayland libinih mesa qtwayland-5 `(,util-linux "lib")))
+ (native-inputs (list gcc-13 cmake pkg-config qtbase-5))
+ (inputs (list elogind hyprland hyprland-protocols slurp pipewire wayland-protocols wayland libinih mesa sdbus-c++ qtwayland-5 `(,util-linux "lib")))
(home-page "")
(synopsis "test")
(description "test")
(license license:bsd-3)))
-xdg-desktop-portal-hyprland
+(define-public wl-mirror
+ (package
+ (name "wl-mirror")
+ (version "0.16.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/Ferdi265/wl-mirror")
+ (commit (string-append "v" version))
+ (recursive? #t)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "06i4jrip4q9j1gp81j0jr79cwfj9zdcfcr1n0jpyqlxsysppidlc"))))
+ (inputs (list wayland egl-wayland mesa))
+ (native-inputs (list pkg-config scdoc wayland-protocols))
+ (build-system cmake-build-system)
+ (arguments (list
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-before 'configure 'touch
+ (lambda _
+ (invoke "touch" "proto/wayland-protocols/.git")
+ (invoke "touch" "proto/wlr-protocols/.git"))))))
+ (home-page "bleh")
+ (synopsis "mirror displays")
+ (description "mirror displays")
+ (license license:expat)))
+
+xdg-desktop-portal-hyprland-ryan
@@ -0,0 +1,224 @@
+(define-module (ryan-packages gl)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (guix utils)
+ #:use-module (ice-9 match)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages gl))
+
+(define-public mesa-libglvnd
+ (package
+ (inherit mesa)
+ (inputs (modify-inputs (package-inputs mesa) (prepend libglvnd)))
+ (arguments
+ (list
+ #:configure-flags
+ #~(list
+ #$@(cond
+ ((or (target-aarch64?) (target-arm32?))
+ '("-Dgallium-drivers=etnaviv,freedreno,kmsro,lima,nouveau,\
+panfrost,r300,r600,svga,swrast,tegra,v3d,vc4,virgl,zink"))
+ ((or (target-ppc64le?) (target-ppc32?) (target-riscv64?))
+ '("-Dgallium-drivers=nouveau,r300,r600,radeonsi,svga,swrast,virgl,zink"))
+ (else
+ '("-Dgallium-drivers=crocus,iris,nouveau,r300,r600,radeonsi,\
+svga,swrast,virgl,zink")))
+ ;; Enable various optional features. TODO: opencl requires libclc,
+ ;; omx requires libomxil-bellagio
+ "-Dplatforms=x11,wayland"
+ "-Dglx=dri" ;Thread Local Storage, improves performance
+ ;; "-Dopencl=true"
+ ;; "-Domx=true"
+ "-Dosmesa=true"
+ "-Dgallium-xa=enabled"
+
+ ;; features required by wayland
+ "-Dgles2=enabled"
+ "-Dgbm=enabled"
+ "-Dshared-glapi=enabled"
+ "-Dglvnd=true"
+
+ ;; Explicitly enable Vulkan on some architectures.
+ #$@(cond
+ ((or (target-x86-32?) (target-x86-64?))
+ '("-Dvulkan-drivers=intel,intel_hasvk,amd,swrast"))
+ ((or (target-ppc64le?) (target-ppc32?))
+ '("-Dvulkan-drivers=amd,swrast"))
+ ((target-aarch64?)
+ '("-Dvulkan-drivers=freedreno,amd,broadcom,swrast"))
+ ((target-riscv64?)
+ '("-Dvulkan-drivers=amd,swrast"))
+ (else
+ '("-Dvulkan-drivers=auto")))
+
+ ;; Enable the Vulkan overlay layer on all architectures.
+ "-Dvulkan-layers=device-select,overlay"
+
+ ;; Enable all the codecs that were built by default as part of the
+ ;; 21.3.x releases to avoid functionality regressions.
+ "-Dvideo-codecs=all"
+
+ ;; Enable ZSTD compression for shader cache.
+ "-Dzstd=enabled"
+
+ ;; Also enable the tests.
+ "-Dbuild-tests=true"
+
+ "-Dllvm=enabled") ; default is x86/x86_64 only
+
+ ;; XXX: 'debugoptimized' causes LTO link failures on some drivers. The
+ ;; documentation recommends using 'release' for performance anyway.
+ #:build-type "release"
+
+ #:modules '((ice-9 match)
+ (srfi srfi-1)
+ (guix build utils)
+ (guix build meson-build-system))
+ #:phases
+ #~(modify-phases %standard-phases
+ #$@(if (%current-target-system)
+ #~((add-after 'unpack 'fix-cross-compiling
+ (lambda* (#:key native-inputs #:allow-other-keys)
+ ;; When cross compiling, we use cmake to find llvm, not
+ ;; llvm-config, because llvm-config cannot be executed
+ ;; see https://github.com/llvm/llvm-project/issues/58984
+ (substitute* "meson.build"
+ (("method : host_machine\\.system.*")
+ "method : 'cmake',\n"))
+ (setenv "CMAKE"
+ (search-input-file
+ native-inputs "/bin/cmake")))))
+ #~())
+ (add-after 'unpack 'disable-failing-test
+ (lambda _
+ ;; Disable the intel vulkan (anv_state_pool) tests, as they may
+ ;; fail in a nondeterministic fashion (see:
+ ;; https://gitlab.freedesktop.org/mesa/mesa/-/issues/5446).
+ (substitute* "src/intel/vulkan/meson.build"
+ (("if with_tests")
+ "if false"))
+ #$@(match (%current-system)
+ ("riscv64-linux"
+ ;; According to the test logs the llvm JIT is not designed
+ ;; for this architecture and the llvmpipe tests all segfault.
+ ;; The same is true for mesa:gallium / osmesa-render.
+ `((substitute* '("src/gallium/drivers/llvmpipe/meson.build"
+ "src/gallium/targets/osmesa/meson.build")
+ (("if with_tests") "if false"))))
+ ("powerpc64le-linux"
+ ;; Disable some of the llvmpipe tests.
+ `((substitute* "src/gallium/drivers/llvmpipe/lp_test_arit.c"
+ (("0\\.5, ") ""))))
+ ("powerpc-linux"
+ ;; There are some tests which fail specifically on powerpc.
+ `((substitute* '(;; LLVM ERROR: Relocation type not implemented yet!
+ "src/gallium/drivers/llvmpipe/meson.build"
+ "src/gallium/targets/osmesa/meson.build")
+ (("if with_tests") "if not with_tests"))
+ ;; This is probably a big-endian test failure.
+ (substitute* "src/amd/common/meson.build"
+ (("and not with_platform_windows")
+ "and with_platform_windows"))))
+ ("i686-linux"
+ ;; This test is known to fail on i686 (see:
+ ;; https://gitlab.freedesktop.org/mesa/mesa/-/issues/4091).
+ `((substitute* "src/util/meson.build"
+ ((".*'tests/u_debug_stack_test.cpp',.*") ""))))
+ ("armhf-linux"
+ ;; Disable some of the llvmpipe tests.
+ `((substitute* "src/gallium/drivers/llvmpipe/meson.build"
+ (("'lp_test_arit', ") ""))))
+ (_
+ '((display "No tests to disable on this architecture.\n"))))))
+ (add-before 'configure 'fix-dlopen-libnames
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((out #$output))
+ ;; Remain agnostic to .so.X.Y.Z versions while doing
+ ;; the substitutions so we're future-safe.
+ (substitute* "src/glx/meson.build"
+ (("-DGL_LIB_NAME=\"lib@0@\\.so\\.@1@\"")
+ (string-append "-DGL_LIB_NAME=\"" out
+ "/lib/lib@0@.so.@1@\"")))
+ (substitute* "src/gbm/backends/dri/gbm_dri.c"
+ (("\"libglapi\\.so")
+ (string-append "\"" out "/lib/libglapi.so")))
+ (substitute* "src/gbm/main/backend.c"
+ ;; No need to patch the gbm_gallium_drm.so reference;
+ ;; it's never installed since Mesa removed its
+ ;; egl_gallium support.
+ (("\"gbm_dri\\.so")
+ (string-append "\"" out "/lib/dri/gbm_dri.so")))
+ (substitute* "src/gallium/drivers/zink/zink_screen.c"
+ (("util_dl_open\\(VK_LIBNAME\\)")
+ (format #f "util_dl_open(\"~a\")"
+ (search-input-file inputs
+ "lib/libvulkan.so.1")))))))
+ (add-after 'install 'split-outputs
+ (lambda _
+ (let ((out #$output)
+ (bin #$output:bin))
+ ;; Not all architectures have the Vulkan overlay control script.
+ (mkdir-p (string-append out "/bin"))
+ (call-with-output-file (string-append out "/bin/.empty")
+ (const #t))
+ (copy-recursively (string-append out "/bin")
+ (string-append bin "/bin"))
+ (delete-file-recursively (string-append out "/bin")))))
+ (add-after 'install 'symlinks-instead-of-hard-links
+ (lambda _
+ ;; All the drivers and gallium targets create hard links upon
+ ;; installation (search for "hardlink each megadriver instance"
+ ;; in the makefiles). This is no good for us since we'd produce
+ ;; nars that contain several copies of these files. Thus, turn
+ ;; them into symlinks, which saves ~124 MiB.
+ (let* ((out #$output)
+ (lib (string-append out "/lib"))
+ (files (find-files lib
+ (lambda (file stat)
+ (and (string-contains file ".so")
+ (eq? 'regular
+ (stat:type stat))))))
+ (inodes (map (compose stat:ino stat) files)))
+ (for-each (lambda (inode)
+ (match (filter-map (match-lambda
+ ((file ino)
+ (and (= ino inode) file)))
+ (zip files inodes))
+ ((_)
+ #f)
+ ((reference others ..1)
+ (format #t "creating ~a symlinks to '~a'~%"
+ (length others) reference)
+ (for-each delete-file others)
+ (for-each (lambda (file)
+ (if (string=? (dirname file)
+ (dirname reference))
+ (symlink (basename reference)
+ file)
+ (symlink reference file)))
+ others))))
+ (delete-duplicates inodes)))))
+ (add-after 'install 'set-layer-path-in-manifests
+ (lambda _
+ (let* ((out #$output)
+ (implicit-path (string-append
+ out
+ "/share/vulkan/implicit_layer.d/"))
+ (explicit-path (string-append
+ out
+ "/share/vulkan/explicit_layer.d/"))
+ (fix-layer-path
+ (lambda (layer-name)
+ (let* ((explicit (string-append explicit-path layer-name ".json"))
+ (implicit (string-append implicit-path layer-name ".json"))
+ (manifest (if (file-exists? explicit)
+ explicit
+ implicit)))
+ (substitute* manifest
+ (((string-append "\"lib" layer-name ".so\""))
+ (string-append "\"" out "/lib/lib" layer-name ".so\"")))))))
+ (for-each fix-layer-path '("VkLayer_MESA_device_select"
+ "VkLayer_MESA_overlay"))))))))))
+
+mesa-libglvnd
@@ -0,0 +1,45 @@
+(define-module (ryan-packages gtk)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix utils)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages gtk))
+
+(define-public glibmm-2.66
+ (package
+ (inherit glibmm-2.64)
+ (name "glibmm")
+ (version "2.66.5")
+ (source
+ (origin
+ (method url-fetch)
+ (uri
+ (string-append "mirror://gnome/sources/glibmm/"
+ (version-major+minor version)
+ "/glibmm-" version ".tar.xz"))
+ (sha256
+ (base32 "0jf1drbb585lcyvh45krkbcjpnq5mwr1scvh0mnbihvfvmi4cf3v"))))))
+
+(define-public pangomm-ryan
+ (package
+ (inherit pangomm-2.46)
+ (propagated-inputs (modify-inputs (package-propagated-inputs pangomm-2.46) (replace "glibmm" glibmm-2.66)))))
+
+(define-public atkmm-ryan
+ (package
+ (inherit atkmm-2.28)
+ (propagated-inputs (modify-inputs (package-propagated-inputs atkmm-2.28) (replace "glibmm" glibmm-2.66)))))
+
+(define-public cairomm-ryan
+ (package
+ (inherit cairomm-1.14)
+ (propagated-inputs (modify-inputs (package-propagated-inputs cairomm-1.14) (replace "glibmm" glibmm-2.66)))))
+
+(define-public gtkmm-ryan
+ (package
+ (inherit gtkmm-3)
+ (propagated-inputs (list gtk+ glibmm cairomm-1.14 atkmm-ryan pangomm-ryan))))
+
+gtkmm-ryan
@@ -0,0 +1,46 @@
+(define-module (ryan-packages hyprland)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system meson)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module (guix packages)
+ #:use-module (guix download))
+
+(define aquamarine
+ (package
+ (name "aquamarine")
+ (version "0.4.3")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/aquamarine")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "114fspibmrwvzdmzv4xdy000vg7mn9r5vas3pr1ndb9xyl15ja1s"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (native-inputs
+ (list
+ gcc-14
+ pkg-config
+ mesa-headers
+ hyprwayland-scanner
+ hwdata))
+ (inputs
+ (list
+ libglvnd
+ mesa-libglvnd
+ libseat
+ libinput
+ libxkbcommon
+ libdisplay-info
+ libxcb
+ libxinerama
+ libxcursor
+ wayland
+ wayland-protocols
@@ -0,0 +1,495 @@
+(define-module (ryan-packages hyprland)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix build-system meson)
+ #:use-module (guix download)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module (guix packages)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages pciutils)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (gnu packages xml)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages web)
+ #:use-module (gnu packages wm)
+ #:use-module (gnu packages gl)
+ #:use-module (ryan-packages gl)
+ #:use-module (guix utils))
+
+; hyprland deps
+(define-public libseat-0.8.0
+ (package
+ (inherit libseat)
+ (name "libseat")
+ (version "0.8.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://git.sr.ht/~kennylevinsen/seatd")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "02wzrgp8di6hqmicnm2fim6jnvbn62wy248ikvdvrhiywrb7i931"))))))
+
+(define-public libinput-minimal-1.26.1
+ (package
+ (inherit libinput-minimal)
+ (name "libinput-minimal")
+ (version "1.26.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://gitlab.freedesktop.org/libinput/libinput.git")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "094k23i10jjmgdzhv5lj7xpc3fgkwi9afcihf0l2fjj71ym8l9fy"))))
+ (native-inputs
+ (modify-inputs (package-native-inputs libinput)
+ (append python-minimal-wrapper python-pytest)))))
+
+(define-public cmake-minimal-3.27.0
+ (package
+ (inherit cmake-minimal)
+ (name "cmake-minimal")
+ (version "3.27.0")
+ (source (origin
+ (inherit (package-source cmake-minimal))
+ (method url-fetch)
+ (uri (string-append "https://cmake.org/files/v"
+ (version-major+minor version)
+ "/cmake-" version ".tar.gz"))
+ (sha256
+ (base32
+ "1f1w9mb868q38nzy145b6q9mc5waf8yi521cwfkd14xr51mxpvda"))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments cmake-minimal)
+ ((#:configure-flags flags ''())
+ #~(append (list "-DCMake_ENABLE_DEBUGGER=false") #$flags))
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (delete 'delete-help-documentation)
+ (delete 'check)))))))
+
+; hypr suite
+
+(define hyprutils
+ (package
+ (name "hyprutils")
+ (version "0.2.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprutils")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0nxx5yb5k9726x95n8gi27xyxyzwb0ma0nj3czpb51sda1k0hz0g"))))
+ (build-system cmake-build-system)
+ ;(arguments (list #:tests? #f))
+ (native-inputs (list pkg-config gcc-13))
+ (inputs (list pixman))
+ (home-page "https://hyprland.org/")
+ (synopsis "Small C++ library for utilities used across the Hypr* ecosystem")
+ (description "C++ library for utilities in the Hypr ecosystem")
+ (license license:bsd-3)))
+
+(define-public libliftoff
+ (package
+ (name "libliftoff")
+ (version "0.1.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://github.com/emersion/libliftoff"
+ "/archive/refs/tags/v" version ".tar.gz"))
+ (sha256
+ (base32
+ "17ssbjbv8njgvfha8zsx4nixpi5xxl1rwvk0lcacgqk0nmjyb23s"))))
+ (build-system meson-build-system)
+ (native-inputs (list gcc-13
+ pkg-config
+ cmake-minimal
+ libdrm))
+ (home-page "https://github.com/emersion/libliftoff")
+ (synopsis "Lightweight KMS plane library")
+ (description "")
+ (license license:expat)))
+
+(define udis86
+ (let ((revision "186")
+ (commit "5336633af70f3917760a6d441ff02d93477b0c86"))
+ (package
+ (name "udis86")
+ (version (git-version "1.7.2" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/canihavesomecoffee/udis86")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0y5z1169wff578jylpafsww4px4y6gickhcs885a9c660d8xs9qy"))))
+ (build-system gnu-build-system)
+ (native-inputs (list autoconf automake libtool python-minimal-wrapper))
+ (home-page "https://github.com/canihavesomecoffee/udis86")
+ (synopsis "Disassembler Library for x86 and x86-64")
+ (description
+ "Udis86 is a disassembler for the x86 and x86-64 class of instruction
+set architectures. It consists of a C library called @code{libudis86} and a
+command line tool called @code{udcli} that incorporates the library.")
+ (license license:bsd-2))))
+
+(define hyprlang
+ (package
+ (name "hyprlang")
+ (version "0.5.2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprlang")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "17i0372yv0fcwnyki36crz7afw8c5f3j985m083p7rjbh4fn3br6"))))
+ (build-system cmake-build-system)
+ (native-inputs (list gcc-13))
+ (home-page "https://hyprland.org/hyprlang/")
+ (synopsis "Official implementation library for hypr config language")
+ (description
+ "This package provides the official implementation for hypr configuration
+language used in @code{hyprland}.")
+ (license license:gpl3+)))
+
+(define-public hyprcursor
+ (package
+ (name "hyprcursor")
+ (version "0.1.9")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprcursor")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0z3ar580n630145nq80qw0p8v0kai6knvhi6nr9z0y1jrb07b0ql"))))
+ (build-system cmake-build-system)
+ (arguments (list #:tests? #f)) ;FIXME
+ (inputs (list cairo hyprlang librsvg libzip tomlplusplus))
+ (native-inputs (list gcc-13 pkg-config))
+ (home-page "https://hyprland.org/")
+ (synopsis "Hyprland cursor format, library and utilities")
+ (description
+ "This package provides Hyprland cursor format, library and utilities.")
+ (license license:bsd-3)))
+
+(define-public hyprland-protocols
+ (package
+ (name "hyprland-protocols")
+ (version "0.2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprland-protocols")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1drjznj7fn6m5m6skhzh0p031cb5x0bb4i56jxnxwpwaa71g1z20"))))
+ (build-system meson-build-system)
+ (home-page "https://hyprland.org")
+ (synopsis "Wayland protocol extensions for Hyprland")
+ (description
+ "This package provides Wayland protocol extensions for Hyprland and it
+exists in an effort to bridge the gap between Hyprland and KDE/Gnome's
+functionality. Since @code{wlr-protocols} is closed for new submissions, and
+@code{wayland-protocols} is very slow with changes, this package will hold
+protocols used by Hyprland to bridge the aforementioned gap.")
+ (license license:bsd-3)))
+
+(define-public hyprwayland-scanner
+ (package
+ (name "hyprwayland-scanner")
+ (version "0.4.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprwayland-scanner")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1xc2xcxpq61lg964ihk0wbfzqqvibw20iz09g0p33ym51gwlpxr4"))))
+ (build-system cmake-build-system)
+ (arguments (list #:tests? #f)) ;No tests.
+ (inputs (list pugixml))
+ (native-inputs (list gcc-13 pkg-config))
+ (home-page "https://github.com/hyprwm/hyprwayland-scanner")
+ (synopsis "Hyprland implementation of wayland-scanner, in and for C++")
+ (description
+ "This package provides a Hyprland implementation of wayland-scanner, in and
+for C++.")
+ (license license:bsd-3)))
+
+(define hwdata-for-hyprland
+ (package
+ (inherit hwdata)
+ (arguments
+ (substitute-keyword-arguments (package-arguments hwdata)
+ ((#:phases _) #~%standard-phases)))
+ (outputs '("out"))))
+
+(define-public wayland-protocols-1.36
+ (package
+ (inherit wayland-protocols)
+ (name "wayland-protocols")
+ (version "1.36")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://gitlab.freedesktop.org/wayland/wayland-protocols"
+ "/-/releases/" version "/downloads/"
+ "wayland-protocols-" version ".tar.xz"))
+ (sha256
+ (base32
+ "14kyxywpfkgpjpkrybs28q1s2prnz30k1b4zap5a3ybrbvh4vzbi"))))))
+
+
+(define-public aquamarine
+ (package
+ (name "aquamarine")
+ (version "0.3.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/aquamarine")
+ (commit (string-append "v" version))))
+ (patches (list
+ (local-file "patches/aquamarine-fix-cmake.patch")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "114fspibmrwvzdmzv4xdy000vg7mn9r5vas3pr1ndb9xyl15ja1s"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list #:tests? #f))
+ (native-inputs
+ (list gcc-13
+ pkg-config
+ mesa-headers
+ hyprwayland-scanner
+ hwdata-for-hyprland))
+ (propagated-inputs
+ (list mesa-libglvnd
+ libglvnd
+ libseat-0.8.0
+ libinput-minimal-1.26.1
+ libxkbcommon
+ libdisplay-info
+ libxcb
+ libxinerama
+ libxcursor
+ xcb-util
+ xcb-util-errors
+ xcb-util-keysyms
+ xcb-util-wm
+ wayland
+ wayland-protocols-1.36))
+ (inputs
+ (list hyprutils pixman))
+ (home-page "https://hyprland.org")
+ (synopsis "Aquamarine is a very light linux rendering backend library ")
+ (description "") ;; TODO: this
+ (license license:bsd-3)))
+
+
+(define xorg-server-xwayland-for-hyprland
+ (package
+ (inherit xorg-server-xwayland)
+ (arguments
+ (substitute-keyword-arguments (package-arguments xorg-server-xwayland)
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'install 'install-headers
+ (lambda _
+ (let ((fmw (string-append #$output "/include")))
+ (mkdir-p fmw)
+ (copy-recursively "include" fmw))
+ ))
+ ))))))
+
+
+(define-public hyprland-ryan
+ (package
+ (name "hyprland")
+ (version "0.42.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/Hyprland")
+ (commit (string-append "v" version))))
+ (patches (list
+ (local-file "patches/hyprland-fix-cmake.patch")))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ (for-each delete-file-recursively
+ '("hyprpm"
+ "subprojects"))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1hp2xafvlymikxsi6pr8iik35g46683bg376n9hkjxgh9y6njzqv"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list #:tests? #f
+ #:build-type "release"
+ #:cmake cmake-minimal-3.27.0
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'fix-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* (find-files "src" "\\.cpp$")
+ (("/usr/local(/bin/Hyprland)" _ path)
+ (string-append #$output path))
+ (("/usr") #$output)
+ (("(execAndGet\\(\")\\<(cat|fc-list|lspci)\\>"
+ _ pre cmd)
+ (string-append
+ pre (search-input-file
+ inputs (string-append "bin/" cmd))))
+ (("\\<cc\\>") (search-input-file inputs "bin/gcc"))
+ ;; NOTE: Add binutils to inputs will override ld-wrapper.
+ (("(execAndGet\\(\\(\")\\<nm\\>" _ pre)
+ (string-append pre #$binutils "/bin/nm"))
+ (("\\<(addr2line|objcopy)\\>" _ cmd)
+ (string-append #$binutils "/bin/" cmd)))
+ (substitute* "CMakeLists.txt"
+ (("libudis86") "udis86"))
+ ))
+ (add-after 'fix-path 'fix-protocols
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((protocols (string-append
+ (getcwd)
+ "/subprojects/hyprland-protocols/protocols")))
+ (mkdir-p protocols)
+ (copy-recursively
+ (search-input-directory inputs "share/hyprland-protocols/protocols")
+ protocols))))
+ (add-after 'install 'wrap-program
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out"))
+ (mesa (assoc-ref inputs "mesa")))
+ (wrap-program (string-append out "/bin/Hyprland")
+ `("__EGL_VENDOR_LIBRARY_DIRS" prefix ,(list (string-append mesa "/share/glvnd/egl_vendor.d")))))))
+ )))
+ (native-inputs
+ (list gcc-13
+ jq
+ pkg-config
+ hyprwayland-scanner
+ hwdata-for-hyprland))
+ (inputs
+ (list gcc-13
+
+ cairo
+ pango
+ pciutils
+ libliftoff
+ udis86
+
+ aquamarine
+ hyprcursor
+ hyprland-protocols
+ hyprlang
+ hyprutils
+
+ xorg-server-xwayland-for-hyprland))
+ (home-page "https://hyprland.org")
+ (synopsis "Dynamic tiling Wayland compositor based on wlroots")
+ (description
+ "Hyprland is a dynamic tiling Wayland compositor based on @code{wlroots}
+that doesn't sacrifice on its looks. It supports multiple layouts, fancy
+effects, has a very flexible IPC model allowing for a lot of customization, and
+more.")
+ (license license:bsd-3)))
+
+
+(define-public hyprpaper
+ (package
+ (name "hyprpaper")
+ (version "0.7.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://github.com/hyprwm/hyprpaper"
+ "/archive/refs/tags/v" version ".tar.gz"))
+ (sha256
+ (base32
+ "1d23nsj5hzyxwvhkg9a7x1b8jgyqwzad91zb1894jnxr2d844h28"))))
+ (build-system cmake-build-system)
+ (arguments
+ `(#:tests? #f))
+ (native-inputs
+ (list gcc-13
+ pkg-config))
+ (inputs
+ (list hyprlang
+ wayland-protocols-1.36
+ wayland
+ cairo
+ libjpeg-turbo
+ libwebp
+ mesa
+ pango
+ libglvnd))
+ (home-page "https://github.com/hyprwm/hyprpaper")
+ (license license:bsd-3)
+ (synopsis "Hyprpaper is a blazing fast wayland wallpaper utility with IPC controls.")
+ (description "Hyprpaper is a blazing fast wayland wallpaper utility with IPC controls.")))
+
+
+(define-public hypridle
+ (package
+ (name "hypridle")
+ (version "0.1.2")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://github.com/hyprwm/hypridle"
+ "/archive/refs/tags/v" version ".tar.gz"))
+ (sha256
+ (base32
+ "0ybwip7yq9q569naz5bnrvcdz99648c4pln2zi30z21y333hpas0"))))
+ (build-system cmake-build-system)
+ (arguments
+ `(#:tests? #f))
+ (native-inputs
+ (list gcc-13
+ pkg-config))
+ (inputs
+ (list hyprlang
+ wayland-protocols-1.36
+ wayland
+ sdbus-c++))
+ (home-page "https://github.com/hyprwm/hypridle")
+ (license license:bsd-3)
+ (synopsis "Hyprland's idle daemon ")
+ (description "Hyprland's idle daemon ")))
@@ -0,0 +1,76 @@
+(define-module (ryan-packages linux)
+ #:use-module (guix download)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (guix build utils)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages vim)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages textutils)
+ #:use-module (gnu packages tree-sitter)
+ #:use-module (gnu packages julia)
+ #:use-module (gnu packages python-xyz)
+ #:use-module (guix git-download)
+ #:use-module (guix utils))
+
+(define-public bluez-ryan
+ (package
+ (inherit bluez)
+ (version "5.79")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "mirror://kernel.org/linux/bluetooth/bluez-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "12pal1m4xlr8k7kxb6isv5lbaca2wc5zcgy0907wfwcz78qaar21"))))
+ (arguments (substitute-keyword-arguments (package-arguments bluez)
+ ((#:configure-flags ''())
+ #~(append (list "--disable-manpages") #$flags))
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'configure 'fix-make
+ (lambda _
+ (substitute* "Makefile"
+ (("install-confDATA:") "install-IGNORED:")
+ (("install-confDATA") "")
+ (("bluetoothd-fix-permissions:") "install-IGNORED2:")
+ (("bluetoothd-fix-permissions") ""))))))))))
+
+(define-public neovim-ryan
+ (package
+ (inherit neovim)
+ (version "0.11.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/neovim/neovim")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "neovim" version))
+ (sha256
+ (base32
+ "0arypdiycmss5g9wav21hfdc384v1ly82jnsc32zincl2y3f628q"))))
+ (native-inputs (modify-inputs (package-native-inputs neovim) (prepend gcc-14)))
+ (inputs (modify-inputs (package-inputs neovim) (append utf8proc) (replace "tree-sitter" treesitter-ryan)))))
+
+(define-public treesitter-ryan
+ (package
+ (inherit tree-sitter)
+ (version "0.25.4")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/tree-sitter/tree-sitter")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "tree-sitter" version))
+ (sha256
+ (base32
+ "0d4ca0ikpmkqg9xlbx45c7mafr5yz0g99y3s3jy5xk86f0nkz8ga"))
+ (modules '((guix build utils)))
+ (snippet #~(begin
+ (delete-file-recursively "lib/src/unicode")))))))
+
+neovim-ryan
@@ -0,0 +1,102 @@
+(define-module (ryan-packages login)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix build-system zig)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages nss)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages zig)
+ #:use-module (gnu packages zig-xyz)
+ #:use-module (guix utils))
+
+(define ly-source
+ (let ((commit "cdba55657976ad289da090b7d4fd1e5e16c156f9")
+ (revision "11")
+ (name "ly")
+ (version "ly-rev11"))
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ryan77627/ly-fork")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1czv95pwmsv8zi92pjrra3swr7m82l3spks8mdkryxk9k62yd2k6")))))
+
+(define ly-zig-cache
+ (computed-file
+ "ly-zig-cache"
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+ (let ((cert-dir (string-append #$nss-certs "/etc/ssl/certs"))
+ (certs "/tmp/ca-certificates.crt")
+ (zig-bin (string-append #$zig-0.15 "/bin"))
+ (git-bin (string-append #$git-minimal "/bin"))
+ (curl-bin (string-append #$curl "/bin"))
+ (proot-bin (string-append #$proot "/bin"))
+ (coreutils-bin (string-append #$(@ (gnu packages base) coreutils) "/bin")))
+ (call-with-output-file certs
+ (lambda (out)
+ (for-each (lambda (file)
+ (call-with-input-file file
+ (lambda (p)
+ (dump-port p out)
+ (display "\n" out))))
+ (find-files cert-dir "\\.pem$"))))
+ (setenv "HOME" "/tmp")
+ (setenv "PATH" (string-append zig-bin ":" curl-bin ":" proot-bin ":" git-bin ":" coreutils-bin))
+ (setenv "ZIG_GLOBAL_CACHE_DIR" "/tmp/zcache")
+ (setenv "SSL_CERT_FILE" certs)
+ (setenv "GIT_SSL_CAINFO" certs)
+ (setenv "CURL_CA_BUNDLE" certs)
+ (mkdir-p "/tmp/zcache")
+ (mkdir-p "/tmp/src")
+ (copy-recursively #$ly-source "/tmp/src")
+ (chmod "/tmp/src" #o755)
+ (with-directory-excursion "/tmp/src"
+ (invoke "proot" "-b" (string-append certs ":/etc/ssl/certs/ca-certificates.crt")
+ "zig" "build" "--fetch=all"))
+ (copy-recursively "/tmp/zcache/p" #$output))))
+ #:options (list
+ #:hash-algo 'sha256
+ #:hash (base32 "1qmj0ysynvyfvwc68apy3lxqccrv3rxak5a21ij6y0c2dw3yzl64")
+ #:recursive? #t)))
+
+(define-public ly
+ (package
+ (name "ly")
+ (version "1.3.2")
+ (source ly-source)
+ (build-system zig-build-system)
+ (arguments
+ (list
+ #:zig-release-type "small"
+ #:zig-build-flags #~(list "-Denable_x11_support=false"
+ "--search-prefix"
+ #$(this-package-input "linux-pam"))
+ #:zig zig-0.15
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-before 'configure 'seed-zig-cache
+ (lambda _
+ (let ((cache-dir "/tmp/zig-cache"))
+ (mkdir-p cache-dir)
+ (symlink #$ly-zig-cache (string-append cache-dir "/p"))
+ (setenv "ZIG_GLOBAL_CACHE_DIR" cache-dir)))))))
+ (native-inputs (list
+ ly-zig-cache))
+ (inputs (list linux-pam))
+ (home-page "https://codeberg.org/fairyglade/ly")
+ (synopsis "TTY-based login manager written in Zig.")
+ (description "Zig-based login manager that can launch X Server and Wayland based compositors.")
+ (license license:expat)))
+
+ly
@@ -0,0 +1,58 @@
+(define-module (ryan-packages mozilla)
+ #:use-module (gnu)
+ #:use-module (guix download)
+ #:use-module (guix packages)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages linux)
+ #:use-module (nonguix build-system binary)
+ #:use-module (guix build-system trivial)
+ #:use-module (nongnu packages mozilla))
+
+(define-public firefox-wrapped
+ (package
+ (name "firefox-wrapped")
+ (source #f)
+ (version "0.1")
+ (synopsis "Simple wrapper for pipewire in firefox")
+ (description "Simple wrapper for pipewire in firefox")
+ (home-page "http://mozilla.org/")
+ (license license:mpl2.0)
+ (inputs
+ `(("bash" ,bash-minimal)
+ ("pipewire" ,pipewire)
+ ("firefox" ,firefox)))
+ (build-system trivial-build-system)
+ (arguments
+ '(#:modules ((guix build utils))
+ #:builder
+ (begin
+ (use-modules (guix build utils))
+ (let* ((bash (assoc-ref %build-inputs "bash"))
+ (firefox (assoc-ref %build-inputs "firefox"))
+ (pipewire (assoc-ref %build-inputs "pipewire"))
+ (out (assoc-ref %outputs "out"))
+ (exe (string-append out "/bin/firefox")))
+ (mkdir-p (dirname exe))
+
+ (call-with-output-file exe
+ (lambda (port)
+ ;; NOTE: added "export LD_LIBRARY_PATH=pipewire"
+ ;; maybe this can be done better with `wrap-programm'
+ (format port "#!~a \n
+export LD_LIBRARY_PATH=~a \n
+export MOZ_ENABLE_WAYLAND=1 \n
+export MOZ_USE_XINPUT2=1 \n
+exec ~a $@\n"
+ (string-append bash "/bin/bash")
+ (string-append pipewire "/lib")
+ (string-append firefox "/bin/firefox"))))
+ (chmod exe #o555)
+
+ ;; Provide the manual and .desktop file.
+ (copy-recursively (string-append firefox "/share")
+ (string-append out "/share"))
+ (substitute* (string-append
+ out "/share/applications/firefox.desktop")
+ ((firefox) out))
+ #t))))))
@@ -0,0 +1,37 @@
+(define-module (ryan-packages networking)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system copy)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages networking)
+ #:use-module (ryan-packages linux)
+ #:use-module (guix utils))
+
+(define-public blueman-ryan
+ (package
+ (inherit blueman)
+ (inputs (modify-inputs (package-inputs blueman) (delete "bluez") (prepend bluez-ryan)))))
+
+(define-public netbird-bin
+ (package
+ (name "netbird")
+ (version "0.68.1")
+ (source (origin
+ (method url-fetch/tarbomb)
+ (uri (string-append "https://github.com/netbirdio/netbird/releases/download/v" version "/netbird_" version "_linux_amd64.tar.gz"))
+ (sha256
+ (base32
+ "08xn4mnr0h4hyqx6447g3p2jaq6yknvllq18k21ac3936dxz4d9a"))))
+ (build-system copy-build-system)
+ (arguments
+ (list #:install-plan
+ #~'(("." "bin/" #:include("netbird")))))
+ (supported-systems '("x86_64-linux"))
+ (home-page "https://netbird.io")
+ (synopsis "Private Wireguard-based networks")
+ (description "This package provides @command{netbird}, which is an alternative to Tailscale.")
+ (license license:bsd-3)))
+
+netbird-bin
@@ -0,0 +1,237 @@
+(define-module (ryan-packages package-management)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system meson)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix packages)
+ #:use-module (guix git-download)
+ #:use-module (guix gexp)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages backup)
+ #:use-module (gnu packages bdw-gc)
+ #:use-module (gnu packages bison)
+ #:use-module (gnu packages boost)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages crypto)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages databases)
+ #:use-module (gnu packages flex)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages libedit)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages llvm)
+ #:use-module (gnu packages markup)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu packages perl)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages sqlite)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages web)
+ #:use-module (guix utils))
+
+(define-public nix-ryan
+ (package
+ (name "nix")
+ (version "2.29.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/NixOS/nix")
+ (commit version)))
+ (file-name (git-file-name "nix" version))
+ (sha256
+ (base32 "19cd94xpjzwmclscpw9x3gfic0vf160llfnh9diz2l4823fw8iky"))))
+ (build-system meson-build-system)
+ (arguments
+ (list
+ #:configure-flags #~(list "--sysconfdir=/etc")
+ #:tests? #f))
+ (native-inputs
+ (list autoconf
+ autoconf-archive
+ automake
+ bison
+ gcc-14
+ cmake
+ flex
+ perl
+ perl-dbi
+ perl-dbd-sqlite
+ googletest
+ jq
+ libtool
+ pkg-config
+ rapidcheck))
+ (inputs
+ (list boost-ryan
+ brotli
+ bzip2
+ curl
+ editline
+ libarchive
+ libgc-ryan
+ libseccomp-ryan
+ libsodium
+ libbl3
+ libgit2-1.9
+ lowdown
+ nlohmann-json
+ openssl
+ sqlite
+ toml11
+ xz
+ zlib))
+ (home-page "https://nixos.org/")
+ (synopsis "The Nix package manager")
+ (description "todo")
+ (license license:lgpl2.1+)))
+
+(define libbl3
+ (package
+ (name "blake3")
+ (version "1.8.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/BLAKE3-team/BLAKE3")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1pm7285insrmpfwwal8rnp3yhvc6s2ki8b6ccmbh2qfnnl95a010"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:configure-flags #~(list "-DCMAKE_POSITION_INDEPENDENT_CODE=on")
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'enter-build-directory
+ (lambda _ (chdir "c") #t))
+ (add-before 'build 'set-env
+ (lambda _
+ (setenv "CFLAGS" "-fPIC")
+ (setenv "CXXFLAGS" "-fPIC")
+ #t)))))
+ (home-page "https://github.com/BLAKE3-team/BLAKE3")
+ (synopsis "Official C implementation of BLAKE3")
+ (description "todo")
+ (license license:expat)))
+
+(define toml11
+ (package
+ (name "toml11")
+ (version "v4.4.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ToruNiina/toml11")
+ (commit version)))
+ (sha256
+ (base32 "0d15b50cf9jgvh3w99xh6crh03bn2dmv9bdyvzq6knsk2diql1dj"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (home-page "https://github.com/ToruNiina/toml11")
+ (synopsis "TODO")
+ (description "TODO")
+ (license license:expat)))
+
+(define libgit2-1.9
+ (package
+ (inherit libgit2-1.8)
+ (version "1.9.0")
+ (source (origin
+ (inherit (package-source libgit2-1.8))
+ (uri (git-reference
+ (url "https://github.com/libgit2/libgit2")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libgit2" version))
+ (sha256
+ (base32
+ "06ajn5i5l1209z7x7jxcpw68ph0a6g3q67bmx0jm381rr8cb4zdz"))
+ (snippet
+ #~(begin
+ (for-each delete-file-recursively
+ '("deps/llhttp"
+ "deps/ntlmclient"
+ "deps/pcre"
+ "deps/winhttp"
+ "deps/zlib"))))))))
+
+(define libgc-ryan
+ (package
+ (inherit libgc)
+ (version "8.2.8")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ivmai/bdwgc")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libgc" version))
+ (sha256
+ (base32 "1xzvr5wb36flkbjqjyk5ilhda1a3yk61rgprxfjzdf1rzlmqn12i"))))
+ (native-inputs (modify-inputs (package-native-inputs libgc) (prepend autoconf autoconf-archive automake libtool)))))
+
+(define boost-ryan
+ (package
+ (inherit boost)
+ (version "1.87.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/boostorg/boost")
+ (commit (string-append "boost-" version))
+ (recursive? #t)))
+ (file-name (git-file-name "boost" version))
+ (sha256
+ (base32 "1xirczrh2rgk2x70crw33w6566d2by9q675wlyv0zj69f49z8prn"))))
+ (native-inputs (modify-inputs (package-native-inputs boost) (prepend clang-18)))
+ (arguments
+ (append
+ (substitute-keyword-arguments (package-arguments boost))
+ (list
+ #:tests? #f
+ #:configure-flags
+ #~(let ((icu (dirname (dirname (search-input-file
+ %build-inputs "bin/uconv")))))
+ (list
+ ;; Auto-detection looks for ICU only in traditional
+ ;; install locations.
+ (string-append "--with-icu=" icu)
+ ;; Ditto for Python.
+ #$@(if (%current-target-system)
+ #~()
+ #~((let ((python (dirname (dirname (search-input-file
+ %build-inputs
+ "bin/python")))))
+ (string-append "--with-python-root=" python)
+ (string-append "--with-python=" python
+ "/bin/python")
+ (string-append "--with-python-version="
+ (python-version python)))))
+ "--with-toolset=clang")))))))
+
+(define libseccomp-ryan
+ (package
+ (inherit libseccomp)
+ (version "2.6.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/seccomp/libseccomp")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libseccomp" version))
+ (sha256
+ (base32 "189yh66aj3z3jvns739qbj504f3mcl3w44pxxizw877pbj3kal11"))))
+ (native-inputs (modify-inputs (package-native-inputs libseccomp) (prepend autoconf autoconf-archive automake libtool)))))
+
+
+nix-ryan
@@ -0,0 +1,25 @@
+From 7b6f11ed0708d8775f42107e19d9099835e2498e Mon Sep 17 00:00:00 2001
+From: Freya Murphy <freya@freyacat.org>
+Date: Mon, 5 Aug 2024 17:52:48 -0400
+Subject: [PATCH] fix cmake
+
+---
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index bb7a4d6..7f7e7ff 100644
+--- a/CMakeLists.txt
+@@ -19,7 +19,7 @@ set(INCLUDE ${CMAKE_INSTALL_FULL_INCLUDEDIR})
+ set(LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR})
+
+ find_package(PkgConfig REQUIRED)
+-find_package(OpenGL REQUIRED COMPONENTS "GLES2")
++find_package(OpenGL REQUIRED)
+ find_package(hyprwayland-scanner 0.4.0 REQUIRED)
+ pkg_check_modules(
+ deps
+--
+2.45.1
+
@@ -0,0 +1,41 @@
+From 33fac66982422104cc1c2664f9a841fc96295c13 Mon Sep 17 00:00:00 2001
+From: Freya Murphy <freya@freyacat.org>
+Date: Mon, 5 Aug 2024 20:35:50 -0400
+Subject: [PATCH] fix cmake
+
+---
+ CMakeLists.txt | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index fa58b63d..51ea6cfa 100644
+--- a/CMakeLists.txt
+@@ -26,7 +26,6 @@ execute_process(COMMAND ./scripts/generateVersion.sh
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
+
+ # udis
+-add_subdirectory("subprojects/udis86")
+
+ if(CMAKE_BUILD_TYPE)
+ string(TOLOWER ${CMAKE_BUILD_TYPE} BUILDTYPE_LOWER)
+@@ -85,7 +84,7 @@ if(LEGACY_RENDERER)
+ else()
+ set(GLES_VERSION "GLES3")
+ endif()
+-find_package(OpenGL REQUIRED COMPONENTS ${GLES_VERSION})
++find_package(OpenGL REQUIRED)
+
+ pkg_check_modules(
+ deps
+@@ -314,7 +313,6 @@ protocolwayland()
+
+ # tools
+ add_subdirectory(hyprctl)
+-add_subdirectory(hyprpm)
+
+ # binary and symlink
+ install(TARGETS Hyprland)
+--
+2.45.1
+
@@ -0,0 +1,45 @@
+;;; Stolen from https://g.tylerm.dev/tylerm/dotfiles/raw/branch/main/modules/home-packages/virtualization.scm
+
+(define-module (ryan-packages virtualization)
+ #:use-module (guix packages)
+ #:use-module (guix utils)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu packages build-tools)
+ #:use-module (gnu packages virtualization)
+ #:use-module (gnu packages firmware)
+ #:use-module (guix gexp))
+
+(define-public libvirt-ovmf
+ (package
+ (inherit libvirt)
+ (name "libvirt-ovmf")
+ (inputs
+ (modify-inputs (package-inputs libvirt)
+ (append qemu)))
+ (arguments
+ (substitute-keyword-arguments (package-arguments libvirt)
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'install 'install-firmware
+ (lambda _
+ (let ((fmw (string-append #$output "/share/qemu")))
+ (mkdir-p fmw)
+ (copy-recursively #$(file-append qemu "/share/qemu") fmw))))))))))
+
+(define-public virt-manager-ovmf
+ (package
+ (inherit virt-manager)
+ (name "virt-manager-ovmf")
+ (inputs
+ (modify-inputs (package-inputs virt-manager)
+ (append qemu)))
+ (arguments
+ (substitute-keyword-arguments (package-arguments virt-manager)
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'install 'install-firmware
+ (lambda _
+ (let ((fmw (string-append #$output "/share/qemu")))
+ (mkdir-p fmw)
+ (copy-recursively #$(file-append qemu "/share/firmware") fmw))))))))))
@@ -0,0 +1,63 @@
+(define-module (ryan-packages web-server)
+ #:use-module (guix download)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (gnu packages)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system go)
+ #:use-module (guix git-download)
+ #:use-module (gnu packages golang)
+ #:use-module (guix utils))
+
+(define-public go-github-com-caddy-certmagic
+ (package
+ (name "certmagic")
+ (version "0.19.2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/caddyserver/certmagic")
+ (commit (string-append "v" version))))
+ (sha256
+ (base32
+ "0jgbkj0azkbs828vsd3gycpab8pycgf55vrxkvnfmwfjpdiq1551"))))
+ (build-system go-build-system)
+ (arguments
+ (list #:tests? #f
+ #:go go-1.20
+ #:import-path "github.com/caddyserver/certmagic"))
+ (home-page "https://github.com/caddyserver/certmagic")
+ (synopsis "Certbot ACME")
+ (description "Automagic certificate management in Caddy")
+ (license license:expat)))
+
+(define-public caddy
+ (package
+ (name "Caddy")
+ (version "2.7.4")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/caddyserver/caddy")
+ (commit (string-append "v" version))))
+ (sha256
+ (base32
+ "0jgbkj0azkbs828vsd3gycpab8pycgf55vrxkvnfmwfjpdiq1551"))))
+ (build-system go-build-system)
+ (native-inputs (list go-github-com-google-uuid
+ go-go-uber-org-zap
+ go-github-com-caddy-certmagic
+ go-github-com-prometheus-client-golang
+ go-golang-org-x-term
+ go-golang-org-x-sys))
+ (arguments
+ (list #:tests? #f
+ #:go go-1.20
+ ;#:unpack-path "github.com/caddyserver/caddy"
+ #:import-path "github.com/caddyserver/caddy"))
+ (home-page "https://github.com/caddyserver/caddy")
+ (synopsis "Web server")
+ (description "This package serves the web")
+ (license license:expat)))
+
+caddy
@@ -1,16 +1,36 @@
(define-module (ryan-packages wm)
+ #:use-module ((guix licenses) #:prefix license:)
#:use-module (guix download)
#:use-module (guix packages)
#:use-module (guix gexp)
#:use-module (gnu packages)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix build-system meson)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages audio)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages gl)
+ #:use-module (gnu packages image)
+ #:use-module (gnu packages llvm)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages check)
#:use-module (guix git-download)
#:use-module (guix utils)
+ ;#:use-module (rosenthal packages wm)
+ ;#:use-module (ryan-packages gtk)
+ #:use-module (ryan-packages gl)
#:use-module (gnu packages wm))
(define-public swaylock-effects-new
(package
(inherit swaylock-effects)
- (version "1.6.11")
+ (version "1.7.0.0")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -18,12 +38,107 @@
(commit (string-append "v" version))))
(sha256
(base32
- "0j7dxn66xqlf6iv2arqzz7mxlh7nf85anvpyf30d2frcidarda9h"))))
+ "0cgpbzdpxj6bbpa8jwql1snghj21mhryyvj6sk46g66lqvwlrqbj"))))
(inputs (modify-inputs (package-inputs swaylock-effects) (delete "linux-pam")))))
+(define-public swayidle-new
+ (package
+ (inherit swayidle)
+ (version "1.8.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/swaywm/swayidle")
+ (commit version)))
+ (file-name (git-file-name "swayidle" version))
+ (sha256
+ (base32 "0y0qdqzx90kvk6l80darldvizr7p5g65bnblhxlq5a2rgvs9hkpx"))))))
+
(define-public waybar-new
(package
(inherit waybar)
- (arguments (list #:configure-flags #~(list "-Dexperimental=true")))))
+ (name "waybar-new")
+ (version "0.10.3")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/Alexays/Waybar")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "04xd61ycn1nisq1s5ch14zkbsjcfcy6n29nkjn68s2ribmws0iid"))))
+ (arguments
+ (list
+ #:configure-flags #~(list "--wrap-mode=nodownload" "-Dexperimental=true")))))
+ ;(inputs (modify-inputs (package-inputs waybar) (delete "gtkmm") (prepend gtkmm-ryan))))) ;(prepend python cava catch2 gtkmm)))))
+ ;(native-inputs (modify-inputs (package-native-inputs waybar) (prepend gcc-13)))))
+
+(define cairo-hypr ;;; stolen from rosenthal since it is not exported
+ (package
+ (inherit cairo)
+ (name "cairo")
+ (version "1.18.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://cairographics.org/releases/cairo-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "0r0by563s75xyzz0d0j1nmjqmdrk2x9agk7r57p3v8vqp4v0ffi4"))))
+ (build-system meson-build-system)
+ (arguments
+ (list #:tests? #f
+ #:glib-or-gtk? #t
+ #:configure-flags
+ #~(list "-Dspectre=disabled")))
+ (outputs '("out"))))
+
+(define-public hyprlock
+ (let ((commit "dba9d8b5175a6f23463035aafc6b0c741f9b73a5")
+ (revision "1"))
+ (package
+ (name "hyprlock")
+ (version (git-version "0.4.1" revision commit))
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprlock")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1zzv7w7hn8k71w75a9mz548cbl4f8zcsd8i92abgnrx5x9i35q63"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'install 'wrap-program
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out"))
+ (mesa (assoc-ref inputs "mesa")))
+ (wrap-program (string-append out "/bin/hyprlock")
+ `("__EGL_VENDOR_LIBRARY_DIRS" prefix ,(list (string-append mesa "/share/glvnd/egl_vendor.d"))))))))))
+ (native-inputs
+ (list gcc-13
+ pkg-config
+ mesa-headers
+ wayland))
+ (inputs
+ (list cairo
+ pango
+ libxkbcommon
+ hyprlang
+ mesa-libglvnd
+ libdrm
+ libglvnd
+ wayland-protocols
+ linux-pam))
+ (home-page "https://github.com/hyprwm/hyprlock")
+ (license license:bsd-3)
+ (synopsis "Screen locker for Hyprland")
+ (description "Screen locker for hyprland."))))
-waybar-new
@@ -0,0 +1,371 @@
+(define-module (ryan-packages wmrosenthal)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix build-system meson)
+ #:use-module (guix build-system qt)
+ #:use-module (guix download)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module (guix packages)
+ #:use-module (guix utils)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages gl)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages guile)
+ #:use-module (gnu packages image)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages man)
+ #:use-module (gnu packages pciutils)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages qt)
+ #:use-module (gnu packages web)
+ #:use-module (gnu packages wm)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (rosenthal packages freedesktop))
+
+(define cairo-for-hyprland
+ (package
+ (inherit cairo)
+ (name "cairo")
+ (version "1.18.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://cairographics.org/releases/cairo-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "0r0by563s75xyzz0d0j1nmjqmdrk2x9agk7r57p3v8vqp4v0ffi4"))))
+ (build-system meson-build-system)
+ (arguments
+ (list #:tests? #f
+ #:glib-or-gtk? #t
+ #:configure-flags
+ #~(list "-Dspectre=disabled")))
+ (outputs '("out"))))
+
+(define hwdata-for-hyprland
+ (package
+ (inherit hwdata)
+ (arguments
+ (substitute-keyword-arguments (package-arguments hwdata)
+ ((#:phases _) #~%standard-phases)))
+ (outputs '("out"))))
+
+(define libdrm-for-hyprland
+ (package
+ (inherit libdrm)
+ (name "libdrm")
+ (version "2.4.120")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://dri.freedesktop.org/libdrm/libdrm-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "0yijzgg6rdsa68bz03sw0lcfa2nclv9m3as1cja50wkcyxim7x9v"))))))
+
+(define udis86-for-hyprland
+ (let ((revision "186")
+ (commit "5336633af70f3917760a6d441ff02d93477b0c86"))
+ (package
+ (name "udis86")
+ (version (git-version "1.7.2" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/canihavesomecoffee/udis86")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0y5z1169wff578jylpafsww4px4y6gickhcs885a9c660d8xs9qy"))))
+ (build-system gnu-build-system)
+ (native-inputs (list autoconf automake libtool python-minimal-wrapper))
+ (home-page "https://github.com/canihavesomecoffee/udis86")
+ (synopsis "Disassembler Library for x86 and x86-64")
+ (description
+ "Udis86 is a disassembler for the x86 and x86-64 class of instruction
+set architectures. It consists of a C library called @code{libudis86} and a
+command line tool called @code{udcli} that incorporates the library.")
+ (license license:bsd-2))))
+
+(define wayland-protocols-for-hyprland
+ (package
+ (inherit wayland-protocols)
+ (name "wayland-protocols")
+ (version "1.34")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://gitlab.freedesktop.org/wayland/wayland-protocols"
+ "/-/releases/" version "/downloads/"
+ "wayland-protocols-" version ".tar.xz"))
+ (sha256
+ (base32
+ "1sxgvis0abkymc02nhx2svm60myiq3shvy759sphpxl5rp52g6y5"))))))
+
+(define wlroots-hyprland
+ (package
+ (inherit wlroots)
+ (name "wlroots")
+ (version "611a4f24cd2384378f6e500253983107c6656c64")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/wlroots-hyprland")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0wpqa241656rcnpszkq14ikz4dxsal2xrrc7ryn22xmciw4rkxxw"))))
+ (propagated-inputs
+ (modify-inputs (package-propagated-inputs wlroots)
+ (prepend libdrm-for-hyprland)
+ (replace "libinput-minimal" libinput-minimal-1.24.0)
+ (replace "wayland-protocols" wayland-protocols-for-hyprland)))
+ (native-inputs
+ (modify-inputs (package-native-inputs wlroots)
+ (replace "hwdata" `(,hwdata-for-hyprland "out"))))))
+
+(define-public hyprcursor
+ (package
+ (name "hyprcursor")
+ (version "0.1.5")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprcursor")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0252abb9yjskclhxjc2ar6r2x9pfllpbas7rfp4597i2gnxrzbvv"))))
+ (build-system cmake-build-system)
+ (arguments (list #:tests? #f)) ;FIXME
+ (inputs (list cairo-for-hyprland hyprlang librsvg libzip))
+ (native-inputs (list gcc-13 pkg-config))
+ (home-page "https://hyprland.org/")
+ (synopsis "Hyprland cursor format, library and utilities")
+ (description
+ "This package provides Hyprland cursor format, library and utilities.")
+ (license license:bsd-3)))
+
+(define-public hyprland-protocols
+ (package
+ (name "hyprland-protocols")
+ (version "0.2")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprland-protocols")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1drjznj7fn6m5m6skhzh0p031cb5x0bb4i56jxnxwpwaa71g1z20"))))
+ (build-system meson-build-system)
+ (home-page "https://hyprland.org")
+ (synopsis "Wayland protocol extensions for Hyprland")
+ (description
+ "This package provides Wayland protocol extensions for Hyprland and it
+exists in an effort to bridge the gap between Hyprland and KDE/Gnome's
+functionality. Since @code{wlr-protocols} is closed for new submissions, and
+@code{wayland-protocols} is very slow with changes, this package will hold
+protocols used by Hyprland to bridge the aforementioned gap.")
+ (license license:bsd-3)))
+
+(define-public hyprland
+ (package
+ (name "hyprland")
+ (version "fe7b748eb668136dd0558b7c8279bfcd7ab4d759")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/Hyprland")
+ (commit version)
+ (recursive? #t)))
+ (file-name (git-file-name name "0.39.1"))
+ ; (modules '((guix build utils)))
+ ; (snippet
+ ; '(begin
+ ; ;; Remove bundled sources and hyprpm utility.
+ ; (substitute* "meson.build"
+ ; ((".*hyprpm/src.*") ""))
+ ; (for-each delete-file-recursively
+ ; '("hyprpm"
+ ; "subprojects"))))
+ (sha256
+ (base32
+ "1b2l1j7i7fgy66c1nai7z16l0a95ay3xqq7yr2r6h7sq0jlnpgpc"))))
+ (build-system meson-build-system)
+ (arguments
+ (list #:build-type "release"
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'fix-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* (find-files "src" "\\.cpp$")
+ (("/usr/local(/bin/Hyprland)" _ path)
+ (string-append #$output path))
+ (("/usr") #$output)
+ (("(execAndGet\\(\")\\<(cat|fc-list|lspci)\\>"
+ _ pre cmd)
+ (string-append
+ pre (search-input-file
+ inputs (string-append "bin/" cmd))))
+ (("\\<cc\\>") (search-input-file inputs "bin/gcc"))
+ ;; NOTE: Add binutils to inputs will override ld-wrapper.
+ (("(execAndGet\\(\\(\")\\<nm\\>" _ pre)
+ (string-append pre #$binutils "/bin/nm"))
+ (("\\<(addr2line|objcopy)\\>" _ cmd)
+ (string-append #$binutils "/bin/" cmd))))))))
+ (native-inputs (cons* (list "gcc-13" gcc-13) (list "jq" jq) (list "pkg-config" pkg-config) (list "cmake" cmake) (list "hwdata" hwdata-for-hyprland) (package-native-inputs wlroots)))
+ (propagated-inputs
+ (cons*
+ (list "libdrm-for-hyprland" libdrm-for-hyprland)
+ (list "libinput-minimal" libinput-minimal-1.24.0)
+ (list "wayland-protocols" wayland-protocols-for-hyprland)
+ (package-propagated-inputs wlroots)))
+
+ (inputs
+ (list cairo-for-hyprland
+ gcc-13
+ hyprcursor
+ hyprland-protocols
+ hyprlang
+ pango
+ pciutils))
+ (home-page "https://hyprland.org")
+ (synopsis "Dynamic tiling Wayland compositor based on wlroots")
+ (description
+ "Hyprland is a dynamic tiling Wayland compositor based on @code{wlroots}
+that doesn't sacrifice on its looks. It supports multiple layouts, fancy
+effects, has a very flexible IPC model allowing for a lot of customization, and
+more.")
+ (license license:bsd-3)))
+
+(define-public hyprlang
+ (package
+ (name "hyprlang")
+ (version "0.5.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/hyprlang")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0f8mahg6d6wylybvh6hgayls57miwwv4w69fbaskd8d7dkg2h7kd"))))
+ (build-system cmake-build-system)
+ (native-inputs (list gcc-13))
+ (home-page "https://hyprland.org/hyprlang/")
+ (synopsis "Official implementation library for hypr config language")
+ (description
+ "This package provides the official implementation for hypr configuration
+language used in @code{hyprland}.")
+ (license license:gpl3+)))
+
+(define-public grimblast
+ (package
+ (name "grimblast")
+ (version "0.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/contrib")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0ld0sj7ahf9jf8cqzbqkhj3m2w60027ixic24ih26nwy90b5qjwx"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list #:tests? #f ;no tests
+ #:make-flags
+ #~(list (string-append "PREFIX=" #$output))
+ #:phases
+ #~(modify-phases %standard-phases
+ (delete 'configure)
+ (add-after 'unpack 'chdir
+ (lambda _
+ (chdir "grimblast")))
+ (add-after 'install 'wrap
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((grimblast (string-append #$output "/bin/grimblast")))
+ (wrap-script grimblast
+ `("PATH" suffix
+ ,(map (lambda (program)
+ (dirname (search-input-file
+ inputs (string-append "/bin/" program))))
+ '("grim" "slurp" "hyprctl" "wl-copy" "jq"
+ "notify-send" "date"))))))))))
+ (native-inputs (list scdoc))
+ (inputs (list grim guile-3.0 jq libnotify slurp hyprland wl-clipboard))
+ (home-page "https://github.com/hyprwm/contrib")
+ (synopsis "Hyprland version of Grimshot")
+ (description "A Hyprland version of Grimshot.")
+ (license license:expat)))
+
+(define-public xdg-desktop-portal-hyprland
+ (package
+ (name "xdg-desktop-portal-hyprland")
+ (version "1.3.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/hyprwm/xdg-desktop-portal-hyprland")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0fdbzxanmmzrvb9wfzg1pdsnlg7dl6v5k8bl44w10n48s7bbbzn0"))))
+ (build-system qt-build-system)
+ (arguments
+ (list #:tests? #f ;No tests
+ #:qtbase qtbase
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'fix-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* (find-files "." "\\.cp?*$")
+ (("/bin/sh") "sh")
+ (("\\<(sh|grim|hyprctl|slurp)\\>" _ cmd)
+ (search-input-file inputs (string-append "/bin/" cmd)))
+ (("\\<(hyprland-share-picker)\\>" _ cmd)
+ (string-append #$output "/bin/" cmd))))))))
+ (native-inputs
+ (list gcc-13 pkg-config wayland))
+ (inputs
+ (list bash-minimal
+ grim
+ hyprland
+ hyprland-protocols
+ hyprlang
+ mesa
+ pipewire
+ qtwayland
+ sdbus-c++
+ slurp
+ wayland-protocols))
+ (home-page "https://github.com/hyprwm/xdg-desktop-portal-hyprland")
+ (synopsis "XDG Desktop Portal backend for Hyprland")
+ (description
+ "This package provides @code{xdg-desktop-portal-hyprland}, which extends
+@code{xdg-desktop-portal-wlr} for Hyprland with support for
+@code{xdg-desktop-portal} screenshot and casting interfaces, while adding a few
+extra portals specific to Hyprland, mostly for window sharing.")
+ (license license:bsd-3)))
+
+hyprland
@@ -0,0 +1,66 @@
+(define-module (ryan-services file-manager)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages base)
+ #:use-module (gnu services)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (srfi srfi-1)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:export (downloads-garbage-collector-service-type
+ downloads-garbage-collector-configuration
+ downloads-garbage-collector-configuration?))
+
+(define-configuration downloads-garbage-collector-configuration
+ (user
+ (string "")
+ "User to run under")
+ (no-serialization))
+
+(define-public (home-symlinks files)
+ ;; Simple service to symlink two paths. Treats all paths with HOME prepended
+ (for-each (lambda (pair)
+ (let ((path1 (car pair))
+ (path2 (cadr pair)))
+ (let ((full-path1 (string-append (getenv "HOME") "/" path1))
+ (full-path2 (string-append (getenv "HOME") "/" path2)))
+ (if (file-exists? full-path2)
+ (if (eq? (stat:type (lstat full-path2)) 'regular)
+ ((display (format #f "WARNING: Deleting regular file ~a.\n" full-path2))
+ (delete-file full-path2)
+ (symlink full-path1 full-path2))
+ #f)
+ (symlink full-path1 full-path2)))))
+ files))
+
+(define downloads-garbage-collector-service
+ (match-record-lambda <downloads-garbage-collector-configuration>
+ (user)
+ (let ((cleanup-command #~(list "find" (string-append "/home/" #$user "/Downloads") "-mtime" "+7" "-delete")))
+ (shepherd-service
+ (documentation "Garbage collect downloaded files more than 1 week old for USER.")
+ (provision '(downloads-garbage-collector))
+ ;(requirement '(root))
+ (modules '((shepherd service timer)))
+ (start #~(make-timer-constructor
+ (calendar-event #:hours '(08) #:minutes '(30)
+ #:days-of-week '(tuesday))
+ (command #$cleanup-command)))
+ (stop #~(make-timer-destructor))
+ (actions (list (shepherd-action
+ (name 'trigger)
+ (documentation "Trigger GC in Downloads folder for USER")
+ (procedure #~(lambda _
+ (apply system* #$cleanup-command))))))))))
+
+(define-public downloads-garbage-collector-service-type
+ (service-type
+ (name 'downloads-garbage-collector)
+ (description "Given a USER, clear files older than 1 week from Downloads folder")
+ (extensions
+ (list
+ (service-extension home-shepherd-service-type
+ (compose list downloads-garbage-collector-service))))
+ (default-value (downloads-garbage-collector-configuration))))
@@ -0,0 +1,84 @@
+(define-module (ryan-services networking)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (ryan-packages networking)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages dns)
+ #:use-module (gnu packages base)
+ #:use-module (gnu services)
+ #:use-module (gnu services admin)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:export (netbird-configuration
+ netbird-service-type))
+
+(define-configuration netbird-configuration
+ (netbird
+ (file-like netbird-bin)
+ "The netbird package to use")
+
+ (iptables
+ (file-like iptables-nft)
+ "The iptables implementation to use")
+
+ (dns-manager
+ (file-like openresolv)
+ "Resolv.conf manager")
+
+ (log-file
+ (string "/var/log/netbird.log")
+ "Path to logs")
+
+ (socket
+ (string "/var/run/netbird.sock")
+ "Path of UNIX socket")
+
+ (verbosity
+ (string "warning")
+ "Log verbosity. Default is 'warning'")
+
+ (extra-options
+ (list-of-strings '())
+ "List of extra options")
+ (no-serialization))
+
+(define netbird-shepherd-service
+ (match-record-lambda <netbird-configuration>
+ (netbird iptables dns-manager log-file socket verbosity extra-options)
+ (let ((environment
+ #~(list (string-append "PATH="
+ (string-join
+ '(#$(file-append iptables "/sbin")
+ #$(file-append iproute "/sbin")
+ #$(file-append dns-manager "/sbin")
+ #$(file-append coreutils "/bin"))
+ ":")))))
+ (list (shepherd-service
+ (documentation "Run netbird")
+ (provision '(netbird))
+ (requirement '(user-processes))
+ (start
+ #~(make-forkexec-constructor
+ (list
+ #$(file-append netbird "/bin/netbird")
+ "service" "run"
+ "--log-level" #$verbosity
+ "--daemon-addr" (string-append "unix://" #$socket)
+ "--log-file" "console"
+ #$@extra-options)
+ #:environment-variables #$environment
+ #:log-file #$log-file))
+ (stop #~(make-kill-destructor)))))))
+
+(define netbird-service-type
+ (service-type
+ (name 'netbird)
+ (extensions
+ (list (service-extension shepherd-root-service-type
+ netbird-shepherd-service)
+ (service-extension profile-service-type
+ (compose list netbird-configuration-netbird))
+ (service-extension log-rotation-service-type
+ (compose list netbird-configuration-log-file))))
+ (default-value (netbird-configuration))
+ (description "Run netbird.")))
@@ -0,0 +1,182 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019, 2020, 2021, 2024 Oleg Pykhalov <go.wigust@gmail.com>
+;;; Copyright © 2020 Peng Mei Yu <i@pengmeiyu.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (ryan-services nix)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu services base)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu services web)
+ #:use-module (gnu services)
+ #:use-module (gnu system file-systems)
+ #:use-module (gnu system shadow)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix records)
+ #:use-module (guix store)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 format)
+ #:use-module (guix modules)
+ #:export (nix-service-type
+
+ nix-configuration
+ nix-configuration?))
+
+;;; Commentary:
+;;;
+;;; This module provides a service definition for the Nix daemon.
+;;;
+;;; Code:
+
+(define-record-type* <nix-configuration>
+ nix-configuration make-nix-configuration
+ nix-configuration?
+ (package nix-configuration-package ;file-like
+ (default nix))
+ (sandbox nix-configuration-sandbox ;boolean
+ (default #t))
+ (build-directory nix-configuration-build-directory ;string
+ (default "/tmp"))
+ (build-sandbox-items nix-configuration-build-sandbox-items ;list of strings
+ (default '()))
+ (extra-config nix-configuration-extra-config ;list of strings
+ (default '()))
+ (extra-options nix-configuration-extra-options ;list of strings
+ (default '())))
+
+;; Copied from gnu/services/base.scm
+(define* (nix-build-accounts count #:key
+ (group "nixbld")
+ (shadow shadow))
+ "Return a list of COUNT user accounts for Nix build users with the given
+GID."
+ (unfold (cut > <> count)
+ (lambda (n)
+ (user-account
+ (name (format #f "nixbld~2,'0d" n))
+ (system? #t)
+ (group group)
+ (supplementary-groups (list group "kvm"))
+ (comment (format #f "Nix Build User ~2d" n))
+ (home-directory "/var/empty")
+ (shell (file-append shadow "/sbin/nologin"))))
+ 1+
+ 1))
+(define (nix-accounts _)
+ "Return the user accounts and user groups."
+ (cons (user-group
+ (name "nixbld")
+ (system? #t)
+
+ ;; Use a fixed GID so that we can create the store with the right
+ ;; owner.
+ (id 40000))
+ (nix-build-accounts 10 #:group "nixbld")))
+
+(define (nix-activation _)
+ ;; Return the activation gexp.
+ #~(begin
+ (use-modules (guix build utils)
+ (srfi srfi-26))
+ (for-each (cut mkdir-p <>) '("/nix/var/log"
+ "/nix/var/nix/gcroots/per-user"
+ "/nix/var/nix/profiles/per-user"))
+ (unless (file-exists? #$%nix-store-directory)
+ (mkdir-p #$%nix-store-directory)
+ (chown #$%nix-store-directory
+ (passwd:uid (getpw "root")) (group:gid (getpw "nixbld01")))
+ (chmod #$%nix-store-directory #o775))
+ (for-each (cut chmod <> #o777) '("/nix/var/nix/profiles"
+ "/nix/var/nix/profiles/per-user"))))
+
+(define nix-service-etc
+ (match-lambda
+ (($ <nix-configuration> package sandbox build-directory build-sandbox-items extra-config)
+ (let ((ref-file (references-file package)))
+ `(("nix/nix.conf"
+ ,(computed-file
+ "nix.conf"
+ #~(begin
+ (use-modules (srfi srfi-26)
+ (ice-9 format))
+ (with-output-to-file #$output
+ (lambda _
+ (define internal-sandbox-paths
+ (call-with-input-file #$ref-file read))
+
+ (format #t "sandbox = ~a~%" (if #$sandbox "true" "false"))
+ ;; config.nix captures store file names.
+ (format #t "sandbox-paths = ~{~a ~}~%"
+ (append (list (string-append "/bin/sh=" #$bash-minimal "/bin/bash"))
+ internal-sandbox-paths
+ '#$build-sandbox-items))
+ (for-each (cut display <>) '#$extra-config)))))))))))
+
+(define %nix-store-directory
+ "/nix/store")
+
+(define %immutable-nix-store
+ ;; Read-only store to avoid users or daemons accidentally modifying it.
+ ;; 'nix-daemon' has provisions to remount it read-write in its own name
+ ;; space.
+ (list (file-system
+ (device %nix-store-directory)
+ (mount-point %nix-store-directory)
+ (type "none")
+ (check? #f)
+ (flags '(read-only bind-mount)))))
+
+(define nix-shepherd-service
+ ;; Return a <shepherd-service> for Nix.
+ (match-lambda
+ (($ <nix-configuration> package _ build-directory _ _ extra-options)
+ (list
+ (shepherd-service
+ (provision '(nix-daemon))
+ (documentation "Run nix-daemon.")
+ (requirement '(user-processes file-system-/nix/store))
+ (start #~(make-forkexec-constructor
+ (list (string-append #$package "/bin/nix-daemon")
+ #$@extra-options)
+ #:environment-variables
+ (list (string-append "TMPDIR=" #$build-directory)
+ "PATH=/run/current-system/profile/bin")))
+ (respawn? #f)
+ (stop #~(make-kill-destructor)))))))
+
+(define nix-service-type
+ (service-type
+ (name 'nix)
+ (extensions
+ (list (service-extension shepherd-root-service-type nix-shepherd-service)
+ (service-extension account-service-type nix-accounts)
+ (service-extension activation-service-type nix-activation)
+ (service-extension etc-service-type nix-service-etc)
+ (service-extension profile-service-type
+ (compose list nix-configuration-package))
+ (service-extension file-system-service-type
+ (const %immutable-nix-store))))
+ (description "Run the Nix daemon.")
+ (default-value (nix-configuration))))
+
+;;; nix.scm ends here
@@ -0,0 +1,43 @@
+(define-module (ryan-services spotify)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages rust-apps)
+ #:use-module (gnu services)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (guix gexp))
+
+(define (home-spotifyd-profile-service config)
+ (map specification->package
+ (list "spotifyd")))
+
+(define (home-spotifyd-shepherd-service config)
+ ;; spotifyd daemon
+ (list (shepherd-service
+ (requirement '(pipewire))
+ (provision '(spotifyd))
+ (stop #~(make-kill-destructor))
+ (start #~(make-forkexec-constructor
+ (list #$(file-append spotifyd "/bin/spotifyd")
+ "--volume-normalisation"
+ "-B320"
+ (format #f "--device-name=~a" (gethostname))
+ "--device-type=computer"
+ "--no-daemon")
+ #:log-file (string-append
+ (or (getenv "XDG_LOG_HOME")
+ (format #f "~a/.local/var/log"
+ (getenv "HOME")))
+ "/spotifyd.log"))))))
+
+(define-public home-spotifyd-service-type
+ (service-type (name 'home-spotifyd)
+ (extensions
+ (list (service-extension
+ home-profile-service-type
+ home-spotifyd-profile-service)
+ (service-extension
+ home-shepherd-service-type
+ home-spotifyd-shepherd-service)))
+ (default-value #f)
+ (description "Provides spotifyd daemon in the background")))
@@ -0,0 +1,17 @@
+(define-module (ryan-services udev)
+ #:use-module (gnu packages)
+ #:use-module (gnu services)
+ #:use-module (gnu services base)
+ #:use-module (guix gexp)
+ #:export (udev-hwdb-configuration
+ udev-hwdb-configuration?
+ udev-hwdb-configuration-rule))
+
+(define-record-type* <udev-hwdb-configuration>
+ udev-hwdb-configuration make-udev-hwdb-configuration
+ udev-hwdb-configuration? this-udev-hwdb-configuration
+ (hwdb-rules udev-hwdb-configuration-hwdb-rules ;list of file-like
+ (default '())))
+
+; TODO: define hwdb rules like udev rules, add compiler step, splice this config
+; into udev service proper, hopefully etc-config handles this gracefully