Compare
52fc10ce2ac8c557ba48c3121a332ac596ea8863
…
new-bootloader-next
· 124 commits
Commits
@@ -1,2 +1,4 @@
current
home-config/sway/monitors
+*.gif
+home-config/fish/fish_variables
@@ -1,6 +0,0 @@
-(use-modules (guix ci))
-
-(list (channel-with-substitutes-available
- %default-guix-channel
- "https://ci.guix.gnu.org")
- )
@@ -1,9 +1,9 @@
(list (channel
(name 'guix)
- (url "https://git.savannah.gnu.org/git/guix.git")
+ (url "https://git.rschanz.org/ryan77627/guix.git")
(branch "master")
(commit
- "40e78353a4699b8edb6600d82df648914c9110b9")
+ "308877be17b2c2c92d972e105e8cc6a782ab4c82")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
@@ -14,7 +14,7 @@
(url "https://gitlab.com/nonguix/nonguix")
(branch "master")
(commit
- "bb184bd0a8f91beec3a00718759e96c7828853de")
+ "ea84538b887df3aa3bdd61d5e4c284f1548e5520")
(introduction
(make-channel-introduction
"897c1a470da759236cc11798f4e0a5f7d4d59fbc"
@@ -25,7 +25,7 @@
(url "https://codeberg.org/hako/rosenthal.git")
(branch "trunk")
(commit
- "58ad8f96b670fd58c474d188be7ae8fa0840b791")
+ "1deb97ada4d7d8c2d501738fcc1532a605de51a7")
(introduction
(make-channel-introduction
"7677db76330121a901604dfbad19077893865f35"
@@ -2,7 +2,7 @@
gather_env() {
# Gather needed information
- echo -n "Type 'e' for encrypted or 'd' for decrypted install: "
+ 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: "
@@ -17,6 +17,13 @@ gather_env() {
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() {
@@ -37,14 +44,14 @@ copy_and_prepare() {
# We are installing!
# Copy template to root of repo
- if [ "$install_type" == "e" ]
+ 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 d or e), bailing!"
+ echo "Invalid install type (not eb, en, or d), bailing!"
exit 1
fi
@@ -62,11 +69,24 @@ copy_and_prepare() {
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!"
- 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
+ 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() {
@@ -8,6 +8,17 @@ from = Ryan Schanzenbacher <ryan@rschanz.org>
copy-to = Sent
signature-file = ~/.config/aerc/signature_personal
check-mail = 5m
+aliases = Ryan S <ryan+ritlugdemo@rschanz.org>, Ryan Schanzenbacher <ryan+guixdevel@rschanz.org>
+
+[Development]
+source = imaps://ryan_devel%40rschanz.org@mail.rschanz.org:993
+source-cred-cmd = pass emails/development 2>/dev/null | tr -d '\n'
+outgoing = smtps://ryan_devel%40rschanz.org@mail.rschanz.org:465
+outgoing-cred-cmd = pass emails/development 2>/dev/null | tr -d '\n'
+default = INBOX
+from = Ryan <ryan_devel@rschanz.org>
+copy-to = Sent
+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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
@@ -64,6 +64,8 @@ log-level=trace
# Default: date<20,name<17,flags>4,subject<*
#index-columns=date<20,name<17,flags>4,subject<*
+spinner = '/,-,\,|'
+
#
# Each name in index-columns must have a corresponding column-$name setting.
# All column-$name settings accept golang text/template syntax. See
@@ -486,7 +488,7 @@ 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"
+text/*=bat -fn
application/x-sh=bat -fn -l sh
#image/*=catimg -w $(tput cols) -
#subject,~Git(hub|lab)=lolcat -f
@@ -49,6 +49,11 @@ Rr = :reply<Enter>
Rq = :reply -q<Enter>
f = :forward -A<Enter>
+# Git custom stuff ala Drew Devault
+ga = :pipe -mb git am -3<Enter>
+gp = :term git push<Enter>
+rt = :reply -aTthanks<Enter>
+
c = :cf<space>
$ = :term<space>
! = :term<space>
@@ -0,0 +1,6 @@
+X-Mailer: aerc {{version}}
+
+{{.Signature}}
+
+On {{dateFormat (.OriginalDate | toLocal) "Mon Jan 2, 2006 at 3:04 PM MST"}}, {{(index .OriginalFrom 0).Name}} wrote:
+{{trimSignature .OriginalText | quote}}
@@ -0,0 +1,7 @@
+X-Mailer: aerc {{version}}
+
+Thanks!
+
+{{exec "{ git remote get-url --push origin; git reflog -2 origin/main --pretty=format:%h; } | xargs printf 'To %s\n %s..%s main -> main\n'" ""}}
+
+{{.Signature}}
@@ -5,7 +5,7 @@ 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
# Honor per-interactive-shell startup file
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
@@ -40,12 +40,15 @@ 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'
+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 -"
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)
+
+eval "$(zoxide init 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,5 @@
+jorgebucaran/fisher
+ilancosman/tide@v6
+patrickf1/fzf.fish
+lilyball/nix-env.fish
+oh-my-fish/plugin-foreign-env
@@ -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
@@ -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
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-Bold.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-Medium.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-Regular.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFont-Thin.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttf differ
Binary files /dev/null and b/home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttf 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/
@@ -0,0 +1,7 @@
+font=Lilex Nerd Font Mono:size=14,FiraCode Nerd Font Mono:size=14
+
+[desktop-notifications]
+command=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
+
+[colors]
+alpha=0.75
@@ -0,0 +1,19 @@
+[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
+[color]
+ ui = auto
+[init]
+ defaultBranch = main
+[sendemail]
+ smtpserver = mail.rschanz.org
+ smtpuser = ryan@rschanz.org
+ smtpencryption = ssl
+ smtpserverport = 465
@@ -17,7 +17,13 @@
(gnu home services gnupg)
(gnu home services)
(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
@@ -27,36 +33,62 @@
(modify-inputs (package-native-inputs neovim)
(prepend gcc-12)))))
+(define %home-symlinks
+ `((".config/guix/home-config/fish" ".config/fish")
+ (".config/guix/home-config/nix-config" ".config/nix")
+ (".config/guix/home-config/tridactyl/native_main" ".local/share/tridactyl/native_main")
+ (".config/guix/home-config/nix-home-manager" ".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"
+ "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"
+ "bombadillo"
"python-msgpack"
+ "wdisplays"
+ "kanshi"
"libreoffice"
"flatpak"
"gnupg"
+ "spotifyd"
"lsof"
"pavucontrol"
+ "netcat"
"bind:utils"
"font-cns11643"
+ "font-google-noto-emoji"
"syncthing"
- "imv"
+ "taskwarrior"
+ "tasksh"
+ ;"imv" ; Nix pkg now for MESA stuff
"perl"
"tor"
"unzip"
- "alacritty"
"htop"
"curl"
"pandoc"
@@ -74,8 +106,10 @@
"texlive-hyperref"
"texlive-parskip"
"texlive-etoolbox"
+ "texlive-setspace"
"zathura"
"zathura-pdf-mupdf"
+ "go"
"fzf"
"weechat"
"gimp"
@@ -85,46 +119,66 @@
"python-lsp-server"
"kdenlive"
"sqlite"
- "mpv"
+ ;"mpv" ; Now a nix pkg for MESA stuff
+ "qbittorrent"
"playerctl"
- "aerc"
+ ;"aerc"
"tcpdump"
"pamixer"
"git"
+ "git:send-email"
+ "password-store"
"node"
+ "kanshi"
+ ;"firefox"
+ "signal-desktop"
+ "sc-im"
"git-lfs"))
- (list my-neovim wl-mirror firefox-wayland-new)))
+ (list my-neovim wl-mirror firefox-wrapped calcurse-fixed )))
;; Below is the list of Home services. To search for available
;; services, run 'guix home search KEYWORD' in a terminal.
(services
- (list (service home-bash-service-type
- (home-bash-configuration
- (aliases '(("grep" . "grep --color=auto") ("ll" . "ls -l")
- ("ls" . "ls -p --color=auto")
- ("python" . "python3")))
- (bashrc (list (local-file
- "bashrc")))
- (bash-profile (list (local-file
- "bash_profile")))))
+ (list ;(service home-bash-service-type
+ ; (home-bash-configuration
+ ;(aliases '(("grep" . "grep --color=auto") ("ll" . "ls -l")
+ ; ("ls" . "ls -p --color=auto")
+ ; ("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"))
+ ("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))
+ ("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))
- ("home-manager" ,(local-file "nix-home-manager" #:recursive? #t)) ))
+ ("aerc" ,(local-file "aerc" #: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"))
+ (".icons" ,(local-file "icons" #:recursive? #t))
+ (".mozilla/native-messaging-hosts/tridactyl.json" ,(local-file "tridactyl/tridactyl.json"))
;(".gnupg/sshcontrol" ,(local-file "gnupg/sshcontrol"))
;(".gnupg/gpg-agent.conf" ,(local-file "gnupg/gpg-agent.conf"))
(".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)
(service home-dbus-service-type)
+ ;;; trying some changes
+ ;(template-files "."
+ ;'("spotify-player/app.toml"
+ ;;;
(service home-gpg-agent-service-type
(home-gpg-agent-configuration
(pinentry-program
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1685362396481634.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1693169418078790.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1694792956043641.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1708470532817406.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1720750738377603.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1720751011150282.png differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1723625710776950.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1723626275390685.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/1728661127589872.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpeg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/CN62QXJ.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/above-clouds.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-wait.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/autumn1.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/autumn1.png differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/lake-winter.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/northern-lights-2.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/northern-lights-bridge.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/purple-grass.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/purple-intersection.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/purple-lakescape.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/scarecrow.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/snow-1.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/snow-2.jpg differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/vfcfyfyehhi31.png differ
Binary files /dev/null and b/home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpg differ
@@ -1,13 +1,34 @@
#!/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 &
+#swaybg -i ~/.config/hypr/Wallpapers/above-clouds.jpg &
+
+nice -n13 swww init &
+
+#~/.config/hypr/wallpaper-daemon.sh &
+wpaperd -d &
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 &
+
+# Kill any orphans of this
+killall wl-clip-persist
+wl-clip-persist -c regular --reconnect-tries 5 &
+
+kanshi -c ~/.config/hypr/kanshi.conf &
+
+# Start the portals
+
+sleep 0.5
+killall -e xdg-desktop-portal-hyprland
+killall xdg-desktop-portal-gtk
+killall xdk-desktop-portal
+
+~/.nix-profile/libexec/xdg-desktop-portal-hyprland &
+~/.nix-profile/libexec/xdg-desktop-portal-gtk &
+sleep 2
+XDG_DESKTOP_PORTAL_DIR="/home/ryan/.nix-profile/share/xdg-desktop-portal/portals" ~/.nix-profile/libexec/xdg-desktop-portal &
Binary files /dev/null and b/home-config/hypr/family_guy.mp4 differ
@@ -8,6 +8,12 @@ exec-once = dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK
# See https://wiki.hyprland.org/Configuring/Monitors/
monitor=,preferred,auto,1
+# Set cursor theme
+env = HYPRCURSOR_THEME,XCursor-Pro-Dark-Hyprcursor
+env = HYPRCURSOR_SIZE,26
+env = XCURSOR_THEME,XCursor-Pro-Dark
+env = XCURSOR_SIZE,26
+
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
@@ -20,6 +26,11 @@ source = ~/.config/hypr/monitors.conf
# Some default env vars.
env = XCURSOR_SIZE,24
+debug {
+ disable_logs = false
+ enable_stdout_logs = true
+}
+
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
input {
kb_layout = us
@@ -88,10 +99,10 @@ dwindle {
preserve_split = yes # you probably want this
}
-master {
- # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
- new_is_master = true
-}
+#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
@@ -100,7 +111,8 @@ gestures {
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
-device:epic-mouse-v1 {
+device {
+ name = epic-mouse-v1
sensitivity = -0.5
}
@@ -115,10 +127,12 @@ device:epic-mouse-v1 {
$mainMod = SUPER
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
-bind = $mainMod, Return, exec, alacritty
+bind = $mainMod, Return, exec, foot
+bind = $mainMod CTRL, Return, exec, foot -a float-foot
bind = $mainMod SHIFT, Q, killactive
bind = $mainMod SHIFT, E, exit
bind = $mainMod SHIFT, Space, togglefloating
+bind = $mainMod SHIFT, Return, pin, active
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
@@ -135,6 +149,9 @@ bind = ,XF86AudioNext, exec, playerctl next
bind = ,XF86AudioPrev, exec, playerctl previous
bind = ,XF86AudioStop, exec, playerctl stop
+# "Auto-connect headphones"
+bind = $mainMod, H, exec, bluetoothctl connect AC:80:0A:1C:D6:C7
+
# Move workspace between monitors
bind = $mainMod CTRL SHIFT, left, movecurrentworkspacetomonitor, l
bind = $mainMod CTRL SHIFT, right, movecurrentworkspacetomonitor, r
@@ -186,16 +203,24 @@ 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
+bind = $mainMod, L, exec, swaylock --screenshots --clock --indicator --fade-in 0.3 --effect-blur 7x5 --effect-greyscale
+bind = $mainMod SHIFT, L, exec, swaylock --screenshots --clock --indicator --effect-blur 7x5 --effect-greyscale & sleep 0.5; loginctl suspend
# Keybind for screenshot
bind = $mainMod SHIFT, S, exec, grimblast copy area
bind = $mainMod SHIFT, Print, exec, grimblast edit area
+bind = $mainMod, S, exec, grimblast save area - | imv -
# Notifications keybinds
bind = $mainMod, N, exec, makoctl dismiss
bind = $mainMod SHIFT, N, exec, makoctl dismiss -a
+# Color picker
+bind = $mainMod SHIFT, C, exec, hyprpicker -a
+
+# LinkedIn Joke (very serious)
+bind = $mainMod SHIFT CTRL ALT, L, exec, xdg-open https://linkedin.com
+
# Window Rules
# Firefox PiP
@@ -207,15 +232,38 @@ windowrulev2 = size 578 326, class:^(firefox)$, title:^(Picture-in-Picture)$
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)$
+windowrulev2 = suppressevent fullscreen maximize, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
# Weather
windowrulev2 = float,class:^(ala-wttr)$
windowrulev2 = size 740 712, class:^(ala-wttr)$
+# Floating terminal
+windowrulev2 = float,class:^(float-foot)$
+windowrulev2 = size 930 680,class:^(float-foot)$
+windowrulev2 = center,class:^(float-foot)$
+
+# Change color of pinned windows
+windowrulev2 = bordercolor rgba(bf0000ee) rgba(ab00adee) 45deg,pinned:1
+
+# Fun Keybinds
+# Subway surfer
+bind = $mainMod CTRL SHIFT, S, exec, mpv ~/.config/hypr/subwaysurfer.webm
+windowrulev2 = float,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
+windowrulev2 = size 310 554,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
+windowrulev2 = move 81% 46% ,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
+windowrulev2 = pin,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
+
+# Family guy funny moments
+bind = $mainMod CTRL SHIFT, F, exec, mpv ~/.config/hypr/family_guy.mp4
+windowrulev2 = float,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
+windowrulev2 = size 595 336,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
+windowrulev2 = move 67% 5% ,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
+windowrulev2 = pin,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
+
exec-once = ~/.config/hypr/autostart.sh
misc {
disable_hyprland_logo = true
+ force_default_wallpaper = 0
}
@@ -0,0 +1,55 @@
+background {
+ monitor =
+ path = /home/ryan/.config/hypr/Wallpapers/static/autumn1.png
+
+ # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
+ blur_passes = 2 # 0 disables blurring
+ blur_size = 7
+ noise = 0.2
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+
+input-field {
+ monitor =
+ size = 200, 50
+ outline_thickness = 3
+ dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = false
+ dots_rounding = -1 # -1 default circle, -2 follow input-field rounding
+ outer_color = rgb(151515)
+ inner_color = rgb(200, 200, 200)
+ font_color = rgb(10, 10, 10)
+ fade_on_empty = true
+ fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered.
+ placeholder_text = <i>Input Password...</i> # Text rendered in the input box when it's empty.
+ hide_input = false
+ rounding = -1 # -1 means complete rounding (circle/oval)
+ check_color = rgb(204, 136, 34)
+ fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color
+ fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i> # can be set to empty
+ fail_timeout = 2000 # milliseconds before fail_text and fail_color disappears
+ fail_transition = 300 # transition time in ms between normal outer_color and fail_color
+ capslock_color = -1
+ numlock_color = -1
+ bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above)
+ invert_numlock = false # change color if numlock is off
+ swap_font_color = false # see below
+
+ position = 0, -20
+ halign = center
+ valign = center
+}
+
+label {
+ monitor =
+ text = cmd[update:1000] echo "$(date +"%-H:%M:%S")"
+ #color = rgba(255, 255, 255, 0.6)
+ font_size = 80
+ position = 0, 300
+ halign = center
+ valign = center
+}
@@ -0,0 +1,21 @@
+profile {
+ output "AU Optronics 0x103D Unknown" enable
+}
+
+profile tylerdesk {
+ output "AU Optronics 0x103D Unknown" disable
+ output "Dell Inc. DELL U3421WE 6WK8753" enable
+}
+
+profile emilydesk {
+ output "AU Optronics 0x103D Unknown" disable
+ output "Dell Inc. DELL U2422H JN4SF83" position 0,0 mode 1920x1080
+ output "Dell Inc. DELL U2414H R9F1P5C59WDL" position 1920,0 mode 1920x1080
+ output "Dell Inc. DELL U2422H 5S9SF83" position 3840,0 mode 1920x1080
+}
+
+profile justindesk {
+ output "AU Optronics 0x103D Unknown" position 0,0 mode 1920x1080
+ output "Dell Inc. DELL U2417H XVNNT7CDC80L" position 1920,0 mode 1920x1080
+ output "Dell Inc. DELL U2417H XVNNT82M978L" position 3840,0 mode 1920x1080
+}
Binary files /dev/null and b/home-config/hypr/subwaysurfer.webm differ
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+
+# Script initialization
+# Check if animated wallpapers exist, set env var if so
+# Sleep for swww init to finish
+sleep 3
+script_init() {
+ if [ `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | wc -l` -gt 0 ]; then
+ echo "true" > /tmp/$USER-desktop-anim
+ ANIM_READY=true
+ else
+ # Download or bail here?
+ echo "no animations found, static only!"
+ fi
+}
+# check if on ac or battery
+check_if_ac() {
+ ON_AC=`cat /sys/class/power_supply/AC/online`
+ if [ $ON_AC -eq 1 ] && [ "$ANIM_READY" = true ]; then
+ echo "Anim"
+ init_anim
+ else
+ echo "Static"
+ init_static
+ fi
+}
+
+init_static() {
+ # On battery or missing wallpapers, just load a random image
+ IMG=`find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ echo $IMG >> /tmp/$USER-desktop-anim
+ swww img $IMG
+ # This is hacky but sometimes we get into a race condition where the
+ # animated background will load anyways, so this will ensure we stay static
+ # until we definitely control swww and its state is known
+ sleep 60
+ swww img $IMG
+}
+
+init_anim() {
+ # Preload a static image until the animated one is ready
+ swww img --transition-step 255 `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ sleep 2
+ IMG=`find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
+ echo $IMG >> /tmp/$USER-desktop-anim
+ swww img $IMG
+}
+
+begin_randomizer() {
+ while :; do
+ echo "Invoke selector"
+ sleep 3600
+ if [ `cat /sys/class/power_supply/AC/online` -eq 1 ] && [ `cat /tmp/$USER-desktop-anim | head -n1` == "true" ]; then
+ switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
+ else
+ switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ fi
+ done
+}
+
+switch_check() {
+ # Simply query what image is displayed and make sure we do not overwrite
+ # it. This is more for animated wallpapers since it causes corruption
+ CURRENT_FILE=`swww query | awk -F'/' '{print $NF}'`
+ SELECTION=`echo $1 | awk -F'/' '{print $NF}'`
+
+ if ! [ "$CURRENT_FILE" == "$SELECTION" ]; then
+ # Update the file
+ sed -i '2c'"$1" /tmp/$USER-desktop-anim
+ # Set the background!
+ swww img $1
+ fi
+}
+
+check_load() {
+ # If system is under stress, disable animated wallpaper. If not, allow them
+ while :; do
+ sleep 60
+ ANIM_ENABLE=`cat /tmp/$USER-desktop-anim`
+ LOAD=`cat /proc/loadavg | cut -d' ' -f1`
+
+ if [ "$ANIM_ENABLE" == "true" ] && [ $LOAD -gt 8.00 ] && [ $ANIM_READY = true ]; then
+ sed -i '1c\false' /tmp/$USER-desktop-anim
+ switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ elif [ "$ANIM_ENABLE" == "false" ] && [ $LOAD -lt 8.00 ] && [ $ANIM_READY = true ]; then
+ sed -i '1c\true' /tmp/$USER-desktop-anim
+ switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
+ fi
+ done
+}
+
+script_init
+check_if_ac
+begin_randomizer &
+check_load &
+
+dbus-monitor --system "interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',sender=':1.2',path='/org/freedesktop/UPower/devices/line_power_AC'" 2>/dev/null | stdbuf -o0 awk -F' ' '/variant boolean/ {print $(NF)}' |
+while read -r line; do
+ if [ "$line" == "true" ]; then
+ echo "switching to ac"
+ switch_check `find ~/.config/hypr/Wallpapers/animated/ -name '*.gif' | sort -R | tail -n1`
+ elif [ "$line" == "false" ]; then
+ echo "switching to bat"
+ switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ fi
+done
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+# Script initialization
+# Check if animated wallpapers exist, set env var if so
+# Sleep for swww init to finish
+init_static() {
+ # On battery or missing wallpapers, just load a random image
+ IMG=`find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ echo $IMG >> /tmp/$USER-desktop-anim
+ swww img $IMG
+}
+
+begin_randomizer() {
+ while :; do
+ sleep 3600
+ switch_check `find ~/.config/hypr/Wallpapers/static/ -type f | sort -R | tail -n1`
+ done
+}
+
+switch_check() {
+ # Simply query what image is displayed and make sure we do not overwrite
+ # it. This is more for animated wallpapers since it causes corruption
+ CURRENT_FILE=`swww query | awk -F'/' '{print $NF}'`
+ SELECTION=`echo $1 | awk -F'/' '{print $NF}'`
+
+ if ! [ "$CURRENT_FILE" == "$SELECTION" ]; then
+ # Update the file
+ sed -i '2c'"$1" /tmp/$USER-desktop-anim
+ # Set the background!
+ swww img $1
+ fi
+}
+
+init_static
+begin_randomizer &
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+sleep 2
+
+# Get currently loaded image
+IMG=`cat /tmp/$USER-desktop-anim | tail -n1`
+
+# Load it for the monitors
+swww img $IMG -o $1
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
@@ -0,0 +1,254 @@
+local msg = require('mp.msg')
+local assdraw = require('mp.assdraw')
+
+local script_name = "easycrop"
+
+-- Number of crop points currently chosen (0 to 2)
+local points = {}
+-- True if in cropping selection mode
+local cropping = false
+-- Original value of osc property
+local osc_prop = false
+
+-- Helper that converts two points to top-left and bottom-right
+local swizzle_points = function (p1, p2)
+ if p1.x > p2.x then p1.x, p2.x = p2.x, p1.x end
+ if p1.y > p2.y then p1.y, p2.y = p2.y, p1.y end
+end
+
+local clamp = function (val, min, max)
+ assert(min <= max)
+ if val < min then return min end
+ if val > max then return max end
+ return val
+end
+
+local video_space_from_screen_space = function (ssp)
+ -- Video native dimensions and screen size
+ local vid_w = mp.get_property("width")
+ local vid_h = mp.get_property("height")
+ local osd_w = mp.get_property("osd-width")
+ local osd_h = mp.get_property("osd-height")
+
+ -- Factor by which the video is scaled to fit the screen
+ local scale = math.min(osd_w/vid_w, osd_h/vid_h)
+
+ -- Size video takes up in screen
+ local vid_sw, vid_sh = scale*vid_w, scale*vid_h
+
+ -- Video offset within screen
+ local off_x = math.floor((osd_w - vid_sw)/2)
+ local off_y = math.floor((osd_h - vid_sh)/2)
+
+ local vsp = {}
+
+ -- Move the point to within the video
+ vsp.x = clamp(ssp.x, off_x, off_x + vid_sw)
+ vsp.y = clamp(ssp.y, off_y, off_y + vid_sh)
+
+ -- Convert screen-space to video-space
+ vsp.x = math.floor((vsp.x - off_x) / scale)
+ vsp.y = math.floor((vsp.y - off_y) / scale)
+
+ return vsp
+end
+
+local screen_space_from_video_space = function (vsp)
+ -- Video native dimensions and screen size
+ local vid_w = mp.get_property("width")
+ local vid_h = mp.get_property("height")
+ local osd_w = mp.get_property("osd-width")
+ local osd_h = mp.get_property("osd-height")
+
+ -- Factor by which the video is scaled to fit the screen
+ local scale = math.min(osd_w/vid_w, osd_h/vid_h)
+
+ -- Size video takes up in screen
+ local vid_sw, vid_sh = scale*vid_w, scale*vid_h
+
+ -- Video offset within screen
+ local off_x = math.floor((osd_w - vid_sw)/2)
+ local off_y = math.floor((osd_h - vid_sh)/2)
+
+ local ssp = {}
+ ssp.x = vsp.x * scale + off_x
+ ssp.y = vsp.y * scale + off_y
+ return ssp
+end
+
+-- Wrapper that converts RRGGBB / RRGGBBAA to ASS format
+local ass_set_color = function (idx, color)
+ assert(color:len() == 8 or color:len() == 6)
+ local ass = ""
+
+ -- Set alpha value (if present)
+ if color:len() == 8 then
+ local alpha = 0xff - tonumber(color:sub(7, 8), 16)
+ ass = ass .. string.format("\\%da&H%X&", idx, alpha)
+ end
+
+ -- Swizzle RGB to BGR and build ASS string
+ color = color:sub(5, 6) .. color:sub(3, 4) .. color:sub(1, 2)
+ return "{" .. ass .. string.format("\\%dc&H%s&", idx, color) .. "}"
+end
+
+local draw_rect = function (p1, p2)
+ local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
+
+ ass = assdraw.ass_new()
+
+ -- Draw overlay over surrounding unselected region
+
+ ass:draw_start()
+ ass:pos(0, 0)
+
+ ass:append(ass_set_color(1, "000000aa"))
+ ass:append(ass_set_color(3, "00000000"))
+
+ local l = math.min(p1.x, p2.x)
+ local r = math.max(p1.x, p2.x)
+ local u = math.min(p1.y, p2.y)
+ local d = math.max(p1.y, p2.y)
+
+ ass:rect_cw(0, 0, l, osd_h)
+ ass:rect_cw(r, 0, osd_w, osd_h)
+ ass:rect_cw(l, 0, r, u)
+ ass:rect_cw(l, d, r, osd_h)
+
+ ass:draw_stop()
+
+ -- Draw border around selected region
+
+ ass:new_event()
+ ass:draw_start()
+ ass:pos(0, 0)
+
+ ass:append(ass_set_color(1, "00000000"))
+ ass:append(ass_set_color(3, "000000ff"))
+ ass:append("{\\bord2}")
+
+ ass:rect_cw(p1.x, p1.y, p2.x, p2.y)
+
+ ass:draw_stop()
+
+ mp.set_osd_ass(osd_w, osd_h, ass.text)
+end
+
+local draw_fill = function ()
+ local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
+
+ ass = assdraw.ass_new()
+ ass:draw_start()
+ ass:pos(0, 0)
+
+ ass:append(ass_set_color(1, "000000aa"))
+ ass:append(ass_set_color(3, "00000000"))
+ ass:rect_cw(0, 0, osd_w, osd_h)
+
+ ass:draw_stop()
+ mp.set_osd_ass(osd_w, osd_h, ass.text)
+end
+
+local draw_clear = function ()
+ local osd_w, osd_h = mp.get_property("osd-width"), mp.get_property("osd-height")
+ mp.set_osd_ass(osd_w, osd_h, "")
+end
+
+local draw_cropper = function ()
+ if #points == 1 then
+ local p1 = screen_space_from_video_space(points[1])
+ local p2 = {}
+ p2.x, p2.y = mp.get_mouse_pos()
+ draw_rect(p1, p2)
+ end
+end
+
+local uncrop = function ()
+ mp.command("no-osd vf del @" .. script_name .. ":crop")
+end
+
+local crop = function(p1, p2)
+ swizzle_points(p1, p2)
+
+ local w = p2.x - p1.x
+ local h = p2.y - p1.y
+ local ok, err = mp.command(string.format(
+ "no-osd vf add @%s:crop=%s:%s:%s:%s", script_name, w, h, p1.x, p1.y))
+
+ if not ok then
+ mp.osd_message("Cropping failed")
+ points = {}
+ end
+end
+
+local easycrop_stop = function ()
+ mp.set_property("osc", osc_prop)
+ cropping = false
+ mp.remove_key_binding("easycrop_mouse_btn0")
+ draw_clear()
+end
+
+local mouse_btn0_cb = function ()
+ if not cropping then
+ return
+ end
+
+ local mx, my = mp.get_mouse_pos()
+ table.insert(points, video_space_from_screen_space({ x = mx, y = my }))
+
+ if #points == 2 then
+ crop(points[1], points[2])
+ easycrop_stop()
+ end
+end
+
+local easycrop_start = function ()
+ -- Cropping requires swdec or hwdec with copy-back
+ local hwdec = mp.get_property("hwdec-current")
+ if hwdec == nil then
+ return mp.msg.error("Cannot determine current hardware decoder mode")
+ end
+ -- Check whitelist of ok values
+ local valid_hwdec = {
+ ["no"] = true, -- software decoding
+ -- Taken from mpv manual
+ ["videotoolbox-co"] = true,
+ ["vaapi-copy"] = true,
+ ["dxva2-copy"] = true,
+ ["d3d11va-copy"] = true,
+ ["mediacodec"] = true
+ }
+ if not valid_hwdec[hwdec] then
+ return mp.osd_message("Cropping requires swdec or hwdec with copy-back (see mpv manual)")
+ end
+
+ -- Just clear the current crop and return, if there is one
+ if #points ~= 0 then
+ uncrop()
+ points = {}
+ return
+ end
+
+ -- Hide OSC
+ osc_prop = mp.get_property("osc")
+ mp.set_property("osc", "no")
+
+ cropping = true
+ mp.add_forced_key_binding("mouse_btn0", "easycrop_mouse_btn0", mouse_btn0_cb)
+ draw_fill()
+end
+
+local easycrop_activate = function ()
+ if cropping then
+ easycrop_stop()
+ else
+ easycrop_start()
+ end
+end
+
+mp.add_key_binding("mouse_move", draw_cropper)
+mp.observe_property("osd-width", "native", draw_cropper)
+mp.observe_property("osd-height", "native", draw_cropper)
+
+mp.add_key_binding("c", "easy_crop", easycrop_activate)
+
@@ -0,0 +1 @@
+experimental-features = nix-command flakes
@@ -0,0 +1,453 @@
+{
+ "nodes": {
+ "aquamarine": {
+ "inputs": {
+ "hyprutils": [
+ "hyprland",
+ "hyprutils"
+ ],
+ "hyprwayland-scanner": [
+ "hyprland",
+ "hyprwayland-scanner"
+ ],
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727261104,
+ "narHash": "sha256-rxDI7WrxIRV9it9mDCHcLa7xQykf1JloXnoXr5xQ8zI=",
+ "owner": "hyprwm",
+ "repo": "aquamarine",
+ "rev": "b82fdaff917582a9d568969e15e61b398c71e990",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "aquamarine",
+ "type": "github"
+ }
+ },
+ "flake-utils": {
+ "locked": {
+ "lastModified": 1659877975,
+ "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1729321331,
+ "narHash": "sha256-KVyQq+ez/oB30/WbdNgVD8g/bda34z8NiU187QKQb74=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "122f70545b29ccb922e655b08acfe05bfb44ec68",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "122f70545b29ccb922e655b08acfe05bfb44ec68",
+ "type": "github"
+ }
+ },
+ "hyprcursor": {
+ "inputs": {
+ "hyprlang": [
+ "hyprland",
+ "hyprlang"
+ ],
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727532803,
+ "narHash": "sha256-ZaZ7h7PY8mQc4vtGmVqWLAq9CAO02gHMyNR5yY8zDmM=",
+ "owner": "hyprwm",
+ "repo": "hyprcursor",
+ "rev": "b98726e431d4d3ed58bd58bee1047cdb81cec69f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprcursor",
+ "type": "github"
+ }
+ },
+ "hyprland": {
+ "inputs": {
+ "aquamarine": "aquamarine",
+ "hyprcursor": "hyprcursor",
+ "hyprland-protocols": "hyprland-protocols",
+ "hyprlang": "hyprlang",
+ "hyprutils": "hyprutils",
+ "hyprwayland-scanner": "hyprwayland-scanner",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "systems": "systems",
+ "xdph": "xdph"
+ },
+ "locked": {
+ "lastModified": 1728478479,
+ "narHash": "sha256-AbfdIlK92oWpI39xlIaUekPeL9u95sXzxVsSqhIMfIc=",
+ "owner": "hyprwm",
+ "repo": "hyprland",
+ "rev": "4520b30d498daca8079365bdb909a8dea38e8d55",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "ref": "v0.44.1",
+ "repo": "hyprland",
+ "type": "github"
+ }
+ },
+ "hyprland-protocols": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727451107,
+ "narHash": "sha256-qV9savtHwmZUa0eJE294WYJjKPGB2+bJhwByFShsVyo=",
+ "owner": "hyprwm",
+ "repo": "hyprland-protocols",
+ "rev": "6b3261ee13a6d2b99de79a31d352f6996e35bde3",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprland-protocols",
+ "type": "github"
+ }
+ },
+ "hyprland-protocols_2": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprland",
+ "xdph",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "xdph",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1721326555,
+ "narHash": "sha256-zCu4R0CSHEactW9JqYki26gy8h9f6rHmSwj4XJmlHgg=",
+ "owner": "hyprwm",
+ "repo": "hyprland-protocols",
+ "rev": "5a11232266bf1a1f5952d5b179c3f4b2facaaa84",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprland-protocols",
+ "type": "github"
+ }
+ },
+ "hyprlang": {
+ "inputs": {
+ "hyprutils": [
+ "hyprland",
+ "hyprutils"
+ ],
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1725997860,
+ "narHash": "sha256-d/rZ/fHR5l1n7PeyLw0StWMNLXVU9c4HFyfskw568so=",
+ "owner": "hyprwm",
+ "repo": "hyprlang",
+ "rev": "dfeb5811dd6485490cce18d6cc1e38a055eea876",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprlang",
+ "type": "github"
+ }
+ },
+ "hyprpicker-git": {
+ "inputs": {
+ "hyprutils": "hyprutils_2",
+ "hyprwayland-scanner": "hyprwayland-scanner_2",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "systems": "systems_2"
+ },
+ "locked": {
+ "lastModified": 1727705155,
+ "narHash": "sha256-gu26MSYbTlRLMUpZ9PeYXtqqhzPDQXxEDkjiJgwzIIc=",
+ "owner": "hyprwm",
+ "repo": "hyprpicker",
+ "rev": "116cec14a552191a9ad69ca96252ca12ecfa9826",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "ref": "v0.4.1",
+ "repo": "hyprpicker",
+ "type": "github"
+ }
+ },
+ "hyprutils": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727300645,
+ "narHash": "sha256-OvAtVLaSRPnbXzOwlR1fVqCXR7i+ICRX3aPMCdIiv+c=",
+ "owner": "hyprwm",
+ "repo": "hyprutils",
+ "rev": "3f5293432b6dc6a99f26aca2eba3876d2660665c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprutils",
+ "type": "github"
+ }
+ },
+ "hyprutils_2": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprpicker-git",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprpicker-git",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727300645,
+ "narHash": "sha256-OvAtVLaSRPnbXzOwlR1fVqCXR7i+ICRX3aPMCdIiv+c=",
+ "owner": "hyprwm",
+ "repo": "hyprutils",
+ "rev": "3f5293432b6dc6a99f26aca2eba3876d2660665c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprutils",
+ "type": "github"
+ }
+ },
+ "hyprwayland-scanner": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1726874836,
+ "narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=",
+ "owner": "hyprwm",
+ "repo": "hyprwayland-scanner",
+ "rev": "500c81a9e1a76760371049a8d99e008ea77aa59e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprwayland-scanner",
+ "type": "github"
+ }
+ },
+ "hyprwayland-scanner_2": {
+ "inputs": {
+ "nixpkgs": [
+ "hyprpicker-git",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprpicker-git",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1726874836,
+ "narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=",
+ "owner": "hyprwm",
+ "repo": "hyprwayland-scanner",
+ "rev": "500c81a9e1a76760371049a8d99e008ea77aa59e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "hyprwayland-scanner",
+ "type": "github"
+ }
+ },
+ "nixgl": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1713543440,
+ "narHash": "sha256-lnzZQYG0+EXl/6NkGpyIz+FEOc/DSEG57AP1VsdeNrM=",
+ "owner": "nix-community",
+ "repo": "nixGL",
+ "rev": "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "nixGL",
+ "rev": "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1729168305,
+ "narHash": "sha256-jmhxZnrlOyLEMUL2+JkVfkN0XWXI5uE6EB5kVZFR0fo=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "2a55bdc8cfcf41551323a4a6cef24d3f566c824d",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "2a55bdc8cfcf41551323a4a6cef24d3f566c824d",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "home-manager": "home-manager",
+ "hyprland": "hyprland",
+ "hyprpicker-git": "hyprpicker-git",
+ "nixgl": "nixgl",
+ "nixpkgs": "nixpkgs"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1689347949,
+ "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
+ "owner": "nix-systems",
+ "repo": "default-linux",
+ "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default-linux",
+ "type": "github"
+ }
+ },
+ "systems_2": {
+ "locked": {
+ "lastModified": 1689347949,
+ "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
+ "owner": "nix-systems",
+ "repo": "default-linux",
+ "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default-linux",
+ "type": "github"
+ }
+ },
+ "xdph": {
+ "inputs": {
+ "hyprland-protocols": "hyprland-protocols_2",
+ "hyprlang": [
+ "hyprland",
+ "hyprlang"
+ ],
+ "hyprutils": [
+ "hyprland",
+ "hyprutils"
+ ],
+ "hyprwayland-scanner": [
+ "hyprland",
+ "hyprwayland-scanner"
+ ],
+ "nixpkgs": [
+ "hyprland",
+ "nixpkgs"
+ ],
+ "systems": [
+ "hyprland",
+ "systems"
+ ]
+ },
+ "locked": {
+ "lastModified": 1727524473,
+ "narHash": "sha256-1DGktDtSWIJpnDbVoj/qpvJSH5zg6JbOfuh6xqZMap0=",
+ "owner": "hyprwm",
+ "repo": "xdg-desktop-portal-hyprland",
+ "rev": "7e500e679ede40e79cf2d89b5f5fa3e34923bd26",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hyprwm",
+ "repo": "xdg-desktop-portal-hyprland",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
@@ -0,0 +1,55 @@
+{
+ description = "Home Manager configuration of ryan";
+
+ inputs = {
+ # Specify the source of Home Manager and Nixpkgs.
+ nixpkgs.url = "github:nixos/nixpkgs/2a55bdc8cfcf41551323a4a6cef24d3f566c824d";
+ home-manager = {
+ url = "github:nix-community/home-manager/122f70545b29ccb922e655b08acfe05bfb44ec68";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ hyprpicker-git = {
+ url = "github:hyprwm/hyprpicker/v0.4.1";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ hyprland = {
+ url = "github:hyprwm/hyprland/v0.44.1";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ nixgl = {
+ url = "github:nix-community/nixGL/310f8e49a149e4c9ea52f1adf70cdc768ec53f8a";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ };
+
+ outputs = { nixpkgs, home-manager, hyprpicker-git, hyprland, nixgl, ... }@inputs:
+ let
+ system = "x86_64-linux";
+ pkgs = nixpkgs.legacyPackages.${system};
+ overlays = [
+ hyprpicker-git.overlays.default
+ nixgl.overlay
+ ];
+ in {
+ homeConfigurations."ryan" = home-manager.lib.homeManagerConfiguration {
+ inherit pkgs;
+
+ # Specify your home configuration modules here, for example,
+ # the path to your home.nix.
+ modules = [
+ ./home.nix
+ {nixpkgs.overlays = overlays;}
+ {
+ _module.args = {
+ inherit hyprland;
+ inherit nixgl;
+ };
+ }
+ ];
+
+ # Optionally use extraSpecialArgs
+ # to pass through arguments to home.nix
+ #extraSpecialArgs = { inherit inputs; };
+ };
+ };
+}
@@ -1,4 +1,4 @@
-{ config, pkgs, ... }:
+{ config, pkgs, hyprland, nixgl, ... }:
{
# Home Manager needs a bit of information about you and the paths it should
@@ -13,14 +13,16 @@
# 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.
+ home.stateVersion = "23.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;
+ #targets.genericLinux.enable = true;
fonts.fontconfig.enable = true;
+ # wayland.windowManager.hyprland.enable = true;
+
# The home.packages option allows you to install Nix packages into your
# environment.
home.packages = with pkgs; [
@@ -28,8 +30,41 @@
# # "Hello, world!" when run.
# pkgs.hello
yt-dlp
- xdg-desktop-portal-hyprland
- pass
+ #pass
+ rustup
+ zoxide
+ nodePackages.pnpm
+ gcc
+ aerc
+ pkg-config
+ wttrbar
+ swww
+ wl-clip-persist
+ gifski
+ waypaper
+ gdu
+ spotify-player
+ hyprpicker
+ hyprlock
+ xwayland
+ xdg-desktop-portal
+ xdg-desktop-portal-gtk
+ mpv
+ imv
+ libva
+ libvdpau
+ wpaperd
+
+ # Flakes specific things defined in flake.nix
+ hyprland.packages.${pkgs.system}.default
+ hyprland.packages.${pkgs.system}.xdg-desktop-portal-hyprland
+ nixgl.packages.${pkgs.system}.nixGLIntel
+
+ # Fonts!
+ noto-fonts
+ liberation_ttf
+ noto-fonts-cjk-sans
+ noto-fonts-emoji
# # It is sometimes useful to fine-tune packages, for example, by applying
# # overrides. You can do that directly here, just don't forget the
@@ -0,0 +1,2 @@
+setlocal tw=0 wm=0
+setlocal wrap linebreak
@@ -18,7 +18,6 @@ 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'
@@ -28,7 +27,9 @@ Plug 'ms-jpq/coq.artifacts', {'branch':'artifacts'}
Plug 'williamboman/mason.nvim'
Plug 'williamboman/mason-lspconfig.nvim'
Plug 'neovim/nvim-lspconfig'
-Plug 'nvim-orgmode/orgmode'
+"Plug 'nvim-orgmode/orgmode'
+Plug 'ggandor/leap.nvim'
+Plug 'xiyaowong/transparent.nvim'
call plug#end()
"Load Theme
@@ -41,12 +42,14 @@ let g:coq_settings = {'auto_start':'shut-up'}
lua << END
require('lualine').setup()
require('coq')
-require('orgmode').setup_ts_grammar()
+require("transparent")
require("mason").setup()
require("mason-lspconfig").setup {
ensure_installed = { "pyright" },
}
+require('leap').add_default_mappings()
+
require("mason-lspconfig").setup_handlers {
function (server_name)
require("lspconfig")[server_name].setup {}
@@ -58,18 +61,9 @@ require('nvim-treesitter.configs').setup {
enable = true,
additional_vim_regex_highlighting = {'org'},
},
- ensure_installed = {'org', 'vim', 'python'},
+ ensure_installed = {'vim', 'python'},
}
-require('orgmode').setup({
- org_agenda_files = {'~/Sync/org/**/*'},
- org_default_notes_file = '~/Sync/org/refile.org',
- org_blank_before_new_entry = {
- heading = false,
- plain_list_item = false,
- },
-})
-
vim.opt.conceallevel = 2
vim.opt.concealcursor = nc
@@ -0,0 +1 @@
+autospawn = no
@@ -0,0 +1,34 @@
+theme = "dracula"
+client_id = "4b1219bdc29945bc8ca914f80a8a6a47"
+client_port = 8888
+playback_format = """
+{track} • {artists}
+{album}
+{metadata}"""
+tracks_playback_limit = 50
+app_refresh_duration_in_ms = 32
+playback_refresh_duration_in_ms = 0
+cover_image_refresh_duration_in_ms = 2000
+page_size_in_rows = 20
+play_icon = "▶"
+pause_icon = "▌▌"
+liked_icon = "♥"
+border_type = "Plain"
+progress_bar_type = "Rectangle"
+playback_window_position = "Top"
+cover_img_length = 9
+cover_img_width = 5
+cover_img_scale = 1.0
+playback_window_width = 6
+enable_media_control = true
+enable_streaming = "DaemonOnly"
+enable_cover_image_cache = true
+default_device = "RyanThinkpad"
+
+[copy_command]
+command = "wlcopy"
+args = []
+
+[notify_format]
+summary = "{track} • {artists}"
+body = "{album}"
@@ -12,5 +12,13 @@ Host hetzner
HostName 5.161.207.21
User root
+Host rncorepub
+ Hostname 5.161.89.186
+ User root
+
+Host 192.168.216.1
+ HostkeyAlgorithms +ssh-rsa
+ PubkeyAcceptedAlgorithms +ssh-rsa
+
Host *
KexAlgorithms -sntrup761x25519-sha512@openssh.com
Binary files /dev/null and b/home-config/tridactyl/native_main differ
@@ -0,0 +1,7 @@
+{
+ "name": "tridactyl",
+ "description": "Tridactyl native command handler",
+ "path": "/home/ryan/.local/share/tridactyl/native_main",
+ "type": "stdio",
+ "allowed_extensions": [ "tridactyl.vim@cmcaine.co.uk","tridactyl.vim.betas@cmcaine.co.uk", "tridactyl.vim.betas.nonewtab@cmcaine.co.uk" ]
+}
@@ -5,7 +5,7 @@
"modules-left": ["hyprland/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"],
+ "modules-right": ["tray", "custom/spotify", "privacy", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "clock"],
"hyprland/submap": {
"format": " {}"
},
@@ -56,9 +56,26 @@
"ethernet": [""],
"disconnected": [""]
},
- "on-click": "alacritty -e doas nmtui",
+ "on-click": "foot -t alacritty doas nmtui",
"tooltip": false
},
+ "privacy": {
+ "icon-spacing":4,
+ "icon-size":18,
+ "transition-duration":250,
+ "modules": [
+ {
+ "type":"screenshare",
+ "tooltip":true,
+ "tooltip-icon-size":24
+ },
+ {
+ "type":"audio-in",
+ "tooltip":true,
+ "tooltip-icon-size":24
+ }
+ ]
+ },
"pulseaudio": {
"format-alt": "{icon}",
"format": "{volume} {icon}",
@@ -93,19 +110,27 @@
"format": "{percent}% {icon}",
"format-alt-click": "click-right",
"format-icons": ["", ""],
- "on-scroll-down": "light -A 1",
- "on-scroll-up": "light -U 1"
+ "on-scroll-up": "light -A 1",
+ "on-scroll-down": "light -U 1"
},
- "custom/weather": {
+ "custom/weather_OLD": {
"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",
+ "on-click": "foot -a ala-wttr -H curl https://v2.wttr.in",
"exec": "~/.config/waybar/modules/weather.sh",
"exec-if": "ping wttr.in -c1"
},
+ "custom/weather": {
+ "format": "{} °F",
+ "tooltip": true,
+ "interval": 3600,
+ "exec": "exit=101; while [ $exit = 101 ]; do wttrbar --main-indicator temp_F --fahrenheit; exit=$(echo $?); sleep 1; done",
+ "on-click": "foot -a ala-wttr -H curl https://v2.wttr.in",
+ "return-type": "json"
+ },
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
@@ -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-----
@@ -9,11 +9,16 @@
#: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 (ryan-packages virtualization)
+ #:use-module (ryan-packages linux)
+ #:use-module (ryan-packages networking)
#:use-module (rosenthal packages wm)
+ #:use-module (rosenthal services networking)
#:use-module (gnu packages security-token)
#:use-module (gnu services security-token)
#:use-module (gnu services cups)
@@ -25,6 +30,7 @@
#: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
@@ -85,6 +91,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)
@@ -99,27 +114,26 @@
(name "ryan")
(comment "Ryan")
(group "users")
- ;(shell (file-append zsh "/bin/zsh"))
+ (shell (file-append fish "/bin/fish"))
(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"
+ ;"hyprland"
"swaybg"
- "swayidle"
+ ;"swayidle"
;"swaylock-effects"
"fuzzel"
- "alacritty"
+ "foot"
"pinentry-qt"
"adwaita-icon-theme"
"hicolor-icon-theme"
"git"
- "nss-certs"
- ;"waybar"
+ "waybar-experimental"
"gnupg"
"light"
"avahi"
@@ -128,15 +142,15 @@
"grimblast"
"slurp"
"wl-clipboard"
- "bluez"
- "blueman"
+ ;"bluez"
+ ;"blueman"
"ldacbt"
"libfreeaptx"
"libfdk"
"opendoas"
;"xdg-desktop-portal-wlr"
- "xdg-desktop-portal"
- "xdg-desktop-portal-gtk"
+ ;"xdg-desktop-portal"
+ ;"xdg-desktop-portal-gtk"
"v4l2loopback-linux-module"
"pipewire"
"docker"
@@ -145,8 +159,9 @@
"dconf"
"wireplumber"
"wireshark"
+ "webkitgtk-with-libsoup2" ; Needed for Go wails development
"zsh"))
- (list my-ca-certs swaylock-effects-new waybar-new xdg-desktop-portal-hyprland virt-manager-ovmf)
+ (list my-ca-certs virt-manager-ovmf bluez-ryan blueman-ryan swayidle-new)
%my-base-packages ))
;; Below is the list of system services. To search for available
@@ -167,14 +182,22 @@
(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)
+ ; Tailscale daemon from rosenthal
+ (service tailscale-service-type
+ (tailscale-configuration
+ (socket "/var/run/tailscale/tailscaled.sock")))
+ (service containerd-service-type)
(service nix-service-type)
(service libvirt-service-type
(libvirt-configuration
(libvirt libvirt-ovmf)
(unix-sock-group "libvirt")))
(service virtlog-service-type)
+ (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"))))
(service bluetooth-service-type
(bluetooth-configuration
+ (bluez bluez-ryan)
(experimental #t)
(fast-connectable? #t)))
(udev-rules-service 'fido2 libfido2 #:groups '("plugdev")))
@@ -199,8 +222,16 @@
(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-lid-switch `ignore)
+ (kill-user-processes? #t)))
(delete pulseaudio-service-type)
(delete gdm-service-type)
(delete avahi-service-type)
@@ -208,11 +239,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,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,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,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,10 +3,9 @@
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix gexp)
#:use-module (guix build-system meson)
- #:use-module (guix build-system qt)
#:use-module (guix build-system cmake)
+ #:use-module (guix build-system qt)
#:use-module (guix build utils)
- #:use-module (guix build glib-or-gtk-build-system)
#:use-module (guix packages)
#:use-module (guix git-download)
#:use-module (guix utils)
@@ -15,10 +14,13 @@
#: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 (gnu packages xorg)
+ #:use-module (gnu packages glib)
#:use-module (gnu packages man)
#:use-module (rosenthal packages wm)
#:use-module (gnu packages wm))
@@ -39,10 +41,47 @@
(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 "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
+ #: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 "0.5.0")
+ (version "1.2.4")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -51,7 +90,7 @@
(file-name (git-file-name name version))
(sha256
(base32
- "1dmgc0w4wjj9hwqg17wg529v8sbxr6czp9s319d5407jm780x40b"))))
+ "1m82rrir2fg7h2cpch6wm3h1rkpnbh9pawlw1wdknw75mi6139r0"))))
(build-system meson-build-system)
(arguments
(list
@@ -95,8 +134,8 @@
(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")
@@ -105,7 +144,7 @@
(define-public wl-mirror
(package
(name "wl-mirror")
- (version "0.13.2")
+ (version "0.16.1")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -115,7 +154,7 @@
(file-name (git-file-name name version))
(sha256
(base32
- "0vkd73x5r2585s3w1ckvslc2mq9qbzrm5xkwg8gpy9ydaxhn8hmp"))))
+ "06i4jrip4q9j1gp81j0jr79cwfj9zdcfcr1n0jpyqlxsysppidlc"))))
(inputs (list wayland egl-wayland mesa))
(native-inputs (list pkg-config scdoc wayland-protocols))
(build-system cmake-build-system)
@@ -132,4 +171,4 @@
(description "mirror displays")
(license license:expat)))
-wl-mirror
+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,35 @@
+(define-module (ryan-packages linux)
+ #:use-module (guix download)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages python-xyz)
+ #:use-module (guix git-download)
+ #:use-module (guix utils))
+
+(define-public bluez-ryan
+ (package
+ (inherit bluez)
+ (version "5.72")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "mirror://kernel.org/linux/bluetooth/bluez-"
+ version ".tar.xz"))
+ (sha256
+ (base32
+ "0vjk4ihywzv8k07bxq7clqgi2afrw54nfp0gcnxw35m98nipz7a9"))))
+ (arguments (list
+ #:configure-flags
+ #~(list "--sysconfdir=/etc"
+ "--localstatedir=/var"
+ "--enable-library"
+ "--disable-manpages"
+ "--disable-systemd"
+ "--enable-hid2hci"
+ (string-append "--with-dbusconfdir=" #$output "/etc")
+ (string-append "--with-udevdir=" #$output "/lib/udev"))))))
+
+bluez-ryan
@@ -9,24 +9,19 @@
#:use-module (guix build-system trivial)
#:use-module (nongnu packages mozilla))
-(define firefox*
- (package/inherit
- firefox
- (inputs
- (modify-inputs
- (package-inputs firefox)
- (delete "pipewire")
- (append pipewire)))))
-
-(define-public firefox-wayland-new
+(define-public firefox-wrapped
(package
- (inherit firefox*)
- (name "firefox-wayland-new")
- (native-inputs '())
+ (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*)))
+ ("firefox" ,firefox)))
(build-system trivial-build-system)
(arguments
'(#:modules ((guix build utils))
@@ -47,6 +42,7 @@
(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")
@@ -0,0 +1,14 @@
+(define-module (ryan-packages networking)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #: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)))))
+
+blueman-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,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,25 @@
+(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 home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (srfi srfi-1)
+ #:use-module (guix gexp))
+
+(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))
@@ -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