Compare
2cbe73acc84ec691257ffa873bbf66c223cf9cd2
…
main
· 81 commits
Commits
@@ -0,0 +1,3 @@
+[submodule "home-config/nix-files"]
+ path = home-config/nix-files
+ url = ssh://git@git.rschanz.org/nix-combined.git
@@ -2,7 +2,27 @@
## Installing Guix
-### Instructions
+### New Instructions
+
+- Boot from Bootable media
+- Setup network and partitions with graphical installer
+- bail out before installation, go to terminal
+ - mount cow-store using `herd start cow-store /mnt`
+ - download latest personal config
+ - add authorization keys
+ - use guix time-machine with `env GUILE_LOAD_PATH='' GUILD_LOAD_COMPILED_PATH='' ...` to init system
+ - place copy of config in /mnt to copy over later. MAKE SURE TO INCLUDE .git FOLDER!!
+ - reboot into new system
+- assign root and ryan pw
+- login to ryan
+ - place config into ~/.config/guix
+ - run `guix pull -C ~/.config/guix/channels.scm`
+ - run `sudo -E guix system -L ~/.config/guix/modules reconfigure ...`
+ - run `guix home -L ~/.config/guix/modules reconfigure ...`
+ - run `nix run --no-write-lock-file github:nix-community/home-manager/ -- --flake ".#$USER" switch`
+- you may have a system now
+
+### Instructions (old, for reference)
- Create USB with Guix installation image
- Boot and create partitions using graphical installer
@@ -25,7 +25,8 @@
'fat32))
(type "vfat")) %base-file-systems))
(bootloader (bootloader-configuration
- (bootloader uefi-uki-bootloader)
+ (bootloader (uefi-uki-signed-bootloader
+ "/var/lib/sbctl/keys/db/db.pem" "/var/lib/sbctl/keys/db/db.key"))
(targets (list "/boot/efi"))
(keyboard-layout (keyboard-layout "us"))))
(swap-devices
@@ -0,0 +1,39 @@
+(use-modules (ryan-config base-system)
+ (ryan-bootloader uki)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (kernel-arguments (append (list "amd_iommu=on"
+ "iommu=pt"
+ "pci=noats"
+ "pcie_aspm=off"
+ "modprobe.blacklist=nouveau"
+ "vfio-pci.disable_idle_d3=1"
+ "vfio-pci.ids=10de:13f1,10de:0fbb")
+ %default-kernel-arguments))
+ (initrd-modules (cons* "vfio_pci" "vfio" "vfio_iommu_type1"
+ %base-initrd-modules))
+ (host-name "RyanTower")
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "e9f000b6-5532-499b-8278-bba30c1a2673"))
+ (target "sysroot")
+ (type luks-device-mapping))))
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/sysroot")
+ (type "ext4")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "89A8-89B0"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (bootloader (bootloader-configuration
+ (bootloader uefi-uki-bootloader)
+ (targets (list "/boot/efi"))
+ (keyboard-layout (keyboard-layout "us"))))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "e9f000b6-5532-499b-8278-bba30c1a2673"))))))
@@ -0,0 +1,30 @@
+(use-modules (ryan-config base-system)
+ (ryan-bootloader uki)
+ (gnu))
+
+(operating-system
+ (inherit base-operating-system)
+ (host-name "SmallLaptop")
+ (mapped-devices (list (mapped-device
+ (source (uuid
+ "f2daabc9-543e-4128-8c61-dd5278988781"))
+ (target "sysroot")
+ (type luks-device-mapping))))
+ (file-systems (cons* (file-system
+ (mount-point "/")
+ (device "/dev/mapper/sysroot")
+ (type "ext4")
+ (dependencies mapped-devices))
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "1E29-F197"
+ 'fat32))
+ (type "vfat")) %base-file-systems))
+ (bootloader (bootloader-configuration
+ (bootloader (uefi-uki-signed-bootloader
+ "/var/lib/sbctl/keys/db/db.pem" "/var/lib/sbctl/keys/db/db.key"))
+ (targets (list "/boot/efi"))
+ (keyboard-layout (keyboard-layout "us"))))
+ (swap-devices
+ (list
+ (swap-space (target (uuid "93ded2d1-da41-4b74-a1ca-697fe99b7efb"))))))
@@ -1,9 +1,9 @@
(list (channel
(name 'guix)
- (url "https://git.savannah.gnu.org/git/guix.git")
+ (url "https://codeberg.org/guix/guix.git")
(branch "master")
(commit
- "18463019a24a7c5acc9c2f3ddf3c0ba04a36db96")
+ "85a7d902c039d82a646f771f661d6935f0a6a1cf")
(introduction
(make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad"
@@ -14,7 +14,7 @@
(url "https://gitlab.com/nonguix/nonguix")
(branch "master")
(commit
- "f44a49d3092d509c5e09cc27ada40a8c4d99c02d")
+ "a3f4e7bff779da4593a2922516064a8edaafa3e6")
(introduction
(make-channel-introduction
"897c1a470da759236cc11798f4e0a5f7d4d59fbc"
@@ -25,7 +25,7 @@
(url "https://codeberg.org/hako/rosenthal.git")
(branch "trunk")
(commit
- "5cb609ce31f9351b9f3a9e94b2a51e48603ef68f")
+ "9e60a11917cbdca57e10c51e174dfa56379e74cc")
(introduction
(make-channel-introduction
"7677db76330121a901604dfbad19077893865f35"
@@ -95,7 +95,7 @@ install_user_env() {
# Copy some files over to prepare for reboot
USER=ryan
- guix shell git -- git clone https://git.stationery.faith/ryan77627/guix-dotfiles /mnt/home/$USER/.config/guix
+ guix shell git -- git clone --recurse-submodules https://git.stationery.faith/ryan77627/guix-dotfiles /mnt/home/$USER/.config/guix
cp ~/guix-dotfiles/$install_hostname.scm /mnt/home/$USER/.config/guix/$install_hostname.scm
cp ~/guix-dotfiles/modules/ryan-config/user_first_run.sh /mnt/home/$USER/.bashrc
@@ -1,32 +0,0 @@
-[Personal]
-source = imaps://ryan%40rschanz.org@mail.rschanz.org:993
-source-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
-outgoing = smtps://ryan%40rschanz.org@mail.rschanz.org:465
-outgoing-cred-cmd = pass emails/personal 2>/dev/null | tr -d '\n'
-default = INBOX
-from = Ryan Schanzenbacher <ryan@rschanz.org>
-copy-to = Sent
-signature-file = ~/.config/aerc/signature_personal
-check-mail = 5m
-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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
-source-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
-outgoing = smtps+oauthbearer://rjs1877%40rit.edu@imap.gmail.com:465?token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken&client_id=667738788924-0rdfvaq9ijfo1vk4474eb3quf8206h2t.apps.googleusercontent.com&client_secret=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
-outgoing-cred-cmd = pass emails/rit_personal 2>/dev/null | tr -d '\n'
-from = Ryan Schanzenbacher <rjs1877@rit.edu>
-signature-file = ~/.config/aerc/signature_rit_personal
-check-mail = 5m
-default = INBOX
-copy-to = [Gmail]/Sent Mail
@@ -1,568 +0,0 @@
-#
-# aerc main configuration
-
-[general]
-#
-# Used as a default path for save operations if no other path is specified.
-# ~ is expanded to the current user home dir.
-#
-default-save-path=~/Downloads/
-
-# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
-# operations. If set to "internal", the internal openpgp keyring will be used.
-# If set to "auto", the system gpg will be preferred unless the internal
-# keyring already exists, in which case the latter will be used.
-#
-# Default: auto
-pgp-provider=gpg
-
-# By default, the file permissions of accounts.conf must be restrictive and
-# only allow reading by the file owner (0600). Set this option to true to
-# ignore this permission check. Use this with care as it may expose your
-# credentials.
-#
-# Default: false
-unsafe-accounts-conf=true # I don't store my creds in this
-
-# Output log messages to specified file. A path starting with ~/ is expanded to
-# the user home dir. When redirecting aerc's output to a file using > shell
-# redirection, this setting is ignored and log messages are printed to stdout.
-#
-#log-file=~/aerc_log
-
-# Only log messages above the specified level to log-file. Supported levels
-# are: trace, debug, info, warn and error. When redirecting aerc's output to
-# a file using > shell redirection, this setting is ignored and the log level
-# is forced to trace.
-#
-# Default: info
-log-level=trace
-
-# Set the $TERM environment variable used for the embedded terminal.
-#
-# Default: xterm-256color
-#term=xterm-256color
-
-# Display OSC8 strings in the embedded terminal
-#
-# Default: false
-#enable-osc8=false
-
-[ui]
-#
-# Describes the format for each row in a mailbox view. This is a comma
-# separated list of column names with an optional align and width suffix. After
-# the column name, one of the '<' (left), ':' (center) or '>' (right) alignment
-# characters can be added (by default, left) followed by an optional width
-# specifier. The width is either an integer representing a fixed number of
-# characters, or a percentage between 1% and 99% representing a fraction of the
-# terminal width. It can also be one of the '*' (auto) or '=' (fit) special
-# width specifiers. Auto width columns will be equally attributed the remaining
-# terminal width. Fit width columns take the width of their contents. If no
-# width specifier is set, '*' is used by default.
-#
-# Default: date<20,name<17,flags>4,subject<*
-#index-columns=date<20,name<17,flags>4,subject<*
-
-spinner = '/,-,\,|'
-
-#
-# Each name in index-columns must have a corresponding column-$name setting.
-# All column-$name settings accept golang text/template syntax. See
-# aerc-templates(7) for available template attributes and functions.
-#
-# Default settings
-#column-date={{.DateAutoFormat .Date.Local}}
-#column-name={{index (.From | names) 0}}
-#column-flags={{.Flags | join ""}}
-#column-subject={{.ThreadPrefix}}{{.Subject}}
-
-#
-# String separator inserted between columns. When the column width specifier is
-# an exact number of characters, the separator is added to it (i.e. the exact
-# width will be fully available for the column contents).
-#
-# Default: " "
-#column-separator=" "
-
-#
-# See time.Time#Format at https://godoc.org/time#Time.Format
-#
-# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
-#timestamp-format=2006-01-02 03:04 PM
-
-#
-# Index-only time format for messages that were received/sent today.
-# If this is not specified, timestamp-format is used instead.
-#
-#this-day-time-format=
-
-#
-# Index-only time format for messages that were received/sent within the last
-# 7 days. If this is not specified, timestamp-format is used instead.
-#
-#this-week-time-format=
-
-#
-# Index-only time format for messages that were received/sent this year.
-# If this is not specified, timestamp-format is used instead.
-#
-#this-year-time-format=
-
-#
-# Width of the sidebar, including the border.
-#
-# Default: 20
-#sidebar-width=20
-
-#
-# Message to display when viewing an empty folder.
-#
-# Default: (no messages)
-#empty-message=(no messages)
-
-# Message to display when no folders exists or are all filtered
-#
-# Default: (no folders)
-#empty-dirlist=(no folders)
-
-# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
-#
-# Default: false
-#mouse-enabled=false
-
-#
-# Ring the bell when new messages are received
-#
-# Default: true
-#new-message-bell=true
-
-#
-# Template to use for Account tab titles
-#
-# Default: {{.Account}}
-#tab-title-account={{.Account}}
-
-# Marker to show before a pinned tab's name.
-#
-# Default: `
-#pinned-tab-marker='`'
-
-# Template for the left side of the directory list.
-# See aerc-templates(7) for all available fields and functions.
-#
-# Default: {{.Folder}}
-#dirlist-left={{.Folder}}
-
-# Template for the right side of the directory list.
-# See aerc-templates(7) for all available fields and functions.
-#
-# Default: {{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
-#dirlist-right={{if .Unread}}{{humanReadable .Unread}}/{{end}}{{if .Exists}}{{humanReadable .Exists}}{{end}}
-
-# Delay after which the messages are actually listed when entering a directory.
-# This avoids loading messages when skipping over folders and makes the UI more
-# responsive. If you do not want that, set it to 0s.
-#
-# Default: 200ms
-#dirlist-delay=200ms
-
-# Display the directory list as a foldable tree that allows to collapse and
-# expand the folders.
-#
-# Default: false
-#dirlist-tree=false
-
-# If dirlist-tree is enabled, set level at which folders are collapsed by
-# default. Set to 0 to disable.
-#
-# Default: 0
-#dirlist-collapse=0
-
-# List of space-separated criteria to sort the messages by, see *sort*
-# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
-# reverses that criterion.
-#
-# Example: "from -r date"
-#
-#sort=
-
-# Moves to next message when the current message is deleted
-#
-# Default: true
-#next-message-on-delete=true
-
-# Automatically set the "seen" flag when a message is opened in the message
-# viewer.
-#
-# Default: true
-#auto-mark-read=true
-
-# The directories where the stylesets are stored. It takes a colon-separated
-# list of directories. If this is unset or if a styleset cannot be found, the
-# following paths will be used as a fallback in that order:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
-# /usr/local/share/aerc/stylesets
-# /usr/share/aerc/stylesets
-#
-#stylesets-dirs=
-
-# Uncomment to use box-drawing characters for vertical and horizontal borders.
-#
-# Default: " "
-#border-char-vertical=" "
-#border-char-horizontal=" "
-
-# Sets the styleset to use for the aerc ui elements.
-#
-# Default: default
-#styleset-name=default
-
-# Activates fuzzy search in commands and their arguments: the typed string is
-# searched in the command or option in any position, and need not be
-# consecutive characters in the command or option.
-#
-# Default: false
-#fuzzy-complete=false
-
-# How long to wait after the last input before auto-completion is triggered.
-#
-# Default: 250ms
-#completion-delay=250ms
-
-# The minimum required characters to allow auto-completion to be triggered after
-# completion-delay.
-#
-# Default: 1
-#completion-min-chars=1
-
-#
-# Global switch for completion popovers
-#
-# Default: true
-#completion-popovers=true
-
-# Uncomment to use UTF-8 symbols to indicate PGP status of messages
-#
-# Default: ASCII
-#icon-unencrypted=
-#icon-encrypted=✔
-#icon-signed=✔
-#icon-signed-encrypted=✔
-#icon-unknown=✘
-#icon-invalid=⚠
-
-# Reverses the order of the message list. By default, the message list is
-# ordered with the newest (highest UID) message on top. Reversing the order
-# will put the oldest (lowest UID) message on top. This can be useful in cases
-# where the backend does not support sorting.
-#
-# Default: false
-#reverse-msglist-order = false
-
-# Reverse display of the mesage threads. Default order is the the intial
-# message is on the top with all the replies being displayed below. The
-# reverse option will put the initial message at the bottom with the
-# replies on top.
-#
-# Default: false
-#reverse-thread-order=false
-
-# Sort the thread siblings according to the sort criteria for the messages. If
-# sort-thread-siblings is false, the thread siblings will be sorted based on
-# the message UID in ascending order. This option is only applicable for
-# client-side threading with a backend that enables sorting. Note that there's
-# a performance impact when sorting is activated.
-#
-# Default: false
-#sort-thread-siblings=false
-
-#[ui:account=Personal]
-#
-# Enable a threaded view of messages. If this is not supported by the backend
-# (IMAP server or notmuch), threads will be built by the client.
-#
-# Default: false
-threading-enabled=true
-
-# Force client-side thread building
-#
-# Default: false
-#force-client-threads=false
-
-# Debounce client-side thread building
-#
-# Default: 50ms
-#client-threads-delay=50ms
-
-[statusline]
-#
-# Describes the format for the status line. This is a comma separated list of
-# column names with an optional align and width suffix. See [ui].index-columns
-# for more details. To completely mute the status line except for push
-# notifications, explicitly set status-columns to an empty string.
-#
-# Default: left<*,center:=,right>*
-#status-columns=left<*,center:=,right>*
-
-#
-# Each name in status-columns must have a corresponding column-$name setting.
-# All column-$name settings accept golang text/template syntax. See
-# aerc-templates(7) for available template attributes and functions.
-#
-# Default settings
-#column-left=[{{.Account}}] {{.StatusInfo}}
-#column-center={{.PendingKeys}}
-#column-right={{.TrayInfo}}
-
-#
-# String separator inserted between columns.
-# See [ui].column-separator for more details.
-#
-#column-separator=" "
-
-# Specifies the separator between grouped statusline elements.
-#
-# Default: " | "
-#separator=" | "
-
-# Defines the mode for displaying the status elements.
-# Options: text, icon
-#
-# Default: text
-#display-mode=text
-
-[viewer]
-#
-# Specifies the pager to use when displaying emails. Note that some filters
-# may add ANSI codes to add color to rendered emails, so you may want to use a
-# pager which supports ANSI codes.
-#
-# Default: less -R
-#pager=less -R
-
-#
-# If an email offers several versions (multipart), you can configure which
-# mimetype to prefer. For example, this can be used to prefer plaintext over
-# html emails.
-#
-# Default: text/plain,text/html
-#alternatives=text/plain,text/html
-
-#
-# Default setting to determine whether to show full headers or only parsed
-# ones in message viewer.
-#
-# Default: false
-#show-headers=false
-
-#
-# Layout of headers when viewing a message. To display multiple headers in the
-# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
-# none of their specified headers are present in the message.
-#
-# Default: From|To,Cc|Bcc,Date,Subject
-#header-layout=From|To,Cc|Bcc,Date,Subject
-
-# Whether to always show the mimetype of an email, even when it is just a single part
-#
-# Default: false
-#always-show-mime=false
-
-# Parses and extracts http links when viewing a message. Links can then be
-# accessed with the open-link command.
-#
-# Default: true
-#parse-http-links=true
-
-[compose]
-#
-# Specifies the command to run the editor with. It will be shown in an embedded
-# terminal, though it may also launch a graphical window if the environment
-# supports it. Defaults to $EDITOR, or vi.
-#editor=
-
-# Address book command
-address-book-cmd = sh -c 'abook --mutt-query "%s" | tail -n +2'
-
-#
-# Default header fields to display when composing a message. To display
-# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
-#
-# Default: To|From,Subject
-#header-layout=To|From,Subject
-
-#
-# Specifies the command to be used to tab-complete email addresses. Any
-# occurrence of "%s" in the address-book-cmd will be replaced with what the
-# user has typed so far.
-#
-# The command must output the completions to standard output, one completion
-# per line. Each line must be tab-delimited, with an email address occurring as
-# the first field. Only the email address field is required. The second field,
-# if present, will be treated as the contact name. Additional fields are
-# ignored.
-#
-# This parameter can also be set per account in accounts.conf.
-#address-book-cmd=
-
-# Specifies the command to be used to select attachments. Any occurence of '%s'
-# in the file-picker-cmd will be replaced the argument <arg> to :attach -m
-# <arg>.
-#
-# The command must output the selected files to standard output, one file per
-# line.
-file-picker-cmd=fzf --multi --query=%s
-
-#
-# Allow to address yourself when replying
-#
-# Default: true
-#reply-to-self=true
-
-#
-# Warn before sending an email that matches the specified regexp but does not
-# have any attachments. Leave empty to disable this feature.
-#
-# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
-# "(?im)" flags are set by default (case-insensitive and multi-line).
-#
-# Example:
-# no-attachment-warning=^[^>]*attach(ed|ment)
-#
-#no-attachment-warning=
-
-#
-# When set, aerc will generate "format=flowed" bodies with a content type of
-# "text/plain; format=flowed" as described in RFC3676. This format is easier to
-# handle for some mailing software, and generally just looks like ordinary
-# text. To actually make use of this format's features, you'll need support in
-# your editor.
-#
-format-flowed=true
-
-[multipart-converters]
-#
-# Converters allow to generate multipart/alternative messages by converting the
-# main text/plain part into any other MIME type. Only exact MIME types are
-# accepted. The commands are invoked with sh -c and are expected to output
-# valid UTF-8 text.
-#
-# Example (obviously, this requires that you write your main text/plain body
-# using the markdown syntax):
-text/html=pandoc --wrap=preserve -f gfm+hard_line_breaks -t html --standalone
-
-[filters]
-#
-# Filters allow you to pipe an email body through a shell command to render
-# certain emails differently, e.g. highlighting them with ANSI escape codes.
-#
-# The commands are invoked with sh -c. The following folders are appended to
-# the system $PATH to allow referencing filters from their name only:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
-# $PREFIX/share/aerc/filters
-# /usr/share/aerc/filters
-#
-# The following variables are defined in the filter command environment:
-#
-# AERC_MIME_TYPE the part MIME type/subtype
-# AERC_FORMAT the part content type format= parameter
-# AERC_FILENAME the attachment filename (if any)
-# AERC_SUBJECT the message Subject header value
-# AERC_FROM the message From header value
-#
-# The first filter which matches the email's mimetype will be used, so order
-# them from most to least specific.
-#
-# You can also match on non-mimetypes, by prefixing with the header to match
-# against (non-case-sensitive) and a comma, e.g. subject,text will match a
-# subject which contains "text". Use header,~regex to match against a regex.
-#
-#text/plain=colorize
-#text/calendar=calendar
-message/delivery-status=bat -fn
-message/rfc822=bat -fn
-text/html=pandoc -f html -t plain | bat -fn
-#text/html=html | colorize
-text/*=bat -fn
-application/x-sh=bat -fn -l sh
-#image/*=catimg -w $(tput cols) -
-#subject,~Git(hub|lab)=lolcat -f
-#from,thatguywhodoesnothardwraphismessages=wrap -w 100 | colorize
-
-# This special filter is only used to post-process email headers when
-# [viewer].show-headers=true
-# By default, headers are piped directly into the pager.
-#
-#.headers=bat -fp
-
-[openers]
-#
-# Openers allow you to specify the command to use for the :open and :open-link
-# actions on a per-MIME-type basis. The :open-link URL scheme is used to
-# determine the MIME type as follows: x-scheme-handler/<scheme>.
-#
-# {} is expanded as the temporary filename to be opened. If it is not
-# encountered in the command, the temporary filename will be appened to the end
-# of the command.
-#
-# Like [filters], openers support basic shell globbing. The first opener which
-# matches the part's MIME type (or URL scheme handler MIME type) will be used,
-# so order them from most to least specific.
-#
-# Examples:
-# x-scheme-handler/irc=hexchat
-# x-scheme-handler/http*=firefox
-# text/html=surf -dfgms
-# text/plain=gvim {} +125
-# message/rfc822=thunderbird
-
-[hooks]
-#
-# Hooks are triggered whenever the associated event occurs.
-
-#
-# Executed when a new email arrives in the selected folder
-mail-received=notify-send "$AERC_FROM_NAME" "$AERC_SUBJECT"
-
-#
-# Executed when aerc starts
-#aerc-startup=aerc :terminal calcurse && aerc :next-tab
-
-#
-# Executed when aerc shuts down.
-#aerc-shutdown=
-
-[templates]
-# Templates are used to populate email bodies automatically.
-#
-
-# The directories where the templates are stored. It takes a colon-separated
-# list of directories. If this is unset or if a template cannot be found, the
-# following paths will be used as a fallback in that order:
-#
-# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
-# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
-# /usr/local/share/aerc/templates
-# /usr/share/aerc/templates
-#
-#template-dirs=
-
-# The default template to be used for new messages.
-#
-# default: new_message
-#new-message=new_message
-
-# The default template to be used for quoted replies.
-#
-# default: quoted_reply
-#quoted-reply=quoted_reply
-
-# The default template to be used for forward as body.
-#
-# default: forward_as_body
-#forwards=forward_as_body
@@ -1,149 +0,0 @@
-# Binds are of the form <key sequence> = <command to run>
-# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
-# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-t> = :term<Enter>
-? = :help keys<Enter>
-
-[messages]
-q = :quit<Enter>
-
-j = :next<Enter>
-<Down> = :next<Enter>
-<C-d> = :next 50%<Enter>
-<C-f> = :next 100%<Enter>
-<PgDn> = :next 100%<Enter>
-
-k = :prev<Enter>
-<Up> = :prev<Enter>
-<C-u> = :prev 50%<Enter>
-<C-b> = :prev 100%<Enter>
-<PgUp> = :prev 100%<Enter>
-g = :select 0<Enter>
-G = :select -1<Enter>
-<C-r> = :read<Enter>
-<C-u> = :unread<Enter>
-
-J = :next-folder<Enter>
-K = :prev-folder<Enter>
-H = :collapse-folder<Enter>
-L = :expand-folder<Enter>
-
-v = :mark -t<Enter>
-V = :mark -v<Enter>
-
-T = :toggle-threads<Enter>
-
-<Enter> = :view<Enter>
-dd = :mv Trash<Enter>
-dg = :mv [Gmail]/Trash<Enter>
-D = :delete<Enter>
-A = :archive year<Enter>
-
-C = :compose<Enter>
-
-rr = :reply -a<Enter>
-rq = :reply -aq<Enter>
-Rr = :reply<Enter>
-Rq = :reply -q<Enter>
-f = :forward -A<Enter>
-
-# 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>
-| = :pipe<space>
-
-/ = :search<space>
-\ = :filter<space>
-n = :next-result<Enter>
-N = :prev-result<Enter>
-<Esc> = :clear<Enter>
-
-[messages:folder=Drafts]
-<Enter> = :recall<Enter>
-
-[view]
-/ = :toggle-key-passthrough<Enter>/
-q = :close<Enter>
-O = :open<Enter>
-S = :save<space>
-| = :pipe<space>
-D = :delete<Enter>
-dd = :mv Trash<Enter>
-dg = :mv [Gmail]/Trash<Enter>
-A = :archive year<Enter>
-
-<C-l> = :open-link <space>
-
-f = :forward -A<Enter>
-rr = :reply -a<Enter>
-rq = :reply -aq<Enter>
-Rr = :reply<Enter>
-Rq = :reply -q<Enter>
-
-H = :toggle-headers<Enter>
-<C-k> = :prev-part<Enter>
-<C-j> = :next-part<Enter>
-J = :next<Enter>
-K = :prev<Enter>
-
-[view::passthrough]
-$noinherit = true
-$ex = <C-x>
-<Esc> = :toggle-key-passthrough<Enter>
-
-[compose]
-# Keybindings used when the embedded terminal is not selected in the compose
-# view
-$noinherit = true
-$ex = <C-x>
-<C-k> = :prev-field<Enter>
-<C-j> = :next-field<Enter>
-<A-p> = :switch-account -p<Enter>
-<A-n> = :switch-account -n<Enter>
-<tab> = :next-field<Enter>
-<backtab> = :prev-field<Enter>
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-c> = :cc<Enter>
-<C-b> = :bcc<Enter>
-<C-q> = :abort<Enter>
-
-[compose::editor]
-# Keybindings used when the embedded terminal is selected in the compose view
-$noinherit = true
-$ex = <C-x>
-<C-k> = :prev-field<Enter>
-<C-j> = :next-field<Enter>
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
-<C-q> = :abort<Enter>
-
-[compose::review]
-# Keybindings used when reviewing a message to be sent
-y = :send<Enter>
-n = :abort<Enter>
-v = :preview<Enter>
-p = :postpone<Enter>
-q = :choose -o d discard abort -o p postpone postpone<Enter>
-e = :edit<Enter>
-a = :attach<space>
-d = :detach<space>
-S = :sign<Enter>
-E = :encrypt<Enter>
-A = :attach-key<Enter>
-C = :multipart text/html<Enter>
-
-[terminal]
-$noinherit = true
-$ex = <C-x>
-<C-q> = :close<Enter>
-
-<C-p> = :prev-tab<Enter>
-<C-n> = :next-tab<Enter>
@@ -1,3 +0,0 @@
-Best,
-Ryan Schanzenbacher
@@ -1,5 +0,0 @@
-Best,
-Ryan Schanzenbacher
-Rochester Institute of Technology
-Cybersecurity BS/MS Student
@@ -1,6 +0,0 @@
-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}}
@@ -1,7 +0,0 @@
-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}}
@@ -1,15 +0,0 @@
-window:
- opacity: 0.70
-font:
- size: 15
- normal:
- family: "Monofur Nerd Font Mono"
- style: Regular
-
- bold:
- family: "Monofur Nerd Font Mono"
- style: Bold
-
- italic:
- family: "Monofur Nerd Font Mono"
- style: Italic
@@ -44,6 +44,8 @@ alias gc='git -C ~/.config/guix add . && git -C ~/.config/guix commit && git -C
alias cg='git -C ~/.config/guix pull'
alias cgh='git -C ~/.config/guix pull stationeryh main'
alias gencs="awk 'BEGIN {print \"# Crib Sheet\"} /<!-- START CS -->/,/<!-- END CS -->/ {if (! /<!-- START CS -->/ && ! /<!-- END CS -->/) print; if (/<!-- END CS -->/) print \"\"}' notes.mkd | pandoc -f gfm -t pdf | zathura -"
+alias dockerg="docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix"
+
export XDG_DATA_DIRS=$XDG_DATA_DIRS:/var/lib/flatpak/exports/share:/home/ryan/.local/share/flatpak/exports/share
# GPG SETUP FOR SSH
@@ -51,9 +53,6 @@ export XDG_DATA_DIRS=$XDG_DATA_DIRS:/var/lib/flatpak/exports/share:/home/ryan/.l
#gpgconf --launch gpg-agent
export GPG_TTY=$(tty)
-# Zoxide
-eval "$(zoxide init --cmd cd bash)"
-
# eza
alias ls='eza --icons=always -Gx'
@@ -62,3 +61,7 @@ alias diff='delta'
# Starship
eval "$(starship init bash)"
+
+# Zoxide
+eval "$(zoxide init --cmd cd bash)"
+
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-BoldItalic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFont-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-BoldItalic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontMono-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-BoldItalic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/AnonymicePro/AnonymiceProNerdFontPropo-Regular.ttf and /dev/null differ
@@ -1,94 +0,0 @@
-Copyright (c) 2009, Mark Simonson (http://www.ms-studio.com, mark@marksimonson.com),
-with Reserved Font Name Anonymous Pro.
-
-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.
@@ -1,8 +0,0 @@
-
-# Nerd Fonts
-
-This is an archived font from a Nerd Fonts release.
-
-For more information see:
-* https://github.com/ryanoasis/nerd-fonts/
-* https://github.com/ryanoasis/nerd-fonts/releases/latest/
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Bold Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Light Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Medium Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Regular Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code Retina Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Mono.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete Windows Compatible.ttf and /dev/null differ
Binary files a/home-config/fonts/Fira Code/Fira Code SemiBold Nerd Font Complete.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-ExtraLight.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-ExtraThick.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-Medium.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFont-Thin.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraLight.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-ExtraThick.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-Medium.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontMono-Thin.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraLight.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-ExtraThick.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-Medium.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/Lilex/LilexNerdFontPropo-Thin.ttf and /dev/null differ
Binary files a/home-config/fonts/Monofur For Powerline/Monofur Bold for Powerline.ttf and /dev/null differ
Binary files a/home-config/fonts/Monofur For Powerline/Monofur Italic for Powerline.ttf and /dev/null differ
Binary files a/home-config/fonts/Monofur For Powerline/Monofur for Powerline.ttf and /dev/null differ
@@ -1,20 +0,0 @@
-The monofur typeface by tobias b koehler (unci@tigerden.com)
-
-This is a monospaced geometric rounded sans serif font based on the
-eurofurence typeface family.
-
-The character set includes Roman, Greek and Cyrillic characters as well
-as box drawing characters. File format is TrueType for PC (under
-Windows, Linux etc).
-
-These fonts are freeware and can be distributed as long as they are
-together with this text file. I would appreciate it though if you could
-contact me at unci@tigerden.com if you put them on a server. Free
-samples from commercial users are always very welcome. :)
-
-For more information, please see the uncifonts WWW page at:
-http://mercurio.iet.unipi.it/users/tobias/uncifonts.html
-
-Have fun! tobias b koehler, 2000-04-02
\ No newline at end of file
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFont-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontMono-Regular.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Bold.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Italic.ttf and /dev/null differ
Binary files a/home-config/fonts/MonofurNerdFont/MonofurNerdFontPropo-Regular.ttf and /dev/null differ
@@ -1,8 +0,0 @@
-
-# Nerd Fonts
-
-This is an archived font from a Nerd Fonts release.
-
-For more information see:
-* https://github.com/ryanoasis/nerd-fonts/
-* https://github.com/ryanoasis/nerd-fonts/releases/latest/
@@ -1,7 +0,0 @@
-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
@@ -1,3 +0,0 @@
-enable-ssh-support
-
-pinentry-program /run/current-system/profile/bin/pinentry
@@ -1,10 +0,0 @@
-# List of allowed ssh keys. Only keys present in this file are used
-# in the SSH protocol. The ssh-add tool may add new entries to this
-# file to enable them; you may also add them manually. Comment
-# lines, like this one, as well as empty lines are ignored. Lines do
-# have a certain length limit but this is not serious limitation as
-# the format of the entries is fixed and checked by gpg-agent. A
-# non-comment line starts with optional white spaces, followed by the
-# keygrip of the key given as 40 hex digits, optionally followed by a
-# caching TTL in seconds, and another optional field for arbitrary
-# flags. Prepend the keygrip with an '!' mark to disable it.
@@ -27,114 +27,123 @@
(rosenthal packages binaries)
(ryan-packages mozilla))
-(define my-neovim
- (package
- (inherit neovim)
- (native-inputs
- (modify-inputs (package-native-inputs neovim)
- (prepend gcc-12)))))
+; (define my-neovim
+; (package
+; (inherit neovim)
+; (native-inputs
+; (modify-inputs (package-native-inputs neovim)
+; (prepend gcc-13)))))
-(define %home-symlinks
- `((".config/guix/home-config/fish" ".config/fish")
- (".config/guix/home-config/nix-config" ".config/nix")
- (".config/guix/home-config/nix-home-manager" ".config/home-manager")))
+ (define %home-symlinks
+; `((".config/guix/home-config/fish" ".config/fish")
+; (".config/guix/home-config/nix-config" ".config/nix")
+ `((".config/guix/home-config/nix-files" ".config/home-manager")))
(home-symlinks %home-symlinks)
(home-environment
;; Below is the list of packages that will show up in your
;; Home profile, under ~/.guix-home/profile.
- (packages (append (specifications->packages (list "bat"
- "fd"
- "fish"
- "xdg-utils"
- "abook"
- "libnotify"
- "fzf"
- "waypipe"
- "foot"
- "pulseaudio" ;only for pactl
- "qpwgraph"
- "gnunet"
+ ;(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"
+ ;"qrencode"
+ ;"tmux"
+ ;"binutils"
+ ;"gcc-toolchain"
+ ;"borg"
+ ;"restic"
+ ;"rsync"
+ ;"cloc"
+ ;"sc-im"
+ ;"pv"
+ ;"jq"
+ ;"gpgme"
+ ;"bombadillo"
+ ;"python-msgpack"
+ ;"wdisplays"
+ ;"kanshi"
+ ;"libreoffice"
+ ;"flatpak"
+ ;"gnupg"
+ ;"spotifyd"
+ ;"lsof"
+ ;"pavucontrol"
+ ;"netcat"
+ ;"bind:utils"
+ ;"font-cns11643-swjz"
+ ;"font-google-noto-emoji"
+ ;"syncthing"
;"taskwarrior"
;"tasksh"
;"imv" ; Nix pkg now for MESA stuff
- "perl"
- "tor"
- "unzip"
- "htop"
- "curl"
- "pandoc"
- "texlive-bin"
- "texlive-scheme-basic"
- "texlive-txfonts"
- "texlive-amsfonts"
- "texlive-lm"
- "texlive-lm-math"
- "texlive-iftex"
- "texlive-unicode-math"
- "texlive-fontspec"
- "texlive-xcolor"
- "texlive-geometry"
- "texlive-hyperref"
- "texlive-parskip"
- "texlive-etoolbox"
- "texlive-setspace"
- "zathura"
- "zathura-pdf-mupdf"
- "go"
- "fzf"
- "weechat"
- "gimp"
- "python"
- "python:tk"
- "file"
- "python-lsp-server"
- "kdenlive"
- "sqlite"
+ ;"perl"
+ ;"tor"
+ ;"unzip"
+ ;"htop"
+ ;"curl"
+ ;"pandoc"
+ ;"texlive-bin"
+ ;"texlive-scheme-basic"
+ ;"texlive-txfonts"
+ ;"texlive-amsfonts"
+ ;"texlive-lm"
+ ;"texlive-lm-math"
+ ;"texlive-iftex"
+ ;"texlive-unicode-math"
+ ;"texlive-fontspec"
+ ;"texlive-xcolor"
+ ;"texlive-geometry"
+ ;"texlive-hyperref"
+ ;"texlive-parskip"
+ ;"texlive-etoolbox"
+ ;"texlive-setspace"
+ ;"texlive-booktabs"
+ ;"texlive-mdwtools"
+ ;"texlive-caption"
+ ;"texlive-diagbox"
+ ;"texlive-pict2e"
+ ;"texlive-ulem"
+ ;"texlive-pgf"
+ ;"zathura"
+ ;"zathura-pdf-mupdf"
+ ;"go"
+ ;"fzf"
+ ;"weechat"
+ ;"gimp"
+ ;"python"
+ ;"python:tk"
+ ;"file"
+ ;"python-lsp-server"
+ ;"kdenlive"
+ ;"sqlite"
;"mpv" ; Now a nix pkg for MESA stuff
- "qbittorrent"
- "playerctl"
+ ;"qbittorrent"
+ ;"playerctl"
;"aerc"
- "tcpdump"
- "pamixer"
- "git"
- "git:send-email"
- "password-store"
- "node"
- "kanshi"
+ ;"tcpdump"
+ ;"pamixer"
+ ;"git"
+ ;"git:send-email"
+ ;"password-store"
+ ;"node"
+ ;"kanshi"
;"firefox"
- "signal-desktop"
- "sc-im"
- "git-lfs"))
- (list my-neovim calcurse-fixed )))
+ ;"signal-desktop"
+ ;"sc-im"
+ ;"tree-sitter-cli"
+ ;"git-lfs"))
+ ;(list calcurse-fixed )))
;; Below is the list of Home services. To search for available
;; services, run 'guix home search KEYWORD' in a terminal.
@@ -143,57 +152,72 @@
(home-bash-configuration
(aliases '(("grep" . "grep --color=auto") ("ll" . "ls -l")
("ls" . "ls -p --color=auto")
- ("spt" . "spotify_player")
- ("python" . "python3")))
+ ;("spt" . "spotify_player")
+ ;("python" . "python3")))
+ ))
(bashrc (list (local-file
"bashrc")))
(bash-profile (list (local-file
"bash_profile")))))
- (service home-xdg-configuration-files-service-type
- `(("nvim/init.vim" ,(local-file "nvim/config/init.vim"))
- ("nvim/after/ftplugin/markdown/custom.vim" ,(local-file "nvim/config/after/ftplugin/markdown/custom.vim"))
- ("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))
- ("wpaperd" ,(local-file "wpaperd" #:recursive? #t))
- ("mpv" ,(local-file "mpv" #:recursive? #t))
- ("foot" ,(local-file "foot" #:recursive? #t))
- ("pulse/client.conf" ,(local-file "pulseaudio/client.conf"))
- ("waybar" ,(local-file "waybar" #:recursive? #t))
- ("alacritty" ,(local-file "alacritty" #:recursive? #t))
- ("aerc" ,(local-file "aerc" #:recursive? #t)) ))
- (service home-files-service-type
- `((".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))
+ ;(service home-xdg-configuration-files-service-type
+ ; Migrated to nix
+ ;`(("nvim/init.vim" ,(local-file "nvim/config/init.vim"))
+ ;("nvim/after/ftplugin/markdown/custom.vim" ,(local-file "nvim/config/after/ftplugin/markdown/custom.vim"))
+ ;("nvim/after/ftplugin/mail/custom.vim" ,(local-file "nvim/config/after/ftplugin/mail/custom.vim"))
+ ;("sway" ,(local-file "sway" #:recursive? #t))
+ ;("hypr" ,(local-file "hypr" #:recursive? #t))
+ ;("hypr/monitors.conf", (local-file "hypr/monitors.conf"))
+ ;("hypr/pyprland.toml", (local-file "hypr/pyprland.toml"))
+ ;("hypr/family_guy.mp4", (local-file "hypr/family_guy.mp4"))
+ ;("hypr/hyprlock.conf", (local-file "hypr/hyprlock.conf"))
+ ;("hypr/hypridle.conf", (local-file "hypr/hypridle.conf"))
+ ;("hypr/kanshi.conf", (local-file "hypr/kanshi.conf"))
+ ;("hypr/subwaysurfer.webm", (local-file "hypr/subwaysurfer.webm"))
+ ;("hypr/Wallpapers", (local-file "hypr/Wallpapers" #:recursive? #t))
+ ;("hypr/scripts", (local-file "hypr/scripts" #:recursive? #t))
+ ;("wpaperd" ,(local-file "wpaperd" #:recursive? #t))
+ ;("mpv" ,(local-file "mpv" #:recursive? #t))
+ ;("foot" ,(local-file "foot" #:recursive? #t))
+ ;("pulse/client.conf" ,(local-file "pulseaudio/client.conf"))
+ ;("waybar" ,(local-file "waybar" #:recursive? #t))
+ ;("alacritty" ,(local-file "alacritty" #:recursive? #t))
+ ;("aerc" ,(local-file "aerc" #:recursive? #t)) ))
+ ;(service home-files-service-type
+ ;l`(;(".local/share/nvim/site/autoload/plug.vim" ,(local-file "nvim/plugin-manager/plug.vim"))
+ ;(".ssh/config" ,(local-file "ssh/config"))
+ ;(".icons" ,(local-file "icons" #:recursive? #t))
+ ;(".mozilla/native-messaging-hosts/gpgmejson.json" ,(local-file "mailvelope/gpgmejson.json"))
+ ;(".local/share/mailvelope" ,(local-file "mailvelope" #:recursive? #t))
;(".mozilla/native-messaging-hosts/tridactyl.json" ,(local-file "tridactyl/tridactyl.json"))
+ ;(".local/share/tridactyl" ,(local-file "tridactyl" #:recursive? #t))
;(".gnupg/sshcontrol" ,(local-file "gnupg/sshcontrol"))
;(".gnupg/gpg-agent.conf" ,(local-file "gnupg/gpg-agent.conf"))
- (".local/share/fonts" ,(local-file "fonts" #:recursive? #t))
- (".gitconfig" ,(local-file "gitconfig"))
- (".docker/cli-plugins" ,(local-file "docker/cli-plugins" #:recursive? #t))
- (".nix-channels" ,(local-file "nix-channels"))))
+ ;(".gnupg/gpg.conf" ,(local-file "gnupg/gpg.conf"))
+ ;(".local/share/fonts" ,(local-file "fonts" #:recursive? #t))
+ ;(".gitconfig" ,(local-file "gitconfig"))
+ ;(".docker/cli-plugins" ,(local-file "docker/cli-plugins" #:recursive? #t))
+ ;(".nix-channels" ,(local-file "nix-channels"))))
(service home-pipewire-service-type)
- (service home-spotifyd-service-type)
+ ;(service home-spotifyd-service-type)
; font things for nix to play nice
- (simple-service 'additional-fonts-service
- home-fontconfig-service-type
- (list "~/.nix-profile/share/fonts"
- '(match (@ (target "pattern"))
- (edit (@ (name "family") (mode "prepend"))
- (string "DejaVu Sans")))
- '(alias
- (family "serif")
- (prefer
- (family "DejaVu Serif")))
- '(alias
- (family "sans")
- (prefer
- (family "DejaVu Sans")))
- '(alias
- (family "monospace")
- (prefer
- (family "DejaVu Sans Mono")))))
+ ; (simple-service 'additional-fonts-service
+ ; home-fontconfig-service-type
+ ; (list "~/.nix-profile/share/fonts"
+ ; '(match (@ (target "pattern"))
+ ; (edit (@ (name "family") (mode "prepend"))
+ ; (string "DejaVu Sans")))
+ ; '(alias
+ ; (family "serif")
+ ; (prefer
+ ; (family "DejaVu Serif")))
+ ; '(alias
+ ; (family "sans")
+ ; (prefer
+ ; (family "DejaVu Sans")))
+ ; '(alias
+ ; (family "monospace")
+ ; (prefer
+ ; (family "DejaVu Sans Mono")))))
(service home-dbus-service-type)
(service downloads-garbage-collector-service-type
(downloads-garbage-collector-configuration
@@ -202,8 +226,9 @@
;(template-files "."
;'("spotify-player/app.toml"
;;;
- (service home-gpg-agent-service-type
- (home-gpg-agent-configuration
- (pinentry-program
- (file-append pinentry "/bin/pinentry"))
- (ssh-support? #t))) )))
+ ;(service home-gpg-agent-service-type
+ ; (home-gpg-agent-configuration
+ ; (pinentry-program
+ ; (file-append pinentry "/bin/pinentry"))
+ ; (ssh-support? #t))) )))
+)))
Binary files a/home-config/hypr/Wallpapers/static/1685362396481634.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1693169418078790.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1694792956043641.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1708470532817406.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1720750738377603.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1720751011150282.png and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1723625710776950.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1723626275390685.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/1728661127589872.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/4yglzy4rkh4d1.jpeg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/7xosa7um3ohd1.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/83juiltm3ohd1.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/CN62QXJ.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/above-clouds.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-bluehour-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-budapest.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-close-to-the-sun-1920.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-cold-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-dreamy-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-eclipse-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-eternity-1080px.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-light-at-the-end-hd.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-lights-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-lines1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-mountains1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-new-year1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-portal-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-reflect1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-serenity-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-sky1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-solar-1k.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-wait.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/alena-aenami-wings-hd.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/autumn1.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/autumn1.png and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/dawn-mountains-vibrant.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/lake-winter.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/mountains.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/northern-lights-2.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/northern-lights-bridge.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/purple-grass.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/purple-intersection.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/purple-lakescape.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/sah1k8tm3ohd1.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/scarecrow.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/snow-1.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/snow-2.jpg and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/vfcfyfyehhi31.png and /dev/null differ
Binary files a/home-config/hypr/Wallpapers/static/w7ufw5eb3cuz.jpg and /dev/null differ
@@ -1,36 +0,0 @@
-#!/usr/bin/env bash
-
-waybar &
-
-mako &
-
-#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' &
-
-hypridle &
-
-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 a/home-config/hypr/family_guy.mp4 and /dev/null differ
@@ -1,16 +0,0 @@
-general {
- lock_cmd = pidof hyprlock || hyprlock
- before_sleep_cmd = loginctl lock-session
- after_sleep_cmd = hyprctl dispatch dpms on
-}
-
-listener {
- timeout = 300
- on-timeout = loginctl lock-session
-}
-
-listener {
- timeout = 600
- on-timeout = hyprctl dispatch dpms off
- on-resume = hyprctl dispatch dpms on
-}
@@ -1,278 +0,0 @@
-exec-once = dbus-update-activation-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=Hyprland
-
-#
-# Please note not all available settings / options are set here.
-# For a full list, see the wiki
-#
-
-# See https://wiki.hyprland.org/Configuring/Monitors/
-monitor=,preferred,auto,1
-
-# Set cursor theme
-env = HYPRCURSOR_THEME,XCursor-Pro-Dark-Hyprcursor
-env = HYPRCURSOR_SIZE,26
-env = XCURSOR_THEME,XCursor-Pro-Dark
-env = XCURSOR_SIZE,26
-
-env = AQ_NO_MODIFIERS,1
-
-
-# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-
-# Execute your favorite apps at launch
-# exec-once = waybar & hyprpaper & firefox
-
-# Source a file (multi-file configs)
-source = ~/.config/hypr/monitors.conf
-
-# Some default env vars.
-env = XCURSOR_SIZE,24
-
-debug {
- disable_logs = false
- enable_stdout_logs = true
-}
-
-# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
-input {
- kb_layout = us
- kb_variant =
- kb_model =
- kb_options =
- kb_rules =
- numlock_by_default = true
-
- follow_mouse = 1
-
- touchpad {
- natural_scroll = no
- middle_button_emulation = true
- clickfinger_behavior = true
- }
-
- sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
-}
-
-general {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
-
- gaps_in = 5
- gaps_out = 10
- border_size = 2
- col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
- col.inactive_border = rgba(595959aa)
-
- layout = dwindle
-}
-
-decoration {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
-
- rounding = 5
- blur {
- enabled = yes
- size = 3
- passes = 1
- new_optimizations = on
- }
-
- shadow {
- enabled = true
- range = 4
- render_power = 3
- color = rgba(1a1a1aee)
- }
-}
-
-animations {
- enabled = yes
-
- # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
-
- bezier = myBezier, 0.05, 0.9, 0.1, 1.05
-
- animation = windows, 1, 7, myBezier
- animation = windowsOut, 1, 7, default, popin 80%
- animation = border, 1, 10, default
- animation = borderangle, 1, 8, default
- animation = fade, 1, 7, default
- animation = workspaces, 1, 6, default
-}
-
-dwindle {
- # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
- pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
- preserve_split = yes # you probably want this
-}
-
-#master {
-# # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
-# new_is_master = true
-#}
-
-gestures {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
- workspace_swipe = off
-}
-
-# Example per-device config
-# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
-device {
- name = epic-mouse-v1
- sensitivity = -0.5
-}
-
-# Example windowrule v1
-# windowrule = float, ^(kitty)$
-# Example windowrule v2
-# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
-# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
-
-
-# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-$mainMod = SUPER
-
-# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
-bind = $mainMod, Return, exec, 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
-bind = $mainMod, F, fullscreen, 1
-bind = $mainMod SHIFT, F, fullscreen
-bind = ,XF86MonBrightnessUp, exec, light -A 10
-bind = ,XF86MonBrightnessDown, exec, light -U 10
-bind = ,XF86AudioRaiseVolume, exec, pamixer -i 5
-bind = ,XF86AudioLowerVolume, exec, pamixer -d 5
-bind = ,XF86AudioMute, exec, pamixer -t
-bind = ,XF86AudioPlay, exec, playerctl play-pause
-bind = ,XF86AudioPause, exec, playerctl play-pause
-bind = ,XF86AudioNext, exec, playerctl next
-bind = ,XF86AudioPrev, exec, playerctl previous
-bind = ,XF86AudioStop, exec, playerctl stop
-
-# "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
-bind = $mainMod CTRL SHIFT, up, movecurrentworkspacetomonitor, u
-bind = $mainMod CTRL SHIFT, down, movecurrentworkspacetomonitor, d
-
-# Move focus with mainMod + arrow keys
-bind = $mainMod, left, movefocus, l
-bind = $mainMod, right, movefocus, r
-bind = $mainMod, up, movefocus, u
-bind = $mainMod, down, movefocus, d
-
-# Move window with mainMod + SHIFT + arrow keys
-bind = $mainMod SHIFT, left, movewindow, l
-bind = $mainMod SHIFT, right, movewindow, r
-bind = $mainMod SHIFT, up, movewindow, u
-bind = $mainMod SHIFT, down, movewindow, d
-
-# Switch workspaces with mainMod + [0-9]
-bind = $mainMod, 1, workspace, 1
-bind = $mainMod, 2, workspace, 2
-bind = $mainMod, 3, workspace, 3
-bind = $mainMod, 4, workspace, 4
-bind = $mainMod, 5, workspace, 5
-bind = $mainMod, 6, workspace, 6
-bind = $mainMod, 7, workspace, 7
-bind = $mainMod, 8, workspace, 8
-bind = $mainMod, 9, workspace, 9
-bind = $mainMod, 0, workspace, 10
-
-# Move active window to a workspace with mainMod + SHIFT + [0-9]
-bind = $mainMod SHIFT, 1, movetoworkspace, 1
-bind = $mainMod SHIFT, 2, movetoworkspace, 2
-bind = $mainMod SHIFT, 3, movetoworkspace, 3
-bind = $mainMod SHIFT, 4, movetoworkspace, 4
-bind = $mainMod SHIFT, 5, movetoworkspace, 5
-bind = $mainMod SHIFT, 6, movetoworkspace, 6
-bind = $mainMod SHIFT, 7, movetoworkspace, 7
-bind = $mainMod SHIFT, 8, movetoworkspace, 8
-bind = $mainMod SHIFT, 9, movetoworkspace, 9
-bind = $mainMod SHIFT, 0, movetoworkspace, 10
-
-# Scroll through existing workspaces with mainMod + scroll
-bind = $mainMod, mouse_down, workspace, e+1
-bind = $mainMod, mouse_up, workspace, e-1
-
-# Move/resize windows with mainMod + LMB/RMB and dragging
-bindm = $mainMod, mouse:272, movewindow
-bindm = $mainMod, mouse:273, resizewindow
-
-# Bind mainMod + L to screenlocker
-bind = $mainMod, L, exec, hyprlock
-bind = $mainMod SHIFT, L, exec, loginctl suspend
-
-# Keybind to toggle "performance mode" (toggles GPU intensive things)
-bind = $mainMod, F1, exec, ~/.config/hypr/perf_mode.sh
-
-# 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
-windowrulev2 = float, class:^(firefox)$, title:^(Picture-in-Picture)$
-windowrulev2 = pin, class:^(firefox)$, title:^(Picture-in-Picture)$
-windowrulev2 = size 578 326, class:^(firefox)$, title:^(Picture-in-Picture)$
-
-# Firefox Sharing Indicator
-windowrulev2 = float, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = size 56 31, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = move 50% 0, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = suppressevent fullscreen maximize, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-
-# Weather
-windowrulev2 = float,class:^(ala-wttr)$
-windowrulev2 = size 822 1026, 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
-}
@@ -1,57 +0,0 @@
-background {
- monitor =
- #path = /home/ryan/.config/hypr/Wallpapers/static/autumn1.png
- path = screenshot
-
- # 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
- font_family = Lilex Nerd Font
-}
@@ -1,22 +0,0 @@
-profile {
- output "AU Optronics 0x103D Unknown" 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
-}
-
-profile homedesk {
- output "AU Optronics 0x103D Unknown" disable
- output "Samsung Electric Company C27F390 H1AK500000" position 0,0 mode 1920x1080
- output "Samsung Electric Company S22R35x H4TNA01683" position 1920,0 mode 1920x1080
-}
@@ -1,2 +0,0 @@
-monitor=eDP-1,1920x1080, 0x0, 1
-monitor=HDMI-A-1,1920x1080, 1920x0, 1
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
-if [ "$HYPRGAMEMODE" = 1 ] ; then
- hyprctl --batch "\
- keyword animations:enabled 0;\
- keyword decoration:drop_shadow 0;\
- keyword decoration:blur:enabled 0;\
- keyword general:gaps_in 0;\
- keyword general:gaps_out 0;\
- keyword general:border_size 1;\
- keyword decoration:rounding 0"
- exit
-fi
-hyprctl reload
Binary files a/home-config/hypr/subwaysurfer.webm and /dev/null differ
@@ -1,106 +0,0 @@
-#!/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
@@ -1,35 +0,0 @@
-#!/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 &
@@ -1,9 +0,0 @@
-#!/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/Bibata-Modern-Classic-Hyprland/hyprcursors/X_cursor.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bd_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_left_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_right_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/bottom_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/center_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/circle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/context-menu.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/copy.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/cross.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/crossed_circle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/crosshair.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-ask.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-copy.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd-link.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dnd_no_drop.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/dotbox.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/fd_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/grabbing.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/hand1.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/hand2.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_ptr_watch.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/left_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/link.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ll_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/lr_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/move.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/pencil.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/plus.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/pointer-move.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/question_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_ptr.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/right_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_down_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_h_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_left_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_right_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_up_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/sb_v_double_arrow.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/tcross.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_left_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_right_corner.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_side.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/top_tee.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ul_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/ur_angle.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/vertical-text.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/wait.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/wayland-cursor.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/xterm.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/zoom-in.hlc differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic-Hyprland/hyprcursors/zoom-out.hlc differ
@@ -0,0 +1,4 @@
+name = Bibata-Modern-Classic-Hyprland
+description = Generated Bibata repository
+version = 0.1
+cursors_directory = hyprcursors
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023-2024 Abdulkaiz Khatri
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
@@ -0,0 +1,35 @@
+[::] Bibata Cursor
+TLDR; This cursor set is a masterpiece of cursors available on the internet,
+hand-designed by Abdulkaiz Khatri(https://twitter.com/ful1e5).
+
+Bibata is an open source, compact, and material designed cursor set that aims
+to improve the cursor experience for users. It is one of the most popular cursor sets
+in the Linux community and is now available for free on Windows as well, with multiple color
+and size options. Its goal is to offer personalized cursors to users.
+
+[::] What does "Bibata" mean?
+The sweetest word I ever spoke was "BI-Buh," which, coincidentally, is also the word for peanuts.
+To make it more pronounceable and not sound like a baby's words, I added the suffix "Ta."
+And with that, my journey in the world of open source began.
+
+[::] Become Sponsor
+https://github.com/sponsors/ful1e5
+
+[::] LICENSE
+MIT License
+
+[::] Bug Reports & Contact
+https://github.com/ful1e5/bibata/issues
+
+[::] Installation
+```bash
+tar -xvf Bibata.tar.gz # extract `Bibata.tar.gz`
+mv Bibata-* ~/.icons/ # Install to local users
+sudo mv Bibata-* /usr/share/icons/ # Install to all users
+```
+
+[::] Uninstallation
+```bash
+rm ~/.icons/Bibata-* # Remove from local users
+sudo rm /usr/share/icons/Bibata-* # Remove from all users
+```
\ No newline at end of file
@@ -0,0 +1,4 @@
+ID=daed906f-99d6-4fb8-ae03-623d988962e3
+Author=Abdualkaiz Khatri <kaizmandhu@gmail.com>
+Type=Bibata-Modern
+Version=1.0.2
\ No newline at end of file
@@ -0,0 +1,3 @@
+[Icon Theme]
+Name=Bibata-Modern-daed9-v1.0.2-x11
+Inherits="Bibata-Modern-daed9-v1.0.2-x11"
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/X_cursor differ
@@ -0,0 +1 @@
+link
\ No newline at end of file
@@ -0,0 +1 @@
+dnd-link
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+copy
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bd_double_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_left_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_right_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/bottom_tee differ
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+plus
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/center_ptr differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/circle differ
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+tcross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/context-menu differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/copy differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/cross differ
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/crossed_circle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/crosshair differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+cross
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-ask differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-copy differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd-link differ
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dnd_no_drop differ
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/dotbox differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_down_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+pencil
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+right_ptr
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+right_side
\ No newline at end of file
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+grabbing
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/fd_double_arrow differ
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+circle
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/grabbing differ
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/hand1 differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/hand2 differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
@@ -0,0 +1 @@
+sb_left_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_ptr differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_ptr_watch differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/left_tee differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/link differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ll_angle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/lr_angle differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/move differ
@@ -0,0 +1 @@
+top_side
\ No newline at end of file
@@ -0,0 +1 @@
+top_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+dnd_no_drop
\ No newline at end of file
@@ -0,0 +1 @@
+crossed_circle
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+top_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+hand1
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/pencil differ
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/plus differ
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/pointer-move differ
@@ -0,0 +1 @@
+hand2
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr_watch
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/question_arrow differ
@@ -0,0 +1 @@
+sb_right_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_ptr differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/right_tee differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_down_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_h_double_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_left_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_right_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_up_arrow differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/sb_v_double_arrow differ
@@ -0,0 +1 @@
+bottom_right_corner
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+move
\ No newline at end of file
@@ -0,0 +1 @@
+fd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bd_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_h_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+bottom_left_corner
\ No newline at end of file
@@ -0,0 +1 @@
+dotbox
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/tcross differ
@@ -0,0 +1 @@
+xterm
\ No newline at end of file
@@ -0,0 +1 @@
+left_ptr
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_left_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_right_corner differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_side differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/top_tee differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ul_angle differ
@@ -0,0 +1 @@
+sb_up_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/ur_angle differ
@@ -0,0 +1 @@
+sb_v_double_arrow
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/vertical-text differ
@@ -0,0 +1 @@
+left_side
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/wait differ
@@ -0,0 +1 @@
+wait
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/wayland-cursor differ
@@ -0,0 +1 @@
+question_arrow
\ No newline at end of file
@@ -0,0 +1 @@
+X_cursor
\ No newline at end of file
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/xterm differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/zoom-in differ
Binary files /dev/null and b/home-config/icons/Bibata-Modern-Classic/cursors/zoom-out differ
@@ -0,0 +1,4 @@
+[Icon Theme]
+Name=Bibata-Modern-daed9-v1.0.2-x11
+Comment=Bibata XCursors
+Inherits="hicolor"
\ No newline at end of file
@@ -1,254 +0,0 @@
-local msg = require('mp.msg')
-local assdraw = require('mp.assdraw')
-
-local script_name = "easycrop"
-
-local points = {}
-local cropping = false
-local osc_prop = false
-
-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
-
-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)
-
@@ -1,2 +0,0 @@
-https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
-https://nixos.org/channels/nixpkgs-unstable nixpkgs
@@ -1 +0,0 @@
-experimental-features = nix-command flakes
@@ -0,0 +1 @@
+Subproject commit 2e30121671a730a2b4bc2f82d2e30ed5c9ff70e5
@@ -1,761 +0,0 @@
-{
- "nodes": {
- "aquamarine": {
- "inputs": {
- "hyprutils": [
- "hyprland",
- "hyprutils"
- ],
- "hyprwayland-scanner": [
- "hyprland",
- "hyprwayland-scanner"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1738107926,
- "narHash": "sha256-ldWD4ci3LcBIfUN41qlBO/oR5chcsRLejMbSW8eH628=",
- "owner": "hyprwm",
- "repo": "aquamarine",
- "rev": "6934e7dc53a3189fa05572c42e0038c9632ee7a5",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "aquamarine",
- "type": "github"
- }
- },
- "flake-compat": {
- "flake": false,
- "locked": {
- "lastModified": 1696426674,
- "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
- "owner": "edolstra",
- "repo": "flake-compat",
- "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
- "type": "github"
- },
- "original": {
- "owner": "edolstra",
- "repo": "flake-compat",
- "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"
- }
- },
- "gitignore": {
- "inputs": {
- "nixpkgs": [
- "hyprland",
- "pre-commit-hooks",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1709087332,
- "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
- "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
- "type": "github"
- },
- "original": {
- "owner": "hercules-ci",
- "repo": "gitignore.nix",
- "type": "github"
- }
- },
- "home-manager": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1736785676,
- "narHash": "sha256-TY0jUwR3EW0fnS0X5wXMAVy6h4Z7Y6a3m+Yq++C9AyE=",
- "owner": "nix-community",
- "repo": "home-manager",
- "rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d",
- "type": "github"
- },
- "original": {
- "owner": "nix-community",
- "repo": "home-manager",
- "rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d",
- "type": "github"
- }
- },
- "hyprcursor": {
- "inputs": {
- "hyprlang": [
- "hyprland",
- "hyprlang"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1734906540,
- "narHash": "sha256-vQ/L9hZFezC0LquLo4TWXkyniWtYBlFHAKIsDc7PYJE=",
- "owner": "hyprwm",
- "repo": "hyprcursor",
- "rev": "69270ba8f057d55b0e6c2dca0e165d652856e613",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprcursor",
- "type": "github"
- }
- },
- "hyprgraphics": {
- "inputs": {
- "hyprutils": [
- "hyprland",
- "hyprutils"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1736115290,
- "narHash": "sha256-Jcn6yAzfUMcxy3tN/iZRbi/QgrYm7XLyVRl9g/nbUl4=",
- "owner": "hyprwm",
- "repo": "hyprgraphics",
- "rev": "52202272d89da32a9f866c0d10305a5e3d954c50",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprgraphics",
- "type": "github"
- }
- },
- "hyprgraphics_2": {
- "inputs": {
- "hyprutils": [
- "hyprlock",
- "hyprutils"
- ],
- "nixpkgs": [
- "hyprlock",
- "nixpkgs"
- ],
- "systems": [
- "hyprlock",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1734906236,
- "narHash": "sha256-vH/ysV2ONGQgYZPtcJKwc8jJivzyVxru2aaOxC20ZOE=",
- "owner": "hyprwm",
- "repo": "hyprgraphics",
- "rev": "6dea3fba08fd704dd624b6d4b261638fb4003c9c",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprgraphics",
- "type": "github"
- }
- },
- "hyprland": {
- "inputs": {
- "aquamarine": "aquamarine",
- "hyprcursor": "hyprcursor",
- "hyprgraphics": "hyprgraphics",
- "hyprland-protocols": "hyprland-protocols",
- "hyprland-qtutils": "hyprland-qtutils",
- "hyprlang": "hyprlang",
- "hyprutils": "hyprutils",
- "hyprwayland-scanner": "hyprwayland-scanner",
- "nixpkgs": [
- "nixpkgs"
- ],
- "pre-commit-hooks": "pre-commit-hooks",
- "systems": "systems",
- "xdph": "xdph"
- },
- "locked": {
- "lastModified": 1738457237,
- "narHash": "sha256-9mtM+lwnmXnv5TPmdij1rR5fLzzqSjkltcyEuRf8uIk=",
- "owner": "hyprwm",
- "repo": "hyprland",
- "rev": "882f7ad7d2bbfc7440d0ccaef93b1cdd78e8e3ff",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "ref": "v0.47.2",
- "repo": "hyprland",
- "type": "github"
- }
- },
- "hyprland-protocols": {
- "inputs": {
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1737556638,
- "narHash": "sha256-laKgI3mr2qz6tas/q3tuGPxMdsGhBi/w+HO+hO2f1AY=",
- "owner": "hyprwm",
- "repo": "hyprland-protocols",
- "rev": "4c75dd5c015c8a0e5a34c6d02a018a650f57feb5",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprland-protocols",
- "type": "github"
- }
- },
- "hyprland-qtutils": {
- "inputs": {
- "hyprutils": [
- "hyprland",
- "hyprutils"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1736114838,
- "narHash": "sha256-FxbuGQExtN37ToWYnGmO6weOYN6WPHN/RAqbr7gNPek=",
- "owner": "hyprwm",
- "repo": "hyprland-qtutils",
- "rev": "6997fe382dcf396704227d2b98ffdd5066da6959",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprland-qtutils",
- "type": "github"
- }
- },
- "hyprlang": {
- "inputs": {
- "hyprutils": [
- "hyprland",
- "hyprutils"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735393019,
- "narHash": "sha256-NPpqA8rtmDLsEmZOmz+qR67zsB6Y503Jnv+nSFLKJZ8=",
- "owner": "hyprwm",
- "repo": "hyprlang",
- "rev": "55608efdaa387af7bfdc0eddb404c409958efa43",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprlang",
- "type": "github"
- }
- },
- "hyprlang_2": {
- "inputs": {
- "hyprutils": [
- "hyprlock",
- "hyprutils"
- ],
- "nixpkgs": [
- "hyprlock",
- "nixpkgs"
- ],
- "systems": [
- "hyprlock",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735393019,
- "narHash": "sha256-NPpqA8rtmDLsEmZOmz+qR67zsB6Y503Jnv+nSFLKJZ8=",
- "owner": "hyprwm",
- "repo": "hyprlang",
- "rev": "55608efdaa387af7bfdc0eddb404c409958efa43",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprlang",
- "type": "github"
- }
- },
- "hyprlock": {
- "inputs": {
- "hyprgraphics": "hyprgraphics_2",
- "hyprlang": "hyprlang_2",
- "hyprutils": "hyprutils_2",
- "hyprwayland-scanner": "hyprwayland-scanner_2",
- "nixpkgs": [
- "nixpkgs"
- ],
- "systems": "systems_2"
- },
- "locked": {
- "lastModified": 1737652318,
- "narHash": "sha256-PotjNmR69yAEZP/Dn4lB0p7sHBjAPclNDbc5WkBZx4s=",
- "owner": "hyprwm",
- "repo": "hyprlock",
- "rev": "9cb5cd9e8227a6bfd456853f965b838f9d0b1786",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "ref": "v0.6.2",
- "repo": "hyprlock",
- "type": "github"
- }
- },
- "hyprpicker-git": {
- "inputs": {
- "hyprutils": "hyprutils_3",
- "hyprwayland-scanner": "hyprwayland-scanner_3",
- "nixpkgs": [
- "nixpkgs"
- ],
- "systems": "systems_3"
- },
- "locked": {
- "lastModified": 1737635601,
- "narHash": "sha256-/Jb/9HqC5Ou5JtsLHY2MJtj/c0aDG3kaeh4RLvc2X2U=",
- "owner": "hyprwm",
- "repo": "hyprpicker",
- "rev": "c3777320b358bb28a0f2112441377fe452d77ea8",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprpicker",
- "rev": "c3777320b358bb28a0f2112441377fe452d77ea8",
- "type": "github"
- }
- },
- "hyprutils": {
- "inputs": {
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1737978343,
- "narHash": "sha256-TfFS0HCEJh63Kahrkp1h9hVDMdLU8a37Zz+IFucxyfA=",
- "owner": "hyprwm",
- "repo": "hyprutils",
- "rev": "6a8bc9d2a4451df12f5179dc0b1d2d46518a90ab",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprutils",
- "type": "github"
- }
- },
- "hyprutils_2": {
- "inputs": {
- "nixpkgs": [
- "hyprlock",
- "nixpkgs"
- ],
- "systems": [
- "hyprlock",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735316583,
- "narHash": "sha256-AiiUwHWHfEdpFzXy7l1x3zInCUa1xcRMrbZ1XRSkzwU=",
- "owner": "hyprwm",
- "repo": "hyprutils",
- "rev": "8f15d45b120b33712f6db477fe5ffb18034d0ea8",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprutils",
- "type": "github"
- }
- },
- "hyprutils_3": {
- "inputs": {
- "nixpkgs": [
- "hyprpicker-git",
- "nixpkgs"
- ],
- "systems": [
- "hyprpicker-git",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1737632363,
- "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=",
- "owner": "hyprwm",
- "repo": "hyprutils",
- "rev": "006620eb29d54ea9086538891404c78563d1bae1",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprutils",
- "type": "github"
- }
- },
- "hyprwayland-scanner": {
- "inputs": {
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735493474,
- "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=",
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "type": "github"
- }
- },
- "hyprwayland-scanner_2": {
- "inputs": {
- "nixpkgs": [
- "hyprlock",
- "nixpkgs"
- ],
- "systems": [
- "hyprlock",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735493474,
- "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=",
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "type": "github"
- }
- },
- "hyprwayland-scanner_3": {
- "inputs": {
- "nixpkgs": [
- "hyprpicker-git",
- "nixpkgs"
- ],
- "systems": [
- "hyprpicker-git",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1735493474,
- "narHash": "sha256-fktzv4NaqKm94VAkAoVqO/nqQlw+X0/tJJNAeCSfzK4=",
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "rev": "de913476b59ee88685fdc018e77b8f6637a2ae0b",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "hyprwayland-scanner",
- "type": "github"
- }
- },
- "nixgl": {
- "inputs": {
- "flake-utils": "flake-utils",
- "nixpkgs": [
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1736159088,
- "narHash": "sha256-WDBc35XdHCdmgVYbPOtd2IeUtUHCYwNyEpIr5vLZMng=",
- "owner": "ryan77627",
- "repo": "nixGL",
- "rev": "3865170cbc23b32ec7cc8df1ec811fd44b6c2a58",
- "type": "github"
- },
- "original": {
- "owner": "ryan77627",
- "repo": "nixGL",
- "rev": "3865170cbc23b32ec7cc8df1ec811fd44b6c2a58",
- "type": "github"
- }
- },
- "nixpkgs": {
- "locked": {
- "lastModified": 1736012469,
- "narHash": "sha256-/qlNWm/IEVVH7GfgAIyP6EsVZI6zjAx1cV5zNyrs+rI=",
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d",
- "type": "github"
- },
- "original": {
- "owner": "nixos",
- "repo": "nixpkgs",
- "rev": "8f3e1f807051e32d8c95cd12b9b421623850a34d",
- "type": "github"
- }
- },
- "pre-commit-hooks": {
- "inputs": {
- "flake-compat": "flake-compat",
- "gitignore": "gitignore",
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1735882644,
- "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=",
- "owner": "cachix",
- "repo": "git-hooks.nix",
- "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656",
- "type": "github"
- },
- "original": {
- "owner": "cachix",
- "repo": "git-hooks.nix",
- "type": "github"
- }
- },
- "root": {
- "inputs": {
- "home-manager": "home-manager",
- "hyprland": "hyprland",
- "hyprlock": "hyprlock",
- "hyprpicker-git": "hyprpicker-git",
- "nixgl": "nixgl",
- "nixpkgs": "nixpkgs",
- "wpaperd": "wpaperd"
- }
- },
- "rust-overlay": {
- "inputs": {
- "nixpkgs": [
- "wpaperd",
- "nixpkgs"
- ]
- },
- "locked": {
- "lastModified": 1729391507,
- "narHash": "sha256-as0I9xieJUHf7kiK2a9znDsVZQTFWhM1pLivII43Gi0=",
- "owner": "oxalica",
- "repo": "rust-overlay",
- "rev": "784981a9feeba406de38c1c9a3decf966d853cca",
- "type": "github"
- },
- "original": {
- "owner": "oxalica",
- "repo": "rust-overlay",
- "type": "github"
- }
- },
- "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"
- }
- },
- "systems_3": {
- "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_4": {
- "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"
- }
- },
- "wpaperd": {
- "inputs": {
- "nixpkgs": [
- "nixpkgs"
- ],
- "rust-overlay": "rust-overlay",
- "systems": "systems_4"
- },
- "locked": {
- "lastModified": 1734445299,
- "narHash": "sha256-/E7Y2UaYTXIyvRguvqD/FHC3I2mAT7w9berqv7/gUI4=",
- "owner": "danyspin97",
- "repo": "wpaperd",
- "rev": "b0b7e66fd32dca36c431a174784a2e87af7edb77",
- "type": "github"
- },
- "original": {
- "owner": "danyspin97",
- "repo": "wpaperd",
- "rev": "b0b7e66fd32dca36c431a174784a2e87af7edb77",
- "type": "github"
- }
- },
- "xdph": {
- "inputs": {
- "hyprland-protocols": [
- "hyprland",
- "hyprland-protocols"
- ],
- "hyprlang": [
- "hyprland",
- "hyprlang"
- ],
- "hyprutils": [
- "hyprland",
- "hyprutils"
- ],
- "hyprwayland-scanner": [
- "hyprland",
- "hyprwayland-scanner"
- ],
- "nixpkgs": [
- "hyprland",
- "nixpkgs"
- ],
- "systems": [
- "hyprland",
- "systems"
- ]
- },
- "locked": {
- "lastModified": 1734907020,
- "narHash": "sha256-p6HxwpRKVl1KIiY5xrJdjcEeK3pbmc///UOyV6QER+w=",
- "owner": "hyprwm",
- "repo": "xdg-desktop-portal-hyprland",
- "rev": "d7f18dda5e511749fa1511185db3536208fb1a63",
- "type": "github"
- },
- "original": {
- "owner": "hyprwm",
- "repo": "xdg-desktop-portal-hyprland",
- "type": "github"
- }
- }
- },
- "root": "root",
- "version": 7
-}
@@ -1,68 +0,0 @@
-{
- description = "Home Manager configuration of ryan";
-
- inputs = {
- # Specify the source of Home Manager and Nixpkgs.
- nixpkgs.url = "github:nixos/nixpkgs/8f3e1f807051e32d8c95cd12b9b421623850a34d";
- home-manager = {
- url = "github:nix-community/home-manager/fc52a210b60f2f52c74eac41a8647c1573d2071d";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- hyprlock = {
- url = "github:hyprwm/hyprlock/v0.6.2";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- hyprpicker-git = {
- url = "github:hyprwm/hyprpicker/c3777320b358bb28a0f2112441377fe452d77ea8";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- hyprland = {
- url = "github:hyprwm/hyprland/v0.47.2";
- inputs.nixpkgs.follows = "nixpkgs";
- #inputs.hyprutils.url = "github:/hyprwm/hyprutils/6a8bc9d2a4451df12f5179dc0b1d2d46518a90ab";
- };
- nixgl = {
- url = "github:ryan77627/nixGL/3865170cbc23b32ec7cc8df1ec811fd44b6c2a58";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- wpaperd = {
- url = "github:danyspin97/wpaperd/b0b7e66fd32dca36c431a174784a2e87af7edb77";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- #mozff.url = "github:mozilla/nixpkgs-mozilla";
- };
-
- outputs = { nixpkgs, home-manager, hyprland, nixgl, wpaperd, hyprpicker-git, hyprlock, ... }@inputs:
- let
- system = "x86_64-linux";
- pkgs = nixpkgs.legacyPackages.${system};
- overlays = [
- nixgl.overlay
- #mozff.overlays.firefox
- ];
- in {
- homeConfigurations."ryan" = home-manager.lib.homeManagerConfiguration {
- inherit pkgs;
-
- # Specify your home configuration modules here, for example,
- # the path to your home.nix.
- modules = [
- {nixpkgs.overlays = overlays;}
- ./home.nix
- {
- _module.args = {
- inherit hyprland;
- inherit nixgl;
- inherit wpaperd;
- inherit hyprlock;
- inherit hyprpicker-git;
- };
- }
- ];
-
- # Optionally use extraSpecialArgs
- # to pass through arguments to home.nix
- # extraSpecialArgs = { inherit overlays; };
- };
- };
-}
@@ -1,472 +0,0 @@
-{ config, pkgs, hyprland, nixgl, wpaperd, hyprpicker-git, hyprlock, ... }:
- let
- lock-false = {
- Value = false;
- Status = "locked";
- };
- lock-true = {
- Value = true;
- Status = "locked";
- };
- in
-{
- # Home Manager needs a bit of information about you and the paths it should
- # manage.
- home.username = "ryan";
- home.homeDirectory = "/home/ryan";
-
- # Ignore news
- news.display = "silent";
-
- # This value determines the Home Manager release that your configuration is
- # compatible with. This helps avoid breakage when a new Home Manager release
- # introduces backwards incompatible changes.
- #
- # You should not change this value, even if you update Home Manager. If you do
- # want to update the value, then make sure to first check the Home Manager
- # release notes.
- home.stateVersion = "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;
- fonts.fontconfig.enable = true;
- fonts.fontconfig.defaultFonts = {
- monospace = [ "DejaVu Sans Mono" ];
- sansSerif = [ "DejaVu Sans" ];
- serif = [ "DejaVu Serif" ];
- };
-
- # wayland.windowManager.hyprland.enable = true;
-
- # Install firefox and add some customizations
- programs.firefox = {
- enable = true;
- policies = {
- EnableTrackingProtection = {
- Value = true;
- Locked = true;
- Cryptomining = true;
- Fingerprinting = true;
- EmailTracking = true;
- };
- UserMessaging = {
- WhatsNew = false;
- ExtensionRecommendations = false;
- FeatureRecommendations = false;
- UrlbarInterventions = false;
- SkipOnboarding = true;
- MoreFromMozilla = false;
- Labs = false;
- Locked = true;
- };
- DisableAppUpdate = true;
- DisableAccounts = true;
- DisableFirefoxAccounts = true;
- DisableFirefoxStudies = true;
- DisablePocket = true;
- DisableTelemetry = true;
- AutofillAddressEnabled = false;
- AutofillCreditCardEnabled = false;
- DisableMasterPasswordCreation = true;
- PasswordManagerEnabled = false;
- PrimaryPassword = false;
- OfferToSaveLogins = false;
- NoDefaultBookmarks = true;
- OverrideFirstRunPage = "";
- OverridePostUpdatePage = "";
- FirefoxHome = {
- Search = true;
- TopSites = true;
- SponsoredTopSites = false;
- Highlights = false;
- Pocket = false;
- SponsoredPocket = false;
- Snippets = false;
- Locked = true;
- };
- SearchSuggestEnabled = true;
- FirefoxSuggest = {
- WebSuggestions = true;
- SponsoredSuggestions = false;
- ImproveSuggest = false;
- Locked = true;
- };
- PictureInPicture = lock-true;
- HardwareAcceleration = true;
- Certificates = {
- ImportEnterpriseRoots = true;
- };
- ExtensionSettings = {
- #"*".installation_mode = "blocked";
- # uBlock Origin
- "uBlock0@raymondhill.net" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
- installation_mode = "force_installed";
- };
- # Bitwarden
- "{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
- installation_mode = "normal_installed";
- };
- # SponsorBlock
- "sponsorBlocker@ajay.app" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi";
- installation_mode = "force_installed";
- };
- # DeArrow
- "deArrow@ajay.app" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/dearrow/latest.xpi";
- installation_mode = "force_installed";
- };
- # Return Youtube Dislike
- "{762f9885-5a13-4abd-9c77-433dcd38b8fd}" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/return-youtube-dislikes/latest.xpi";
- installation_mode = "force_installed";
- };
- # Youtube Nonstop
- "{0d7cafdd-501c-49ca-8ebb-e3341caaa55e}" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/youtube-nonstop/latest.xpi";
- installation_mode = "force_installed";
- };
- # Sidebery
- "{3c078156-979c-498b-8990-85f7987dd929}" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/sidebery/latest.xpi";
- installation_mode = "normal_installed";
- };
- # TamperMonkey
- "firefox@tampermonkey.net" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/tampermonkey/latest.xpi";
- installation_mode = "force_installed";
- };
- # Floccus
- "floccus@handmadeideas.org" = {
- install_url = "https://addons.mozilla.org/firefox/downloads/latest/floccus/latest.xpi";
- installation_mode = "force_installed";
- };
- };
- Preferences = {
- "browser.startup.homepage" = "https://d.in.rschanz.org";
- "extensions.activeThemeID" = {
- Value = "firefox-compact-dark@mozilla.org";
- Status = "locked";
- };
- "toolkit.legacyUserProfileCustomizations.stylesheets" = lock-true;
- "xpinstall.whitelist.required" = lock-true;
- "dom.webgpu.enabled" = lock-true;
- "media.eme.enabled" = lock-true;
- "general.autoScroll" = lock-true;
- "general.smoothScroll" = lock-true;
- "browser.crashReports.unsubmittedCheck.autoSubmit2" = lock-false;
- "browser.aboutConfig.showWarning" = lock-false;
- };
- };
- profiles.${config.home.username} = {
- name = "${config.home.username}";
- isDefault = true;
- containersForce = true;
- containers = {
- rit = {
- name = "RIT";
- color = "orange";
- icon = "dollar";
- id = 1;
- };
- ritwork = {
- name = "RIT Work";
- color = "green";
- icon = "briefcase";
- id = 2;
- };
- other = {
- name = "Other";
- color = "blue";
- icon = "fingerprint";
- id = 3;
- };
- };
- search = {
- force = true;
- default = "DuckDuckGo";
- order = ["DuckDuckGo" "Google"];
- engines = {
- "Nix Packages" = {
- urls = [
- {
- template = "https://search.nixos.org/packages";
- params = [
- {
- name = "type";
- value = "packages";
- }
- {
- name = "channel";
- value = "unstable";
- }
- {
- name = "query";
- value = "{searchTerms}";
- }
- ];
- }
- ];
- icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
- definedAliases = ["@np"];
- };
- };
- };
- userChrome = "
- #main-window .toolbar-items {
- overflow: hidden;
- transition: height 0.3s 0.3s !important;
- }
- /* Default state: Set initial height to enable animation */
- #main-window .toolbar-items { height: 3em !important; }
- #main-window .titlebar-button { height: 3em !important; }
- #main-window[uidensity=\"touch\"] .toolbar-items { height: 3.35em !important; }
- #main-window[uidensity=\"compact\"] .toolbar-items { height: 2.7em !important; }
- /* Hidden state: Hide native tabs strip */
- #main-window[titlepreface*=\"\"] .toolbar-items { height: 0 !important; }
- #main-window[titlepreface*=\"\"] .titlebar-button { height: 0 !important; }
- /* Hidden state: Fix z-index of active pinned tabs */
- #main-window[titlepreface*=\"\"] #tabbrowser-tabs { z-index: 0 !important; }
-
- /* Sidebery expand on mouse-over and hide otherwise */
-
- /* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/autohide_sidebar.css made available under Mozilla Public License v. 2.0
- See the above repository for updates as well as full license text. */
-
- /* Show sidebar only when the cursor is over it */
- /* The border controlling sidebar width will be removed so you'll need to modify these values to change width */
-
- #sidebar-box{
- --uc-sidebar-width: 60px;
- --uc-sidebar-hover-width: 230px;
- --uc-autohide-sidebar-delay: 200ms; /* Wait 0.2s before hiding sidebar */
- --uc-autohide-transition-duration: 115ms;
- --uc-autohide-transition-type: linear;
- --browser-area-z-index-sidebar: 3;
- position: relative;
- min-width: var(--uc-sidebar-width) !important;
- width: var(--uc-sidebar-width) !important;
- max-width: var(--uc-sidebar-width) !important;
- z-index: var(--browser-area-z-index-sidebar,3);
- }
- #sidebar-box[positionend]{ direction: rtl }
- #sidebar-box[positionend] > *{ direction: ltr }
-
- #sidebar-box[positionend]:-moz-locale-dir(rtl){ direction: ltr }
- #sidebar-box[positionend]:-moz-locale-dir(rtl) > *{ direction: rtl }
-
- #main-window[sizemode=\"fullscreen\"] #sidebar-box{ --uc-sidebar-width: 1px; }
-
- #sidebar-splitter{ display: none }
-
- #sidebar-header{
- overflow: hidden;
- color: var(--chrome-color, inherit) !important;
- padding-inline: 0 !important;
- }
-
- #sidebar-header::before,
- #sidebar-header::after{
- content: \"\";
- display: flex;
- padding-left: 8px;
- }
-
- #sidebar-header,
- #sidebar{
- transition: min-width var(--uc-autohide-transition-duration) var(--uc-autohide-transition-type) var(--uc-autohide-sidebar-delay) !important;
- min-width: var(--uc-sidebar-width) !important;
- will-change: min-width;
- }
- #sidebar-box:hover > #sidebar-header,
- #sidebar-box:hover > #sidebar{
- min-width: var(--uc-sidebar-hover-width) !important;
- transition-delay: 0ms !important;
- }
-
- .sidebar-panel{
- background-color: transparent !important;
- color: var(--newtab-text-primary-color) !important;
- }
-
- .sidebar-panel #search-box{
- -moz-appearance: none !important;
- background-color: rgba(249,249,250,0.1) !important;
- color: inherit !important;
- }
-
- /* Add sidebar divider and give it background */
-
- #sidebar,
- #sidebar-header{
- background-color: inherit !important;
- border-inline: 1px solid rgb(80,80,80);
- border-inline-width: 0px 1px;
- }
-
- #sidebar-box:not([positionend]) > :-moz-locale-dir(rtl),
- #sidebar-box[positionend] > *{
- border-inline-width: 1px 0px;
- }
-
- /* Move statuspanel to the other side when sidebar is hovered so it doesn't get covered by sidebar */
-
- #sidebar-box:not([positionend]):hover ~ #appcontent #statuspanel{
- inset-inline: auto 0px !important;
- }
- #sidebar-box:not([positionend]):hover ~ #appcontent #statuspanel-label{
- margin-inline: 0px !important;
- border-left-style: solid !important;
- }
-
- /* Remove the tabs label and move the Sidebary icon to the center of the box */
- #sidebar-box:hover [id=\"sidebar-icon\"] {
- transform: translateX(0px) !important;
- transition-delay: 0ms !important;
- }
-
- #sidebar-box [id=\"sidebar-icon\"] {
- transform: translateX(9px);
- transition: transform var(--uc-autohide-transition-duration) var(--uc-autohide-transition-type) var(--uc-autohide-sidebar-delay) !important;
- }
-
- #sidebar-box [id=\"sidebar-title\"] {
- visibility: hidden !important;
- transition: visibility var(--uc-autohide-transition-duration) var(--uc-autohide-transition-type) var(--uc-autohide-sidebar-delay) !important;
- }
-
- #sidebar-box:hover [id=\"sidebar-title\"] {
- visibility: visible !important;
- transition-delay: 0ms !important;
- }
- ";
- };
-};
-
- programs.starship = {
- enable = true;
- settings = {
- add_newline = false;
- character = {
- success_symbol = "[➜](bold green)";
- error_symbol = "[➜](bold red)";
- };
- time = {
- disabled = false;
- format = "\[ $time \]($style)";
- time_format = "%T";
- };
- };
- };
-
- # The home.packages option allows you to install Nix packages into your
- # environment.
- home.packages = with pkgs; [
- # # Adds the 'hello' command to your environment. It prints a friendly
- # # "Hello, world!" when run.
- # pkgs.hello
- yt-dlp
- #pass
- rustup
- zoxide
- nodePackages.pnpm
- gcc
- aerc
- pkg-config
- wttrbar
- wl-clip-persist
- gifski
- waypaper
- gdu
- spotify-player
- #hyprpicker
- xwayland
- xdg-desktop-portal
- xdg-desktop-portal-gtk
- mpv
- imv
- libva
- libvdpau
- #wpaperd
- hypridle
- #latest.firefox-nightly-bin
- eza
- wl-mirror
- starship
- taskwarrior3
- delta
-
- # Here until i can fix firefox's stupid devtools issue
- chromium
-
- # Wrapped programs for some env variables
- (pkgs.writeScriptBin "hyprlock" ''
- #! ${pkgs.bash}/bin/bash
- export LD_PRELOAD="/run/current-system/profile/lib/libpam.so.0:/run/current-system/profile/lib/libfontconfig.so:$LD_PRELOAD"
- exec ${hyprlock.packages.${pkgs.system}.hyprlock}/bin/hyprlock "$@"
- '')
-
- # 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
- wpaperd.packages.${pkgs.system}.wpaperd
- hyprpicker-git.packages.${pkgs.system}.hyprpicker
-
- # Fonts!
- noto-fonts
- dejavu_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
- # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
- # # fonts?
- # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
-
- # # You can also create simple shell scripts directly inside your
- # # configuration. For example, this adds a command 'my-hello' to your
- # # environment:
- # (pkgs.writeShellScriptBin "my-hello" ''
- # echo "Hello, ${config.home.username}!"
- # '')
- ];
-
- # Home Manager is pretty good at managing dotfiles. The primary way to manage
- # plain files is through 'home.file'.
- home.file = {
- # # Building this configuration will create a copy of 'dotfiles/screenrc' in
- # # the Nix store. Activating the configuration will then make '~/.screenrc' a
- # # symlink to the Nix store copy.
- # ".screenrc".source = dotfiles/screenrc;
-
- # # You can also set the file content immediately.
- # ".gradle/gradle.properties".text = ''
- # org.gradle.console=verbose
- # org.gradle.daemon.idletimeout=3600000
- # '';
- };
-
- # You can also manage environment variables but you will have to manually
- # source
- #
- # ~/.nix-profile/etc/profile.d/hm-session-vars.sh
- #
- # or
- #
- # /etc/profiles/per-user/ryan/etc/profile.d/hm-session-vars.sh
- #
- # if you don't want to manage your shell through Home Manager.
- home.sessionVariables = {
- # EDITOR = "emacs";
- };
-
- # Let Home Manager install and manage itself.
- programs.home-manager.enable = true;
-}
@@ -1,2 +0,0 @@
-setlocal tw=0 wm=0
-setlocal wrap linebreak
@@ -1,2 +0,0 @@
-"Used to overwrite table behavior in markdown files
-let b:table_mode_corner='+'
@@ -1,91 +0,0 @@
-set nu rnu
-imap kj <Esc>
-set ts=4
-set sw=4
-set sts=4
-set et
-set mouse=
-set cursorline
-set cc=79
-
-call plug#begin(stdpath('data') . '/plugged')
-"Plug 'prabirshrestha/vim-lsp'
-"Plug 'mattn/vim-lsp-settings'
-"Plug 'prabirshrestha/asyncomplete.vim'
-"Plug 'prabirshrestha/asyncomplete-lsp.vim'
-"Plug 'Yggdroot/indentLine'
-Plug 'nvim-treesitter/nvim-treesitter', {'do':':TSUpdate'}
-Plug 'vim-pandoc/vim-pandoc'
-Plug 'vim-pandoc/vim-pandoc-syntax'
-Plug 'dhruvasagar/vim-table-mode'
-Plug 'skywind3000/asyncrun.vim'
-Plug 'folke/tokyonight.nvim', {'branch':'main'}
-Plug 'nvim-lualine/lualine.nvim'
-Plug 'nvim-tree/nvim-web-devicons'
-Plug 'ms-jpq/coq_nvim', {'branch':'coq'}
-Plug 'ms-jpq/coq.artifacts', {'branch':'artifacts'}
-Plug 'williamboman/mason.nvim'
-Plug 'williamboman/mason-lspconfig.nvim'
-Plug 'neovim/nvim-lspconfig'
-"Plug 'nvim-orgmode/orgmode'
-Plug 'ggandor/leap.nvim'
-Plug 'xiyaowong/transparent.nvim'
-call plug#end()
-
-"Load Theme
-colorscheme tokyonight-night
-
-"Load COQ Autocomplete
-let g:coq_settings = {'auto_start':'shut-up'}
-
-"Load LuaLine, COQ, and nvim-orgmode
-lua << END
-require('lualine').setup()
-require('coq')
-require("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 {}
- end,
-}
-
-require('nvim-treesitter.configs').setup {
- highlight = {
- enable = true,
- additional_vim_regex_highlighting = {'org'},
- },
- ensure_installed = {'vim', 'python'},
-}
-
-vim.opt.conceallevel = 2
-vim.opt.concealcursor = nc
-
-END
-
-"asynccomplete Auto Complete Config
-"inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
-"inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
-"inoremap <expr> <cr> pumvisible() ? asyncomplete#close_popup() : "\<cr>"
-
-"vim-pandoc config
-let g:pandoc#modules#disabled = ['spell', 'folding']
-
-"vim-table-mode config
-let g:table_mode_corner_corner='+'
-let g:table_mode_header_fillchar='='
-
-"pandoc render and open preview
-command Pv AsyncRun zathura '%:r.pdf'
-command Rd silent exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
-command Rr exec "!pandoc -t pdf -o %:r.pdf --from=markdown+escaped_line_breaks -V geometry:margin=1in %"
-
-"Auto-rerender markdown files to pdf
-autocmd BufWritePost *.mkd :Rd
@@ -1,2812 +0,0 @@
-" vim-plug: Vim plugin manager
-" ============================
-"
-" Download plug.vim and put it in ~/.vim/autoload
-"
-" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
-" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
-"
-" Edit your .vimrc
-"
-" call plug#begin('~/.vim/plugged')
-"
-" " Make sure you use single quotes
-"
-" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
-" Plug 'junegunn/vim-easy-align'
-"
-" " Any valid git URL is allowed
-" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
-"
-" " Multiple Plug commands can be written in a single line using | separators
-" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
-"
-" " On-demand loading
-" Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
-" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
-"
-" " Using a non-default branch
-" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
-"
-" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
-" Plug 'fatih/vim-go', { 'tag': '*' }
-"
-" " Plugin options
-" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
-"
-" " Plugin outside ~/.vim/plugged with post-update hook
-" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
-"
-" " Unmanaged plugin (manually installed and updated)
-" Plug '~/my-prototype-plugin'
-"
-" " Initialize plugin system
-" call plug#end()
-"
-" Then reload .vimrc and :PlugInstall to install plugins.
-"
-" Plug options:
-"
-"| Option | Description |
-"| ----------------------- | ------------------------------------------------ |
-"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
-"| `rtp` | Subdirectory that contains Vim plugin |
-"| `dir` | Custom directory for the plugin |
-"| `as` | Use different name for the plugin |
-"| `do` | Post-update hook (string or funcref) |
-"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
-"| `for` | On-demand loading: File types |
-"| `frozen` | Do not update unless explicitly specified |
-"
-" More information: https://github.com/junegunn/vim-plug
-"
-"
-" Copyright (c) 2017 Junegunn Choi
-"
-" MIT License
-"
-" Permission is hereby granted, free of charge, to any person obtaining
-" a copy of this software and associated documentation files (the
-" "Software"), to deal in the Software without restriction, including
-" without limitation the rights to use, copy, modify, merge, publish,
-" distribute, sublicense, and/or sell copies of the Software, and to
-" permit persons to whom the Software is furnished to do so, subject to
-" the following conditions:
-"
-" The above copyright notice and this permission notice shall be
-" included in all copies or substantial portions of the Software.
-"
-" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-if exists('g:loaded_plug')
- finish
-endif
-let g:loaded_plug = 1
-
-let s:cpo_save = &cpo
-set cpo&vim
-
-let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
-let s:plug_tab = get(s:, 'plug_tab', -1)
-let s:plug_buf = get(s:, 'plug_buf', -1)
-let s:mac_gui = has('gui_macvim') && has('gui_running')
-let s:is_win = has('win32')
-let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
-let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
-if s:is_win && &shellslash
- set noshellslash
- let s:me = resolve(expand('<sfile>:p'))
- set shellslash
-else
- let s:me = resolve(expand('<sfile>:p'))
-endif
-let s:base_spec = { 'branch': '', 'frozen': 0 }
-let s:TYPE = {
-\ 'string': type(''),
-\ 'list': type([]),
-\ 'dict': type({}),
-\ 'funcref': type(function('call'))
-\ }
-let s:loaded = get(s:, 'loaded', {})
-let s:triggers = get(s:, 'triggers', {})
-
-function! s:is_powershell(shell)
- return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$'
-endfunction
-
-function! s:isabsolute(dir) abort
- return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)')
-endfunction
-
-function! s:git_dir(dir) abort
- let gitdir = s:trim(a:dir) . '/.git'
- if isdirectory(gitdir)
- return gitdir
- endif
- if !filereadable(gitdir)
- return ''
- endif
- let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*')
- if len(gitdir) && !s:isabsolute(gitdir)
- let gitdir = a:dir . '/' . gitdir
- endif
- return isdirectory(gitdir) ? gitdir : ''
-endfunction
-
-function! s:git_origin_url(dir) abort
- let gitdir = s:git_dir(a:dir)
- let config = gitdir . '/config'
- if empty(gitdir) || !filereadable(config)
- return ''
- endif
- return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze')
-endfunction
-
-function! s:git_revision(dir) abort
- let gitdir = s:git_dir(a:dir)
- let head = gitdir . '/HEAD'
- if empty(gitdir) || !filereadable(head)
- return ''
- endif
-
- let line = get(readfile(head), 0, '')
- let ref = matchstr(line, '^ref: \zs.*')
- if empty(ref)
- return line
- endif
-
- if filereadable(gitdir . '/' . ref)
- return get(readfile(gitdir . '/' . ref), 0, '')
- endif
-
- if filereadable(gitdir . '/packed-refs')
- for line in readfile(gitdir . '/packed-refs')
- if line =~# ' ' . ref
- return matchstr(line, '^[0-9a-f]*')
- endif
- endfor
- endif
-
- return ''
-endfunction
-
-function! s:git_local_branch(dir) abort
- let gitdir = s:git_dir(a:dir)
- let head = gitdir . '/HEAD'
- if empty(gitdir) || !filereadable(head)
- return ''
- endif
- let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*')
- return len(branch) ? branch : 'HEAD'
-endfunction
-
-function! s:git_origin_branch(spec)
- if len(a:spec.branch)
- return a:spec.branch
- endif
-
- " The file may not be present if this is a local repository
- let gitdir = s:git_dir(a:spec.dir)
- let origin_head = gitdir.'/refs/remotes/origin/HEAD'
- if len(gitdir) && filereadable(origin_head)
- return matchstr(get(readfile(origin_head), 0, ''),
- \ '^ref: refs/remotes/origin/\zs.*')
- endif
-
- " The command may not return the name of a branch in detached HEAD state
- let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir))
- return v:shell_error ? '' : result[-1]
-endfunction
-
-if s:is_win
- function! s:plug_call(fn, ...)
- let shellslash = &shellslash
- try
- set noshellslash
- return call(a:fn, a:000)
- finally
- let &shellslash = shellslash
- endtry
- endfunction
-else
- function! s:plug_call(fn, ...)
- return call(a:fn, a:000)
- endfunction
-endif
-
-function! s:plug_getcwd()
- return s:plug_call('getcwd')
-endfunction
-
-function! s:plug_fnamemodify(fname, mods)
- return s:plug_call('fnamemodify', a:fname, a:mods)
-endfunction
-
-function! s:plug_expand(fmt)
- return s:plug_call('expand', a:fmt, 1)
-endfunction
-
-function! s:plug_tempname()
- return s:plug_call('tempname')
-endfunction
-
-function! plug#begin(...)
- if a:0 > 0
- let s:plug_home_org = a:1
- let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
- elseif exists('g:plug_home')
- let home = s:path(g:plug_home)
- elseif has('nvim')
- let home = stdpath('data') . '/plugged'
- elseif !empty(&rtp)
- let home = s:path(split(&rtp, ',')[0]) . '/plugged'
- else
- return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
- endif
- if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
- return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
- endif
-
- let g:plug_home = home
- let g:plugs = {}
- let g:plugs_order = []
- let s:triggers = {}
-
- call s:define_commands()
- return 1
-endfunction
-
-function! s:define_commands()
- command! -nargs=+ -bar Plug call plug#(<args>)
- if !executable('git')
- return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
- endif
- if has('win32')
- \ && &shellslash
- \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell))
- return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
- endif
- if !has('nvim')
- \ && (has('win32') || has('win32unix'))
- \ && !has('multi_byte')
- return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
- endif
- command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
- command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
- command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
- command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
- command! -nargs=0 -bar PlugStatus call s:status()
- command! -nargs=0 -bar PlugDiff call s:diff()
- command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
-endfunction
-
-function! s:to_a(v)
- return type(a:v) == s:TYPE.list ? a:v : [a:v]
-endfunction
-
-function! s:to_s(v)
- return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
-endfunction
-
-function! s:glob(from, pattern)
- return s:lines(globpath(a:from, a:pattern))
-endfunction
-
-function! s:source(from, ...)
- let found = 0
- for pattern in a:000
- for vim in s:glob(a:from, pattern)
- execute 'source' s:esc(vim)
- let found = 1
- endfor
- endfor
- return found
-endfunction
-
-function! s:assoc(dict, key, val)
- let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
-endfunction
-
-function! s:ask(message, ...)
- call inputsave()
- echohl WarningMsg
- let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
- echohl None
- call inputrestore()
- echo "\r"
- return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
-endfunction
-
-function! s:ask_no_interrupt(...)
- try
- return call('s:ask', a:000)
- catch
- return 0
- endtry
-endfunction
-
-function! s:lazy(plug, opt)
- return has_key(a:plug, a:opt) &&
- \ (empty(s:to_a(a:plug[a:opt])) ||
- \ !isdirectory(a:plug.dir) ||
- \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
- \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
-endfunction
-
-function! plug#end()
- if !exists('g:plugs')
- return s:err('plug#end() called without calling plug#begin() first')
- endif
-
- if exists('#PlugLOD')
- augroup PlugLOD
- autocmd!
- augroup END
- augroup! PlugLOD
- endif
- let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
-
- if get(g:, 'did_load_filetypes', 0)
- filetype off
- endif
- for name in g:plugs_order
- if !has_key(g:plugs, name)
- continue
- endif
- let plug = g:plugs[name]
- if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
- let s:loaded[name] = 1
- continue
- endif
-
- if has_key(plug, 'on')
- let s:triggers[name] = { 'map': [], 'cmd': [] }
- for cmd in s:to_a(plug.on)
- if cmd =~? '^<Plug>.\+'
- if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
- call s:assoc(lod.map, cmd, name)
- endif
- call add(s:triggers[name].map, cmd)
- elseif cmd =~# '^[A-Z]'
- let cmd = substitute(cmd, '!*$', '', '')
- if exists(':'.cmd) != 2
- call s:assoc(lod.cmd, cmd, name)
- endif
- call add(s:triggers[name].cmd, cmd)
- else
- call s:err('Invalid `on` option: '.cmd.
- \ '. Should start with an uppercase letter or `<Plug>`.')
- endif
- endfor
- endif
-
- if has_key(plug, 'for')
- let types = s:to_a(plug.for)
- if !empty(types)
- augroup filetypedetect
- call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
- augroup END
- endif
- for type in types
- call s:assoc(lod.ft, type, name)
- endfor
- endif
- endfor
-
- for [cmd, names] in items(lod.cmd)
- execute printf(
- \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
- \ cmd, string(cmd), string(names))
- endfor
-
- for [map, names] in items(lod.map)
- for [mode, map_prefix, key_prefix] in
- \ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
- execute printf(
- \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
- \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
- endfor
- endfor
-
- for [ft, names] in items(lod.ft)
- augroup PlugLOD
- execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
- \ ft, string(ft), string(names))
- augroup END
- endfor
-
- call s:reorg_rtp()
- filetype plugin indent on
- if has('vim_starting')
- if has('syntax') && !exists('g:syntax_on')
- syntax enable
- end
- else
- call s:reload_plugins()
- endif
-endfunction
-
-function! s:loaded_names()
- return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
-endfunction
-
-function! s:load_plugin(spec)
- call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
-endfunction
-
-function! s:reload_plugins()
- for name in s:loaded_names()
- call s:load_plugin(g:plugs[name])
- endfor
-endfunction
-
-function! s:trim(str)
- return substitute(a:str, '[\/]\+$', '', '')
-endfunction
-
-function! s:version_requirement(val, min)
- for idx in range(0, len(a:min) - 1)
- let v = get(a:val, idx, 0)
- if v < a:min[idx] | return 0
- elseif v > a:min[idx] | return 1
- endif
- endfor
- return 1
-endfunction
-
-function! s:git_version_requirement(...)
- if !exists('s:git_version')
- let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)')
- endif
- return s:version_requirement(s:git_version, a:000)
-endfunction
-
-function! s:progress_opt(base)
- return a:base && !s:is_win &&
- \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
-endfunction
-
-function! s:rtp(spec)
- return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
-endfunction
-
-if s:is_win
- function! s:path(path)
- return s:trim(substitute(a:path, '/', '\', 'g'))
- endfunction
-
- function! s:dirpath(path)
- return s:path(a:path) . '\'
- endfunction
-
- function! s:is_local_plug(repo)
- return a:repo =~? '^[a-z]:\|^[%~]'
- endfunction
-
- " Copied from fzf
- function! s:wrap_cmds(cmds)
- let cmds = [
- \ '@echo off',
- \ 'setlocal enabledelayedexpansion']
- \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
- \ + ['endlocal']
- if has('iconv')
- if !exists('s:codepage')
- let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
- endif
- return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
- endif
- return map(cmds, 'v:val."\r"')
- endfunction
-
- function! s:batchfile(cmd)
- let batchfile = s:plug_tempname().'.bat'
- call writefile(s:wrap_cmds(a:cmd), batchfile)
- let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
- if s:is_powershell(&shell)
- let cmd = '& ' . cmd
- endif
- return [batchfile, cmd]
- endfunction
-else
- function! s:path(path)
- return s:trim(a:path)
- endfunction
-
- function! s:dirpath(path)
- return substitute(a:path, '[/\\]*$', '/', '')
- endfunction
-
- function! s:is_local_plug(repo)
- return a:repo[0] =~ '[/$~]'
- endfunction
-endif
-
-function! s:err(msg)
- echohl ErrorMsg
- echom '[vim-plug] '.a:msg
- echohl None
-endfunction
-
-function! s:warn(cmd, msg)
- echohl WarningMsg
- execute a:cmd 'a:msg'
- echohl None
-endfunction
-
-function! s:esc(path)
- return escape(a:path, ' ')
-endfunction
-
-function! s:escrtp(path)
- return escape(a:path, ' ,')
-endfunction
-
-function! s:remove_rtp()
- for name in s:loaded_names()
- let rtp = s:rtp(g:plugs[name])
- execute 'set rtp-='.s:escrtp(rtp)
- let after = globpath(rtp, 'after')
- if isdirectory(after)
- execute 'set rtp-='.s:escrtp(after)
- endif
- endfor
-endfunction
-
-function! s:reorg_rtp()
- if !empty(s:first_rtp)
- execute 'set rtp-='.s:first_rtp
- execute 'set rtp-='.s:last_rtp
- endif
-
- " &rtp is modified from outside
- if exists('s:prtp') && s:prtp !=# &rtp
- call s:remove_rtp()
- unlet! s:middle
- endif
-
- let s:middle = get(s:, 'middle', &rtp)
- let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
- let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
- let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
- \ . ','.s:middle.','
- \ . join(map(afters, 'escape(v:val, ",")'), ',')
- let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
- let s:prtp = &rtp
-
- if !empty(s:first_rtp)
- execute 'set rtp^='.s:first_rtp
- execute 'set rtp+='.s:last_rtp
- endif
-endfunction
-
-function! s:doautocmd(...)
- if exists('#'.join(a:000, '#'))
- execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
- endif
-endfunction
-
-function! s:dobufread(names)
- for name in a:names
- let path = s:rtp(g:plugs[name])
- for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
- if len(finddir(dir, path))
- if exists('#BufRead')
- doautocmd BufRead
- endif
- return
- endif
- endfor
- endfor
-endfunction
-
-function! plug#load(...)
- if a:0 == 0
- return s:err('Argument missing: plugin name(s) required')
- endif
- if !exists('g:plugs')
- return s:err('plug#begin was not called')
- endif
- let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
- let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
- if !empty(unknowns)
- let s = len(unknowns) > 1 ? 's' : ''
- return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
- end
- let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
- if !empty(unloaded)
- for name in unloaded
- call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- endfor
- call s:dobufread(unloaded)
- return 1
- end
- return 0
-endfunction
-
-function! s:remove_triggers(name)
- if !has_key(s:triggers, a:name)
- return
- endif
- for cmd in s:triggers[a:name].cmd
- execute 'silent! delc' cmd
- endfor
- for map in s:triggers[a:name].map
- execute 'silent! unmap' map
- execute 'silent! iunmap' map
- endfor
- call remove(s:triggers, a:name)
-endfunction
-
-function! s:lod(names, types, ...)
- for name in a:names
- call s:remove_triggers(name)
- let s:loaded[name] = 1
- endfor
- call s:reorg_rtp()
-
- for name in a:names
- let rtp = s:rtp(g:plugs[name])
- for dir in a:types
- call s:source(rtp, dir.'/**/*.vim')
- endfor
- if a:0
- if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
- execute 'runtime' a:1
- endif
- call s:source(rtp, a:2)
- endif
- call s:doautocmd('User', name)
- endfor
-endfunction
-
-function! s:lod_ft(pat, names)
- let syn = 'syntax/'.a:pat.'.vim'
- call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
- execute 'autocmd! PlugLOD FileType' a:pat
- call s:doautocmd('filetypeplugin', 'FileType')
- call s:doautocmd('filetypeindent', 'FileType')
-endfunction
-
-function! s:lod_cmd(cmd, bang, l1, l2, args, names)
- call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- call s:dobufread(a:names)
- execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
-endfunction
-
-function! s:lod_map(map, names, with_prefix, prefix)
- call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
- call s:dobufread(a:names)
- let extra = ''
- while 1
- let c = getchar(0)
- if c == 0
- break
- endif
- let extra .= nr2char(c)
- endwhile
-
- if a:with_prefix
- let prefix = v:count ? v:count : ''
- let prefix .= '"'.v:register.a:prefix
- if mode(1) == 'no'
- if v:operator == 'c'
- let prefix = "\<esc>" . prefix
- endif
- let prefix .= v:operator
- endif
- call feedkeys(prefix, 'n')
- endif
- call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
-endfunction
-
-function! plug#(repo, ...)
- if a:0 > 1
- return s:err('Invalid number of arguments (1..2)')
- endif
-
- try
- let repo = s:trim(a:repo)
- let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
- let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
- let spec = extend(s:infer_properties(name, repo), opts)
- if !has_key(g:plugs, name)
- call add(g:plugs_order, name)
- endif
- let g:plugs[name] = spec
- let s:loaded[name] = get(s:loaded, name, 0)
- catch
- return s:err(repo . ' ' . v:exception)
- endtry
-endfunction
-
-function! s:parse_options(arg)
- let opts = copy(s:base_spec)
- let type = type(a:arg)
- let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)'
- if type == s:TYPE.string
- if empty(a:arg)
- throw printf(opt_errfmt, 'tag', 'string')
- endif
- let opts.tag = a:arg
- elseif type == s:TYPE.dict
- for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
- if has_key(a:arg, opt)
- \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
- throw printf(opt_errfmt, opt, 'string')
- endif
- endfor
- for opt in ['on', 'for']
- if has_key(a:arg, opt)
- \ && type(a:arg[opt]) != s:TYPE.list
- \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt]))
- throw printf(opt_errfmt, opt, 'string or list')
- endif
- endfor
- if has_key(a:arg, 'do')
- \ && type(a:arg.do) != s:TYPE.funcref
- \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do))
- throw printf(opt_errfmt, 'do', 'string or funcref')
- endif
- call extend(opts, a:arg)
- if has_key(opts, 'dir')
- let opts.dir = s:dirpath(s:plug_expand(opts.dir))
- endif
- else
- throw 'Invalid argument type (expected: string or dictionary)'
- endif
- return opts
-endfunction
-
-function! s:infer_properties(name, repo)
- let repo = a:repo
- if s:is_local_plug(repo)
- return { 'dir': s:dirpath(s:plug_expand(repo)) }
- else
- if repo =~ ':'
- let uri = repo
- else
- if repo !~ '/'
- throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
- endif
- let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
- let uri = printf(fmt, repo)
- endif
- return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
- endif
-endfunction
-
-function! s:install(force, names)
- call s:update_impl(0, a:force, a:names)
-endfunction
-
-function! s:update(force, names)
- call s:update_impl(1, a:force, a:names)
-endfunction
-
-function! plug#helptags()
- if !exists('g:plugs')
- return s:err('plug#begin was not called')
- endif
- for spec in values(g:plugs)
- let docd = join([s:rtp(spec), 'doc'], '/')
- if isdirectory(docd)
- silent! execute 'helptags' s:esc(docd)
- endif
- endfor
- return 1
-endfunction
-
-function! s:syntax()
- syntax clear
- syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
- syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
- syn match plugNumber /[0-9]\+[0-9.]*/ contained
- syn match plugBracket /[[\]]/ contained
- syn match plugX /x/ contained
- syn match plugDash /^-\{1}\ /
- syn match plugPlus /^+/
- syn match plugStar /^*/
- syn match plugMessage /\(^- \)\@<=.*/
- syn match plugName /\(^- \)\@<=[^ ]*:/
- syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
- syn match plugTag /(tag: [^)]\+)/
- syn match plugInstall /\(^+ \)\@<=[^:]*/
- syn match plugUpdate /\(^* \)\@<=[^:]*/
- syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
- syn match plugEdge /^ \X\+$/
- syn match plugEdge /^ \X*/ contained nextgroup=plugSha
- syn match plugSha /[0-9a-f]\{7,9}/ contained
- syn match plugRelDate /([^)]*)$/ contained
- syn match plugNotLoaded /(not loaded)$/
- syn match plugError /^x.*/
- syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
- syn match plugH2 /^.*:\n-\+$/
- syn match plugH2 /^-\{2,}/
- syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
- hi def link plug1 Title
- hi def link plug2 Repeat
- hi def link plugH2 Type
- hi def link plugX Exception
- hi def link plugBracket Structure
- hi def link plugNumber Number
-
- hi def link plugDash Special
- hi def link plugPlus Constant
- hi def link plugStar Boolean
-
- hi def link plugMessage Function
- hi def link plugName Label
- hi def link plugInstall Function
- hi def link plugUpdate Type
-
- hi def link plugError Error
- hi def link plugDeleted Ignore
- hi def link plugRelDate Comment
- hi def link plugEdge PreProc
- hi def link plugSha Identifier
- hi def link plugTag Constant
-
- hi def link plugNotLoaded Comment
-endfunction
-
-function! s:lpad(str, len)
- return a:str . repeat(' ', a:len - len(a:str))
-endfunction
-
-function! s:lines(msg)
- return split(a:msg, "[\r\n]")
-endfunction
-
-function! s:lastline(msg)
- return get(s:lines(a:msg), -1, '')
-endfunction
-
-function! s:new_window()
- execute get(g:, 'plug_window', 'vertical topleft new')
-endfunction
-
-function! s:plug_window_exists()
- let buflist = tabpagebuflist(s:plug_tab)
- return !empty(buflist) && index(buflist, s:plug_buf) >= 0
-endfunction
-
-function! s:switch_in()
- if !s:plug_window_exists()
- return 0
- endif
-
- if winbufnr(0) != s:plug_buf
- let s:pos = [tabpagenr(), winnr(), winsaveview()]
- execute 'normal!' s:plug_tab.'gt'
- let winnr = bufwinnr(s:plug_buf)
- execute winnr.'wincmd w'
- call add(s:pos, winsaveview())
- else
- let s:pos = [winsaveview()]
- endif
-
- setlocal modifiable
- return 1
-endfunction
-
-function! s:switch_out(...)
- call winrestview(s:pos[-1])
- setlocal nomodifiable
- if a:0 > 0
- execute a:1
- endif
-
- if len(s:pos) > 1
- execute 'normal!' s:pos[0].'gt'
- execute s:pos[1] 'wincmd w'
- call winrestview(s:pos[2])
- endif
-endfunction
-
-function! s:finish_bindings()
- nnoremap <silent> <buffer> R :call <SID>retry()<cr>
- nnoremap <silent> <buffer> D :PlugDiff<cr>
- nnoremap <silent> <buffer> S :PlugStatus<cr>
- nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
- xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
- nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
- nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
-endfunction
-
-function! s:prepare(...)
- if empty(s:plug_getcwd())
- throw 'Invalid current working directory. Cannot proceed.'
- endif
-
- for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
- if exists(evar)
- throw evar.' detected. Cannot proceed.'
- endif
- endfor
-
- call s:job_abort()
- if s:switch_in()
- if b:plug_preview == 1
- pc
- endif
- enew
- else
- call s:new_window()
- endif
-
- nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
- if a:0 == 0
- call s:finish_bindings()
- endif
- let b:plug_preview = -1
- let s:plug_tab = tabpagenr()
- let s:plug_buf = winbufnr(0)
- call s:assign_name()
-
- for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
- execute 'silent! unmap <buffer>' k
- endfor
- setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
- if exists('+colorcolumn')
- setlocal colorcolumn=
- endif
- setf vim-plug
- if exists('g:syntax_on')
- call s:syntax()
- endif
-endfunction
-
-function! s:close_pane()
- if b:plug_preview == 1
- pc
- let b:plug_preview = -1
- else
- bd
- endif
-endfunction
-
-function! s:assign_name()
- " Assign buffer name
- let prefix = '[Plugins]'
- let name = prefix
- let idx = 2
- while bufexists(name)
- let name = printf('%s (%s)', prefix, idx)
- let idx = idx + 1
- endwhile
- silent! execute 'f' fnameescape(name)
-endfunction
-
-function! s:chsh(swap)
- let prev = [&shell, &shellcmdflag, &shellredir]
- if !s:is_win
- set shell=sh
- endif
- if a:swap
- if s:is_powershell(&shell)
- let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s'
- elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$'
- set shellredir=>%s\ 2>&1
- endif
- endif
- return prev
-endfunction
-
-function! s:bang(cmd, ...)
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(a:0)
- " FIXME: Escaping is incomplete. We could use shellescape with eval,
- " but it won't work on Windows.
- let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
- if s:is_win
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
- execute "normal! :execute g:_plug_bang\<cr>\<cr>"
- finally
- unlet g:_plug_bang
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
- return v:shell_error ? 'Exit status: ' . v:shell_error : ''
-endfunction
-
-function! s:regress_bar()
- let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
- call s:progress_bar(2, bar, len(bar))
-endfunction
-
-function! s:is_updated(dir)
- return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir))
-endfunction
-
-function! s:do(pull, force, todo)
- for [name, spec] in items(a:todo)
- if !isdirectory(spec.dir)
- continue
- endif
- let installed = has_key(s:update.new, name)
- let updated = installed ? 0 :
- \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
- if a:force || installed || updated
- execute 'cd' s:esc(spec.dir)
- call append(3, '- Post-update hook for '. name .' ... ')
- let error = ''
- let type = type(spec.do)
- if type == s:TYPE.string
- if spec.do[0] == ':'
- if !get(s:loaded, name, 0)
- let s:loaded[name] = 1
- call s:reorg_rtp()
- endif
- call s:load_plugin(spec)
- try
- execute spec.do[1:]
- catch
- let error = v:exception
- endtry
- if !s:plug_window_exists()
- cd -
- throw 'Warning: vim-plug was terminated by the post-update hook of '.name
- endif
- else
- let error = s:bang(spec.do)
- endif
- elseif type == s:TYPE.funcref
- try
- call s:load_plugin(spec)
- let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
- call spec.do({ 'name': name, 'status': status, 'force': a:force })
- catch
- let error = v:exception
- endtry
- else
- let error = 'Invalid hook type'
- endif
- call s:switch_in()
- call setline(4, empty(error) ? (getline(4) . 'OK')
- \ : ('x' . getline(4)[1:] . error))
- if !empty(error)
- call add(s:update.errors, name)
- call s:regress_bar()
- endif
- cd -
- endif
- endfor
-endfunction
-
-function! s:hash_match(a, b)
- return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
-endfunction
-
-function! s:checkout(spec)
- let sha = a:spec.commit
- let output = s:git_revision(a:spec.dir)
- if !empty(output) && !s:hash_match(sha, s:lines(output)[0])
- let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : ''
- let output = s:system(
- \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
- endif
- return output
-endfunction
-
-function! s:finish(pull)
- let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
- if new_frozen
- let s = new_frozen > 1 ? 's' : ''
- call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
- endif
- call append(3, '- Finishing ... ') | 4
- redraw
- call plug#helptags()
- call plug#end()
- call setline(4, getline(4) . 'Done!')
- redraw
- let msgs = []
- if !empty(s:update.errors)
- call add(msgs, "Press 'R' to retry.")
- endif
- if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
- \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
- call add(msgs, "Press 'D' to see the updated changes.")
- endif
- echo join(msgs, ' ')
- call s:finish_bindings()
-endfunction
-
-function! s:retry()
- if empty(s:update.errors)
- return
- endif
- echo
- call s:update_impl(s:update.pull, s:update.force,
- \ extend(copy(s:update.errors), [s:update.threads]))
-endfunction
-
-function! s:is_managed(name)
- return has_key(g:plugs[a:name], 'uri')
-endfunction
-
-function! s:names(...)
- return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
-endfunction
-
-function! s:check_ruby()
- silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
- if !exists('g:plug_ruby')
- redraw!
- return s:warn('echom', 'Warning: Ruby interface is broken')
- endif
- let ruby_version = split(g:plug_ruby, '\.')
- unlet g:plug_ruby
- return s:version_requirement(ruby_version, [1, 8, 7])
-endfunction
-
-function! s:update_impl(pull, force, args) abort
- let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
- let args = filter(copy(a:args), 'v:val != "--sync"')
- let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
- \ remove(args, -1) : get(g:, 'plug_threads', 16)
-
- let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
- let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
- \ filter(managed, 'index(args, v:key) >= 0')
-
- if empty(todo)
- return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
- endif
-
- if !s:is_win && s:git_version_requirement(2, 3)
- let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
- let $GIT_TERMINAL_PROMPT = 0
- for plug in values(todo)
- let plug.uri = substitute(plug.uri,
- \ '^https://git::@github\.com', 'https://github.com', '')
- endfor
- endif
-
- if !isdirectory(g:plug_home)
- try
- call mkdir(g:plug_home, 'p')
- catch
- return s:err(printf('Invalid plug directory: %s. '.
- \ 'Try to call plug#begin with a valid directory', g:plug_home))
- endtry
- endif
-
- if has('nvim') && !exists('*jobwait') && threads > 1
- call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
- endif
-
- let use_job = s:nvim || s:vim8
- let python = (has('python') || has('python3')) && !use_job
- let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
-
- let s:update = {
- \ 'start': reltime(),
- \ 'all': todo,
- \ 'todo': copy(todo),
- \ 'errors': [],
- \ 'pull': a:pull,
- \ 'force': a:force,
- \ 'new': {},
- \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
- \ 'bar': '',
- \ 'fin': 0
- \ }
-
- call s:prepare(1)
- call append(0, ['', ''])
- normal! 2G
- silent! redraw
-
- " Set remote name, overriding a possible user git config's clone.defaultRemoteName
- let s:clone_opt = ['--origin', 'origin']
- if get(g:, 'plug_shallow', 1)
- call extend(s:clone_opt, ['--depth', '1'])
- if s:git_version_requirement(1, 7, 10)
- call add(s:clone_opt, '--no-single-branch')
- endif
- endif
-
- if has('win32unix') || has('wsl')
- call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input'])
- endif
-
- let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
-
- " Python version requirement (>= 2.7)
- if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
- redir => pyv
- silent python import platform; print platform.python_version()
- redir END
- let python = s:version_requirement(
- \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
- endif
-
- if (python || ruby) && s:update.threads > 1
- try
- let imd = &imd
- if s:mac_gui
- set noimd
- endif
- if ruby
- call s:update_ruby()
- else
- call s:update_python()
- endif
- catch
- let lines = getline(4, '$')
- let printed = {}
- silent! 4,$d _
- for line in lines
- let name = s:extract_name(line, '.', '')
- if empty(name) || !has_key(printed, name)
- call append('$', line)
- if !empty(name)
- let printed[name] = 1
- if line[0] == 'x' && index(s:update.errors, name) < 0
- call add(s:update.errors, name)
- end
- endif
- endif
- endfor
- finally
- let &imd = imd
- call s:update_finish()
- endtry
- else
- call s:update_vim()
- while use_job && sync
- sleep 100m
- if s:update.fin
- break
- endif
- endwhile
- endif
-endfunction
-
-function! s:log4(name, msg)
- call setline(4, printf('- %s (%s)', a:msg, a:name))
- redraw
-endfunction
-
-function! s:update_finish()
- if exists('s:git_terminal_prompt')
- let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
- endif
- if s:switch_in()
- call append(3, '- Updating ...') | 4
- for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
- let [pos, _] = s:logpos(name)
- if !pos
- continue
- endif
- if has_key(spec, 'commit')
- call s:log4(name, 'Checking out '.spec.commit)
- let out = s:checkout(spec)
- elseif has_key(spec, 'tag')
- let tag = spec.tag
- if tag =~ '\*'
- let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
- if !v:shell_error && !empty(tags)
- let tag = tags[0]
- call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
- call append(3, '')
- endif
- endif
- call s:log4(name, 'Checking out '.tag)
- let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
- else
- let branch = s:git_origin_branch(spec)
- call s:log4(name, 'Merging origin/'.s:esc(branch))
- let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
- \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
- endif
- if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
- \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
- call s:log4(name, 'Updating submodules. This may take a while.')
- let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
- endif
- let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
- if v:shell_error
- call add(s:update.errors, name)
- call s:regress_bar()
- silent execute pos 'd _'
- call append(4, msg) | 4
- elseif !empty(out)
- call setline(pos, msg[0])
- endif
- redraw
- endfor
- silent 4 d _
- try
- call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
- catch
- call s:warn('echom', v:exception)
- call s:warn('echo', '')
- return
- endtry
- call s:finish(s:update.pull)
- call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
- call s:switch_out('normal! gg')
- endif
-endfunction
-
-function! s:job_abort()
- if (!s:nvim && !s:vim8) || !exists('s:jobs')
- return
- endif
-
- for [name, j] in items(s:jobs)
- if s:nvim
- silent! call jobstop(j.jobid)
- elseif s:vim8
- silent! call job_stop(j.jobid)
- endif
- if j.new
- call s:rm_rf(g:plugs[name].dir)
- endif
- endfor
- let s:jobs = {}
-endfunction
-
-function! s:last_non_empty_line(lines)
- let len = len(a:lines)
- for idx in range(len)
- let line = a:lines[len-idx-1]
- if !empty(line)
- return line
- endif
- endfor
- return ''
-endfunction
-
-function! s:job_out_cb(self, data) abort
- let self = a:self
- let data = remove(self.lines, -1) . a:data
- let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
- call extend(self.lines, lines)
- " To reduce the number of buffer updates
- let self.tick = get(self, 'tick', -1) + 1
- if !self.running || self.tick % len(s:jobs) == 0
- let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
- let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
- call s:log(bullet, self.name, result)
- endif
-endfunction
-
-function! s:job_exit_cb(self, data) abort
- let a:self.running = 0
- let a:self.error = a:data != 0
- call s:reap(a:self.name)
- call s:tick()
-endfunction
-
-function! s:job_cb(fn, job, ch, data)
- if !s:plug_window_exists() " plug window closed
- return s:job_abort()
- endif
- call call(a:fn, [a:job, a:data])
-endfunction
-
-function! s:nvim_cb(job_id, data, event) dict abort
- return (a:event == 'stdout' || a:event == 'stderr') ?
- \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
- \ s:job_cb('s:job_exit_cb', self, 0, a:data)
-endfunction
-
-function! s:spawn(name, cmd, opts)
- let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
- \ 'new': get(a:opts, 'new', 0) }
- let s:jobs[a:name] = job
-
- if s:nvim
- if has_key(a:opts, 'dir')
- let job.cwd = a:opts.dir
- endif
- let argv = a:cmd
- call extend(job, {
- \ 'on_stdout': function('s:nvim_cb'),
- \ 'on_stderr': function('s:nvim_cb'),
- \ 'on_exit': function('s:nvim_cb'),
- \ })
- let jid = s:plug_call('jobstart', argv, job)
- if jid > 0
- let job.jobid = jid
- else
- let job.running = 0
- let job.error = 1
- let job.lines = [jid < 0 ? argv[0].' is not executable' :
- \ 'Invalid arguments (or job table is full)']
- endif
- elseif s:vim8
- let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})'))
- if has_key(a:opts, 'dir')
- let cmd = s:with_cd(cmd, a:opts.dir, 0)
- endif
- let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
- let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
- \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
- \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]),
- \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
- \ 'err_mode': 'raw',
- \ 'out_mode': 'raw'
- \})
- if job_status(jid) == 'run'
- let job.jobid = jid
- else
- let job.running = 0
- let job.error = 1
- let job.lines = ['Failed to start job']
- endif
- else
- let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd]))
- let job.error = v:shell_error != 0
- let job.running = 0
- endif
-endfunction
-
-function! s:reap(name)
- let job = s:jobs[a:name]
- if job.error
- call add(s:update.errors, a:name)
- elseif get(job, 'new', 0)
- let s:update.new[a:name] = 1
- endif
- let s:update.bar .= job.error ? 'x' : '='
-
- let bullet = job.error ? 'x' : '-'
- let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
- call s:log(bullet, a:name, empty(result) ? 'OK' : result)
- call s:bar()
-
- call remove(s:jobs, a:name)
-endfunction
-
-function! s:bar()
- if s:switch_in()
- let total = len(s:update.all)
- call setline(1, (s:update.pull ? 'Updating' : 'Installing').
- \ ' plugins ('.len(s:update.bar).'/'.total.')')
- call s:progress_bar(2, s:update.bar, total)
- call s:switch_out()
- endif
-endfunction
-
-function! s:logpos(name)
- let max = line('$')
- for i in range(4, max > 4 ? max : 4)
- if getline(i) =~# '^[-+x*] '.a:name.':'
- for j in range(i + 1, max > 5 ? max : 5)
- if getline(j) !~ '^ '
- return [i, j - 1]
- endif
- endfor
- return [i, i]
- endif
- endfor
- return [0, 0]
-endfunction
-
-function! s:log(bullet, name, lines)
- if s:switch_in()
- let [b, e] = s:logpos(a:name)
- if b > 0
- silent execute printf('%d,%d d _', b, e)
- if b > winheight('.')
- let b = 4
- endif
- else
- let b = 4
- endif
- " FIXME For some reason, nomodifiable is set after :d in vim8
- setlocal modifiable
- call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
- call s:switch_out()
- endif
-endfunction
-
-function! s:update_vim()
- let s:jobs = {}
-
- call s:bar()
- call s:tick()
-endfunction
-
-function! s:tick()
- let pull = s:update.pull
- let prog = s:progress_opt(s:nvim || s:vim8)
-while 1 " Without TCO, Vim stack is bound to explode
- if empty(s:update.todo)
- if empty(s:jobs) && !s:update.fin
- call s:update_finish()
- let s:update.fin = 1
- endif
- return
- endif
-
- let name = keys(s:update.todo)[0]
- let spec = remove(s:update.todo, name)
- let new = empty(globpath(spec.dir, '.git', 1))
-
- call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
- redraw
-
- let has_tag = has_key(spec, 'tag')
- if !new
- let [error, _] = s:git_validate(spec, 0)
- if empty(error)
- if pull
- let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch']
- if has_tag && !empty(globpath(spec.dir, '.git/shallow'))
- call extend(cmd, ['--depth', '99999999'])
- endif
- if !empty(prog)
- call add(cmd, prog)
- endif
- call s:spawn(name, cmd, { 'dir': spec.dir })
- else
- let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
- endif
- else
- let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
- endif
- else
- let cmd = ['git', 'clone']
- if !has_tag
- call extend(cmd, s:clone_opt)
- endif
- if !empty(prog)
- call add(cmd, prog)
- endif
- call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 })
- endif
-
- if !s:jobs[name].running
- call s:reap(name)
- endif
- if len(s:jobs) >= s:update.threads
- break
- endif
-endwhile
-endfunction
-
-function! s:update_python()
-let py_exe = has('python') ? 'python' : 'python3'
-execute py_exe "<< EOF"
-import datetime
-import functools
-import os
-try:
- import queue
-except ImportError:
- import Queue as queue
-import random
-import re
-import shutil
-import signal
-import subprocess
-import tempfile
-import threading as thr
-import time
-import traceback
-import vim
-
-G_NVIM = vim.eval("has('nvim')") == '1'
-G_PULL = vim.eval('s:update.pull') == '1'
-G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
-G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
-G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt'))
-G_PROGRESS = vim.eval('s:progress_opt(1)')
-G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
-G_STOP = thr.Event()
-G_IS_WIN = vim.eval('s:is_win') == '1'
-
-class PlugError(Exception):
- def __init__(self, msg):
- self.msg = msg
-class CmdTimedOut(PlugError):
- pass
-class CmdFailed(PlugError):
- pass
-class InvalidURI(PlugError):
- pass
-class Action(object):
- INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
-
-class Buffer(object):
- def __init__(self, lock, num_plugs, is_pull):
- self.bar = ''
- self.event = 'Updating' if is_pull else 'Installing'
- self.lock = lock
- self.maxy = int(vim.eval('winheight(".")'))
- self.num_plugs = num_plugs
-
- def __where(self, name):
- """ Find first line with name in current buffer. Return line num. """
- found, lnum = False, 0
- matcher = re.compile('^[-+x*] {0}:'.format(name))
- for line in vim.current.buffer:
- if matcher.search(line) is not None:
- found = True
- break
- lnum += 1
-
- if not found:
- lnum = -1
- return lnum
-
- def header(self):
- curbuf = vim.current.buffer
- curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
-
- num_spaces = self.num_plugs - len(self.bar)
- curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
-
- with self.lock:
- vim.command('normal! 2G')
- vim.command('redraw')
-
- def write(self, action, name, lines):
- first, rest = lines[0], lines[1:]
- msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
- msg.extend([' ' + line for line in rest])
-
- try:
- if action == Action.ERROR:
- self.bar += 'x'
- vim.command("call add(s:update.errors, '{0}')".format(name))
- elif action == Action.DONE:
- self.bar += '='
-
- curbuf = vim.current.buffer
- lnum = self.__where(name)
- if lnum != -1: # Found matching line num
- del curbuf[lnum]
- if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
- lnum = 3
- else:
- lnum = 3
- curbuf.append(msg, lnum)
-
- self.header()
- except vim.error:
- pass
-
-class Command(object):
- CD = 'cd /d' if G_IS_WIN else 'cd'
-
- def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
- self.cmd = cmd
- if cmd_dir:
- self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
- self.timeout = timeout
- self.callback = cb if cb else (lambda msg: None)
- self.clean = clean if clean else (lambda: None)
- self.proc = None
-
- @property
- def alive(self):
- """ Returns true only if command still running. """
- return self.proc and self.proc.poll() is None
-
- def execute(self, ntries=3):
- """ Execute the command with ntries if CmdTimedOut.
- Returns the output of the command if no Exception.
- """
- attempt, finished, limit = 0, False, self.timeout
-
- while not finished:
- try:
- attempt += 1
- result = self.try_command()
- finished = True
- return result
- except CmdTimedOut:
- if attempt != ntries:
- self.notify_retry()
- self.timeout += limit
- else:
- raise
-
- def notify_retry(self):
- """ Retry required for command, notify user. """
- for count in range(3, 0, -1):
- if G_STOP.is_set():
- raise KeyboardInterrupt
- msg = 'Timeout. Will retry in {0} second{1} ...'.format(
- count, 's' if count != 1 else '')
- self.callback([msg])
- time.sleep(1)
- self.callback(['Retrying ...'])
-
- def try_command(self):
- """ Execute a cmd & poll for callback. Returns list of output.
- Raises CmdFailed -> return code for Popen isn't 0
- Raises CmdTimedOut -> command exceeded timeout without new output
- """
- first_line = True
-
- try:
- tfile = tempfile.NamedTemporaryFile(mode='w+b')
- preexec_fn = not G_IS_WIN and os.setsid or None
- self.proc = subprocess.Popen(self.cmd, stdout=tfile,
- stderr=subprocess.STDOUT,
- stdin=subprocess.PIPE, shell=True,
- preexec_fn=preexec_fn)
- thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
- thrd.start()
-
- thread_not_started = True
- while thread_not_started:
- try:
- thrd.join(0.1)
- thread_not_started = False
- except RuntimeError:
- pass
-
- while self.alive:
- if G_STOP.is_set():
- raise KeyboardInterrupt
-
- if first_line or random.random() < G_LOG_PROB:
- first_line = False
- line = '' if G_IS_WIN else nonblock_read(tfile.name)
- if line:
- self.callback([line])
-
- time_diff = time.time() - os.path.getmtime(tfile.name)
- if time_diff > self.timeout:
- raise CmdTimedOut(['Timeout!'])
-
- thrd.join(0.5)
-
- tfile.seek(0)
- result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
-
- if self.proc.returncode != 0:
- raise CmdFailed([''] + result)
-
- return result
- except:
- self.terminate()
- raise
-
- def terminate(self):
- """ Terminate process and cleanup. """
- if self.alive:
- if G_IS_WIN:
- os.kill(self.proc.pid, signal.SIGINT)
- else:
- os.killpg(self.proc.pid, signal.SIGTERM)
- self.clean()
-
-class Plugin(object):
- def __init__(self, name, args, buf_q, lock):
- self.name = name
- self.args = args
- self.buf_q = buf_q
- self.lock = lock
- self.tag = args.get('tag', 0)
-
- def manage(self):
- try:
- if os.path.exists(self.args['dir']):
- self.update()
- else:
- self.install()
- with self.lock:
- thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
- except PlugError as exc:
- self.write(Action.ERROR, self.name, exc.msg)
- except KeyboardInterrupt:
- G_STOP.set()
- self.write(Action.ERROR, self.name, ['Interrupted!'])
- except:
- # Any exception except those above print stack trace
- msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
- self.write(Action.ERROR, self.name, msg.split('\n'))
- raise
-
- def install(self):
- target = self.args['dir']
- if target[-1] == '\\':
- target = target[0:-1]
-
- def clean(target):
- def _clean():
- try:
- shutil.rmtree(target)
- except OSError:
- pass
- return _clean
-
- self.write(Action.INSTALL, self.name, ['Installing ...'])
- callback = functools.partial(self.write, Action.INSTALL, self.name)
- cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
- '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
- esc(target))
- com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
- result = com.execute(G_RETRIES)
- self.write(Action.DONE, self.name, result[-1:])
-
- def repo_uri(self):
- cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
- command = Command(cmd, self.args['dir'], G_TIMEOUT,)
- result = command.execute(G_RETRIES)
- return result[-1]
-
- def update(self):
- actual_uri = self.repo_uri()
- expect_uri = self.args['uri']
- regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
- ma = regex.match(actual_uri)
- mb = regex.match(expect_uri)
- if ma is None or mb is None or ma.groups() != mb.groups():
- msg = ['',
- 'Invalid URI: {0}'.format(actual_uri),
- 'Expected {0}'.format(expect_uri),
- 'PlugClean required.']
- raise InvalidURI(msg)
-
- if G_PULL:
- self.write(Action.UPDATE, self.name, ['Updating ...'])
- callback = functools.partial(self.write, Action.UPDATE, self.name)
- fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
- cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
- com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
- result = com.execute(G_RETRIES)
- self.write(Action.DONE, self.name, result[-1:])
- else:
- self.write(Action.DONE, self.name, ['Already installed'])
-
- def write(self, action, name, msg):
- self.buf_q.put((action, name, msg))
-
-class PlugThread(thr.Thread):
- def __init__(self, tname, args):
- super(PlugThread, self).__init__()
- self.tname = tname
- self.args = args
-
- def run(self):
- thr.current_thread().name = self.tname
- buf_q, work_q, lock = self.args
-
- try:
- while not G_STOP.is_set():
- name, args = work_q.get_nowait()
- plug = Plugin(name, args, buf_q, lock)
- plug.manage()
- work_q.task_done()
- except queue.Empty:
- pass
-
-class RefreshThread(thr.Thread):
- def __init__(self, lock):
- super(RefreshThread, self).__init__()
- self.lock = lock
- self.running = True
-
- def run(self):
- while self.running:
- with self.lock:
- thread_vim_command('noautocmd normal! a')
- time.sleep(0.33)
-
- def stop(self):
- self.running = False
-
-if G_NVIM:
- def thread_vim_command(cmd):
- vim.session.threadsafe_call(lambda: vim.command(cmd))
-else:
- def thread_vim_command(cmd):
- vim.command(cmd)
-
-def esc(name):
- return '"' + name.replace('"', '\"') + '"'
-
-def nonblock_read(fname):
- """ Read a file with nonblock flag. Return the last line. """
- fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
- buf = os.read(fread, 100000).decode('utf-8', 'replace')
- os.close(fread)
-
- line = buf.rstrip('\r\n')
- left = max(line.rfind('\r'), line.rfind('\n'))
- if left != -1:
- left += 1
- line = line[left:]
-
- return line
-
-def main():
- thr.current_thread().name = 'main'
- nthreads = int(vim.eval('s:update.threads'))
- plugs = vim.eval('s:update.todo')
- mac_gui = vim.eval('s:mac_gui') == '1'
-
- lock = thr.Lock()
- buf = Buffer(lock, len(plugs), G_PULL)
- buf_q, work_q = queue.Queue(), queue.Queue()
- for work in plugs.items():
- work_q.put(work)
-
- start_cnt = thr.active_count()
- for num in range(nthreads):
- tname = 'PlugT-{0:02}'.format(num)
- thread = PlugThread(tname, (buf_q, work_q, lock))
- thread.start()
- if mac_gui:
- rthread = RefreshThread(lock)
- rthread.start()
-
- while not buf_q.empty() or thr.active_count() != start_cnt:
- try:
- action, name, msg = buf_q.get(True, 0.25)
- buf.write(action, name, ['OK'] if not msg else msg)
- buf_q.task_done()
- except queue.Empty:
- pass
- except KeyboardInterrupt:
- G_STOP.set()
-
- if mac_gui:
- rthread.stop()
- rthread.join()
-
-main()
-EOF
-endfunction
-
-function! s:update_ruby()
- ruby << EOF
- module PlugStream
- SEP = ["\r", "\n", nil]
- def get_line
- buffer = ''
- loop do
- char = readchar rescue return
- if SEP.include? char.chr
- buffer << $/
- break
- else
- buffer << char
- end
- end
- buffer
- end
- end unless defined?(PlugStream)
-
- def esc arg
- %["#{arg.gsub('"', '\"')}"]
- end
-
- def killall pid
- pids = [pid]
- if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
- pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
- else
- unless `which pgrep 2> /dev/null`.empty?
- children = pids
- until children.empty?
- children = children.map { |pid|
- `pgrep -P #{pid}`.lines.map { |l| l.chomp }
- }.flatten
- pids += children
- end
- end
- pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
- end
- end
-
- def compare_git_uri a, b
- regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
- regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
- end
-
- require 'thread'
- require 'fileutils'
- require 'timeout'
- running = true
- iswin = VIM::evaluate('s:is_win').to_i == 1
- pull = VIM::evaluate('s:update.pull').to_i == 1
- base = VIM::evaluate('g:plug_home')
- all = VIM::evaluate('s:update.todo')
- limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
- tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
- nthr = VIM::evaluate('s:update.threads').to_i
- maxy = VIM::evaluate('winheight(".")').to_i
- vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
- cd = iswin ? 'cd /d' : 'cd'
- tot = VIM::evaluate('len(s:update.todo)') || 0
- bar = ''
- skip = 'Already installed'
- mtx = Mutex.new
- take1 = proc { mtx.synchronize { running && all.shift } }
- logh = proc {
- cnt = bar.length
- $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
- $curbuf[2] = '[' + bar.ljust(tot) + ']'
- VIM::command('normal! 2G')
- VIM::command('redraw')
- }
- where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
- log = proc { |name, result, type|
- mtx.synchronize do
- ing = ![true, false].include?(type)
- bar += type ? '=' : 'x' unless ing
- b = case type
- when :install then '+' when :update then '*'
- when true, nil then '-' else
- VIM::command("call add(s:update.errors, '#{name}')")
- 'x'
- end
- result =
- if type || type.nil?
- ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
- elsif result =~ /^Interrupted|^Timeout/
- ["#{b} #{name}: #{result}"]
- else
- ["#{b} #{name}"] + result.lines.map { |l| " " << l }
- end
- if lnum = where.call(name)
- $curbuf.delete lnum
- lnum = 4 if ing && lnum > maxy
- end
- result.each_with_index do |line, offset|
- $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
- end
- logh.call
- end
- }
- bt = proc { |cmd, name, type, cleanup|
- tried = timeout = 0
- begin
- tried += 1
- timeout += limit
- fd = nil
- data = ''
- if iswin
- Timeout::timeout(timeout) do
- tmp = VIM::evaluate('tempname()')
- system("(#{cmd}) > #{tmp}")
- data = File.read(tmp).chomp
- File.unlink tmp rescue nil
- end
- else
- fd = IO.popen(cmd).extend(PlugStream)
- first_line = true
- log_prob = 1.0 / nthr
- while line = Timeout::timeout(timeout) { fd.get_line }
- data << line
- log.call name, line.chomp, type if name && (first_line || rand < log_prob)
- first_line = false
- end
- fd.close
- end
- [$? == 0, data.chomp]
- rescue Timeout::Error, Interrupt => e
- if fd && !fd.closed?
- killall fd.pid
- fd.close
- end
- cleanup.call if cleanup
- if e.is_a?(Timeout::Error) && tried < tries
- 3.downto(1) do |countdown|
- s = countdown > 1 ? 's' : ''
- log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
- sleep 1
- end
- log.call name, 'Retrying ...', type
- retry
- end
- [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
- end
- }
- main = Thread.current
- threads = []
- watcher = Thread.new {
- if vim7
- while VIM::evaluate('getchar(1)')
- sleep 0.1
- end
- else
- require 'io/console' # >= Ruby 1.9
- nil until IO.console.getch == 3.chr
- end
- mtx.synchronize do
- running = false
- threads.each { |t| t.raise Interrupt } unless vim7
- end
- threads.each { |t| t.join rescue nil }
- main.kill
- }
- refresh = Thread.new {
- while true
- mtx.synchronize do
- break unless running
- VIM::command('noautocmd normal! a')
- end
- sleep 0.2
- end
- } if VIM::evaluate('s:mac_gui') == 1
-
- clone_opt = VIM::evaluate('s:clone_opt').join(' ')
- progress = VIM::evaluate('s:progress_opt(1)')
- nthr.times do
- mtx.synchronize do
- threads << Thread.new {
- while pair = take1.call
- name = pair.first
- dir, uri, tag = pair.last.values_at *%w[dir uri tag]
- exists = File.directory? dir
- ok, result =
- if exists
- chdir = "#{cd} #{iswin ? dir : esc(dir)}"
- ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
- current_uri = data.lines.to_a.last
- if !ret
- if data =~ /^Interrupted|^Timeout/
- [false, data]
- else
- [false, [data.chomp, "PlugClean required."].join($/)]
- end
- elsif !compare_git_uri(current_uri, uri)
- [false, ["Invalid URI: #{current_uri}",
- "Expected: #{uri}",
- "PlugClean required."].join($/)]
- else
- if pull
- log.call name, 'Updating ...', :update
- fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
- bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
- else
- [true, skip]
- end
- end
- else
- d = esc dir.sub(%r{[\\/]+$}, '')
- log.call name, 'Installing ...', :install
- bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
- FileUtils.rm_rf dir
- }
- end
- mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
- log.call name, result, ok
- end
- } if running
- end
- end
- threads.each { |t| t.join rescue nil }
- logh.call
- refresh.kill if refresh
- watcher.kill
-EOF
-endfunction
-
-function! s:shellesc_cmd(arg, script)
- let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
- return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
-endfunction
-
-function! s:shellesc_ps1(arg)
- return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
-endfunction
-
-function! s:shellesc_sh(arg)
- return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
-endfunction
-
-" Escape the shell argument based on the shell.
-" Vim and Neovim's shellescape() are insufficient.
-" 1. shellslash determines whether to use single/double quotes.
-" Double-quote escaping is fragile for cmd.exe.
-" 2. It does not work for powershell.
-" 3. It does not work for *sh shells if the command is executed
-" via cmd.exe (ie. cmd.exe /c sh -c command command_args)
-" 4. It does not support batchfile syntax.
-"
-" Accepts an optional dictionary with the following keys:
-" - shell: same as Vim/Neovim 'shell' option.
-" If unset, fallback to 'cmd.exe' on Windows or 'sh'.
-" - script: If truthy and shell is cmd.exe, escape for batchfile syntax.
-function! plug#shellescape(arg, ...)
- if a:arg =~# '^[A-Za-z0-9_/:.-]\+$'
- return a:arg
- endif
- let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
- let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
- let script = get(opts, 'script', 1)
- if shell =~# 'cmd\(\.exe\)\?$'
- return s:shellesc_cmd(a:arg, script)
- elseif s:is_powershell(shell)
- return s:shellesc_ps1(a:arg)
- endif
- return s:shellesc_sh(a:arg)
-endfunction
-
-function! s:glob_dir(path)
- return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
-endfunction
-
-function! s:progress_bar(line, bar, total)
- call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
-endfunction
-
-function! s:compare_git_uri(a, b)
- " See `git help clone'
- " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
- " [git@] github.com[:port] : junegunn/vim-plug [.git]
- " file:// / junegunn/vim-plug [/]
- " / junegunn/vim-plug [/]
- let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
- let ma = matchlist(a:a, pat)
- let mb = matchlist(a:b, pat)
- return ma[1:2] ==# mb[1:2]
-endfunction
-
-function! s:format_message(bullet, name, message)
- if a:bullet != 'x'
- return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
- else
- let lines = map(s:lines(a:message), '" ".v:val')
- return extend([printf('x %s:', a:name)], lines)
- endif
-endfunction
-
-function! s:with_cd(cmd, dir, ...)
- let script = a:0 > 0 ? a:1 : 1
- return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
-endfunction
-
-function! s:system(cmd, ...)
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(1)
- if type(a:cmd) == s:TYPE.list
- " Neovim's system() supports list argument to bypass the shell
- " but it cannot set the working directory for the command.
- " Assume that the command does not rely on the shell.
- if has('nvim') && a:0 == 0
- return system(a:cmd)
- endif
- let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
- if s:is_powershell(&shell)
- let cmd = '& ' . cmd
- endif
- else
- let cmd = a:cmd
- endif
- if a:0 > 0
- let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list)
- endif
- if s:is_win && type(a:cmd) != s:TYPE.list
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- return system(cmd)
- finally
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
-endfunction
-
-function! s:system_chomp(...)
- let ret = call('s:system', a:000)
- return v:shell_error ? '' : substitute(ret, '\n$', '', '')
-endfunction
-
-function! s:git_validate(spec, check_branch)
- let err = ''
- if isdirectory(a:spec.dir)
- let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)]
- let remote = result[-1]
- if empty(remote)
- let err = join([remote, 'PlugClean required.'], "\n")
- elseif !s:compare_git_uri(remote, a:spec.uri)
- let err = join(['Invalid URI: '.remote,
- \ 'Expected: '.a:spec.uri,
- \ 'PlugClean required.'], "\n")
- elseif a:check_branch && has_key(a:spec, 'commit')
- let sha = s:git_revision(a:spec.dir)
- if empty(sha)
- let err = join(add(result, 'PlugClean required.'), "\n")
- elseif !s:hash_match(sha, a:spec.commit)
- let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
- \ a:spec.commit[:6], sha[:6]),
- \ 'PlugUpdate required.'], "\n")
- endif
- elseif a:check_branch
- let current_branch = result[0]
- " Check tag
- let origin_branch = s:git_origin_branch(a:spec)
- if has_key(a:spec, 'tag')
- let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
- if a:spec.tag !=# tag && a:spec.tag !~ '\*'
- let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
- \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
- endif
- " Check branch
- elseif origin_branch !=# current_branch
- let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
- \ current_branch, origin_branch)
- endif
- if empty(err)
- let [ahead, behind] = split(s:lastline(s:system([
- \ 'git', 'rev-list', '--count', '--left-right',
- \ printf('HEAD...origin/%s', origin_branch)
- \ ], a:spec.dir)), '\t')
- if !v:shell_error && ahead
- if behind
- " Only mention PlugClean if diverged, otherwise it's likely to be
- " pushable (and probably not that messed up).
- let err = printf(
- \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
- \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind)
- else
- let err = printf("Ahead of origin/%s by %d commit(s).\n"
- \ .'Cannot update until local changes are pushed.',
- \ origin_branch, ahead)
- endif
- endif
- endif
- endif
- else
- let err = 'Not found'
- endif
- return [err, err =~# 'PlugClean']
-endfunction
-
-function! s:rm_rf(dir)
- if isdirectory(a:dir)
- return s:system(s:is_win
- \ ? 'rmdir /S /Q '.plug#shellescape(a:dir)
- \ : ['rm', '-rf', a:dir])
- endif
-endfunction
-
-function! s:clean(force)
- call s:prepare()
- call append(0, 'Searching for invalid plugins in '.g:plug_home)
- call append(1, '')
-
- " List of valid directories
- let dirs = []
- let errs = {}
- let [cnt, total] = [0, len(g:plugs)]
- for [name, spec] in items(g:plugs)
- if !s:is_managed(name)
- call add(dirs, spec.dir)
- else
- let [err, clean] = s:git_validate(spec, 1)
- if clean
- let errs[spec.dir] = s:lines(err)[0]
- else
- call add(dirs, spec.dir)
- endif
- endif
- let cnt += 1
- call s:progress_bar(2, repeat('=', cnt), total)
- normal! 2G
- redraw
- endfor
-
- let allowed = {}
- for dir in dirs
- let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
- let allowed[dir] = 1
- for child in s:glob_dir(dir)
- let allowed[child] = 1
- endfor
- endfor
-
- let todo = []
- let found = sort(s:glob_dir(g:plug_home))
- while !empty(found)
- let f = remove(found, 0)
- if !has_key(allowed, f) && isdirectory(f)
- call add(todo, f)
- call append(line('$'), '- ' . f)
- if has_key(errs, f)
- call append(line('$'), ' ' . errs[f])
- endif
- let found = filter(found, 'stridx(v:val, f) != 0')
- end
- endwhile
-
- 4
- redraw
- if empty(todo)
- call append(line('$'), 'Already clean.')
- else
- let s:clean_count = 0
- call append(3, ['Directories to delete:', ''])
- redraw!
- if a:force || s:ask_no_interrupt('Delete all directories?')
- call s:delete([6, line('$')], 1)
- else
- call setline(4, 'Cancelled.')
- nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
- nmap <silent> <buffer> dd d_
- xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
- echo 'Delete the lines (d{motion}) to delete the corresponding directories'
- endif
- endif
- 4
- setlocal nomodifiable
-endfunction
-
-function! s:delete_op(type, ...)
- call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
-endfunction
-
-function! s:delete(range, force)
- let [l1, l2] = a:range
- let force = a:force
- let err_count = 0
- while l1 <= l2
- let line = getline(l1)
- if line =~ '^- ' && isdirectory(line[2:])
- execute l1
- redraw!
- let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
- let force = force || answer > 1
- if answer
- let err = s:rm_rf(line[2:])
- setlocal modifiable
- if empty(err)
- call setline(l1, '~'.line[1:])
- let s:clean_count += 1
- else
- delete _
- call append(l1 - 1, s:format_message('x', line[1:], err))
- let l2 += len(s:lines(err))
- let err_count += 1
- endif
- let msg = printf('Removed %d directories.', s:clean_count)
- if err_count > 0
- let msg .= printf(' Failed to remove %d directories.', err_count)
- endif
- call setline(4, msg)
- setlocal nomodifiable
- endif
- endif
- let l1 += 1
- endwhile
-endfunction
-
-function! s:upgrade()
- echo 'Downloading the latest version of vim-plug'
- redraw
- let tmp = s:plug_tempname()
- let new = tmp . '/plug.vim'
-
- try
- let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp])
- if v:shell_error
- return s:err('Error upgrading vim-plug: '. out)
- endif
-
- if readfile(s:me) ==# readfile(new)
- echo 'vim-plug is already up-to-date'
- return 0
- else
- call rename(s:me, s:me . '.old')
- call rename(new, s:me)
- unlet g:loaded_plug
- echo 'vim-plug has been upgraded'
- return 1
- endif
- finally
- silent! call s:rm_rf(tmp)
- endtry
-endfunction
-
-function! s:upgrade_specs()
- for spec in values(g:plugs)
- let spec.frozen = get(spec, 'frozen', 0)
- endfor
-endfunction
-
-function! s:status()
- call s:prepare()
- call append(0, 'Checking plugins')
- call append(1, '')
-
- let ecnt = 0
- let unloaded = 0
- let [cnt, total] = [0, len(g:plugs)]
- for [name, spec] in items(g:plugs)
- let is_dir = isdirectory(spec.dir)
- if has_key(spec, 'uri')
- if is_dir
- let [err, _] = s:git_validate(spec, 1)
- let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
- else
- let [valid, msg] = [0, 'Not found. Try PlugInstall.']
- endif
- else
- if is_dir
- let [valid, msg] = [1, 'OK']
- else
- let [valid, msg] = [0, 'Not found.']
- endif
- endif
- let cnt += 1
- let ecnt += !valid
- " `s:loaded` entry can be missing if PlugUpgraded
- if is_dir && get(s:loaded, name, -1) == 0
- let unloaded = 1
- let msg .= ' (not loaded)'
- endif
- call s:progress_bar(2, repeat('=', cnt), total)
- call append(3, s:format_message(valid ? '-' : 'x', name, msg))
- normal! 2G
- redraw
- endfor
- call setline(1, 'Finished. '.ecnt.' error(s).')
- normal! gg
- setlocal nomodifiable
- if unloaded
- echo "Press 'L' on each line to load plugin, or 'U' to update"
- nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
- xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
- end
-endfunction
-
-function! s:extract_name(str, prefix, suffix)
- return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
-endfunction
-
-function! s:status_load(lnum)
- let line = getline(a:lnum)
- let name = s:extract_name(line, '-', '(not loaded)')
- if !empty(name)
- call plug#load(name)
- setlocal modifiable
- call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
- setlocal nomodifiable
- endif
-endfunction
-
-function! s:status_update() range
- let lines = getline(a:firstline, a:lastline)
- let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
- if !empty(names)
- echo
- execute 'PlugUpdate' join(names)
- endif
-endfunction
-
-function! s:is_preview_window_open()
- silent! wincmd P
- if &previewwindow
- wincmd p
- return 1
- endif
-endfunction
-
-function! s:find_name(lnum)
- for lnum in reverse(range(1, a:lnum))
- let line = getline(lnum)
- if empty(line)
- return ''
- endif
- let name = s:extract_name(line, '-', '')
- if !empty(name)
- return name
- endif
- endfor
- return ''
-endfunction
-
-function! s:preview_commit()
- if b:plug_preview < 0
- let b:plug_preview = !s:is_preview_window_open()
- endif
-
- let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
- if empty(sha)
- let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
- if empty(name)
- return
- endif
- let title = 'HEAD@{1}..'
- let command = 'git diff --no-color HEAD@{1}'
- else
- let title = sha
- let command = 'git show --no-color --pretty=medium '.sha
- let name = s:find_name(line('.'))
- endif
-
- if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
- return
- endif
-
- if exists('g:plug_pwindow') && !s:is_preview_window_open()
- execute g:plug_pwindow
- execute 'e' title
- else
- execute 'pedit' title
- wincmd P
- endif
- setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
- let batchfile = ''
- try
- let [sh, shellcmdflag, shrd] = s:chsh(1)
- let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
- if s:is_win
- let [batchfile, cmd] = s:batchfile(cmd)
- endif
- execute 'silent %!' cmd
- finally
- let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
- if s:is_win && filereadable(batchfile)
- call delete(batchfile)
- endif
- endtry
- setlocal nomodifiable
- nnoremap <silent> <buffer> q :q<cr>
- wincmd p
-endfunction
-
-function! s:section(flags)
- call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
-endfunction
-
-function! s:format_git_log(line)
- let indent = ' '
- let tokens = split(a:line, nr2char(1))
- if len(tokens) != 5
- return indent.substitute(a:line, '\s*$', '', '')
- endif
- let [graph, sha, refs, subject, date] = tokens
- let tag = matchstr(refs, 'tag: [^,)]\+')
- let tag = empty(tag) ? ' ' : ' ('.tag.') '
- return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
-endfunction
-
-function! s:append_ul(lnum, text)
- call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
-endfunction
-
-function! s:diff()
- call s:prepare()
- call append(0, ['Collecting changes ...', ''])
- let cnts = [0, 0]
- let bar = ''
- let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
- call s:progress_bar(2, bar, len(total))
- for origin in [1, 0]
- let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
- if empty(plugs)
- continue
- endif
- call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
- for [k, v] in plugs
- let branch = s:git_origin_branch(v)
- if len(branch)
- let range = origin ? '..origin/'.branch : 'HEAD@{1}..'
- let cmd = ['git', 'log', '--graph', '--color=never']
- if s:git_version_requirement(2, 10, 0)
- call add(cmd, '--no-show-signature')
- endif
- call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range])
- if has_key(v, 'rtp')
- call extend(cmd, ['--', v.rtp])
- endif
- let diff = s:system_chomp(cmd, v.dir)
- if !empty(diff)
- let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
- call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
- let cnts[origin] += 1
- endif
- endif
- let bar .= '='
- call s:progress_bar(2, bar, len(total))
- normal! 2G
- redraw
- endfor
- if !cnts[origin]
- call append(5, ['', 'N/A'])
- endif
- endfor
- call setline(1, printf('%d plugin(s) updated.', cnts[0])
- \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
-
- if cnts[0] || cnts[1]
- nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
- if empty(maparg("\<cr>", 'n'))
- nmap <buffer> <cr> <plug>(plug-preview)
- endif
- if empty(maparg('o', 'n'))
- nmap <buffer> o <plug>(plug-preview)
- endif
- endif
- if cnts[0]
- nnoremap <silent> <buffer> X :call <SID>revert()<cr>
- echo "Press 'X' on each block to revert the update"
- endif
- normal! gg
- setlocal nomodifiable
-endfunction
-
-function! s:revert()
- if search('^Pending updates', 'bnW')
- return
- endif
-
- let name = s:find_name(line('.'))
- if empty(name) || !has_key(g:plugs, name) ||
- \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
- return
- endif
-
- call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
- setlocal modifiable
- normal! "_dap
- setlocal nomodifiable
- echo 'Reverted'
-endfunction
-
-function! s:snapshot(force, ...) abort
- call s:prepare()
- setf vim
- call append(0, ['" Generated by vim-plug',
- \ '" '.strftime("%c"),
- \ '" :source this file in vim to restore the snapshot',
- \ '" or execute: vim -S snapshot.vim',
- \ '', '', 'PlugUpdate!'])
- 1
- let anchor = line('$') - 3
- let names = sort(keys(filter(copy(g:plugs),
- \'has_key(v:val, "uri") && isdirectory(v:val.dir)')))
- for name in reverse(names)
- let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
- if !empty(sha)
- call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
- redraw
- endif
- endfor
-
- if a:0 > 0
- let fn = s:plug_expand(a:1)
- if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
- return
- endif
- call writefile(getline(1, '$'), fn)
- echo 'Saved as '.a:1
- silent execute 'e' s:esc(fn)
- setf vim
- endif
-endfunction
-
-function! s:split_rtp()
- return split(&rtp, '\\\@<!,')
-endfunction
-
-let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
-let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
-
-if exists('g:plugs')
- let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
- call s:upgrade_specs()
- call s:define_commands()
-endif
-
-let &cpo = s:cpo_save
-unlet s:cpo_save
@@ -1,34 +0,0 @@
-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}"
@@ -1,24 +0,0 @@
-Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
-
-Host rocApex
- HostName 129.158.232.104
- User root
-
-Host linode
- HostName 97.107.142.58
- User root
-
-Host hetzner
- HostName 5.161.207.21
- User root
-
-Host 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 a/home-config/tridactyl/native_main and /dev/null differ
@@ -1,7 +0,0 @@
-{
- "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" ]
-}
@@ -1,154 +0,0 @@
-{
- "layer": "top",
- "position": "top",
- "height": 30,
-
- "modules-left": ["hyprland/workspaces", "hyprland/submap"],
- "modules-center": ["hyprland/window"],
- "modules-right": ["tray", "custom/spotify", "privacy", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "clock"],
- "hyprland/submap": {
- "format": " {}"
- },
- "hyprland/workspaces": {
- "format": "{id}",
- "all-outputs": false,
- "disable-scroll": true
- },
- "hyprland/window": {
- "max-length": 80,
- "tooltip": false,
- "separate-outputs": true
- },
- "clock": {
- "format": "{:%a %d %b %H:%M}",
- "tooltip": false
- },
- "battery": {
- "format": "{capacity}% {icon}",
- "format-alt": "{time} {icon}",
- "format-icons": ["", "", "", "", ""],
- "format-charging": "{capacity}% ",
- "interval": 30,
- "states": {
- "warning": 25,
- "critical": 10
- },
- "tooltip": false,
- "bat":"BAT1"
- },
- "bluetooth": {
- "format": "",
- "format-disabled": "",
- "format-connected": "",
- "format-connected-battery": " {device_battery_percentage}%",
- "on-click": "blueman-manager",
- "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
- "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
- "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
- "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%"
- },
- "network": {
- "format-alt": "{ipaddr}/{cidr} {icon} {bandwidthTotalBytes}",
- "format": "{ipaddr}/{cidr} {icon}",
- "format-alt-click": "click-right",
- "format-icons": {
- "wifi": ["", "" ,"", ""],
- "ethernet": [""],
- "disconnected": [""]
- },
- "on-click": "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}",
- "format-alt-click": "click-right",
- "format-muted": "",
- "format-icons": {
- "phone": [" ", " ", " ", " "],
- "default": ["", "", "", ""]
- },
- "scroll-step": 1,
- "on-click": "pavucontrol",
- "tooltip": false
- },
- "custom/spotify": {
- "interval": 2,
- "return-type": "json",
- "exec": "~/.config/waybar/modules/spotify.sh",
- "exec-if": "~/.config/waybar/modules/check-for-music.sh",
- "escape": true,
- "on-click": "playerctl play-pause"
- },
- "custom/storage": {
- "format-alt": "{} ",
- "format": "{percentage}% ",
- "format-alt-click": "click-right",
- "return-type": "json",
- "interval": 60,
- "exec": "~/.config/waybar/modules/storage.sh"
- },
- "backlight": {
- "format-alt": "{icon}",
- "format": "{percent}% {icon}",
- "format-alt-click": "click-right",
- "format-icons": ["", ""],
- "on-scroll-up": "light -A 1",
- "on-scroll-down": "light -U 1"
- },
- "custom/weather_OLD": {
- "format-alt": "{}",
- "format": "{alt}: {}",
- "format-alt-click": "click-right",
- "interval": 1800,
- "return-type": "json",
- "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": {
- "activated": "",
- "deactivated": ""
- },
- "tooltip": false
- },
- "custom/mail": {
- "format": "",
- "format-alt": "{alt} ",
- "format-alt-click": "click-right",
- "interval": 60,
- "return-type": "json",
- "exec": "~/.config/waybar/modules/mail.py",
- "tooltip": false
- },
- "tray": {
- "icon-size": 18
- }
-}
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-if [[ $(playerctl metadata --format '{{lc(status)}}' | grep playing) -eq 0 ]]; then
- exit 0
-else
- exit 1
-fi
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-class=$(playerctl metadata --format '{{lc(status)}}')
-icon=""
-
-if [[ $class == "playing" ]]; then
- info=$(playerctl metadata --format '{{artist}} - {{title}}')
- if [[ ${#info} > 40 ]]; then
- info=$(playerctl metadata --format '{{title}}' | cut -c1-40)"..."
- fi
- text=$info" "$icon
-elif [[ $class == "paused" ]]; then
- text=$icon
-elif [[ $class == "stopped" ]]; then
- text=""
-fi
-
-echo -e "{\"text\":\""$text"\", \"class\":\""$class"\"}"
-
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-mount="/"
-warning=20
-critical=10
-
-df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical '
-/\/.*/ {
- text=$4
- tooltip="Filesystem: "$1"\rSize: "$2"\rUsed: "$3"\rAvail: "$4"\rUse%: "$5"\rMounted on: "$6
- use=$5
- exit 0
-}
-END {
- class=""
- gsub(/%$/,"",use)
- if ((100 - use) < critical) {
- class="critical"
- } else if ((100 - use) < warning) {
- class="warning"
- }
- print "{\"text\":\""text"\", \"percentage\":"use",\"tooltip\":\""tooltip"\", \"class\":\""class"\"}"
-}
-'
-
@@ -1,77 +0,0 @@
-cachedir=~/.cache/rbn
-cachefile=${0##*/}-$1
-
-if [ ! -d $cachedir ]; then
- mkdir -p $cachedir
-fi
-
-if [ ! -f $cachedir/$cachefile ]; then
- touch $cachedir/$cachefile
-fi
-
-# Save current IFS
-SAVEIFS=$IFS
-# Change IFS to new line.
-IFS=$'\n'
-
-cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile")))
-if [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ]; then
- data=($(curl -s https://en.wttr.in/$1\?0qnT 2>&1))
- echo ${data[0]} | cut -f1 -d, > $cachedir/$cachefile
- echo ${data[1]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
- echo ${data[2]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile
-fi
-
-weather=($(cat $cachedir/$cachefile))
-
-# Restore IFSClear
-IFS=$SAVEIFS
-
-temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]]+)\.\./\1 to /g')
-
-#echo ${weather[1]##*,}
-
-# https://fontawesome.com/icons?s=solid&c=weather
-case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in
-"clear" | "sunny")
- condition=""
- ;;
-"partly cloudy")
- condition=""
- ;;
-"cloudy")
- condition=""
- ;;
-"overcast")
- condition=""
- ;;
-"mist" | "fog" | "freezing fog")
- condition="敖"
- ;;
-"patchy rain possible" | "patchy light drizzle" | "light drizzle" | "patchy light rain" | "light rain" | "light rain shower" | "rain")
- condition="殺"
- ;;
-"moderate rain at times" | "moderate rain" | "heavy rain at times" | "heavy rain" | "moderate or heavy rain shower" | "torrential rain shower" | "rain shower")
- condition=""
- ;;
-"patchy snow possible" | "patchy sleet possible" | "patchy freezing drizzle possible" | "freezing drizzle" | "heavy freezing drizzle" | "light freezing rain" | "moderate or heavy freezing rain" | "light sleet" | "ice pellets" | "light sleet showers" | "moderate or heavy sleet showers")
- condition="流"
- ;;
-"blowing snow" | "moderate or heavy sleet" | "patchy light snow" | "light snow" | "light snow showers")
- condition="ﰕ"
- ;;
-"blizzard" | "patchy moderate snow" | "moderate snow" | "patchy heavy snow" | "heavy snow" | "moderate or heavy snow with thunder" | "moderate or heavy snow showers")
- condition=""
- ;;
-"thundery outbreaks possible" | "patchy light rain with thunder" | "moderate or heavy rain with thunder" | "patchy light snow with thunder")
- condition=""
- ;;
-*)
- condition=""
- echo -e "{\"text\":\""$condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
- ;;
-esac
-
-#echo $temp $condition
-
-echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"
@@ -1,77 +0,0 @@
-* {
- border: none;
- border-radius: 0;
- font-family: AnonymicePro Nerd Font;
- font-size: 15px;
- box-shadow: none;
- text-shadow: none;
- transition-duration: 0s;
- color: white;
-}
-
-#waybar {
- background-color:rgba(0,0,0,0.25);
- color: white;
-}
-
-window {
- color: rgba(217, 216, 216, 1);
- background: rgba(35, 31, 32, 0.00);
-}
-
-window#waybar.solo {
- color: rgba(217, 216, 216, 1);
- background: rgba(35, 31, 32, 0.85);
-}
-
-#workspaces {
- margin: 0 5px;
-}
-
-#workspaces button {
- padding: 0 5px;
- color: rgba(217, 216, 216, 0.4);
-}
-
-#workspaces button.visible {
- color: rgba(217, 216, 216, 1);
-}
-
-#workspaces button.active {
- border-top: 3px solid rgba(217, 216, 216, 1);
- border-bottom: 3px solid rgba(217, 216, 216, 0);
-}
-
-#workspaces button.urgent {
- color: rgba(238, 46, 36, 1);
-}
-
-#mode, #battery, #cpu, #memory, #network, #bluetooth, #pulseaudio, #idle_inhibitor, #backlight, #custom-storage, #custom-spotify, #custom-weather, #custom-mail {
- margin: 0px 6px 0px 10px;
- min-width: 25px;
-}
-
-#clock {
- margin: 0px 16px 0px 10px;
- min-width: 140px;
-}
-
-#battery.warning {
- color: rgba(255, 210, 4, 1);
-}
-
-#battery.critical {
- color: rgba(238, 46, 36, 1);
-}
-
-#battery.charging {
- color: rgba(217, 216, 216, 1);
-}
-
-#custom-storage.warning {
- color: rgba(255, 210, 4, 1);
-}
-
-#custom-storage.critical {
- color: rgba(238, 46, 36, 1);
-}
@@ -1,4 +0,0 @@
-[default]
-duration = "30m"
-path = "~/.config/hypr/Wallpapers/static/"
-transition-time = 2000
@@ -4,6 +4,7 @@
#:use-module (gnu system setuid)
#:use-module (gnu packages admin)
#:use-module (gnu packages avahi)
+ #:use-module (gnu packages gnome)
#:use-module (gnu packages wm)
#:use-module (guix packages)
#:use-module (gnu packages shells)
@@ -17,8 +18,9 @@
#:use-module (ryan-packages wm)
#:use-module (ryan-packages virtualization)
#:use-module (ryan-packages linux)
+ #:use-module (ryan-packages login)
#:use-module (ryan-packages networking)
- #:use-module (rosenthal packages wm)
+ #:use-module (ryan-packages package-management)
#:use-module (rosenthal services networking)
#:use-module (gnu packages security-token)
#:use-module (gnu services security-token)
@@ -27,7 +29,8 @@
#:use-module (gnu services networking)
#:use-module (gnu services xorg)
#:use-module (gnu services ssh)
- #:use-module (gnu services nix)
+ #:use-module (ryan-services nix)
+ #:use-module (ryan-services networking)
#:use-module (gnu services sound)
#:use-module (gnu services docker)
#:use-module (gnu services avahi)
@@ -115,7 +118,7 @@
(name "ryan")
(comment "Ryan")
(group "users")
- ;(shell (file-append zsh "/bin/zsh"))
+ (shell (file-append zsh "/bin/zsh"))
(home-directory "/home/ryan")
(supplementary-groups '("wheel" "netdev" "audio" "video" "lp" "plugdev" "docker" "libvirt" "kvm" "dialout")))
%base-user-accounts))
@@ -123,48 +126,50 @@
;; Packages installed system-wide. Users can also install packages
;; under their own account: use 'guix search KEYWORD' to search
;; for packages and 'guix install PACKAGE' to install a package.
- (packages (append (map specification->package (list "sway"
- ;"hyprland"
- "swaybg"
- ;"swayidle"
- ;"swaylock-effects"
- "fuzzel"
- "foot"
- "linux-pam" ; installed directly to get libs in profile directly
- "pinentry-qt"
- "adwaita-icon-theme"
- "hicolor-icon-theme"
- "git"
- "waybar-experimental"
- "gnupg"
- "light"
- "avahi"
- "mako"
- "grim"
- "grimblast"
- "slurp"
- "wl-clipboard"
- ;"bluez"
- ;"blueman"
- "ldacbt"
- "libfreeaptx"
- "libfdk"
- "opendoas"
- ;"xdg-desktop-portal-wlr"
- ;"xdg-desktop-portal"
- ;"xdg-desktop-portal-gtk"
- "v4l2loopback-linux-module"
- "pipewire"
- "docker"
- ;"libvirt" ;New version inherited from service
- ;"virt-manager"
- "dconf"
- "wireplumber"
- "wireshark"
- "webkitgtk-with-libsoup2" ; Needed for Go wails development
- "zsh"))
- (list my-ca-certs virt-manager-ovmf bluez-ryan blueman-ryan)
- %my-base-packages ))
+ (packages (append (map specification->package (list ;"sway"
+ ;"hyprland"
+ ;"swaybg"
+ ;"swayidle"
+ ;"swaylock-effects"
+ ;"fuzzel"
+ ;"foot"
+ "linux-pam" ; installed directly to get libs in profile directly
+ ;"pinentry-qt"
+ "adwaita-icon-theme"
+ "hicolor-icon-theme"
+ ;"git"
+ ;"waybar-experimental"
+ ;"gnupg"
+ "light"
+ "avahi"
+ ;"mako"
+ ;"grim"
+ ;"grimblast"
+ ;"slurp"
+ ;"wl-clipboard"
+ ;"bluez"
+ ;"blueman"
+ "ldacbt"
+ "libfreeaptx"
+ "libfdk"
+ "opendoas"
+ ;"xdg-desktop-portal-wlr"
+ ;"xdg-desktop-portal"
+ ;"xdg-desktop-portal-gtk"
+ "v4l2loopback-linux-module"
+ "pipewire"
+ "docker"
+ ;"libvirt" ;New version inherited from service
+ ;"virt-manager"
+ "dconf"
+ "wireplumber"
+ "wireshark"
+ ;"openconnect"
+ ;"openconnect-sso"
+ ;"webkitgtk-with-libsoup2" ; Needed for Go wails development
+ "zsh"))
+ (list my-ca-certs virt-manager-ovmf bluez-ryan netbird-bin) ;neovim-ryan)
+ %my-base-packages ))
;; Below is the list of system services. To search for available
;; services, run 'guix system search KEYWORD' in a terminal.
@@ -185,11 +190,14 @@
(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 tailscale-service-type
+ ; (tailscale-configuration
+ ; (socket "/var/run/tailscale/tailscaled.sock")))
+ (service netbird-service-type)
(service containerd-service-type)
- (service nix-service-type)
+ (service nix-service-type
+ (nix-configuration
+ (package nix-ryan)))
(simple-service 'hyprlock-pam pam-root-service-type
(list
(pam-service
@@ -198,6 +206,36 @@
(list
(pam-entry (control "include")
(module "login")))))))
+ ; (simple-service 'ly-pam pam-root-service-type
+ ; (list
+ ; (pam-service
+ ; (name "ly")
+ ; (account
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so"))))
+ ; (auth
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so"))))
+ ; (password
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so")
+ ; (arguments (list "sha512" "shadow")))))
+ ; (session
+ ; (list
+ ; (pam-entry (control "required")
+ ; (module "/gnu/store/4lhhf88iz9pdr624z5hnq2avlk1ny4ga-elogind-255.17/lib/security/pam_elogind.so")
+ ; (arguments (list "debug=yes")))
+ ; (pam-entry (control "required")
+ ; (module "pam_env.so"))
+ ; (pam-entry (control "required")
+ ; (module "pam_unix.so")))))))
+ (service kmscon-service-type
+ (kmscon-configuration
+ (virtual-terminal "tty7")
+ (login-program #~(string-append #$ly "/bin/ly"))))
(service libvirt-service-type
(libvirt-configuration
(libvirt libvirt-ovmf)
@@ -210,6 +248,7 @@
; (using-pam? #t)))
(simple-service 'spice-polkit polkit-service-type (list spice-gtk))
(simple-service 'hwdb-creation etc-service-type (list `("udev-here-oneoneone" ,(plain-file "issue" "test\n"))))
+ (simple-service 'ly-config etc-service-type (list `("ly/config.ini" , (local-file "./lyconfig.ini"))))
(service bluetooth-service-type
(bluetooth-configuration
(bluez bluez-ryan)
@@ -245,8 +284,16 @@
(inherit config)
(handle-power-key `ignore)
(handle-suspend-key `ignore)
+ (handle-hibernate-key 'ignore)
(handle-lid-switch `ignore)
+ (handle-lid-switch-docked 'ignore)
+ (handle-lid-switch-external-power 'ignore)
(kill-user-processes? #t)))
+ (network-manager-service-type config =>
+ (network-manager-configuration
+ (inherit config)
+ (vpn-plugins
+ (list network-manager-openconnect))))
(delete pulseaudio-service-type)
(delete gdm-service-type)
(delete avahi-service-type)
@@ -0,0 +1,10 @@
+animation = colormix
+colormix_col1 = 0x00631E61
+colormix_col2 = 0x0060631E
+colormix_col3 = 0x001E6063
+bigclock = en
+bigclock_12hr = false
+clock = %c
+waylandsessions=/run/current-system/profile/share/wayland-sessions
+custom_sessions=/home/ryan/sessions
+setup_cmd=/home/ryan/rysway-launch
@@ -9,6 +9,13 @@
#:use-module (gnu packages python-xyz)
#:use-module (gnu packages python-crypto)
#:use-module (gnu packages pkg-config)
+ ;below for cryptsetup
+ #:use-module (gnu packages password-utils)
+ #:use-module (gnu packages cryptsetup)
+ #:use-module (gnu packages security-token)
+ #:use-module (gnu packages web)
+ #:use-module (gnu packages gnupg)
+ #:use-module (gnu packages tls)
#:use-module (guix gexp)
#:use-module (guix utils)
#:use-module (guix modules)
@@ -18,7 +25,7 @@
#:use-module (guix build-system meson)
#:use-module (guix build-system python))
-(define systemd-version "255")
+(define systemd-version "258")
(define systemd-source
(origin
(method git-fetch)
@@ -28,7 +35,7 @@
(file-name (git-file-name "systemd" systemd-version))
(sha256
(base32
- "1qdyw9g3jgvsbc1aryr11gpc3075w5pg00mqv4pyf3hwixxkwaq6"))))
+ "18gnp45gl1154jra6qv95k8y7ny6phdm87yqi5jdq13cadlrklf6"))))
(define-public (systemd-stub-name)
(let ((arch (cond ((target-x86-32?) "ia32")
@@ -54,7 +61,7 @@
,(string-append "-Dsbat-distro-pkgname=" name)
,(string-append "-Dsbat-distro-version=" version))
#:phases
- #~(let ((stub #$(string-append "src/boot/efi/" (systemd-stub-name))))
+ #~(let ((stub #$(string-append "src/boot/" (systemd-stub-name))))
(modify-phases %standard-phases
(replace 'build
(lambda* (#:key parallel-build? #:allow-other-keys)
@@ -108,3 +115,34 @@ kernel arguments, and optional secure boot signatures into a single, UEFI-bootab
image.")
(license license:lgpl2.1+)))
+(define-public systemd-cryptsetup
+ (package
+ (name "systemd-cryptsetup")
+ (version systemd-version)
+ (source systemd-source)
+ (build-system meson-build-system)
+ (arguments
+ (list
+ #:build-type "release"
+ #:configure-flags
+ `(list "-Dlibcryptsetup=true" "-Dlibfido2=true"
+ "-Dopenssl=true")
+ #:phases
+ #~(modify-phases %standard-phases
+ (replace 'build
+ (lambda* (#:key parallel-build? #:allow-other-keys)
+ (invoke "ninja" "systemd-cryptsetup"
+ "-j" (if parallel-build?
+ (number->string (parallel-job-count)) "1"))))
+ (replace 'install
+ (lambda _
+ (install-file "systemd-cryptsetup" (string-append #$output "/libexec"))
+ (install-file "src/shared/libsystemd-shared-258.so" (string-append #$output "/lib"))))
+ (delete 'check))))
+ (native-inputs (list `(,util-linux "lib") eudev lvm2 cryptsetup libfido2 libxcrypt gperf pkg-config python-3 python-jinja2 libcap argon2 json-c libgcrypt openssl))
+ (home-page "test")
+ (synopsis "test")
+ (description "test")
+ (license license:lgpl2.1+)))
+
+systemd-cryptsetup
@@ -22,7 +22,7 @@
#:use-module (gnu packages xorg)
#:use-module (gnu packages glib)
#:use-module (gnu packages man)
- #:use-module (rosenthal packages wm)
+ ;#:use-module (rosenthal packages wm)
#:use-module (gnu packages wm))
(define-public xdg-desktop-portal-wlr-new
@@ -5,6 +5,11 @@
#:use-module (guix build utils)
#:use-module (gnu packages)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages vim)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages textutils)
+ #:use-module (gnu packages tree-sitter)
+ #:use-module (gnu packages julia)
#:use-module (gnu packages python-xyz)
#:use-module (guix git-download)
#:use-module (guix utils))
@@ -35,4 +40,37 @@
(("bluetoothd-fix-permissions:") "install-IGNORED2:")
(("bluetoothd-fix-permissions") ""))))))))))
-bluez-ryan
+(define-public neovim-ryan
+ (package
+ (inherit neovim)
+ (version "0.11.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/neovim/neovim")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "neovim" version))
+ (sha256
+ (base32
+ "0arypdiycmss5g9wav21hfdc384v1ly82jnsc32zincl2y3f628q"))))
+ (native-inputs (modify-inputs (package-native-inputs neovim) (prepend gcc-14)))
+ (inputs (modify-inputs (package-inputs neovim) (append utf8proc) (replace "tree-sitter" treesitter-ryan)))))
+
+(define-public treesitter-ryan
+ (package
+ (inherit tree-sitter)
+ (version "0.25.4")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/tree-sitter/tree-sitter")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "tree-sitter" version))
+ (sha256
+ (base32
+ "0d4ca0ikpmkqg9xlbx45c7mafr5yz0g99y3s3jy5xk86f0nkz8ga"))
+ (modules '((guix build utils)))
+ (snippet #~(begin
+ (delete-file-recursively "lib/src/unicode")))))))
+
+neovim-ryan
@@ -0,0 +1,102 @@
+(define-module (ryan-packages login)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix build-system zig)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages nss)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages zig)
+ #:use-module (gnu packages zig-xyz)
+ #:use-module (guix utils))
+
+(define ly-source
+ (let ((commit "cdba55657976ad289da090b7d4fd1e5e16c156f9")
+ (revision "11")
+ (name "ly")
+ (version "ly-rev11"))
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ryan77627/ly-fork")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1czv95pwmsv8zi92pjrra3swr7m82l3spks8mdkryxk9k62yd2k6")))))
+
+(define ly-zig-cache
+ (computed-file
+ "ly-zig-cache"
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+ (let ((cert-dir (string-append #$nss-certs "/etc/ssl/certs"))
+ (certs "/tmp/ca-certificates.crt")
+ (zig-bin (string-append #$zig-0.15 "/bin"))
+ (git-bin (string-append #$git-minimal "/bin"))
+ (curl-bin (string-append #$curl "/bin"))
+ (proot-bin (string-append #$proot "/bin"))
+ (coreutils-bin (string-append #$(@ (gnu packages base) coreutils) "/bin")))
+ (call-with-output-file certs
+ (lambda (out)
+ (for-each (lambda (file)
+ (call-with-input-file file
+ (lambda (p)
+ (dump-port p out)
+ (display "\n" out))))
+ (find-files cert-dir "\\.pem$"))))
+ (setenv "HOME" "/tmp")
+ (setenv "PATH" (string-append zig-bin ":" curl-bin ":" proot-bin ":" git-bin ":" coreutils-bin))
+ (setenv "ZIG_GLOBAL_CACHE_DIR" "/tmp/zcache")
+ (setenv "SSL_CERT_FILE" certs)
+ (setenv "GIT_SSL_CAINFO" certs)
+ (setenv "CURL_CA_BUNDLE" certs)
+ (mkdir-p "/tmp/zcache")
+ (mkdir-p "/tmp/src")
+ (copy-recursively #$ly-source "/tmp/src")
+ (chmod "/tmp/src" #o755)
+ (with-directory-excursion "/tmp/src"
+ (invoke "proot" "-b" (string-append certs ":/etc/ssl/certs/ca-certificates.crt")
+ "zig" "build" "--fetch=all"))
+ (copy-recursively "/tmp/zcache/p" #$output))))
+ #:options (list
+ #:hash-algo 'sha256
+ #:hash (base32 "1qmj0ysynvyfvwc68apy3lxqccrv3rxak5a21ij6y0c2dw3yzl64")
+ #:recursive? #t)))
+
+(define-public ly
+ (package
+ (name "ly")
+ (version "1.3.2")
+ (source ly-source)
+ (build-system zig-build-system)
+ (arguments
+ (list
+ #:zig-release-type "small"
+ #:zig-build-flags #~(list "-Denable_x11_support=false"
+ "--search-prefix"
+ #$(this-package-input "linux-pam"))
+ #:zig zig-0.15
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-before 'configure 'seed-zig-cache
+ (lambda _
+ (let ((cache-dir "/tmp/zig-cache"))
+ (mkdir-p cache-dir)
+ (symlink #$ly-zig-cache (string-append cache-dir "/p"))
+ (setenv "ZIG_GLOBAL_CACHE_DIR" cache-dir)))))))
+ (native-inputs (list
+ ly-zig-cache))
+ (inputs (list linux-pam))
+ (home-page "https://codeberg.org/fairyglade/ly")
+ (synopsis "TTY-based login manager written in Zig.")
+ (description "Zig-based login manager that can launch X Server and Wayland based compositors.")
+ (license license:expat)))
+
+ly
@@ -1,6 +1,9 @@
(define-module (ryan-packages networking)
#:use-module (guix gexp)
#:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build-system copy)
+ #:use-module ((guix licenses) #:prefix license:)
#:use-module (gnu packages)
#:use-module (gnu packages networking)
#:use-module (ryan-packages linux)
@@ -11,4 +14,24 @@
(inherit blueman)
(inputs (modify-inputs (package-inputs blueman) (delete "bluez") (prepend bluez-ryan)))))
-blueman-ryan
+(define-public netbird-bin
+ (package
+ (name "netbird")
+ (version "0.68.1")
+ (source (origin
+ (method url-fetch/tarbomb)
+ (uri (string-append "https://github.com/netbirdio/netbird/releases/download/v" version "/netbird_" version "_linux_amd64.tar.gz"))
+ (sha256
+ (base32
+ "08xn4mnr0h4hyqx6447g3p2jaq6yknvllq18k21ac3936dxz4d9a"))))
+ (build-system copy-build-system)
+ (arguments
+ (list #:install-plan
+ #~'(("." "bin/" #:include("netbird")))))
+ (supported-systems '("x86_64-linux"))
+ (home-page "https://netbird.io")
+ (synopsis "Private Wireguard-based networks")
+ (description "This package provides @command{netbird}, which is an alternative to Tailscale.")
+ (license license:bsd-3)))
+
+netbird-bin
@@ -0,0 +1,237 @@
+(define-module (ryan-packages package-management)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix build-system meson)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix packages)
+ #:use-module (guix git-download)
+ #:use-module (guix gexp)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages backup)
+ #:use-module (gnu packages bdw-gc)
+ #:use-module (gnu packages bison)
+ #:use-module (gnu packages boost)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages crypto)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages databases)
+ #:use-module (gnu packages flex)
+ #:use-module (gnu packages gcc)
+ #:use-module (gnu packages libedit)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages llvm)
+ #:use-module (gnu packages markup)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu packages perl)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages sqlite)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages web)
+ #:use-module (guix utils))
+
+(define-public nix-ryan
+ (package
+ (name "nix")
+ (version "2.29.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/NixOS/nix")
+ (commit version)))
+ (file-name (git-file-name "nix" version))
+ (sha256
+ (base32 "19cd94xpjzwmclscpw9x3gfic0vf160llfnh9diz2l4823fw8iky"))))
+ (build-system meson-build-system)
+ (arguments
+ (list
+ #:configure-flags #~(list "--sysconfdir=/etc")
+ #:tests? #f))
+ (native-inputs
+ (list autoconf
+ autoconf-archive
+ automake
+ bison
+ gcc-14
+ cmake
+ flex
+ perl
+ perl-dbi
+ perl-dbd-sqlite
+ googletest
+ jq
+ libtool
+ pkg-config
+ rapidcheck))
+ (inputs
+ (list boost-ryan
+ brotli
+ bzip2
+ curl
+ editline
+ libarchive
+ libgc-ryan
+ libseccomp-ryan
+ libsodium
+ libbl3
+ libgit2-1.9
+ lowdown
+ nlohmann-json
+ openssl
+ sqlite
+ toml11
+ xz
+ zlib))
+ (home-page "https://nixos.org/")
+ (synopsis "The Nix package manager")
+ (description "todo")
+ (license license:lgpl2.1+)))
+
+(define libbl3
+ (package
+ (name "blake3")
+ (version "1.8.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/BLAKE3-team/BLAKE3")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1pm7285insrmpfwwal8rnp3yhvc6s2ki8b6ccmbh2qfnnl95a010"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:configure-flags #~(list "-DCMAKE_POSITION_INDEPENDENT_CODE=on")
+ #:tests? #f
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'enter-build-directory
+ (lambda _ (chdir "c") #t))
+ (add-before 'build 'set-env
+ (lambda _
+ (setenv "CFLAGS" "-fPIC")
+ (setenv "CXXFLAGS" "-fPIC")
+ #t)))))
+ (home-page "https://github.com/BLAKE3-team/BLAKE3")
+ (synopsis "Official C implementation of BLAKE3")
+ (description "todo")
+ (license license:expat)))
+
+(define toml11
+ (package
+ (name "toml11")
+ (version "v4.4.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ToruNiina/toml11")
+ (commit version)))
+ (sha256
+ (base32 "0d15b50cf9jgvh3w99xh6crh03bn2dmv9bdyvzq6knsk2diql1dj"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:tests? #f))
+ (home-page "https://github.com/ToruNiina/toml11")
+ (synopsis "TODO")
+ (description "TODO")
+ (license license:expat)))
+
+(define libgit2-1.9
+ (package
+ (inherit libgit2-1.8)
+ (version "1.9.0")
+ (source (origin
+ (inherit (package-source libgit2-1.8))
+ (uri (git-reference
+ (url "https://github.com/libgit2/libgit2")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libgit2" version))
+ (sha256
+ (base32
+ "06ajn5i5l1209z7x7jxcpw68ph0a6g3q67bmx0jm381rr8cb4zdz"))
+ (snippet
+ #~(begin
+ (for-each delete-file-recursively
+ '("deps/llhttp"
+ "deps/ntlmclient"
+ "deps/pcre"
+ "deps/winhttp"
+ "deps/zlib"))))))))
+
+(define libgc-ryan
+ (package
+ (inherit libgc)
+ (version "8.2.8")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ivmai/bdwgc")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libgc" version))
+ (sha256
+ (base32 "1xzvr5wb36flkbjqjyk5ilhda1a3yk61rgprxfjzdf1rzlmqn12i"))))
+ (native-inputs (modify-inputs (package-native-inputs libgc) (prepend autoconf autoconf-archive automake libtool)))))
+
+(define boost-ryan
+ (package
+ (inherit boost)
+ (version "1.87.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/boostorg/boost")
+ (commit (string-append "boost-" version))
+ (recursive? #t)))
+ (file-name (git-file-name "boost" version))
+ (sha256
+ (base32 "1xirczrh2rgk2x70crw33w6566d2by9q675wlyv0zj69f49z8prn"))))
+ (native-inputs (modify-inputs (package-native-inputs boost) (prepend clang-18)))
+ (arguments
+ (append
+ (substitute-keyword-arguments (package-arguments boost))
+ (list
+ #:tests? #f
+ #:configure-flags
+ #~(let ((icu (dirname (dirname (search-input-file
+ %build-inputs "bin/uconv")))))
+ (list
+ ;; Auto-detection looks for ICU only in traditional
+ ;; install locations.
+ (string-append "--with-icu=" icu)
+ ;; Ditto for Python.
+ #$@(if (%current-target-system)
+ #~()
+ #~((let ((python (dirname (dirname (search-input-file
+ %build-inputs
+ "bin/python")))))
+ (string-append "--with-python-root=" python)
+ (string-append "--with-python=" python
+ "/bin/python")
+ (string-append "--with-python-version="
+ (python-version python)))))
+ "--with-toolset=clang")))))))
+
+(define libseccomp-ryan
+ (package
+ (inherit libseccomp)
+ (version "2.6.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/seccomp/libseccomp")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name "libseccomp" version))
+ (sha256
+ (base32 "189yh66aj3z3jvns739qbj504f3mcl3w44pxxizw877pbj3kal11"))))
+ (native-inputs (modify-inputs (package-native-inputs libseccomp) (prepend autoconf autoconf-archive automake libtool)))))
+
+
+nix-ryan
@@ -22,8 +22,8 @@
#: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 (rosenthal packages wm)
+ ;#:use-module (ryan-packages gtk)
#:use-module (ryan-packages gl)
#:use-module (gnu packages wm))
@@ -38,14 +38,14 @@
(define downloads-garbage-collector-service
(match-record-lambda <downloads-garbage-collector-configuration>
(user)
- (let ((cleanup-command #~(list "find" (string-append "/home/" #$user "/Downloads") "-mtime" "+7" "-exec" "rm" "-rf" "{}" "';'")))
+ (let ((cleanup-command #~(list "find" (string-append "/home/" #$user "/Downloads") "-mtime" "+7" "-delete")))
(shepherd-service
(documentation "Garbage collect downloaded files more than 1 week old for USER.")
(provision '(downloads-garbage-collector))
;(requirement '(root))
(modules '((shepherd service timer)))
(start #~(make-timer-constructor
- (calendar-event #:hours '(8) #:minutes '(20)
+ (calendar-event #:hours '(08) #:minutes '(30)
#:days-of-week '(tuesday))
(command #$cleanup-command)))
(stop #~(make-timer-destructor))
@@ -53,7 +53,7 @@
(name 'trigger)
(documentation "Trigger GC in Downloads folder for USER")
(procedure #~(lambda _
- (system (string-join #$cleanup-command " ")))))))))))
+ (apply system* #$cleanup-command))))))))))
(define-public downloads-garbage-collector-service-type
(service-type
@@ -0,0 +1,84 @@
+(define-module (ryan-services networking)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (ryan-packages networking)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages dns)
+ #:use-module (gnu packages base)
+ #:use-module (gnu services)
+ #:use-module (gnu services admin)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:export (netbird-configuration
+ netbird-service-type))
+
+(define-configuration netbird-configuration
+ (netbird
+ (file-like netbird-bin)
+ "The netbird package to use")
+
+ (iptables
+ (file-like iptables-nft)
+ "The iptables implementation to use")
+
+ (dns-manager
+ (file-like openresolv)
+ "Resolv.conf manager")
+
+ (log-file
+ (string "/var/log/netbird.log")
+ "Path to logs")
+
+ (socket
+ (string "/var/run/netbird.sock")
+ "Path of UNIX socket")
+
+ (verbosity
+ (string "warning")
+ "Log verbosity. Default is 'warning'")
+
+ (extra-options
+ (list-of-strings '())
+ "List of extra options")
+ (no-serialization))
+
+(define netbird-shepherd-service
+ (match-record-lambda <netbird-configuration>
+ (netbird iptables dns-manager log-file socket verbosity extra-options)
+ (let ((environment
+ #~(list (string-append "PATH="
+ (string-join
+ '(#$(file-append iptables "/sbin")
+ #$(file-append iproute "/sbin")
+ #$(file-append dns-manager "/sbin")
+ #$(file-append coreutils "/bin"))
+ ":")))))
+ (list (shepherd-service
+ (documentation "Run netbird")
+ (provision '(netbird))
+ (requirement '(user-processes))
+ (start
+ #~(make-forkexec-constructor
+ (list
+ #$(file-append netbird "/bin/netbird")
+ "service" "run"
+ "--log-level" #$verbosity
+ "--daemon-addr" (string-append "unix://" #$socket)
+ "--log-file" "console"
+ #$@extra-options)
+ #:environment-variables #$environment
+ #:log-file #$log-file))
+ (stop #~(make-kill-destructor)))))))
+
+(define netbird-service-type
+ (service-type
+ (name 'netbird)
+ (extensions
+ (list (service-extension shepherd-root-service-type
+ netbird-shepherd-service)
+ (service-extension profile-service-type
+ (compose list netbird-configuration-netbird))
+ (service-extension log-rotation-service-type
+ (compose list netbird-configuration-log-file))))
+ (default-value (netbird-configuration))
+ (description "Run netbird.")))
@@ -0,0 +1,182 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2019, 2020, 2021, 2024 Oleg Pykhalov <go.wigust@gmail.com>
+;;; Copyright © 2020 Peng Mei Yu <i@pengmeiyu.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (ryan-services nix)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu services base)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu services web)
+ #:use-module (gnu services)
+ #:use-module (gnu system file-systems)
+ #:use-module (gnu system shadow)
+ #:use-module (guix gexp)
+ #:use-module (guix packages)
+ #:use-module (guix records)
+ #:use-module (guix store)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 format)
+ #:use-module (guix modules)
+ #:export (nix-service-type
+
+ nix-configuration
+ nix-configuration?))
+
+;;; Commentary:
+;;;
+;;; This module provides a service definition for the Nix daemon.
+;;;
+;;; Code:
+
+(define-record-type* <nix-configuration>
+ nix-configuration make-nix-configuration
+ nix-configuration?
+ (package nix-configuration-package ;file-like
+ (default nix))
+ (sandbox nix-configuration-sandbox ;boolean
+ (default #t))
+ (build-directory nix-configuration-build-directory ;string
+ (default "/tmp"))
+ (build-sandbox-items nix-configuration-build-sandbox-items ;list of strings
+ (default '()))
+ (extra-config nix-configuration-extra-config ;list of strings
+ (default '()))
+ (extra-options nix-configuration-extra-options ;list of strings
+ (default '())))
+
+;; Copied from gnu/services/base.scm
+(define* (nix-build-accounts count #:key
+ (group "nixbld")
+ (shadow shadow))
+ "Return a list of COUNT user accounts for Nix build users with the given
+GID."
+ (unfold (cut > <> count)
+ (lambda (n)
+ (user-account
+ (name (format #f "nixbld~2,'0d" n))
+ (system? #t)
+ (group group)
+ (supplementary-groups (list group "kvm"))
+ (comment (format #f "Nix Build User ~2d" n))
+ (home-directory "/var/empty")
+ (shell (file-append shadow "/sbin/nologin"))))
+ 1+
+ 1))
+(define (nix-accounts _)
+ "Return the user accounts and user groups."
+ (cons (user-group
+ (name "nixbld")
+ (system? #t)
+
+ ;; Use a fixed GID so that we can create the store with the right
+ ;; owner.
+ (id 40000))
+ (nix-build-accounts 10 #:group "nixbld")))
+
+(define (nix-activation _)
+ ;; Return the activation gexp.
+ #~(begin
+ (use-modules (guix build utils)
+ (srfi srfi-26))
+ (for-each (cut mkdir-p <>) '("/nix/var/log"
+ "/nix/var/nix/gcroots/per-user"
+ "/nix/var/nix/profiles/per-user"))
+ (unless (file-exists? #$%nix-store-directory)
+ (mkdir-p #$%nix-store-directory)
+ (chown #$%nix-store-directory
+ (passwd:uid (getpw "root")) (group:gid (getpw "nixbld01")))
+ (chmod #$%nix-store-directory #o775))
+ (for-each (cut chmod <> #o777) '("/nix/var/nix/profiles"
+ "/nix/var/nix/profiles/per-user"))))
+
+(define nix-service-etc
+ (match-lambda
+ (($ <nix-configuration> package sandbox build-directory build-sandbox-items extra-config)
+ (let ((ref-file (references-file package)))
+ `(("nix/nix.conf"
+ ,(computed-file
+ "nix.conf"
+ #~(begin
+ (use-modules (srfi srfi-26)
+ (ice-9 format))
+ (with-output-to-file #$output
+ (lambda _
+ (define internal-sandbox-paths
+ (call-with-input-file #$ref-file read))
+
+ (format #t "sandbox = ~a~%" (if #$sandbox "true" "false"))
+ ;; config.nix captures store file names.
+ (format #t "sandbox-paths = ~{~a ~}~%"
+ (append (list (string-append "/bin/sh=" #$bash-minimal "/bin/bash"))
+ internal-sandbox-paths
+ '#$build-sandbox-items))
+ (for-each (cut display <>) '#$extra-config)))))))))))
+
+(define %nix-store-directory
+ "/nix/store")
+
+(define %immutable-nix-store
+ ;; Read-only store to avoid users or daemons accidentally modifying it.
+ ;; 'nix-daemon' has provisions to remount it read-write in its own name
+ ;; space.
+ (list (file-system
+ (device %nix-store-directory)
+ (mount-point %nix-store-directory)
+ (type "none")
+ (check? #f)
+ (flags '(read-only bind-mount)))))
+
+(define nix-shepherd-service
+ ;; Return a <shepherd-service> for Nix.
+ (match-lambda
+ (($ <nix-configuration> package _ build-directory _ _ extra-options)
+ (list
+ (shepherd-service
+ (provision '(nix-daemon))
+ (documentation "Run nix-daemon.")
+ (requirement '(user-processes file-system-/nix/store))
+ (start #~(make-forkexec-constructor
+ (list (string-append #$package "/bin/nix-daemon")
+ #$@extra-options)
+ #:environment-variables
+ (list (string-append "TMPDIR=" #$build-directory)
+ "PATH=/run/current-system/profile/bin")))
+ (respawn? #f)
+ (stop #~(make-kill-destructor)))))))
+
+(define nix-service-type
+ (service-type
+ (name 'nix)
+ (extensions
+ (list (service-extension shepherd-root-service-type nix-shepherd-service)
+ (service-extension account-service-type nix-accounts)
+ (service-extension activation-service-type nix-activation)
+ (service-extension etc-service-type nix-service-etc)
+ (service-extension profile-service-type
+ (compose list nix-configuration-package))
+ (service-extension file-system-service-type
+ (const %immutable-nix-store))))
+ (description "Run the Nix daemon.")
+ (default-value (nix-configuration))))
+
+;;; nix.scm ends here