summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-01-31 16:03:57 -0500
committerMica White <botahamec@outlook.com>2026-01-31 16:03:57 -0500
commit73a217ffa13aa728f1903b782428f7f522b4539a (patch)
treefde1ef460fed0cc6023f8aacebf3d5fb3043b700
Initial dotfile stuff
-rw-r--r--.cargo/config.toml2
-rw-r--r--.config/beets/config.yaml12
-rw-r--r--.config/fish/completions/fzf_configure_bindings.fish8
-rw-r--r--.config/fish/conf.d/fish_frozen_key_bindings.fish14
-rw-r--r--.config/fish/conf.d/fzf.fish28
-rw-r--r--.config/fish/config.fish23
-rw-r--r--.config/fish/fish_plugins1
-rw-r--r--.config/fish/fish_variables12
-rw-r--r--.config/fish/functions/_fzf_configure_bindings_help.fish43
-rw-r--r--.config/fish/functions/_fzf_extract_var_info.fish15
-rw-r--r--.config/fish/functions/_fzf_preview_changed_file.fish49
-rw-r--r--.config/fish/functions/_fzf_preview_file.fish43
-rw-r--r--.config/fish/functions/_fzf_report_diff_type.fish18
-rw-r--r--.config/fish/functions/_fzf_report_file_type.fish6
-rw-r--r--.config/fish/functions/_fzf_search_directory.fish33
-rw-r--r--.config/fish/functions/_fzf_search_git_log.fish36
-rw-r--r--.config/fish/functions/_fzf_search_git_status.fish41
-rw-r--r--.config/fish/functions/_fzf_search_history.fish39
-rw-r--r--.config/fish/functions/_fzf_search_processes.fish32
-rw-r--r--.config/fish/functions/_fzf_search_variables.fish47
-rw-r--r--.config/fish/functions/_fzf_wrapper.fish21
-rw-r--r--.config/fish/functions/fish_greeting.fish3
-rw-r--r--.config/fish/functions/fish_user_key_bindings.fish5
-rw-r--r--.config/fish/functions/fzf_configure_bindings.fish46
-rw-r--r--.config/freac/freac.xml388
-rw-r--r--.config/helix/config.toml26
-rw-r--r--.config/helix/languages.toml14
-rw-r--r--.config/mpd/mpd.conf9
-rw-r--r--.config/mpdscribble/mpdscribble.conf4
-rw-r--r--.config/rmpc/config.ron175
-rw-r--r--.gitconfig10
-rw-r--r--.newsboat/urls1
32 files changed, 1204 insertions, 0 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml
new file mode 100644
index 0000000..ee1d391
--- /dev/null
+++ b/.cargo/config.toml
@@ -0,0 +1,2 @@
+[build]
+rustc-wrapper = "/usr/bin/sccache"
diff --git a/.config/beets/config.yaml b/.config/beets/config.yaml
new file mode 100644
index 0000000..d70fa70
--- /dev/null
+++ b/.config/beets/config.yaml
@@ -0,0 +1,12 @@
+directory: ~/Music
+library: ~/Music/beets.db
+
+copy: no
+
+plugins: musicbrainz edit fetchart thumbnails scrub fuzzy lyrics mpdlrc
+fetchart:
+ cautious: yes
+ cover_names: cover
+lyrics:
+ auto: no
+ synced: yes
diff --git a/.config/fish/completions/fzf_configure_bindings.fish b/.config/fish/completions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..b38ef92
--- /dev/null
+++ b/.config/fish/completions/fzf_configure_bindings.fish
@@ -0,0 +1,8 @@
+complete fzf_configure_bindings --no-files
+complete fzf_configure_bindings --long help --short h --description "Print help" --condition "not __fish_seen_argument --help -h"
+complete fzf_configure_bindings --long directory --description "Change the key binding for Search Directory" --condition "not __fish_seen_argument --directory"
+complete fzf_configure_bindings --long git_log --description "Change the key binding for Search Git Log" --condition "not __fish_seen_argument --git_log"
+complete fzf_configure_bindings --long git_status --description "Change the key binding for Search Git Status" --condition "not __fish_seen_argument --git_status"
+complete fzf_configure_bindings --long history --description "Change the key binding for Search History" --condition "not __fish_seen_argument --history"
+complete fzf_configure_bindings --long processes --description "Change the key binding for Search Processes" --condition "not __fish_seen_argument --processes"
+complete fzf_configure_bindings --long variables --description "Change the key binding for Search Variables" --condition "not __fish_seen_argument --variables"
diff --git a/.config/fish/conf.d/fish_frozen_key_bindings.fish b/.config/fish/conf.d/fish_frozen_key_bindings.fish
new file mode 100644
index 0000000..495aee9
--- /dev/null
+++ b/.config/fish/conf.d/fish_frozen_key_bindings.fish
@@ -0,0 +1,14 @@
+# This file was created by fish when upgrading to version 4.3, to migrate
+# the 'fish_key_bindings' variable from its old default scope (universal)
+# to its new default scope (global). We recommend you delete this file
+# and configure key bindings in ~/.config/fish/config.fish if needed.
+
+# set --global fish_key_bindings fish_default_key_bindings
+
+# Prior to version 4.3, fish shipped an event handler that runs
+# `set --universal fish_key_bindings fish_default_key_bindings`
+# whenever the fish_key_bindings variable is erased.
+# This means that as long as any fish < 4.3 is still running on this system,
+# we cannot complete the migration.
+# As a workaround, erase the universal variable at every shell startup.
+set --erase --universal fish_key_bindings
diff --git a/.config/fish/conf.d/fzf.fish b/.config/fish/conf.d/fzf.fish
new file mode 100644
index 0000000..8156c11
--- /dev/null
+++ b/.config/fish/conf.d/fzf.fish
@@ -0,0 +1,28 @@
+# fzf.fish is only meant to be used in interactive mode. If not in interactive mode and not in CI, skip the config to speed up shell startup
+if not status is-interactive && test "$CI" != true
+ exit
+end
+
+# Because of scoping rules, to capture the shell variables exactly as they are, we must read
+# them before even executing _fzf_search_variables. We use psub to store the
+# variables' info in temporary files and pass in the filenames as arguments.
+# This variable is global so that it can be referenced by fzf_configure_bindings and in tests
+set --global _fzf_search_vars_command '_fzf_search_variables (set --show | psub) (set --names | psub)'
+
+
+# Install the default bindings, which are mnemonic and minimally conflict with fish's preset bindings
+fzf_configure_bindings
+
+# Doesn't erase autoloaded _fzf_* functions because they are not easily accessible once key bindings are erased
+function _fzf_uninstall --on-event fzf_uninstall
+ _fzf_uninstall_bindings
+
+ set --erase _fzf_search_vars_command
+ functions --erase _fzf_uninstall _fzf_migration_message _fzf_uninstall_bindings fzf_configure_bindings
+ complete --erase fzf_configure_bindings
+
+ set_color cyan
+ echo "fzf.fish uninstalled."
+ echo "You may need to manually remove fzf_configure_bindings from your config.fish if you were using custom key bindings."
+ set_color normal
+end
diff --git a/.config/fish/config.fish b/.config/fish/config.fish
new file mode 100644
index 0000000..3209c48
--- /dev/null
+++ b/.config/fish/config.fish
@@ -0,0 +1,23 @@
+if status is-interactive
+ function mkcd --description "Make a directory and cd into it"
+ mkdir -p $argv[1]
+ cd $argv[1]
+ end
+
+ function rm
+ echo "No. Use trash or shred instead."
+ end
+
+ zoxide init fish | source
+
+ alias ls="eza"
+ alias ll="ls -l"
+ alias la="ls -A"
+ alias lla="ls -lA"
+ alias lal="ls -Al"
+ alias tree="eza -T"
+
+ alias bios="systemctl reboot --firmware-setup"
+
+ alias stow="stow -t ~"
+end
diff --git a/.config/fish/fish_plugins b/.config/fish/fish_plugins
new file mode 100644
index 0000000..3638fbb
--- /dev/null
+++ b/.config/fish/fish_plugins
@@ -0,0 +1 @@
+patrickf1/fzf.fish
diff --git a/.config/fish/fish_variables b/.config/fish/fish_variables
new file mode 100644
index 0000000..fcf0f5e
--- /dev/null
+++ b/.config/fish/fish_variables
@@ -0,0 +1,12 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR --export EDITOR:helix
+SETUVAR NNN_PLUG:z\x3aautojump\x3br\x3arenamer\x3b\x21\x3asuedit
+SETUVAR --export --path PYTHONPATH:/home/botahamec/Projects
+SETUVAR --export VISUAL:helix
+SETUVAR __fish_initialized:4300
+SETUVAR _fisher_patrickf1_2F_fzf_2E_fish_files:\x7e/\x2econfig/fish/functions/_fzf_configure_bindings_help\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_extract_var_info\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_changed_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_preview_file\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_diff_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_report_file_type\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_directory\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_log\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_git_status\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_history\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_processes\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_search_variables\x2efish\x1e\x7e/\x2econfig/fish/functions/_fzf_wrapper\x2efish\x1e\x7e/\x2econfig/fish/functions/fzf_configure_bindings\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/fzf\x2efish\x1e\x7e/\x2econfig/fish/completions/fzf_configure_bindings\x2efish
+SETUVAR _fisher_plugins:patrickf1/fzf\x2efish
+SETUVAR _fisher_upgraded_to_4_4:\x1d
+SETUVAR fish_greeting:\x1d
+SETUVAR fish_user_paths:/home/botahamec/go/bin
diff --git a/.config/fish/functions/_fzf_configure_bindings_help.fish b/.config/fish/functions/_fzf_configure_bindings_help.fish
new file mode 100644
index 0000000..ecfe68e
--- /dev/null
+++ b/.config/fish/functions/_fzf_configure_bindings_help.fish
@@ -0,0 +1,43 @@
+function _fzf_configure_bindings_help --description "Prints the help message for fzf_configure_bindings."
+ echo "\
+USAGE:
+ fzf_configure_bindings [--COMMAND=[KEY_SEQUENCE]...]
+
+DESCRIPTION
+ fzf_configure_bindings installs key bindings for fzf.fish's commands and erases any bindings it
+ previously installed. It installs bindings for both default and insert modes. fzf.fish executes
+ it without options on fish startup to install the out-of-the-box key bindings.
+
+ By default, commands are bound to a mnemonic key sequence, shown below. Each command's binding
+ can be configured using a namesake corresponding option:
+ COMMAND | DEFAULT KEY SEQUENCE | CORRESPONDING OPTION
+ Search Directory | Ctrl+Alt+F (F for file) | --directory
+ Search Git Log | Ctrl+Alt+L (L for log) | --git_log
+ Search Git Status | Ctrl+Alt+S (S for status) | --git_status
+ Search History | Ctrl+R (R for reverse) | --history
+ Search Processes | Ctrl+Alt+P (P for process) | --processes
+ Search Variables | Ctrl+V (V for variable) | --variables
+ Override a command's binding by specifying its corresponding option with the desired key
+ sequence. Disable a command's binding by specifying its corresponding option with no value.
+
+ Because fzf_configure_bindings erases bindings it previously installed, it can be cleanly
+ executed multiple times. Once the desired fzf_configure_bindings command has been found, add it
+ to your config.fish in order to persist the customized bindings.
+
+ In terms of validation, fzf_configure_bindings fails if passed unknown options. It expects an
+ equals sign between an option's name and value. However, it does not validate key sequences.
+
+ Pass -h or --help to print this help message and exit.
+
+EXAMPLES
+ Default bindings but bind Search Directory to Ctrl+F and Search Variables to Ctrl+Alt+V
+ \$ fzf_configure_bindings --directory=\cf --variables=\e\cv
+ Default bindings but disable Search History
+ \$ fzf_configure_bindings --history=
+ An agglomeration of different options
+ \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables= --processes=
+
+SEE Also
+ To learn more about fish key bindings, see bind(1) and fish_key_reader(1).
+"
+end
diff --git a/.config/fish/functions/_fzf_extract_var_info.fish b/.config/fish/functions/_fzf_extract_var_info.fish
new file mode 100644
index 0000000..dd4e952
--- /dev/null
+++ b/.config/fish/functions/_fzf_extract_var_info.fish
@@ -0,0 +1,15 @@
+# helper function for _fzf_search_variables
+function _fzf_extract_var_info --argument-names variable_name set_show_output --description "Extract and reformat lines pertaining to \$variable_name from \$set_show_output."
+ # Extract only the lines about the variable, all of which begin with either
+ # $variable_name: ...or... $variable_name[
+ string match --regex "^\\\$$variable_name(?::|\[).*" <$set_show_output |
+
+ # Strip the variable name prefix, including ": " for scope info lines
+ string replace --regex "^\\\$$variable_name(?:: )?" '' |
+
+ # Distill the lines of values, replacing...
+ # [1]: |value|
+ # ...with...
+ # [1] value
+ string replace --regex ": \|(.*)\|" ' $1'
+end
diff --git a/.config/fish/functions/_fzf_preview_changed_file.fish b/.config/fish/functions/_fzf_preview_changed_file.fish
new file mode 100644
index 0000000..78dd561
--- /dev/null
+++ b/.config/fish/functions/_fzf_preview_changed_file.fish
@@ -0,0 +1,49 @@
+# helper for _fzf_search_git_status
+# arg should be a line from git status --short, e.g.
+# MM functions/_fzf_preview_changed_file.fish
+# D README.md
+# R LICENSE -> "New License"
+function _fzf_preview_changed_file --argument-names path_status --description "Show the git diff of the given file."
+ # remove quotes because they'll be interpreted literally by git diff
+ # no need to requote when referencing $path because fish does not perform word splitting
+ # https://fishshell.com/docs/current/fish_for_bash_users.html
+ set -f path (string unescape (string sub --start 4 $path_status))
+ # first letter of short format shows index, second letter shows working tree
+ # https://git-scm.com/docs/git-status/2.35.0#_short_format
+ set -f index_status (string sub --length 1 $path_status)
+ set -f working_tree_status (string sub --start 2 --length 1 $path_status)
+
+ set -f diff_opts --color=always
+
+ if test $index_status = '?'
+ _fzf_report_diff_type Untracked
+ _fzf_preview_file $path
+ else if contains {$index_status}$working_tree_status DD AU UD UA DU AA UU
+ # Unmerged statuses taken directly from git status help's short format table
+ # Unmerged statuses are mutually exclusive with other statuses, so if we see
+ # these, then safe to assume the path is unmerged
+ _fzf_report_diff_type Unmerged
+ git diff $diff_opts -- $path
+ else
+ if test $index_status != ' '
+ _fzf_report_diff_type Staged
+
+ # renames are only detected in the index, never working tree, so only need to test for it here
+ # https://stackoverflow.com/questions/73954214
+ if test $index_status = R
+ # diff the post-rename path with the original path, otherwise the diff will show the entire file as being added
+ set -f orig_and_new_path (string split --max 1 -- ' -> ' $path)
+ git diff --staged $diff_opts -- $orig_and_new_path[1] $orig_and_new_path[2]
+ # path currently has the form of "original -> current", so we need to correct it before it's used below
+ set path $orig_and_new_path[2]
+ else
+ git diff --staged $diff_opts -- $path
+ end
+ end
+
+ if test $working_tree_status != ' '
+ _fzf_report_diff_type Unstaged
+ git diff $diff_opts -- $path
+ end
+ end
+end
diff --git a/.config/fish/functions/_fzf_preview_file.fish b/.config/fish/functions/_fzf_preview_file.fish
new file mode 100644
index 0000000..c926475
--- /dev/null
+++ b/.config/fish/functions/_fzf_preview_file.fish
@@ -0,0 +1,43 @@
+# helper function for _fzf_search_directory and _fzf_search_git_status
+function _fzf_preview_file --description "Print a preview for the given file based on its file type."
+ # because there's no way to guarantee that _fzf_search_directory passes the path to _fzf_preview_file
+ # as one argument, we collect all the arguments into one single variable and treat that as the path
+ set -f file_path $argv
+
+ if test -L "$file_path" # symlink
+ # notify user and recurse on the target of the symlink, which can be any of these file types
+ set -l target_path (realpath "$file_path")
+
+ set_color yellow
+ echo "'$file_path' is a symlink to '$target_path'."
+ set_color normal
+
+ _fzf_preview_file "$target_path"
+ else if test -f "$file_path" # regular file
+ if set --query fzf_preview_file_cmd
+ # need to escape quotes to make sure eval receives file_path as a single arg
+ eval "$fzf_preview_file_cmd '$file_path'"
+ else
+ bat --style=numbers --color=always "$file_path"
+ end
+ else if test -d "$file_path" # directory
+ if set --query fzf_preview_dir_cmd
+ # see above
+ eval "$fzf_preview_dir_cmd '$file_path'"
+ else
+ # -A list hidden files as well, except for . and ..
+ # -F helps classify files by appending symbols after the file name
+ command ls -A -F "$file_path"
+ end
+ else if test -c "$file_path"
+ _fzf_report_file_type "$file_path" "character device file"
+ else if test -b "$file_path"
+ _fzf_report_file_type "$file_path" "block device file"
+ else if test -S "$file_path"
+ _fzf_report_file_type "$file_path" socket
+ else if test -p "$file_path"
+ _fzf_report_file_type "$file_path" "named pipe"
+ else
+ echo "$file_path doesn't exist." >&2
+ end
+end
diff --git a/.config/fish/functions/_fzf_report_diff_type.fish b/.config/fish/functions/_fzf_report_diff_type.fish
new file mode 100644
index 0000000..cc26fb3
--- /dev/null
+++ b/.config/fish/functions/_fzf_report_diff_type.fish
@@ -0,0 +1,18 @@
+# helper for _fzf_preview_changed_file
+# prints out something like
+# ╭────────╮
+# │ Staged │
+# ╰────────╯
+function _fzf_report_diff_type --argument-names diff_type --description "Print a distinct colored header meant to preface a git patch."
+ # number of "-" to draw is the length of the string to box + 2 for padding
+ set -f repeat_count (math 2 + (string length $diff_type))
+ set -f line (string repeat --count $repeat_count ─)
+ set -f top_border ╭$line╮
+ set -f btm_border ╰$line╯
+
+ set_color yellow
+ echo $top_border
+ echo "│ $diff_type │"
+ echo $btm_border
+ set_color normal
+end
diff --git a/.config/fish/functions/_fzf_report_file_type.fish b/.config/fish/functions/_fzf_report_file_type.fish
new file mode 100644
index 0000000..49e02e1
--- /dev/null
+++ b/.config/fish/functions/_fzf_report_file_type.fish
@@ -0,0 +1,6 @@
+# helper function for _fzf_preview_file
+function _fzf_report_file_type --argument-names file_path file_type --description "Explain the file type for a file."
+ set_color red
+ echo "Cannot preview '$file_path': it is a $file_type."
+ set_color normal
+end
diff --git a/.config/fish/functions/_fzf_search_directory.fish b/.config/fish/functions/_fzf_search_directory.fish
new file mode 100644
index 0000000..4541eec
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_directory.fish
@@ -0,0 +1,33 @@
+function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths."
+ # Directly use fd binary to avoid output buffering delay caused by a fd alias, if any.
+ # Debian-based distros install fd as fdfind and the fd package is something else, so
+ # check for fdfind first. Fall back to "fd" for a clear error message.
+ set -f fd_cmd (command -v fdfind || command -v fd || echo "fd")
+ set -f --append fd_cmd --color=always $fzf_fd_opts
+
+ set -f fzf_arguments --multi --ansi $fzf_directory_opts
+ set -f token (commandline --current-token)
+ # expand any variables or leading tilde (~) in the token
+ set -f expanded_token (eval echo -- $token)
+ # unescape token because it's already quoted so backslashes will mess up the path
+ set -f unescaped_exp_token (string unescape -- $expanded_token)
+
+ # If the current token is a directory and has a trailing slash,
+ # then use it as fd's base directory.
+ if string match --quiet -- "*/" $unescaped_exp_token && test -d "$unescaped_exp_token"
+ set --append fd_cmd --base-directory=$unescaped_exp_token
+ # use the directory name as fzf's prompt to indicate the search is limited to that directory
+ set --prepend fzf_arguments --prompt="Directory $unescaped_exp_token> " --preview="_fzf_preview_file $expanded_token{}"
+ set -f file_paths_selected $unescaped_exp_token($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ else
+ set --prepend fzf_arguments --prompt="Directory> " --query="$unescaped_exp_token" --preview='_fzf_preview_file {}'
+ set -f file_paths_selected ($fd_cmd 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ end
+
+
+ if test $status -eq 0
+ commandline --current-token --replace -- (string escape -- $file_paths_selected | string join ' ')
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_git_log.fish b/.config/fish/functions/_fzf_search_git_log.fish
new file mode 100644
index 0000000..aa54724
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_log.fish
@@ -0,0 +1,36 @@
+function _fzf_search_git_log --description "Search the output of git log and preview commits. Replace the current token with the selected commit hash."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_log: Not in a git repository.' >&2
+ else
+ if not set --query fzf_git_log_format
+ # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below
+ set -f fzf_git_log_format '%C(bold blue)%h%C(reset) - %C(cyan)%ad%C(reset) %C(yellow)%d%C(reset) %C(normal)%s%C(reset) %C(dim normal)[%an]%C(reset)'
+ end
+
+ set -f preview_cmd 'git show --color=always --stat --patch {1}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_log_lines (
+ git log --no-show-signature --color=always --format=format:$fzf_git_log_format --date=short | \
+ _fzf_wrapper --ansi \
+ --multi \
+ --scheme=history \
+ --prompt="Git Log> " \
+ --preview=$preview_cmd \
+ --query=(commandline --current-token) \
+ $fzf_git_log_opts
+ )
+ if test $status -eq 0
+ for line in $selected_log_lines
+ set -f abbreviated_commit_hash (string split --field 1 " " $line)
+ set -f full_commit_hash (git rev-parse $abbreviated_commit_hash)
+ set -f --append commit_hashes $full_commit_hash
+ end
+ commandline --current-token --replace (string join ' ' $commit_hashes)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_git_status.fish b/.config/fish/functions/_fzf_search_git_status.fish
new file mode 100644
index 0000000..358f88c
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_status.fish
@@ -0,0 +1,41 @@
+function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths."
+ if not git rev-parse --git-dir >/dev/null 2>&1
+ echo '_fzf_search_git_status: Not in a git repository.' >&2
+ else
+ set -f preview_cmd '_fzf_preview_changed_file {}'
+ if set --query fzf_diff_highlighter
+ set preview_cmd "$preview_cmd | $fzf_diff_highlighter"
+ end
+
+ set -f selected_paths (
+ # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe
+ git -c color.status=always status --short |
+ _fzf_wrapper --ansi \
+ --multi \
+ --prompt="Git Status> " \
+ --query=(commandline --current-token) \
+ --preview=$preview_cmd \
+ --nth="2.." \
+ $fzf_git_status_opts
+ )
+ if test $status -eq 0
+ # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle
+ # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping")
+ set -f cleaned_paths
+
+ for path in $selected_paths
+ if test (string sub --length 1 $path) = R
+ # path has been renamed and looks like "R LICENSE -> LICENSE.md"
+ # extract the path to use from after the arrow
+ set --append cleaned_paths (string split -- "-> " $path)[-1]
+ else
+ set --append cleaned_paths (string sub --start=4 $path)
+ end
+ end
+
+ commandline --current-token --replace -- (string join ' ' $cleaned_paths)
+ end
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_history.fish b/.config/fish/functions/_fzf_search_history.fish
new file mode 100644
index 0000000..cafbce9
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_history.fish
@@ -0,0 +1,39 @@
+function _fzf_search_history --description "Search command history. Replace the command line with the selected command."
+ # history merge incorporates history changes from other fish sessions
+ # it errors out if called in private mode
+ if test -z "$fish_private_mode"
+ builtin history merge
+ end
+
+ if not set --query fzf_history_time_format
+ # Reference https://devhints.io/strftime to understand strftime format symbols
+ set -f fzf_history_time_format "%m-%d %H:%M:%S"
+ end
+
+ # Delinate time from command in history entries using the vertical box drawing char (U+2502).
+ # Then, to get raw command from history entries, delete everything up to it. The ? on regex is
+ # necessary to make regex non-greedy so it won't match into commands containing the char.
+ set -f time_prefix_regex '^.*? │ '
+ # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+ set -f commands_selected (
+ builtin history --null --show-time="$fzf_history_time_format │ " |
+ _fzf_wrapper --read0 \
+ --print0 \
+ --multi \
+ --scheme=history \
+ --prompt="History> " \
+ --query=(commandline) \
+ --preview="string replace --regex '$time_prefix_regex' '' -- {} | fish_indent --ansi" \
+ --preview-window="bottom:3:wrap" \
+ $fzf_history_opts |
+ string split0 |
+ # remove timestamps from commands selected
+ string replace --regex $time_prefix_regex ''
+ )
+
+ if test $status -eq 0
+ commandline --replace -- $commands_selected
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_processes.fish b/.config/fish/functions/_fzf_search_processes.fish
new file mode 100644
index 0000000..133a880
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_processes.fish
@@ -0,0 +1,32 @@
+function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
+ # Directly use ps command because it is often aliased to a different command entirely
+ # or with options that dirty the search results and preview output
+ set -f ps_cmd (command -v ps || echo "ps")
+ # use all caps to be consistent with ps default format
+ # snake_case because ps doesn't seem to allow spaces in the field names
+ set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
+ set -f processes_selected (
+ $ps_cmd -A -opid,command | \
+ _fzf_wrapper --multi \
+ --prompt="Processes> " \
+ --query (commandline --current-token) \
+ --ansi \
+ # first line outputted by ps is a header, so we need to mark it as so
+ --header-lines=1 \
+ # ps uses exit code 1 if the process was not found, in which case show an message explaining so
+ --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \
+ --preview-window="bottom:4:wrap" \
+ $fzf_processes_opts
+ )
+
+ if test $status -eq 0
+ for process in $processes_selected
+ set -f --append pids_selected (string split --no-empty --field=1 -- " " $process)
+ end
+
+ # string join to replace the newlines outputted by string split with spaces
+ commandline --current-token --replace -- (string join ' ' $pids_selected)
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_search_variables.fish b/.config/fish/functions/_fzf_search_variables.fish
new file mode 100644
index 0000000..52a7c70
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_variables.fish
@@ -0,0 +1,47 @@
+# This function expects the following two arguments:
+# argument 1 = output of (set --show | psub), i.e. a file with the scope info and values of all variables
+# argument 2 = output of (set --names | psub), i.e. a file with all variable names
+function _fzf_search_variables --argument-names set_show_output set_names_output --description "Search and preview shell variables. Replace the current token with the selected variable."
+ if test -z "$set_names_output"
+ printf '%s\n' '_fzf_search_variables requires 2 arguments.' >&2
+
+ commandline --function repaint
+ return 22 # 22 means invalid argument in POSIX
+ end
+
+ # Exclude the history variable from being piped into fzf because
+ # 1. it's not included in $set_names_output
+ # 2. it tends to be a very large value => increases computation time
+ # 3._fzf_search_history is a much better way to examine history anyway
+ set -f all_variable_names (string match --invert history <$set_names_output)
+
+ set -f current_token (commandline --current-token)
+ # Use the current token to pre-populate fzf's query. If the current token begins
+ # with a $, remove it from the query so that it will better match the variable names
+ set -f cleaned_curr_token (string replace -- '$' '' $current_token)
+
+ set -f variable_names_selected (
+ printf '%s\n' $all_variable_names |
+ _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \
+ --prompt="Variables> " \
+ --preview-window="wrap" \
+ --multi \
+ --query=$cleaned_curr_token \
+ $fzf_variables_opts
+ )
+
+ if test $status -eq 0
+ # If the current token begins with a $, do not overwrite the $ when
+ # replacing the current token with the selected variable.
+ # Uses brace expansion to prepend $ to each variable name.
+ commandline --current-token --replace (
+ if string match --quiet -- '$*' $current_token
+ string join " " \${$variable_names_selected}
+ else
+ string join " " $variable_names_selected
+ end
+ )
+ end
+
+ commandline --function repaint
+end
diff --git a/.config/fish/functions/_fzf_wrapper.fish b/.config/fish/functions/_fzf_wrapper.fish
new file mode 100644
index 0000000..486e36c
--- /dev/null
+++ b/.config/fish/functions/_fzf_wrapper.fish
@@ -0,0 +1,21 @@
+function _fzf_wrapper --description "Prepares some environment variables before executing fzf."
+ # Make sure fzf uses fish to execute preview commands, some of which
+ # are autoloaded fish functions so don't exist in other shells.
+ # Use --function so that it doesn't clobber SHELL outside this function.
+ set -f --export SHELL (command --search fish)
+
+ # If neither FZF_DEFAULT_OPTS nor FZF_DEFAULT_OPTS_FILE are set, then set some sane defaults.
+ # See https://github.com/junegunn/fzf#environment-variables
+ set --query FZF_DEFAULT_OPTS FZF_DEFAULT_OPTS_FILE
+ if test $status -eq 2
+ # cycle allows jumping between the first and last results, making scrolling faster
+ # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env
+ # border shows where the fzf window begins and ends
+ # height=90% leaves space to see the current command and some scrollback, maintaining context of work
+ # preview-window=wrap wraps long lines in the preview window, making reading easier
+ # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >)
+ set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"'
+ end
+
+ fzf $argv
+end
diff --git a/.config/fish/functions/fish_greeting.fish b/.config/fish/functions/fish_greeting.fish
new file mode 100644
index 0000000..6d853da
--- /dev/null
+++ b/.config/fish/functions/fish_greeting.fish
@@ -0,0 +1,3 @@
+function fish_greeting
+ fortune
+end
diff --git a/.config/fish/functions/fish_user_key_bindings.fish b/.config/fish/functions/fish_user_key_bindings.fish
new file mode 100644
index 0000000..e0b3575
--- /dev/null
+++ b/.config/fish/functions/fish_user_key_bindings.fish
@@ -0,0 +1,5 @@
+function fish_user_key_bindings
+ fish_default_key_bindings -M insert
+
+ fish_vi_key_bindings --no-erase insert
+end
diff --git a/.config/fish/functions/fzf_configure_bindings.fish b/.config/fish/functions/fzf_configure_bindings.fish
new file mode 100644
index 0000000..4b4e7a2
--- /dev/null
+++ b/.config/fish/functions/fzf_configure_bindings.fish
@@ -0,0 +1,46 @@
+# Always installs bindings for insert and default mode for simplicity and b/c it has almost no side-effect
+# https://gitter.im/fish-shell/fish-shell?at=60a55915ee77a74d685fa6b1
+function fzf_configure_bindings --description "Installs the default key bindings for fzf.fish with user overrides passed as options."
+ # no need to install bindings if not in interactive mode or running tests
+ status is-interactive || test "$CI" = true; or return
+
+ set -f options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'processes=?' 'variables=?'
+ argparse --max-args=0 --ignore-unknown $options_spec -- $argv 2>/dev/null
+ if test $status -ne 0
+ echo "Invalid option or a positional argument was provided." >&2
+ _fzf_configure_bindings_help
+ return 22
+ else if set --query _flag_help
+ _fzf_configure_bindings_help
+ return
+ else
+ # Initialize with default key sequences and then override or disable them based on flags
+ # index 1 = directory, 2 = git_log, 3 = git_status, 4 = history, 5 = processes, 6 = variables
+ set -f key_sequences \e\cf \e\cl \e\cs \cr \e\cp \cv # \c = control, \e = escape
+ set --query _flag_directory && set key_sequences[1] "$_flag_directory"
+ set --query _flag_git_log && set key_sequences[2] "$_flag_git_log"
+ set --query _flag_git_status && set key_sequences[3] "$_flag_git_status"
+ set --query _flag_history && set key_sequences[4] "$_flag_history"
+ set --query _flag_processes && set key_sequences[5] "$_flag_processes"
+ set --query _flag_variables && set key_sequences[6] "$_flag_variables"
+
+ # If fzf bindings already exists, uninstall it first for a clean slate
+ if functions --query _fzf_uninstall_bindings
+ _fzf_uninstall_bindings
+ end
+
+ for mode in default insert
+ test -n $key_sequences[1] && bind --mode $mode $key_sequences[1] _fzf_search_directory
+ test -n $key_sequences[2] && bind --mode $mode $key_sequences[2] _fzf_search_git_log
+ test -n $key_sequences[3] && bind --mode $mode $key_sequences[3] _fzf_search_git_status
+ test -n $key_sequences[4] && bind --mode $mode $key_sequences[4] _fzf_search_history
+ test -n $key_sequences[5] && bind --mode $mode $key_sequences[5] _fzf_search_processes
+ test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] "$_fzf_search_vars_command"
+ end
+
+ function _fzf_uninstall_bindings --inherit-variable key_sequences
+ bind --erase -- $key_sequences
+ bind --erase --mode insert -- $key_sequences
+ end
+ end
+end
diff --git a/.config/freac/freac.xml b/.config/freac/freac.xml
new file mode 100644
index 0000000..f3ba87f
--- /dev/null
+++ b/.config/freac/freac.xml
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ConfigFile>
+ <configuration name="default">
+ <section name="Settings">
+ <value name="LastOutputDirectory1">/home/botahamec/Downloads/</value>
+ <value name="Language">internal</value>
+ <value name="StartCount">6</value>
+ <value name="WindowPosX">2696</value>
+ <value name="WindowPosY">392</value>
+ <value name="WindowSizeX">740</value>
+ <value name="WindowSizeY">550</value>
+ <value name="Encoder">ffmpeg-alac-enc</value>
+ <value name="WindowMaximized">0</value>
+ <value name="ShowTips">0</value>
+ <value name="NextTip">1</value>
+ <value name="NotificationAvailable">1</value>
+ <value name="EncodeToSingleFile">0</value>
+ <value name="ShowTitleInfo">1</value>
+ <value name="WriteToInputDirectory">0</value>
+ <value name="AllowOverwriteSource">0</value>
+ <value name="ActiveConfiguration">default</value>
+ <value name="EncodeOnTheFly">1</value>
+ <value name="KeepWaveFiles">0</value>
+ <value name="RemoveTracks">1</value>
+ <value name="AddEncodedTracks">0</value>
+ <value name="EncoderOutDir">/home/botahamec/Downloads/</value>
+ <value name="LastFilePattern5"/>
+ <value name="LastFilePattern4"/>
+ <value name="LastFilePattern3"/>
+ <value name="LastFilePattern2"/>
+ <value name="LastFilePattern1">&lt;albumartist&gt;/&lt;album&gt;/&lt;track&gt; - &lt;title&gt;</value>
+ <value name="EncoderFilenamePattern">&lt;albumartist&gt;/&lt;album&gt;/&lt;track&gt; - &lt;title&gt;</value>
+ <value name="UseFilenameFallback">1</value>
+ <value name="FilenamesAddSequentialNumbers">0</value>
+ <value name="UseUnicodeFilenames">1</value>
+ <value name="FilenamesReplaceSpaces">0</value>
+ <value name="FilenamesKeepTimeStamps">0</value>
+ <value name="ShowJobsTab">0</value>
+ <value name="LastOutputDirectory5"/>
+ <value name="LastOutputDirectory4"/>
+ <value name="LastOutputDirectory3"/>
+ <value name="LastOutputDirectory2">/home/botahamec/Music/</value>
+ </section>
+ <section name="Tags">
+ <value name="DefaultComment">fre:ac - free audio converter &lt;https://www.freac.org/&gt;</value>
+ <value name="EnableAPEv2">1</value>
+ <value name="APEv2Encoding">UTF-8</value>
+ <value name="TrackPrependZeroAPEv2">1</value>
+ <value name="EnableRIFFCartTag">0</value>
+ <value name="RIFFCartTagEncoding">ISO-8859-1</value>
+ <value name="EnableFLACMetadata">1</value>
+ <value name="FLACMetadataEncoding">UTF-8</value>
+ <value name="TrackPrependZeroFLACMetadata">1</value>
+ <value name="EnableID3v1">0</value>
+ <value name="ID3v1Encoding">ISO-8859-1</value>
+ <value name="EnableID3v2">1</value>
+ <value name="ID3v2Encoding">UTF-16LE</value>
+ <value name="TrackPrependZeroID3v2">0</value>
+ <value name="EnableMP4Metadata">1</value>
+ <value name="MP4MetadataEncoding">UTF-8</value>
+ <value name="EnableRIFFINFOTag">1</value>
+ <value name="RIFFINFOTagEncoding">ISO-8859-1</value>
+ <value name="TrackPrependZeroRIFFINFOTag">1</value>
+ <value name="EnableVorbisComment">1</value>
+ <value name="VorbisCommentEncoding">UTF-8</value>
+ <value name="TrackPrependZeroVorbisComment">1</value>
+ <value name="ReadChapters">1</value>
+ <value name="WriteChapters">1</value>
+ <value name="WriteMCDI">1</value>
+ <value name="PreserveReplayGain">1</value>
+ <value name="ExtractFromFileNames">1</value>
+ <value name="ReplaceExistingComments">0</value>
+ <value name="CoverArtWriteToAPEv2">1</value>
+ <value name="CoverArtWriteToFLACMetadata">1</value>
+ <value name="CoverArtWriteToID3v2">1</value>
+ <value name="CoverArtWriteToMP4Metadata">1</value>
+ <value name="CoverArtWriteToVorbisComment">1</value>
+ <value name="CoverArtReadFromTags">1</value>
+ <value name="CoverArtWriteToTags">1</value>
+ <value name="CoverArtReadFromFiles">1</value>
+ <value name="CoverArtWriteToFiles">1</value>
+ <value name="CoverArtRestrictFilenames">1</value>
+ <value name="CoverArtFilenames">folder;*cover*;*albumart*;*front*;*back*;*inside*;*cd*;*disc*;*booklet*</value>
+ <value name="CoverArtMaxFileSize">250</value>
+ <value name="CoverArtFilenamePattern">&lt;albumartist&gt; - &lt;album&gt;/&lt;type&gt;</value>
+ <value name="CoverArtWriteToFilesWithReference">0</value>
+ <value name="ReadEmbeddedCueSheets">1</value>
+ <value name="PreferCueSheetsToChapters">1</value>
+ </section>
+ <section name="Donate">
+ <value name="StartCount">6</value>
+ </section>
+ <section name="Playlist">
+ <value name="CreatePlaylist">0</value>
+ <value name="CreateCueSheet">0</value>
+ <value name="OutputDir">/home/botahamec/Music/</value>
+ <value name="FilenamePattern">&lt;albumartist&gt; - &lt;album&gt;/&lt;albumartist&gt; - &lt;album&gt;</value>
+ <value name="UseEncoderOutputDir">1</value>
+ <value name="SinglePlaylistFile">0</value>
+ <value name="PlaylistFormat">m3u-playlist-m3u8</value>
+ </section>
+ <section name="Ripper">
+ <value name="ActiveDrive">0</value>
+ <value name="UseOffsetDrive-1ee73637">1</value>
+ <value name="ReadOffsetDrive-1ee73637">6</value>
+ <value name="RippingSpeedDrive-1ee73637">0</value>
+ <value name="SpinUpTimeDrive-1ee73637">-5</value>
+ <value name="AutoReadContents">1</value>
+ <value name="AutoRip">0</value>
+ <value name="EjectAfterRipping">0</value>
+ <value name="ReadCDText">1</value>
+ <value name="ReadISRC">0</value>
+ <value name="CDParanoia">0</value>
+ <value name="CDParanoiaMode">3</value>
+ </section>
+ <section name="freedb">
+ <value name="EnableCDDBCache">1</value>
+ <value name="AutoCDDBQueries">1</value>
+ <value name="AutoSelectFirstEntry">0</value>
+ <value name="OverwriteCDText">1</value>
+ <value name="EnableLocalCDDB">0</value>
+ <value name="EnableRemoteCDDB">1</value>
+ <value name="Directory">freedb/</value>
+ <value name="Server">gnudb.gnudb.org</value>
+ <value name="eMail">cddb@freac.org</value>
+ <value name="Mode">0</value>
+ <value name="HTTPPort">80</value>
+ </section>
+ <section name="Processing">
+ <value name="EnableProcessing">1</value>
+ <value name="ProcessPlayback">1</value>
+ <value name="ProcessingComponents"/>
+ <value name="SingleFileMode">1</value>
+ </section>
+ <section name="Joblist">
+ <value name="FieldSizes">120,343,50,80,100</value>
+ <value name="Fields">&lt;artist&gt;,&lt;title&gt;,&lt;track&gt;,&lt;time&gt;,&lt;bytes&gt;</value>
+ </section>
+ <section name="AccurateRip">
+ <value name="DriveLevel-1ee73637">1</value>
+ <value name="Enabled">1</value>
+ <value name="Path">http://accuraterip.com/accuraterip/</value>
+ <value name="EnableCache">1</value>
+ <value name="ExpireCache">30</value>
+ <value name="NotifyMissingEntry">0</value>
+ <value name="NotifySuccess">0</value>
+ </section>
+ <section name="Verification">
+ <value name="VerifyInput">1</value>
+ <value name="VerifyOutput">0</value>
+ </section>
+ <section name="Resources">
+ <value name="EnableParallelConversions">1</value>
+ <value name="EnableSuperFastMode">1</value>
+ <value name="NumberOfConversionThreads">1</value>
+ <value name="Priority">0</value>
+ </section>
+ <section name="CueSheet">
+ <value name="ReadInformationTags">1</value>
+ <value name="PreferCueSheets">1</value>
+ <value name="LookForAlternativeFiles">0</value>
+ <value name="IgnoreErrors">0</value>
+ </section>
+ <section name="mpg123">
+ <value name="Decoder"/>
+ </section>
+ <section name="Channels">
+ <value name="Channels">2</value>
+ <value name="SwapChannels">0</value>
+ </section>
+ <section name="Format">
+ <value name="Float">0</value>
+ <value name="Signed">1</value>
+ <value name="Bits">16</value>
+ <value name="ApplyDither">1</value>
+ <value name="DitherType">1</value>
+ </section>
+ <section name="Resample">
+ <value name="Converter">1</value>
+ <value name="Samplerate">44100</value>
+ </section>
+ <section name="rnnoise">
+ <value name="SignalType">2</value>
+ <value name="NoiseType">0</value>
+ </section>
+ <section name="RubberBand">
+ <value name="Stretch">1000</value>
+ <value name="Pitch">1000</value>
+ <value name="Detector">0</value>
+ <value name="Transients">0</value>
+ <value name="Window">0</value>
+ <value name="Phase">0</value>
+ <value name="Formant">0</value>
+ <value name="PitchMode">0</value>
+ <value name="Channels">0</value>
+ <value name="Smoothing">0</value>
+ </section>
+ <section name="Surround">
+ <value name="ChannelSetup">6</value>
+ <value name="RedirectBass">1</value>
+ </section>
+ <section name="Volume">
+ <value name="qdB">0</value>
+ </section>
+ <section name="FDKAAC">
+ <value name="MPEGVersion">0</value>
+ <value name="AACType">2</value>
+ <value name="Mode">0</value>
+ <value name="Bitrate">64</value>
+ <value name="Quality">4</value>
+ <value name="Bandwidth">0</value>
+ <value name="AllowID3v2">0</value>
+ <value name="MP4Container">1</value>
+ <value name="MP4FileExtension">0</value>
+ </section>
+ <section name="FLAC">
+ <value name="Preset">5</value>
+ <value name="FileFormat">0</value>
+ <value name="StreamableSubset">1</value>
+ <value name="DoMidSideStereo">1</value>
+ <value name="LooseMidSideStereo">0</value>
+ <value name="Blocksize">4096</value>
+ <value name="Apodization">tukey(0.5)</value>
+ <value name="MaxLPCOrder">8</value>
+ <value name="QLPCoeffPrecision">0</value>
+ <value name="DoQLPCoeffPrecSearch">0</value>
+ <value name="DoExhaustiveModelSearch">0</value>
+ <value name="MinResidualPartitionOrder">0</value>
+ <value name="MaxResidualPartitionOrder">5</value>
+ </section>
+ <section name="LAME">
+ <value name="Preset">2</value>
+ <value name="SetBitrate">1</value>
+ <value name="Bitrate">192</value>
+ <value name="Ratio">1100</value>
+ <value name="SetQuality">0</value>
+ <value name="Quality">3</value>
+ <value name="StereoMode">0</value>
+ <value name="ForceJS">0</value>
+ <value name="VBRMode">4</value>
+ <value name="VBRQuality">50</value>
+ <value name="ABRBitrate">192</value>
+ <value name="SetMinVBRBitrate">0</value>
+ <value name="MinVBRBitrate">128</value>
+ <value name="SetMaxVBRBitrate">0</value>
+ <value name="MaxVBRBitrate">256</value>
+ <value name="CRC">0</value>
+ <value name="Copyright">0</value>
+ <value name="Original">1</value>
+ <value name="Private">0</value>
+ <value name="StrictISO">0</value>
+ <value name="DisableFiltering">0</value>
+ <value name="SetLowpass">0</value>
+ <value name="Lowpass">0</value>
+ <value name="SetLowpassWidth">0</value>
+ <value name="LowpassWidth">0</value>
+ <value name="SetHighpass">0</value>
+ <value name="Highpass">0</value>
+ <value name="SetHighpassWidth">0</value>
+ <value name="HighpassWidth">0</value>
+ <value name="EnableATH">1</value>
+ <value name="ATHType">-1</value>
+ <value name="UseTNS">1</value>
+ <value name="TNSMode">-1</value>
+ </section>
+ <section name="meh!">
+ <value name="SeparateFolders">0</value>
+ <value name="Encoders">flac-enc,lame-enc</value>
+ </section>
+ <section name="Vorbis">
+ <value name="Mode">0</value>
+ <value name="FileExtension">0</value>
+ <value name="Quality">60</value>
+ <value name="SetMinBitrate">0</value>
+ <value name="MinBitrate">32</value>
+ <value name="SetBitrate">1</value>
+ <value name="Bitrate">192</value>
+ <value name="SetMaxBitrate">0</value>
+ <value name="MaxBitrate">320</value>
+ </section>
+ <section name="Opus">
+ <value name="Mode">0</value>
+ <value name="Bandwidth">0</value>
+ <value name="FileExtension">0</value>
+ <value name="Bitrate">128</value>
+ <value name="Complexity">10</value>
+ <value name="FrameSize">20000</value>
+ <value name="PacketLoss">0</value>
+ <value name="EnableVBR">1</value>
+ <value name="EnableConstrainedVBR">0</value>
+ <value name="EnableDTX">0</value>
+ <value name="DisablePhaseInversion">0</value>
+ </section>
+ <section name="SndFile">
+ <value name="Format">65536</value>
+ <value name="SubFormat">0</value>
+ </section>
+ <section name="Speex">
+ <value name="Mode">-1</value>
+ <value name="VBR">0</value>
+ <value name="VBRQuality">80</value>
+ <value name="VBRMaxBitrate">-48</value>
+ <value name="ABR">-16</value>
+ <value name="Quality">8</value>
+ <value name="Bitrate">-16</value>
+ <value name="Complexity">3</value>
+ <value name="VAD">0</value>
+ <value name="DTX">0</value>
+ </section>
+ <section name="twolame-enc">
+ <value name="Set Bitrate">1</value>
+ <value name="Bitrate">192</value>
+ <value name="Enable VBR mode">0</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="wv-enc">
+ <value name="Set Enable lossy compression">0</value>
+ <value name="Enable lossy compression">32</value>
+ <value name="Create correction file">0</value>
+ <value name="Set Compression mode">0</value>
+ <value name="Compression mode">-h</value>
+ <value name="Set Extra encode processing">0</value>
+ <value name="Extra encode processing">1</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="ffmpeg-wma-enc">
+ <value name="Set Bitrate">1</value>
+ <value name="Bitrate">48</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="SndFileWave">
+ <value name="SubFormat">0</value>
+ </section>
+ <section name="MP4">
+ <value name="ChapterType">2</value>
+ </section>
+ <section name="ffmpeg-ac3-dec">
+ <value name="Downmix multi-channel audio to stereo">0</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="ffmpeg-dsd-dec">
+ <value name="Downmix multi-channel audio to stereo">0</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="ffmpeg-dts-dec">
+ <value name="Downmix multi-channel audio to stereo">0</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="ffmpeg-mlp-dec">
+ <value name="Downmix multi-channel audio to stereo">0</value>
+ <value name="Set Additional arguments">0</value>
+ <value name="Additional arguments"/>
+ </section>
+ <section name="Notifier">
+ <value name="EnableNotifications">1</value>
+ <value name="PlaySound">1</value>
+ <value name="DisplayMessage">0</value>
+ <value name="MinimumDuration">0</value>
+ <value name="SoundFile">&lt;sounds&gt;/finished.flac</value>
+ <value name="Message">Conversion process finished!</value>
+ <value name="Seconds">30</value>
+ </section>
+ <section name="TagEdit">
+ <value name="ClearAlbumArtist">0</value>
+ </section>
+ <section name="Logging">
+ <value name="ShowLogsTab">1</value>
+ <value name="ArchiveLogs">1</value>
+ <value name="LogsFolder">/home/botahamec/.cache/freac/logs/</value>
+ <value name="DeleteLogs">1</value>
+ <value name="DeleteLogsDays">30</value>
+ <value name="LogCompletePaths">0</value>
+ <value name="SaveConversionLogsWithFiles">0</value>
+ <value name="SaveRippingLogsOnly">1</value>
+ <value name="ConversionLogPattern">&lt;albumartist&gt; - &lt;album&gt;/&lt;albumartist&gt; - &lt;album&gt;</value>
+ </section>
+ <section name="Dialogs">
+ <value name="CDDBMultiMatchSizeX">355</value>
+ <value name="CDDBMultiMatchSizeY">345</value>
+ </section>
+ </configuration>
+</ConfigFile>
diff --git a/.config/helix/config.toml b/.config/helix/config.toml
new file mode 100644
index 0000000..fa19bb5
--- /dev/null
+++ b/.config/helix/config.toml
@@ -0,0 +1,26 @@
+[editor]
+line-number = "relative"
+end-of-line-diagnostics = "warning"
+
+[editor.statusline]
+left = ["mode", "spinner", "diagnostics"]
+center = ["file-name", "read-only-indicator", "file-modification-indicator"]
+right = ["register", "position"]
+
+[editor.lsp]
+display-messages = false
+display-inlay-hints = true
+
+[editor.cursor-shape]
+insert = "bar"
+normal = "block"
+select = "underline"
+
+[editor.file-picker]
+hidden = false
+
+[editor.indent-guides]
+render = true
+
+[editor.smart-tab]
+enable = false
diff --git a/.config/helix/languages.toml b/.config/helix/languages.toml
new file mode 100644
index 0000000..d727f5f
--- /dev/null
+++ b/.config/helix/languages.toml
@@ -0,0 +1,14 @@
+[[language]]
+name = "rust"
+indent = { tab-width=4, unit="\t" }
+formatter = { command="rustfmt" }
+[language-server.rust-analyzer.config]
+check.command = "clippy"
+
+[[language]]
+name = "python"
+indent = { tab-width=8, unit="\t" }
+
+[[language]]
+name = "markdown"
+soft-wrap = { enable = true }
diff --git a/.config/mpd/mpd.conf b/.config/mpd/mpd.conf
new file mode 100644
index 0000000..75fb00f
--- /dev/null
+++ b/.config/mpd/mpd.conf
@@ -0,0 +1,9 @@
+music_directory "~/Music"
+db_file "~/.config/mpd/database"
+auto_update "yes"
+port "6600"
+
+audio_output {
+ type "pipewire"
+ name "Pipewire Sound Server"
+}
diff --git a/.config/mpdscribble/mpdscribble.conf b/.config/mpdscribble/mpdscribble.conf
new file mode 100644
index 0000000..e4e19f1
--- /dev/null
+++ b/.config/mpdscribble/mpdscribble.conf
@@ -0,0 +1,4 @@
+[last.fm]
+url = "https://post.audioscrobbler.com"
+username = "Botahamec"
+password = "xP]@K]jTmpQ,3J!"
diff --git a/.config/rmpc/config.ron b/.config/rmpc/config.ron
new file mode 100644
index 0000000..d53316b
--- /dev/null
+++ b/.config/rmpc/config.ron
@@ -0,0 +1,175 @@
+#![enable(implicit_some)]
+#![enable(unwrap_newtypes)]
+#![enable(unwrap_variant_newtypes)]
+(
+ address: "127.0.0.1:6600",
+ password: None,
+ theme: None,
+ cache_dir: None,
+ lyrics_dir: "~/Music",
+ on_song_change: None,
+ volume_step: 5,
+ max_fps: 30,
+ scrolloff: 0,
+ wrap_navigation: false,
+ enable_mouse: true,
+ enable_config_hot_reload: true,
+ status_update_interval_ms: 1000,
+ rewind_to_start_sec: None,
+ keep_state_on_song_change: true,
+ reflect_changes_to_playlist: false,
+ select_current_song_on_change: false,
+ ignore_leading_the: false,
+ browser_song_sort: [Disc, Track, Artist, Title],
+ directories_sort: SortFormat(group_by_type: true, reverse: false),
+ album_art: (
+ method: Auto,
+ max_size_px: (width: 1200, height: 1200),
+ disabled_protocols: ["http://", "https://"],
+ vertical_align: Center,
+ horizontal_align: Center,
+ ),
+ keybinds: (
+ global: {
+ ":": CommandMode,
+ ",": VolumeDown,
+ "s": Stop,
+ ".": VolumeUp,
+ "<Tab>": NextTab,
+ "<S-Tab>": PreviousTab,
+ "1": SwitchToTab("1 Queue"),
+ "2": SwitchToTab("2 Artists"),
+ "3": SwitchToTab("3 Albums"),
+ "4": SwitchToTab("4 Playlists"),
+ "5": SwitchToTab("5 Search"),
+ "q": Quit,
+ ">": NextTrack,
+ "p": TogglePause,
+ "<": PreviousTrack,
+ "f": SeekForward,
+ "z": ToggleRepeat,
+ "x": ToggleRandom,
+ "c": ToggleConsume,
+ "v": ToggleSingle,
+ "b": SeekBack,
+ "?": ShowHelp,
+ "u": Update,
+ "U": Rescan,
+ "I": ShowCurrentSongInfo,
+ "O": ShowOutputs,
+ "P": ShowDecoders,
+ "R": AddRandom,
+ },
+ navigation: {
+ "k": Up,
+ "j": Down,
+ "h": Left,
+ "l": Right,
+ "<Up>": Up,
+ "<Down>": Down,
+ "<Left>": Left,
+ "<Right>": Right,
+ "<C-k>": PaneUp,
+ "<C-j>": PaneDown,
+ "<C-h>": PaneLeft,
+ "<C-l>": PaneRight,
+ "<C-u>": UpHalf,
+ "N": PreviousResult,
+ "a": Add,
+ "A": AddAll,
+ "r": Rename,
+ "n": NextResult,
+ "g": Top,
+ "<Space>": Select,
+ "<C-Space>": InvertSelection,
+ "G": Bottom,
+ "<CR>": Confirm,
+ "i": FocusInput,
+ "J": MoveDown,
+ "<C-d>": DownHalf,
+ "/": EnterSearch,
+ "<C-c>": Close,
+ "<Esc>": Close,
+ "K": MoveUp,
+ "D": Delete,
+ "B": ShowInfo,
+ "<C-z>": ContextMenu(),
+ "<C-s>": Save(kind: Modal(all: false, duplicates_strategy: Ask)),
+ },
+ queue: {
+ "D": DeleteAll,
+ "<CR>": Play,
+ "a": AddToPlaylist,
+ "d": Delete,
+ "C": JumpToCurrent,
+ "X": Shuffle,
+ },
+ ),
+ search: (
+ case_sensitive: false,
+ ignore_diacritics: false,
+ search_button: false,
+ mode: Contains,
+ tags: [
+ (value: "any", label: "Any Tag"),
+ (value: "artist", label: "Artist"),
+ (value: "album", label: "Album"),
+ (value: "albumartist", label: "Album Artist"),
+ (value: "title", label: "Title"),
+ (value: "filename", label: "Filename"),
+ (value: "genre", label: "Genre"),
+ ],
+ ),
+ artists: (
+ album_display_mode: SplitByDate,
+ album_sort_by: Date,
+ album_date_tags: [Date],
+ ),
+ tabs: [
+ (
+ name: "1 Queue",
+ pane: Split(
+ direction: Horizontal,
+ panes: [
+ (
+ size: "40%",
+ pane: Split(
+ direction: Vertical,
+ panes: [
+ (
+ size: "3",
+ pane: Pane(Lyrics)
+ ),
+ (
+ size: "100%",
+ pane: Pane(AlbumArt)
+ ),
+ ],
+ ),
+ ),
+ (
+ size: "60%",
+ pane: Pane(Queue)
+ ),
+ ],
+ ),
+ ),
+ (
+ name: "2 Artists",
+ pane: Pane(AlbumArtists),
+ ),
+ (
+ name: "3 Albums",
+ pane: Pane(Albums),
+ ),
+ (
+ name: "4 Playlists",
+ pane: Pane(Playlists),
+ ),
+ (
+ name: "5 Search",
+ pane: Pane(Search),
+ ),
+ ],
+)
+
diff --git a/.gitconfig b/.gitconfig
new file mode 100644
index 0000000..017b981
--- /dev/null
+++ b/.gitconfig
@@ -0,0 +1,10 @@
+[user]
+ name = Mica White
+ email = botahamec@outlook.com
+ signingkey = 552EE5463ED911BE778971888D68F806996D90E8
+[init]
+ defaultBranch = main
+[commit]
+ gpgSign = true
+[pull]
+ ff = only
diff --git a/.newsboat/urls b/.newsboat/urls
new file mode 100644
index 0000000..26e6a75
--- /dev/null
+++ b/.newsboat/urls
@@ -0,0 +1 @@
+https://archlinux.org/feeds/news/