summaryrefslogtreecommitdiff
path: root/.config/fish/functions
diff options
context:
space:
mode:
Diffstat (limited to '.config/fish/functions')
-rw-r--r--.config/fish/functions/__abbr_tips_bind_newline.fish10
-rw-r--r--.config/fish/functions/__abbr_tips_bind_space.fish11
-rw-r--r--.config/fish/functions/__abbr_tips_init.fish24
-rw-r--r--.config/fish/functions/__mm_dependencies.fish78
-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.fish30
-rw-r--r--.config/fish/functions/_fzf_preview_file.fish43
-rw-r--r--.config/fish/functions/_fzf_report_diff_type.fish16
-rw-r--r--.config/fish/functions/_fzf_report_file_type.fish6
-rw-r--r--.config/fish/functions/_fzf_search_directory.fish44
-rw-r--r--.config/fish/functions/_fzf_search_git_log.fish28
-rw-r--r--.config/fish/functions/_fzf_search_git_status.fish34
-rw-r--r--.config/fish/functions/_fzf_search_history.fish30
-rw-r--r--.config/fish/functions/_fzf_search_processes.fish28
-rw-r--r--.config/fish/functions/_fzf_search_variables.fish46
-rw-r--r--.config/fish/functions/_fzf_wrapper.fish20
-rw-r--r--.config/fish/functions/_tide_1_line_prompt.fish19
-rw-r--r--.config/fish/functions/_tide_2_line_prompt.fish31
-rw-r--r--.config/fish/functions/_tide_cache_variables.fish17
-rw-r--r--.config/fish/functions/_tide_detect_os.fish75
-rw-r--r--.config/fish/functions/_tide_find_and_remove.fish3
-rw-r--r--.config/fish/functions/_tide_item_aws.fish11
-rw-r--r--.config/fish/functions/_tide_item_character.fish17
-rw-r--r--.config/fish/functions/_tide_item_chruby.fish3
-rw-r--r--.config/fish/functions/_tide_item_cmd_duration.fish11
-rw-r--r--.config/fish/functions/_tide_item_context.fish9
-rw-r--r--.config/fish/functions/_tide_item_docker.fish5
-rw-r--r--.config/fish/functions/_tide_item_git.fish67
-rw-r--r--.config/fish/functions/_tide_item_go.fish3
-rw-r--r--.config/fish/functions/_tide_item_java.fish3
-rw-r--r--.config/fish/functions/_tide_item_jobs.fish3
-rw-r--r--.config/fish/functions/_tide_item_kubectl.fish4
-rw-r--r--.config/fish/functions/_tide_item_nix_shell.fish3
-rw-r--r--.config/fish/functions/_tide_item_node.fish3
-rw-r--r--.config/fish/functions/_tide_item_os.fish3
-rw-r--r--.config/fish/functions/_tide_item_php.fish3
-rw-r--r--.config/fish/functions/_tide_item_private_mode.fish3
-rw-r--r--.config/fish/functions/_tide_item_rustc.fish3
-rw-r--r--.config/fish/functions/_tide_item_shlvl.fish4
-rw-r--r--.config/fish/functions/_tide_item_status.fish15
-rw-r--r--.config/fish/functions/_tide_item_terraform.fish6
-rw-r--r--.config/fish/functions/_tide_item_time.fish3
-rw-r--r--.config/fish/functions/_tide_item_toolbox.fish3
-rw-r--r--.config/fish/functions/_tide_item_vi_mode.fish16
-rw-r--r--.config/fish/functions/_tide_item_virtual_env.fish11
-rw-r--r--.config/fish/functions/_tide_print_item.fish22
-rw-r--r--.config/fish/functions/_tide_pwd.fish37
-rw-r--r--.config/fish/functions/_tide_remove_unusable_items.fish21
-rw-r--r--.config/fish/functions/_tide_sub_bug-report.fish73
-rw-r--r--.config/fish/functions/_tide_sub_configure.fish95
-rw-r--r--.config/fish/functions/fish_mode_prompt.fish1
-rw-r--r--.config/fish/functions/fish_prompt.fish87
-rw-r--r--.config/fish/functions/fisher.fish578
-rw-r--r--.config/fish/functions/fzf_configure_bindings.fish46
-rw-r--r--.config/fish/functions/git_pull_all.fish7
-rw-r--r--.config/fish/functions/git_sync_all.fish6
-rw-r--r--.config/fish/functions/mm.fish153
-rw-r--r--.config/fish/functions/prometeo-jenkins.fish3
-rw-r--r--.config/fish/functions/prometeo.fish2
-rw-r--r--.config/fish/functions/spark.fish33
-rw-r--r--.config/fish/functions/tide.fish27
-rw-r--r--.config/fish/functions/tide/configure/choices/all/finish.fish33
-rw-r--r--.config/fish/functions/tide/configure/choices/all/icons.fish33
-rw-r--r--.config/fish/functions/tide/configure/choices/all/prompt_colors.fish26
-rw-r--r--.config/fish/functions/tide/configure/choices/all/prompt_connection.fish28
-rw-r--r--.config/fish/functions/tide/configure/choices/all/prompt_connection_andor_frame_color.fish36
-rw-r--r--.config/fish/functions/tide/configure/choices/all/prompt_spacing.fish21
-rw-r--r--.config/fish/functions/tide/configure/choices/all/show_time.fish31
-rw-r--r--.config/fish/functions/tide/configure/choices/all/style.fish57
-rw-r--r--.config/fish/functions/tide/configure/choices/classic/classic_prompt_color.fish38
-rw-r--r--.config/fish/functions/tide/configure/choices/classic/classic_prompt_separators.fish40
-rw-r--r--.config/fish/functions/tide/configure/choices/lean/lean_prompt_height.fish26
-rw-r--r--.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_frame.fish46
-rw-r--r--.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_heads.fish40
-rw-r--r--.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_height.fish30
-rw-r--r--.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_tails.fish48
-rw-r--r--.config/fish/functions/tide/configure/choices/rainbow/rainbow_prompt_separators.fish40
-rw-r--r--.config/fish/functions/tide/configure/configs/classic.fish129
-rw-r--r--.config/fish/functions/tide/configure/configs/classic_16color.fish73
-rw-r--r--.config/fish/functions/tide/configure/configs/lean.fish129
-rw-r--r--.config/fish/functions/tide/configure/configs/lean_16color.fish73
-rw-r--r--.config/fish/functions/tide/configure/configs/rainbow.fish129
-rw-r--r--.config/fish/functions/tide/configure/configs/rainbow_16color.fish77
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_cache_variables.fish41
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_character.fish5
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_cmd_duration.fish3
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_git.fish3
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_newline.fish5
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_os.fish3
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_item_time.fish3
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_print_item.fish22
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_prompt.fish42
-rw-r--r--.config/fish/functions/tide/configure/functions/_fake_tide_pwd.fish11
94 files changed, 2990 insertions, 385 deletions
diff --git a/.config/fish/functions/__abbr_tips_bind_newline.fish b/.config/fish/functions/__abbr_tips_bind_newline.fish
new file mode 100644
index 00000000..8cc8992c
--- /dev/null
+++ b/.config/fish/functions/__abbr_tips_bind_newline.fish
@@ -0,0 +1,10 @@
+function __abbr_tips_bind_newline
+ if test $__abbr_tips_used != 1
+ if abbr -q -- (string trim -- (commandline))
+ set -g __abbr_tips_used 1
+ else
+ set -g __abbr_tips_used 0
+ end
+ end
+ commandline -f 'execute'
+end
diff --git a/.config/fish/functions/__abbr_tips_bind_space.fish b/.config/fish/functions/__abbr_tips_bind_space.fish
new file mode 100644
index 00000000..0f371030
--- /dev/null
+++ b/.config/fish/functions/__abbr_tips_bind_space.fish
@@ -0,0 +1,11 @@
+function __abbr_tips_bind_space
+ commandline -i " "
+ if test $__abbr_tips_used != 1
+ if abbr -q -- (string trim -- (commandline))
+ set -g __abbr_tips_used 1
+ else
+ set -g __abbr_tips_used 0
+ end
+ end
+ commandline -f 'expand-abbr'
+end
diff --git a/.config/fish/functions/__abbr_tips_init.fish b/.config/fish/functions/__abbr_tips_init.fish
new file mode 100644
index 00000000..9cda53ad
--- /dev/null
+++ b/.config/fish/functions/__abbr_tips_init.fish
@@ -0,0 +1,24 @@
+function __abbr_tips_init -d "Initialize abbreviations variables for fish-abbr-tips"
+ set -e __ABBR_TIPS_KEYS
+ set -e __ABBR_TIPS_VALUES
+ set -Ux __ABBR_TIPS_KEYS
+ set -Ux __ABBR_TIPS_VALUES
+
+ set -l i 1
+ set -l abb (string replace -r '.*-- ' '' -- (abbr -s))
+ while test $i -le (count $abb)
+ set -l current_abb (string split -m1 -- ' ' "$abb[$i]")
+ set -a __ABBR_TIPS_KEYS "$current_abb[1]"
+ set -a __ABBR_TIPS_VALUES (string trim -c '\'' -- "$current_abb[2]")
+ set i (math $i + 1)
+ end
+
+ set -l i 1
+ set -l abb (string replace -r '.*-- ' '' -- (alias -s))
+ while test $i -le (count $abb)
+ set -l current_abb (string split -m2 -- ' ' "$abb[$i]")
+ set -a __ABBR_TIPS_KEYS "a__$current_abb[2]"
+ set -a __ABBR_TIPS_VALUES (string trim -c '\'' -- "$current_abb[3]")
+ set i (math $i + 1)
+ end
+end
diff --git a/.config/fish/functions/__mm_dependencies.fish b/.config/fish/functions/__mm_dependencies.fish
new file mode 100644
index 00000000..41fd0560
--- /dev/null
+++ b/.config/fish/functions/__mm_dependencies.fish
@@ -0,0 +1,78 @@
+function __mm_confirm --description 'Confirm' --argument prompt
+ if test -z "$prompt"
+ set prompt "Continue?"
+ end
+
+ while true
+ read -p 'echo -ne "$prompt ["; set_color green; echo -ne "y"; set_color normal; echo -ne "/"; set_color red; echo -ne "N"; set_color normal; echo -ne "]: "; ' -l confirm
+
+ switch $confirm
+ case Y y
+ return 0
+ case '' N n
+ return 1
+ end
+ end
+end
+
+function __mm_echo --argument color --argument text --argument no_newline
+ set_color $color;
+ if test -n "$no_newline"
+ echo -ne $text
+ else
+ echo $text
+ end
+ set_color normal;
+end
+
+function __mm_check_dependencies
+ if type -q "fzf"
+ return 0
+ else
+ return 1
+ end
+end
+
+
+function __mm_install_dependencies
+ if __mm_check_dependencies
+ echo ""
+ __mm_echo green "Dependencies already installed"
+ echo ""
+ return 0
+ else
+ echo ""
+ echo "MakeMeFish is dependent of fzf - the command line fuzzy finder."
+ if __mm_confirm "fzf is not installed. Would you like to install fzf?"
+ switch (uname)
+ case Linux Darwin
+ if type -q "brew"
+ if __mm_confirm "You are using brew - would you like to install fzf through brew?"
+ echo (brew install fzf)
+ return 0
+ end
+ end
+ case FreeBSD NetBSD DragonFly
+ echo (pkg install fzf)
+ return 0
+ case '*'
+ echo "Unknown OS"
+ end
+ __mm_echo red "Could not install automatically."
+ end
+ echo -ne "Go to "; __mm_echo blue "https://github.com/junegunn/fzf#installation" 1; echo -ne " and follow the instructions for your environment."
+ return 1
+ end
+end
+
+function __mm_dependencies
+ if __mm_check_dependencies
+ return 0
+ else
+ if __mm_install_dependencies true
+ return 0
+ else
+ return 1
+ end
+ end
+end \ No newline at end of file
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 00000000..1209e498
--- /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 [--FEATURE[=KEY_SEQUENCE]...]
+
+DESCRIPTION
+ By default, fzf_configure_bindings installs mnemonic key bindings for fzf.fish's features. Each
+ feature's binding can be customized through a corresponding namesake option:
+ FEATURE | MNEMONIC 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 variables | Ctrl+V (V for variable) | --variables
+ Search processes | Ctrl+Alt+P (P for process) | --processes
+ An option with a key sequence value overrides the binding for its feature, while an option
+ without a value disables the binding. A feature that is not customized retains its default
+ menomonic binding specified above. Key bindings are installed for default and insert modes.
+
+ In terms of validation, fzf_configure_bindings fails if passed unknown options. Furthermore, it
+ expects an equals sign between an option's name and value. However, it does not validate key
+ sequences. Rather, consider using fish_key_reader to manually validate them.
+
+ In terms of experimentation, fzf_configure_bindings erases any bindings it previously installed
+ before installing new ones so it can be repeatedly executed in the same fish session without
+ problem. Once the desired fzf_configure_bindings command has been found, add it to config.fish
+ in order to persist the bindings.
+
+ The -h and --help options print this help message.
+
+EXAMPLES
+ Install the default mnemonic bindings
+ \$ fzf_configure_bindings
+ Install the default bindings but override git log's binding to Ctrl+G
+ \$ fzf_configure_bindings --git_log=\cg
+ Install the default bindings but leave search history unbound
+ \$ fzf_configure_bindings --history
+ Alternative style of disabling search history
+ \$ fzf_configure_bindings --history=
+ An agglomeration of all the options
+ \$ fzf_configure_bindings --git_status=\cg --history=\ch --variables --directory --git_log
+"
+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 00000000..dd4e9523
--- /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 00000000..c6e8c3d9
--- /dev/null
+++ b/.config/fish/functions/_fzf_preview_changed_file.fish
@@ -0,0 +1,30 @@
+# 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.md -> LICENSE
+function _fzf_preview_changed_file --description "Show the untracked, staged, and/or unstaged changes in the given file."
+ set -l path (string split ' ' $argv)[-1]
+ # first letter of short format shows index, second letter shows working tree
+ # https://git-scm.com/docs/git-status/2.35.0#_output
+ set -l index_status (string sub --length 1 $argv)
+ set -l working_tree_status (string sub --start 2 --length 1 $argv)
+
+ if test $index_status = '?'
+ _fzf_report_diff_type Untracked
+ _fzf_preview_file $path
+ else
+ # no-prefix because the file is always being compared to itself so is unecessary
+ set diff_opts --color=always --no-prefix
+
+ if test $index_status != ' '
+ _fzf_report_diff_type Staged
+ git diff --staged $diff_opts -- $path
+ 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 00000000..eaa68d05
--- /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 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 00000000..1edef783
--- /dev/null
+++ b/.config/fish/functions/_fzf_report_diff_type.fish
@@ -0,0 +1,16 @@
+# 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 repeat_count (math 2 + (string length $diff_type))
+ set horizontal_border +(string repeat --count $repeat_count -)+
+
+ set_color yellow
+ echo $horizontal_border
+ echo "| $diff_type |"
+ echo $horizontal_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 00000000..49e02e1c
--- /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 00000000..fee63085
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_directory.fish
@@ -0,0 +1,44 @@
+function _fzf_search_directory --description "Search the current directory. Replace the current token with the selected file paths."
+ # --string-cwd-prefix prevents fd >= 8.3.0 from prepending ./ to relative paths
+ set fd_opts --color=always --strip-cwd-prefix $fzf_fd_opts
+
+ set fzf_arguments --multi --ansi $fzf_dir_opts
+ set token (commandline --current-token)
+ # expand any variables or leading tilde (~) in the token
+ set expanded_token (eval echo -- $token)
+ # unescape token because it's already quoted so backslashes will mess up the path
+ set 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_opts --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="$unescaped_exp_token" --preview="_fzf_preview_file $expanded_token{}"
+ set file_paths_selected $unescaped_exp_token(fd $fd_opts 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ else
+ set --prepend fzf_arguments --query="$unescaped_exp_token" --preview='_fzf_preview_file {}'
+ set file_paths_selected (fd $fd_opts 2>/dev/null | _fzf_wrapper $fzf_arguments)
+ end
+
+
+ if test $status -eq 0
+ # Fish will cd implicitly if a directory name ending in a slash is provided.
+ # To help the user leverage this feature, we automatically append / to the selected path if
+ # - only one path was selected,
+ # - the user was in the middle of inputting the first token,
+ # - the path is a directory
+ # Then, the user only needs to hit Enter once more to cd into that directory.
+ if test (count $file_paths_selected) = 1
+ set commandline_tokens (commandline --tokenize)
+ if test "$commandline_tokens" = "$token" -a -d "$file_paths_selected" \
+ -a (fd --version | string replace --regex --all '[^\d]' '') -lt 840
+ set file_paths_selected $file_paths_selected/
+ end
+ end
+
+ 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 00000000..3375c1d9
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_log.fish
@@ -0,0 +1,28 @@
+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
+ # see documentation for git format placeholders at https://git-scm.com/docs/git-log#Documentation/git-log.txt-emnem
+ # %h gives you the abbreviated commit hash, which is useful for saving screen space, but we will have to expand it later below
+ set log_fmt_str '%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)'
+ set selected_log_lines (
+ git log --color=always --format=format:$log_fmt_str --date=short | \
+ _fzf_wrapper --ansi \
+ --multi \
+ --tiebreak=index \
+ --preview='git show --color=always --stat --patch {1}' \
+ --query=(commandline --current-token) \
+ $fzf_git_log_opts
+ )
+ if test $status -eq 0
+ for line in $selected_log_lines
+ set abbreviated_commit_hash (string split --field 1 " " $line)
+ set full_commit_hash (git rev-parse $abbreviated_commit_hash)
+ set --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 00000000..f8ae3759
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_git_status.fish
@@ -0,0 +1,34 @@
+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 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 \
+ --query=(commandline --current-token) \
+ --preview='_fzf_preview_changed_file {}' \
+ $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 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 00000000..d795c5c7
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_history.fish
@@ -0,0 +1,30 @@
+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
+
+ # Delinate commands throughout pipeline using null rather than newlines because commands can be multi-line
+ set commands_selected (
+ # Reference https://devhints.io/strftime to understand strftime format symbols
+ builtin history --null --show-time="%m-%d %H:%M:%S │ " |
+ _fzf_wrapper --read0 \
+ --print0 \
+ --multi \
+ --tiebreak=index \
+ --query=(commandline) \
+ --preview="echo -- {4..} | fish_indent --ansi" \
+ --preview-window="bottom:3:wrap" \
+ $fzf_history_opts |
+ string split0 |
+ # remove timestamps from commands selected
+ string replace --regex '^\d\d-\d\d \d\d:\d\d:\d\d │ ' ''
+ )
+
+ 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 00000000..e3ef59fd
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_processes.fish
@@ -0,0 +1,28 @@
+function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
+ # 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 ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
+ set processes_selected (
+ ps -A -opid,command | \
+ _fzf_wrapper --multi \
+ --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 -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 --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 00000000..744f2262
--- /dev/null
+++ b/.config/fish/functions/_fzf_search_variables.fish
@@ -0,0 +1,46 @@
+# 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 all_variable_names (string match --invert history <$set_names_output)
+
+ set 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 cleaned_curr_token (string replace -- '$' '' $current_token)
+
+ set variable_names_selected (
+ printf '%s\n' $all_variable_names |
+ _fzf_wrapper --preview "_fzf_extract_var_info {} $set_show_output" \
+ --preview-window="wrap" \
+ --multi \
+ --query=$cleaned_curr_token \
+ $fzf_shell_vars_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 00000000..a9287016
--- /dev/null
+++ b/.config/fish/functions/_fzf_wrapper.fish
@@ -0,0 +1,20 @@
+function _fzf_wrapper --description "Prepares some environment variables before executing fzf."
+ # Make sure fzf uses fish to execute preview commands, some of which
+ # are autoloaded fish functions so don't exist in other shells.
+ # Use --local so that it doesn't clobber SHELL outside of this function.
+ set --local --export SHELL (command --search fish)
+
+ # If FZF_DEFAULT_OPTS is not set, then set some sane defaults.
+ # See https://github.com/junegunn/fzf#environment-variables
+ if not set --query FZF_DEFAULT_OPTS
+ # cycle allows jumping between the first and last results, making scrolling faster
+ # layout=reverse lists results top to bottom, mimicking the familiar layouts of git log, history, and env
+ # border shows where the fzf window begins and ends
+ # height=90% leaves space to see the current command and some scrollback, maintaining context of work
+ # preview-window=wrap wraps long lines in the preview window, making reading easier
+ # marker=* makes the multi-select marker more distinguishable from the pointer (since both default to >)
+ set --export FZF_DEFAULT_OPTS '--cycle --layout=reverse --border --height=90% --preview-window=wrap --marker="*"'
+ end
+
+ fzf $argv
+end
diff --git a/.config/fish/functions/_tide_1_line_prompt.fish b/.config/fish/functions/_tide_1_line_prompt.fish
new file mode 100644
index 00000000..57722237
--- /dev/null
+++ b/.config/fish/functions/_tide_1_line_prompt.fish
@@ -0,0 +1,19 @@
+function _tide_1_line_prompt
+ set -g add_prefix
+ _tide_side=left for item in $_tide_left_items
+ _tide_item_$item
+ end
+ set_color $prev_bg_color -b normal
+ echo $tide_left_prompt_suffix
+
+ set -g add_prefix
+ _tide_side=right for item in $_tide_right_items
+ _tide_item_$item
+ end
+ set_color $prev_bg_color -b normal
+ echo $tide_right_prompt_suffix
+end
+
+function _tide_item_pwd
+ _tide_print_item pwd @PWD@
+end
diff --git a/.config/fish/functions/_tide_2_line_prompt.fish b/.config/fish/functions/_tide_2_line_prompt.fish
new file mode 100644
index 00000000..e9017af4
--- /dev/null
+++ b/.config/fish/functions/_tide_2_line_prompt.fish
@@ -0,0 +1,31 @@
+function _tide_2_line_prompt
+ set -g add_prefix
+ _tide_side=left for item in $_tide_left_items
+ _tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo $tide_left_prompt_suffix
+ end
+
+ echo
+
+ set -g add_prefix
+ _tide_side=right for item in $_tide_right_items
+ _tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo $tide_right_prompt_suffix
+ end
+end
+
+function _tide_item_pwd
+ _tide_print_item pwd @PWD@
+end
+
+function _tide_item_newline
+ set_color $prev_bg_color -b normal
+ v=tide_"$_tide_side"_prompt_suffix echo $$v
+ set -g add_prefix
+end
diff --git a/.config/fish/functions/_tide_cache_variables.fish b/.config/fish/functions/_tide_cache_variables.fish
new file mode 100644
index 00000000..31e38507
--- /dev/null
+++ b/.config/fish/functions/_tide_cache_variables.fish
@@ -0,0 +1,17 @@
+function _tide_cache_variables
+ # Same-color-separator color
+ set_color $tide_prompt_color_separator_same_color | read -gx _tide_color_separator_same_color
+
+ # git
+ contains git $_tide_left_items $_tide_right_items && set_color $tide_git_color_branch | read -gx _tide_location_color
+
+ # private_mode
+ if contains private_mode $_tide_left_items $_tide_right_items && test -n "$fish_private_mode"
+ set -gx _tide_private_mode
+ else
+ set -e _tide_private_mode
+ end
+
+ # item padding
+ test "$tide_prompt_pad_items" = true && set -gx _tide_pad ' ' || set -e _tide_pad
+end
diff --git a/.config/fish/functions/_tide_detect_os.fish b/.config/fish/functions/_tide_detect_os.fish
new file mode 100644
index 00000000..5d960535
--- /dev/null
+++ b/.config/fish/functions/_tide_detect_os.fish
@@ -0,0 +1,75 @@
+# Outputs icon, color, bg_color
+function _tide_detect_os
+ set -lx defaultColor 080808 CED7CF
+ switch (uname | string lower)
+ case darwin
+ printf %s\n  D6D6D6 333333 # from apple.com header
+ case freebsd openbsd dragonfly
+ printf %s\n  FFFFFF AB2B28 # https://freebsdfoundation.org/about-us/about-the-foundation/project/
+ case 'cygwin*'
+ printf %s\n  FFFFFF 00CCFF # https://answers.microsoft.com/en-us/windows/forum/all/what-is-the-official-windows-8-blue-rgb-or-hex/fd57144b-f69b-42d8-8c21-6ca911646e44
+ case linux
+ if test (uname -o) = Android
+ echo ﲎ # This character is evil and messes up code display, so it's put on its own line
+ # https://developer.android.com/distribute/marketing-tools/brand-guidelines
+ printf %s\n 3DDC84 3C3F41 # fg is from above link, bg is from Android Studio default dark theme
+ else
+ _tide_detect_os_linux_cases /etc/os-release ID ||
+ _tide_detect_os_linux_cases /etc/os-release ID_LIKE ||
+ _tide_detect_os_linux_cases /etc/lsb-release DISTRIB_ID ||
+ printf %s\n  $defaultColor
+ end
+ case '*'
+ echo -ns '?'
+ end
+end
+
+function _tide_detect_os_linux_cases -a file key
+ test -e $file || return
+ set -l split_file (string split '=' <$file)
+ set -l key_index (contains --index $key $split_file) || return
+ set -l value (string trim --chars='"' $split_file[(math $key_index + 1)])
+
+ # Anything which would have pure white background has been changed to D4D4D4
+ # It was just too bright otherwise
+ switch (string lower $value)
+ case alpine
+ printf %s\n  FFFFFF 0D597F # from alpine logo
+ case arch
+ printf %s\n  1793D1 4D4D4D # from arch wiki header
+ case centos
+ printf %s\n  000000 D4D4D4 # https://wiki.centos.org/ArtWork/Brand/Logo, monochromatic
+ case debian
+ printf %s\n  C70036 D4D4D4 # from debian logo https://www.debian.org/logos/openlogo-nd-100.png
+ case devuan
+ printf %s\n  $defaultColor # logo is monochromatic
+ case elementary
+ printf %s\n  000000 D4D4D4 # https://elementary.io/brand, encouraged to be monochromatic
+ case fedora
+ printf %s\n  FFFFFF 294172 # from logo https://fedoraproject.org/w/uploads/2/2d/Logo_fedoralogo.png
+ case gentoo
+ printf %s\n  FFFFFF 54487A # https://wiki.gentoo.org/wiki/Project:Artwork/Colors
+ case mageia
+ printf %s\n  FFFFFF 262F45 # https://wiki.mageia.org/en/Artwork_guidelines
+ case manjaro
+ printf %s\n  FFFFFF 35BF5C # from https://gitlab.manjaro.org/artwork/branding/logo/-/blob/master/logo.svg
+ case mint
+ printf %s\n  FFFFFF 69B53F # extracted from https://linuxmint.com/web/img/favicon.ico
+ case nixos
+ printf %s\n  FFFFFF 5277C3 # https://github.com/NixOS/nixos-artwork/tree/master/logo
+ case opensuse-leap opensuse-tumbleweed
+ printf %s\n  73BA25 173f4f # https://en.opensuse.org/openSUSE:Artwork_brand
+ case raspbian
+ printf %s\n  FFFFFF A22846 # https://static.raspberrypi.org/files/Raspberry_Pi_Visual_Guidelines_2020.pdf
+ case rhel
+ printf %s\n  EE0000 000000 # https://www.redhat.com/en/about/brand/standards/color
+ case sabayon
+ printf %s\n  $defaultColor # Can't find colors, and they are rebranding anyway
+ case slackware
+ printf %s\n  $defaultColor # Doesn't really have a logo, and the colors are too close to PWD blue anyway
+ case ubuntu
+ printf %s\n  E95420 D4D4D4 # https://design.ubuntu.com/brand/
+ case '*'
+ return 1
+ end
+end
diff --git a/.config/fish/functions/_tide_find_and_remove.fish b/.config/fish/functions/_tide_find_and_remove.fish
new file mode 100644
index 00000000..29f21808
--- /dev/null
+++ b/.config/fish/functions/_tide_find_and_remove.fish
@@ -0,0 +1,3 @@
+function _tide_find_and_remove -a name list --no-scope-shadowing
+ contains --index $name $$list | read -l index && set -e "$list"[$index]
+end
diff --git a/.config/fish/functions/_tide_item_aws.fish b/.config/fish/functions/_tide_item_aws.fish
new file mode 100644
index 00000000..7cb6338e
--- /dev/null
+++ b/.config/fish/functions/_tide_item_aws.fish
@@ -0,0 +1,11 @@
+function _tide_item_aws
+ # AWS_PROFILE overrides AWS_DEFAULT_PROFILE, AWS_REGION overrides AWS_DEFAULT_REGION
+ set -q AWS_PROFILE && set -l AWS_DEFAULT_PROFILE $AWS_PROFILE
+ set -q AWS_REGION && set -l AWS_DEFAULT_REGION $AWS_REGION
+
+ if test -n "$AWS_DEFAULT_PROFILE" && test -n "$AWS_DEFAULT_REGION"
+ _tide_print_item aws $tide_aws_icon' ' "$AWS_DEFAULT_PROFILE/$AWS_DEFAULT_REGION"
+ else if test -n "$AWS_DEFAULT_PROFILE$AWS_DEFAULT_REGION"
+ _tide_print_item aws $tide_aws_icon' ' "$AWS_DEFAULT_PROFILE$AWS_DEFAULT_REGION"
+ end
+end
diff --git a/.config/fish/functions/_tide_item_character.fish b/.config/fish/functions/_tide_item_character.fish
new file mode 100644
index 00000000..10bb3244
--- /dev/null
+++ b/.config/fish/functions/_tide_item_character.fish
@@ -0,0 +1,17 @@
+function _tide_item_character
+ test $_tide_status = 0 && set_color $tide_character_color || set_color $tide_character_color_failure
+
+ set -q add_prefix || echo -ns ' '
+
+ test "$fish_key_bindings" = fish_default_key_bindings && echo -ns $tide_character_icon ||
+ switch $fish_bind_mode
+ case insert
+ echo -ns $tide_character_icon
+ case default
+ echo -ns $tide_character_vi_icon_default
+ case replace replace_one
+ echo -ns $tide_character_vi_icon_replace
+ case visual
+ echo -ns $tide_character_vi_icon_visual
+ end
+end
diff --git a/.config/fish/functions/_tide_item_chruby.fish b/.config/fish/functions/_tide_item_chruby.fish
new file mode 100644
index 00000000..02d5fbd9
--- /dev/null
+++ b/.config/fish/functions/_tide_item_chruby.fish
@@ -0,0 +1,3 @@
+function _tide_item_chruby
+ test -n "$RUBY_VERSION" && _tide_print_item chruby $tide_chruby_icon' ' $RUBY_VERSION
+end
diff --git a/.config/fish/functions/_tide_item_cmd_duration.fish b/.config/fish/functions/_tide_item_cmd_duration.fish
new file mode 100644
index 00000000..f7b9db61
--- /dev/null
+++ b/.config/fish/functions/_tide_item_cmd_duration.fish
@@ -0,0 +1,11 @@
+function _tide_item_cmd_duration
+ test $CMD_DURATION -gt $tide_cmd_duration_threshold && time=(math --scale=0 "$CMD_DURATION/3600000" # Hours
+ math --scale=0 "$CMD_DURATION/60000"%60 # Minutes
+ math --scale=$tide_cmd_duration_decimals "$CMD_DURATION/1000"%60) if test $time[1] != 0
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$time[1]h $time[2]m $time[3]s"
+ else if test $time[2] != 0
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$time[2]m $time[3]s"
+ else
+ _tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$time[3]s"
+ end
+end
diff --git a/.config/fish/functions/_tide_item_context.fish b/.config/fish/functions/_tide_item_context.fish
new file mode 100644
index 00000000..9dfa56d7
--- /dev/null
+++ b/.config/fish/functions/_tide_item_context.fish
@@ -0,0 +1,9 @@
+function _tide_item_context
+ if set -q SSH_TTY
+ tide_context_color=$tide_context_color_ssh _tide_print_item context $USER@$hostname
+ else if test "$EUID" = 0
+ tide_context_color=$tide_context_color_root _tide_print_item context $USER@$hostname
+ else if test "$tide_context_always_display" = true
+ tide_context_color=$tide_context_color_default _tide_print_item context $USER@$hostname
+ end
+end
diff --git a/.config/fish/functions/_tide_item_docker.fish b/.config/fish/functions/_tide_item_docker.fish
new file mode 100644
index 00000000..4eec0bff
--- /dev/null
+++ b/.config/fish/functions/_tide_item_docker.fish
@@ -0,0 +1,5 @@
+function _tide_item_docker
+ docker context inspect --format '{{.Name}}' | read -l context
+ contains -- "$context" $tide_docker_default_contexts ||
+ _tide_print_item docker $tide_docker_icon' ' $context
+end
diff --git a/.config/fish/functions/_tide_item_git.fish b/.config/fish/functions/_tide_item_git.fish
new file mode 100644
index 00000000..9fca6d0e
--- /dev/null
+++ b/.config/fish/functions/_tide_item_git.fish
@@ -0,0 +1,67 @@
+function _tide_item_git
+ if git branch --show-current 2>/dev/null | string replace -r "(.{$tide_git_truncation_length}).+" '$1…' | read -l location
+ git rev-parse --git-dir --is-inside-git-dir | read -fL gdir in_gdir
+ set location $_tide_location_color$location
+ else if test $pipestatus[1] != 0
+ return
+ else if git tag --points-at HEAD | string replace -r "(.{$tide_git_truncation_length}).+" '$1…' | read location
+ git rev-parse --git-dir --is-inside-git-dir | read -fL gdir in_gdir
+ set location '#'$_tide_location_color$location
+ else
+ git rev-parse --git-dir --is-inside-git-dir --short HEAD | read -fL gdir in_gdir location
+ set location @$_tide_location_color$location
+ end
+
+ # Operation
+ if test -d $gdir/rebase-merge
+ read -f step <$gdir/rebase-merge/msgnum
+ read -f total_steps <$gdir/rebase-merge/end
+ test -f $gdir/rebase-merge/interactive && set -f operation rebase-i || set -f operation rebase-m
+ else if test -d $gdir/rebase-apply
+ read -f step <$gdir/rebase-apply/next
+ read -f total_steps <$gdir/rebase-apply/last
+ if test -f $gdir/rebase-apply/rebasing
+ set -f operation rebase
+ else if test -f $gdir/rebase-apply/applying
+ set -f operation am
+ else
+ set -f operation am/rebase
+ end
+ else if test -f $gdir/MERGE_HEAD
+ set -f operation merge
+ else if test -f $gdir/CHERRY_PICK_HEAD
+ set -f operation cherry-pick
+ else if test -f $gdir/REVERT_HEAD
+ set -f operation revert
+ else if test -f $gdir/BISECT_LOG
+ set -f operation bisect
+ end
+
+ # Git status/stash + Upstream behind/ahead
+ test $in_gdir = true && set -l _set_dir_opt -C $gdir/..
+ # Suppress errors in case we are in a bare repo or there is no upstream
+ stat=(git $_set_dir_opt --no-optional-locks status --porcelain 2>/dev/null) \
+ string match -qr '(0|(?<stash>.*))\n(0|(?<conflicted>.*))\n(0|(?<staged>.*))
+(0|(?<dirty>.*))\n(0|(?<untracked>.*))(\n(0|(?<behind>.*))\t(0|(?<ahead>.*)))?' \
+ "$(git $_set_dir_opt stash list 2>/dev/null | count
+ string match -r ^UU $stat | count
+ string match -r ^[ADMR]. $stat | count
+ string match -r ^.[ADMR] $stat | count
+ string match -r '^\?\?' $stat | count
+ git rev-list --count --left-right @{upstream}...HEAD 2>/dev/null)"
+
+ if test -n "$operation$conflicted"
+ set -g tide_git_bg_color $tide_git_bg_color_urgent
+ else if test -n "$staged$dirty$untracked"
+ set -g tide_git_bg_color $tide_git_bg_color_unstable
+ end
+
+ _tide_print_item git $_tide_location_color$tide_git_icon' ' (set_color white; echo -ns $location
+ set_color $tide_git_color_operation; echo -ns ' '$operation ' '$step/$total_steps
+ set_color $tide_git_color_upstream; echo -ns ' ⇣'$behind ' ⇡'$ahead
+ set_color $tide_git_color_stash; echo -ns ' *'$stash
+ set_color $tide_git_color_conflicted; echo -ns ' ~'$conflicted
+ set_color $tide_git_color_staged; echo -ns ' +'$staged
+ set_color $tide_git_color_dirty; echo -ns ' !'$dirty
+ set_color $tide_git_color_untracked; echo -ns ' ?'$untracked)
+end
diff --git a/.config/fish/functions/_tide_item_go.fish b/.config/fish/functions/_tide_item_go.fish
new file mode 100644
index 00000000..304acc52
--- /dev/null
+++ b/.config/fish/functions/_tide_item_go.fish
@@ -0,0 +1,3 @@
+function _tide_item_go
+ test -e go.mod && _tide_print_item go $tide_go_icon' ' (go version | string match -r "[\d.]+")
+end
diff --git a/.config/fish/functions/_tide_item_java.fish b/.config/fish/functions/_tide_item_java.fish
new file mode 100644
index 00000000..88d0ea6e
--- /dev/null
+++ b/.config/fish/functions/_tide_item_java.fish
@@ -0,0 +1,3 @@
+function _tide_item_java
+ test -e pom.xml && _tide_print_item java $tide_java_icon' ' (java -version &| string match -r "[\d.]+")[1]
+end
diff --git a/.config/fish/functions/_tide_item_jobs.fish b/.config/fish/functions/_tide_item_jobs.fish
new file mode 100644
index 00000000..96cf902c
--- /dev/null
+++ b/.config/fish/functions/_tide_item_jobs.fish
@@ -0,0 +1,3 @@
+function _tide_item_jobs
+ set -q _tide_jobs && _tide_print_item jobs $tide_jobs_icon
+end
diff --git a/.config/fish/functions/_tide_item_kubectl.fish b/.config/fish/functions/_tide_item_kubectl.fish
new file mode 100644
index 00000000..ab044b33
--- /dev/null
+++ b/.config/fish/functions/_tide_item_kubectl.fish
@@ -0,0 +1,4 @@
+function _tide_item_kubectl
+ kubectl config view --minify --output 'jsonpath={.current-context}/{..namespace}' 2>/dev/null | read -l context &&
+ _tide_print_item kubectl $tide_kubectl_icon' ' (string replace -r '/(|default)$' '' $context)
+end
diff --git a/.config/fish/functions/_tide_item_nix_shell.fish b/.config/fish/functions/_tide_item_nix_shell.fish
new file mode 100644
index 00000000..647f6066
--- /dev/null
+++ b/.config/fish/functions/_tide_item_nix_shell.fish
@@ -0,0 +1,3 @@
+function _tide_item_nix_shell
+ set -q IN_NIX_SHELL && _tide_print_item nix_shell $tide_nix_shell_icon' ' $IN_NIX_SHELL
+end
diff --git a/.config/fish/functions/_tide_item_node.fish b/.config/fish/functions/_tide_item_node.fish
new file mode 100644
index 00000000..90a929b0
--- /dev/null
+++ b/.config/fish/functions/_tide_item_node.fish
@@ -0,0 +1,3 @@
+function _tide_item_node
+ test -e package.json && _tide_print_item node $tide_node_icon' ' (node --version | string trim --chars=v)
+end
diff --git a/.config/fish/functions/_tide_item_os.fish b/.config/fish/functions/_tide_item_os.fish
new file mode 100644
index 00000000..8a6208c6
--- /dev/null
+++ b/.config/fish/functions/_tide_item_os.fish
@@ -0,0 +1,3 @@
+function _tide_item_os
+ _tide_print_item os $tide_os_icon
+end
diff --git a/.config/fish/functions/_tide_item_php.fish b/.config/fish/functions/_tide_item_php.fish
new file mode 100644
index 00000000..64fc59b6
--- /dev/null
+++ b/.config/fish/functions/_tide_item_php.fish
@@ -0,0 +1,3 @@
+function _tide_item_php
+ test -e composer.json && _tide_print_item php $tide_php_icon' ' (php --version | string match -r 'PHP ([\d.]+)')[2]
+end
diff --git a/.config/fish/functions/_tide_item_private_mode.fish b/.config/fish/functions/_tide_item_private_mode.fish
new file mode 100644
index 00000000..4eb4684d
--- /dev/null
+++ b/.config/fish/functions/_tide_item_private_mode.fish
@@ -0,0 +1,3 @@
+function _tide_item_private_mode
+ set -q _tide_private_mode && _tide_print_item private_mode $tide_private_mode_icon
+end
diff --git a/.config/fish/functions/_tide_item_rustc.fish b/.config/fish/functions/_tide_item_rustc.fish
new file mode 100644
index 00000000..b898e6f3
--- /dev/null
+++ b/.config/fish/functions/_tide_item_rustc.fish
@@ -0,0 +1,3 @@
+function _tide_item_rustc
+ test -e Cargo.toml && _tide_print_item rustc $tide_rustc_icon' ' (rustc --version | string split ' ')[2]
+end
diff --git a/.config/fish/functions/_tide_item_shlvl.fish b/.config/fish/functions/_tide_item_shlvl.fish
new file mode 100644
index 00000000..95dd5ff2
--- /dev/null
+++ b/.config/fish/functions/_tide_item_shlvl.fish
@@ -0,0 +1,4 @@
+function _tide_item_shlvl
+ # Non-interactive shells do not increment SHLVL, so we don't need to subtract 1
+ test $SHLVL -gt $tide_shlvl_threshold && _tide_print_item shlvl $tide_shlvl_icon' ' $SHLVL
+end
diff --git a/.config/fish/functions/_tide_item_status.fish b/.config/fish/functions/_tide_item_status.fish
new file mode 100644
index 00000000..3a040fd1
--- /dev/null
+++ b/.config/fish/functions/_tide_item_status.fish
@@ -0,0 +1,15 @@
+function _tide_item_status
+ if string match -qv 0 $_tide_pipestatus # If there is a failure anywhere in the pipestatus
+ if test "$_tide_pipestatus" = 1 # If simple failure
+ contains character $_tide_left_items || tide_status_bg_color=$tide_status_bg_color_failure \
+ tide_status_color=$tide_status_color_failure _tide_print_item status $tide_status_icon_failure' ' 1
+ else
+ fish_status_to_signal $_tide_pipestatus | string replace SIG '' | string join '|' | read -l out
+ test $_tide_status = 0 && _tide_print_item status $tide_status_icon' ' $out ||
+ tide_status_bg_color=$tide_status_bg_color_failure tide_status_color=$tide_status_color_failure \
+ _tide_print_item status $tide_status_icon_failure' ' $out
+ end
+ else if not contains character $_tide_left_items
+ _tide_print_item status $tide_status_icon
+ end
+end
diff --git a/.config/fish/functions/_tide_item_terraform.fish b/.config/fish/functions/_tide_item_terraform.fish
new file mode 100644
index 00000000..60fd3fb1
--- /dev/null
+++ b/.config/fish/functions/_tide_item_terraform.fish
@@ -0,0 +1,6 @@
+function _tide_item_terraform
+ if test -d .terraform
+ terraform workspace show | read -l workspace
+ test $workspace != default && _tide_print_item terraform $tide_terraform_icon' ' $workspace
+ end
+end
diff --git a/.config/fish/functions/_tide_item_time.fish b/.config/fish/functions/_tide_item_time.fish
new file mode 100644
index 00000000..b8522bc4
--- /dev/null
+++ b/.config/fish/functions/_tide_item_time.fish
@@ -0,0 +1,3 @@
+function _tide_item_time
+ _tide_print_item time (date +$tide_time_format)
+end
diff --git a/.config/fish/functions/_tide_item_toolbox.fish b/.config/fish/functions/_tide_item_toolbox.fish
new file mode 100644
index 00000000..28975d30
--- /dev/null
+++ b/.config/fish/functions/_tide_item_toolbox.fish
@@ -0,0 +1,3 @@
+function _tide_item_toolbox
+ test -e /run/.toolboxenv && _tide_print_item toolbox $tide_toolbox_icon' ' $hostname
+end
diff --git a/.config/fish/functions/_tide_item_vi_mode.fish b/.config/fish/functions/_tide_item_vi_mode.fish
new file mode 100644
index 00000000..582855d0
--- /dev/null
+++ b/.config/fish/functions/_tide_item_vi_mode.fish
@@ -0,0 +1,16 @@
+function _tide_item_vi_mode
+ test "$fish_key_bindings" != fish_default_key_bindings && switch $fish_bind_mode
+ case default
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_default tide_vi_mode_color=$tide_vi_mode_color_default \
+ _tide_print_item vi_mode $tide_vi_mode_icon_default
+ case insert
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_insert tide_vi_mode_color=$tide_vi_mode_color_insert \
+ _tide_print_item vi_mode $tide_vi_mode_icon_insert
+ case replace replace_one
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_replace tide_vi_mode_color=$tide_vi_mode_color_replace \
+ _tide_print_item vi_mode $tide_vi_mode_icon_replace
+ case visual
+ tide_vi_mode_bg_color=$tide_vi_mode_bg_color_visual tide_vi_mode_color=$tide_vi_mode_color_visual \
+ _tide_print_item vi_mode $tide_vi_mode_icon_visual
+ end
+end
diff --git a/.config/fish/functions/_tide_item_virtual_env.fish b/.config/fish/functions/_tide_item_virtual_env.fish
new file mode 100644
index 00000000..0f20ceec
--- /dev/null
+++ b/.config/fish/functions/_tide_item_virtual_env.fish
@@ -0,0 +1,11 @@
+function _tide_item_virtual_env
+ test -n "$VIRTUAL_ENV" && split_virtual_env=(string split / "$VIRTUAL_ENV") if test $split_virtual_env[-2] = virtualenvs
+ # pipenv $VIRTUAL_ENV looks like /home/ilan/.local/share/virtualenvs/pipenv_project-EwRYuc3l
+ # Detect whether we are using pipenv by looking for virtualenvs. If so, remove the hash at the end.
+ _tide_print_item virtual_env $tide_virtual_env_icon' ' (string split -r -m1 - "$split_virtual_env[-1]")[1]
+ else if contains -- $split_virtual_env[-1] virtualenv venv .venv env # avoid generic names
+ _tide_print_item virtual_env $tide_virtual_env_icon' ' $split_virtual_env[-2]
+ else
+ _tide_print_item virtual_env $tide_virtual_env_icon' ' $split_virtual_env[-1]
+ end
+end
diff --git a/.config/fish/functions/_tide_print_item.fish b/.config/fish/functions/_tide_print_item.fish
new file mode 100644
index 00000000..db5c98b2
--- /dev/null
+++ b/.config/fish/functions/_tide_print_item.fish
@@ -0,0 +1,22 @@
+function _tide_print_item -a item
+ v=tide_"$item"_bg_color set -f item_bg_color $$v
+
+ if set -e add_prefix
+ set_color $item_bg_color -b normal
+ v=tide_"$_tide_side"_prompt_prefix echo -ns $$v
+ else if test "$item_bg_color" = "$prev_bg_color"
+ v=tide_"$_tide_side"_prompt_separator_same_color echo -ns $_tide_color_separator_same_color$$v
+ else if test $_tide_side = left
+ set_color $prev_bg_color -b $item_bg_color
+ echo -ns $tide_left_prompt_separator_diff_color
+ else
+ set_color $item_bg_color -b $prev_bg_color
+ echo -ns $tide_right_prompt_separator_diff_color
+ end
+
+ v=tide_"$item"_color set_color $$v -b $item_bg_color
+
+ echo -ns $_tide_pad $argv[2..] $_tide_pad
+
+ set -g prev_bg_color $item_bg_color
+end
diff --git a/.config/fish/functions/_tide_pwd.fish b/.config/fish/functions/_tide_pwd.fish
new file mode 100644
index 00000000..1680528e
--- /dev/null
+++ b/.config/fish/functions/_tide_pwd.fish
@@ -0,0 +1,37 @@
+set_color -o $tide_pwd_color_anchors | read -l color_anchors
+set_color $tide_pwd_color_truncated_dirs | read -l color_truncated
+set -l reset_to_color_dirs (set_color normal -b $tide_pwd_bg_color; set_color $tide_pwd_color_dirs)
+
+set -l unwritable_icon $tide_pwd_icon_unwritable' '
+set -l home_icon $tide_pwd_icon_home' '
+set -l pwd_icon $tide_pwd_icon' '
+
+eval "function _tide_pwd
+ if set -l split_pwd (string replace -r '^$HOME' '~' \$PWD | string split /)
+ test -w . && set -f split_output \"$pwd_icon\$split_pwd[1]\" \$split_pwd[2..] ||
+ set -f split_output \"$unwritable_icon\$split_pwd[1]\" \$split_pwd[2..]
+ set split_output[-1] \"$color_anchors\$split_output[-1]$reset_to_color_dirs\"
+ else
+ set -f split_output \"$home_icon$color_anchors~\"
+ end
+
+ string join / \$split_output | string length -V | read -g _tide_pwd_len
+
+ i=1 for dir_section in \$split_pwd[2..-2]
+ string join -- / \$split_pwd[..\$i] | string replace '~' $HOME | read -l parent_dir # Uses i before increment
+
+ math \$i+1 | read i
+
+ if path is \$parent_dir/\$dir_section/\$tide_pwd_markers
+ set split_output[\$i] \"$color_anchors\$dir_section$reset_to_color_dirs\"
+ else if test \$_tide_pwd_len -gt \$dist_btwn_sides
+ set -l trunc
+ while string match -qr \"(?<trunc>\$trunc.)\" \$dir_section && v=\$parent_dir/\$trunc*/ set -q v[2]
+ end
+ test -n \"\$trunc\" && set split_output[\$i] \"$color_truncated\$trunc$reset_to_color_dirs\" &&
+ string join / \$split_output | string length -V | read _tide_pwd_len
+ end
+ end
+
+ string join -- / \"$reset_to_color_dirs\$split_output[1]\" \$split_output[2..]
+end"
diff --git a/.config/fish/functions/_tide_remove_unusable_items.fish b/.config/fish/functions/_tide_remove_unusable_items.fish
new file mode 100644
index 00000000..69065dc8
--- /dev/null
+++ b/.config/fish/functions/_tide_remove_unusable_items.fish
@@ -0,0 +1,21 @@
+function _tide_remove_unusable_items
+ # Remove tool-specific items for tools the machine doesn't have installed
+ set -l removed_items
+ for item in aws chruby docker git go java kubectl nix_shell node php rustc terraform toolbox virtual_env
+ set -l cli_names $item
+ switch $item
+ case virtual_env
+ set cli_names python python3
+ case nix_shell
+ set cli_names nix nix-shell
+ end
+ type --query $cli_names || set -a removed_items $item
+ end
+
+ set -U _tide_left_items (for item in $tide_left_prompt_items
+ contains $item $removed_items || echo $item
+ end)
+ set -U _tide_right_items (for item in $tide_right_prompt_items
+ contains $item $removed_items || echo $item
+ end)
+end
diff --git a/.config/fish/functions/_tide_sub_bug-report.fish b/.config/fish/functions/_tide_sub_bug-report.fish
new file mode 100644
index 00000000..5f087c88
--- /dev/null
+++ b/.config/fish/functions/_tide_sub_bug-report.fish
@@ -0,0 +1,73 @@
+function _tide_sub_bug-report
+ argparse c/clean v/verbose check -- $argv
+
+ set -l fish_path (status fish-path)
+
+ if set -q _flag_clean
+ HOME=(mktemp -d) $fish_path --init-command "curl --silent \
+ https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish |
+ source && fisher install ilancosman/tide@v5"
+ else if set -q _flag_verbose
+ set --long | string match -r "^_?tide.*" | # Get only tide variables
+ string match -r --invert "^_tide_prompt_var.*" # Remove _tide_prompt_var
+ else
+ set -l fish_version ($fish_path --version | string match -r "fish, version (\d\.\d\.\d)")[2]
+ _tide_check_version Fish fish-shell/fish-shell "(\d\.\d\.\d)" $fish_version || return
+
+ set -l tide_version (tide --version | string match -r "tide, version (\d\.\d\.\d)")[2]
+ _tide_check_version Tide IlanCosman/tide "v(\d\.\d\.\d)" $tide_version || return
+
+ if command --query git
+ test (git --version | string match -r "git version ([\d\.]*)" | string replace --all . '')[2] -gt 2220
+ _tide_check_condition \
+ "Your git version is too old." \
+ "Tide requires at least version 2.22." \
+ "Please update before submitting a bug report." || return
+ end
+
+ # Check that omf is not installed
+ not functions --query omf
+ _tide_check_condition \
+ "Tide does not work with oh-my-fish installed." \
+ "Please uninstall it before submitting a bug report." || return
+
+ if not set -q _flag_check
+ set -l fish_startup_time ($fish_path -ic "time $fish_path -c exit" 2>|
+ string match -r "Executed in(.*)fish" | string trim)[2]
+
+ read --local --prompt-str "What operating system are you using? (e.g Ubuntu 20.04): " os
+ read --local --prompt-str "What terminal emulator are you using? (e.g Kitty): " terminal_emulator
+
+ printf '%b\n' "\nPlease copy the following information into the issue:\n" \
+ "fish version: $fish_version" \
+ "tide version: $tide_version" \
+ "term: $TERM" \
+ "os: $os" \
+ "terminal emulator: $terminal_emulator" \
+ "fish startup: $fish_startup_time" \
+ "fisher plugins: $_fisher_plugins"
+ end
+ end
+end
+
+function _tide_check_version -a program_name repo_name regex_to_get_version current_version
+ curl --silent https://github.com/$repo_name/releases/latest |
+ string match -r ".*$repo_name/releases/tag/$regex_to_get_version.*" |
+ read --local --line __ latestVersion
+
+ string match --quiet -r "^$latestVersion" "$current_version"
+ _tide_check_condition \
+ "Your $program_name version is out of date." \
+ "The latest is $latestVersion. You have $current_version." \
+ "Please update before submitting a bug report."
+end
+
+function _tide_check_condition
+ if test "$status" != 0
+ set_color red
+ printf '%s\n' $argv
+ set_color normal
+ return 1
+ end
+ return 0
+end
diff --git a/.config/fish/functions/_tide_sub_configure.fish b/.config/fish/functions/_tide_sub_configure.fish
new file mode 100644
index 00000000..cb872901
--- /dev/null
+++ b/.config/fish/functions/_tide_sub_configure.fish
@@ -0,0 +1,95 @@
+set -g _tide_color_dark_blue 0087AF
+set -g _tide_color_dark_green 5FAF00
+set -g _tide_color_gold D7AF00
+set -g _tide_color_green 5FD700
+set -g _tide_color_light_blue 00AFFF
+
+# Create an empty fake function for each item
+for func in _fake(functions --all | string match --entire _tide_item)
+ function $func
+ end
+end
+
+for file in (status dirname)/tide/configure/{choices, functions}/**.fish
+ source $file
+end
+
+function _tide_sub_configure
+ if test $COLUMNS -lt 55 -o $LINES -lt 21
+ echo 'Terminal size too small; must be at least 55 x 21'
+ return 1
+ end
+
+ _tide_detect_os | read -g --line os_branding_icon os_branding_color os_branding_bg_color
+
+ set -g fake_columns $COLUMNS
+ test $fake_columns -gt 90 && set fake_columns 90
+ set -g fake_lines $LINES
+
+ set -g _tide_selected_option
+ _next_choice all/style
+end
+
+function _next_choice -a nextChoice
+ set -q _tide_selected_option || return 0
+ set -l cmd (string split '/' $nextChoice)[2]
+ $cmd
+end
+
+function _tide_title -a text
+ command -q clear && clear
+ set_color -o
+ string pad --width (math --scale=0 "$fake_columns/2" + (string length $text)/2) $text
+ set_color normal
+end
+
+function _tide_option -a symbol text
+ set -ga _tide_option_list $symbol
+
+ set_color -o
+ echo "($symbol) $text"
+ set_color normal
+end
+
+function _tide_menu
+ set -l list_with_slashes (string join '/' $_tide_option_list)
+
+ echo '(r) Restart from the beginning'
+ echo '(q) Quit and do nothing'\n
+
+ while true
+ set_color -o
+ read --nchars 1 --prompt-str "Choice [$list_with_slashes/r/q] " input
+ set_color normal
+
+ switch $input
+ case r
+ set -e _tide_option_list
+ _next_choice all/style
+ break
+ case q
+ set -e _tide_selected_option # Skip through all the _next_choices
+ set -e _tide_option_list
+ command -q clear && clear
+ break
+ case $_tide_option_list
+ set -e _tide_option_list
+ set -g _tide_selected_option $input
+ break
+ end
+ end
+end
+
+function _tide_display_prompt -a var_name var_value
+ test -n "$var_name" && set -g $var_name $var_value
+ _fake_tide_cache_variables
+ set -l prompt (_fake_tide_prompt)
+
+ set -l bottom_left_prompt_string_length (string length --visible $prompt[-1])
+ set -l right_prompt_string (string pad --width (math $fake_columns-$bottom_left_prompt_string_length) $prompt[1])
+ set -l prompt[-1] "$prompt[-1]$right_prompt_string"
+
+ string unescape $prompt[2..]
+ set_color normal
+ echo
+end
diff --git a/.config/fish/functions/fish_mode_prompt.fish b/.config/fish/functions/fish_mode_prompt.fish
new file mode 100644
index 00000000..f37cf7dc
--- /dev/null
+++ b/.config/fish/functions/fish_mode_prompt.fish
@@ -0,0 +1 @@
+# Disable default vi prompt
diff --git a/.config/fish/functions/fish_prompt.fish b/.config/fish/functions/fish_prompt.fish
new file mode 100644
index 00000000..7aef1678
--- /dev/null
+++ b/.config/fish/functions/fish_prompt.fish
@@ -0,0 +1,87 @@
+function fish_prompt
+end # In case this file gets loaded non-interactively, e.g by conda
+status is-interactive || exit
+
+_tide_remove_unusable_items
+_tide_cache_variables
+source (functions --details _tide_pwd)
+
+set -l prompt_var _tide_prompt_$fish_pid
+set -U $prompt_var # Set var here so if we erase $prompt_var, bg job won't set a uvar
+
+set_color normal | read -l color_normal
+status fish-path | read -l fish_path
+
+# _tide_repaint prevents us from creating a second background job
+function _tide_refresh_prompt --on-variable $prompt_var --on-variable COLUMNS
+ set -g _tide_repaint
+ commandline -f repaint
+end
+
+if contains newline $_tide_left_items # two line prompt initialization
+ test "$tide_prompt_add_newline_before" = true && set -l add_newline '\n'
+
+ set_color $tide_prompt_color_frame_and_connection -b normal | read -l prompt_and_frame_color
+
+ set -l column_offset 5
+ test "$tide_left_prompt_frame_enabled" = true &&
+ set -l top_left_frame "$prompt_and_frame_color╭─" &&
+ set -l bot_left_frame "$prompt_and_frame_color╰─" &&
+ set column_offset (math $column_offset-2)
+ test "$tide_right_prompt_frame_enabled" = true &&
+ set -l top_right_frame "$prompt_and_frame_color─╮" &&
+ set -l bot_right_frame "$prompt_and_frame_color─╯" &&
+ set column_offset (math $column_offset-2)
+
+ eval "
+function fish_prompt
+ _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && set -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_2_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides
+
+ echo -ns $add_newline'$top_left_frame'(string replace @PWD@ (_tide_pwd) \"\$$prompt_var[1][1]\")'$prompt_and_frame_color'
+ string repeat -Nm(math max 0, \$dist_btwn_sides-\$_tide_pwd_len) '$tide_prompt_icon_connection'
+ echo -ns \"\$$prompt_var[1][3]$top_right_frame\"\n\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
+end
+
+function fish_right_prompt
+ string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
+end"
+else # one line prompt initialization
+ test "$tide_prompt_add_newline_before" = true && set -l add_newline '\0'
+
+ math 5 -$tide_prompt_min_cols | read -l column_offset
+ test $column_offset -ge 0 && set column_offset "+$column_offset"
+
+ eval "
+function fish_prompt
+ _tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
+ jobs -q && set -lx _tide_jobs
+ $fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
+CMD_DURATION=\$CMD_DURATION fish_bind_mode=\$fish_bind_mode set $prompt_var (_tide_1_line_prompt)\" &
+ builtin disown
+
+ command kill \$_tide_last_pid 2>/dev/null
+ set -g _tide_last_pid \$last_pid
+ end
+
+ math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][2]\")$column_offset | read -lx dist_btwn_sides
+ string replace @PWD@ (_tide_pwd) $add_newline \$$prompt_var[1][1]'$color_normal '
+end
+
+function fish_right_prompt
+ string unescape \"\$$prompt_var[1][2]$color_normal\"
+end"
+end
+
+eval "function _tide_on_fish_exit --on-event fish_exit
+ set -e $prompt_var
+end"
diff --git a/.config/fish/functions/fisher.fish b/.config/fish/functions/fisher.fish
index 47598571..a4666a13 100644
--- a/.config/fish/functions/fisher.fish
+++ b/.config/fish/functions/fisher.fish
@@ -1,430 +1,240 @@
-set -g fisher_version 3.2.9
+function fisher --argument-names cmd --description "A plugin manager for Fish"
+ set --query fisher_path || set --local fisher_path $__fish_config_dir
+ set --local fisher_version 4.4.2
+ set --local fish_plugins $__fish_config_dir/fish_plugins
-function fisher -a cmd -d "fish package manager"
- set -q XDG_CACHE_HOME; or set XDG_CACHE_HOME ~/.cache
- set -q XDG_CONFIG_HOME; or set XDG_CONFIG_HOME ~/.config
+ switch "$cmd"
+ case -v --version
+ echo "fisher, version $fisher_version"
+ case "" -h --help
+ echo "Usage: fisher install <plugins...> Install plugins"
+ echo " fisher remove <plugins...> Remove installed plugins"
+ echo " fisher update <plugins...> Update installed plugins"
+ echo " fisher update Update all installed plugins"
+ echo " fisher list [<regex>] List installed plugins matching regex"
+ echo "Options:"
+ echo " -v or --version Print version"
+ echo " -h or --help Print this help message"
+ echo "Variables:"
+ echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
+ case ls list
+ string match --entire --regex -- "$argv[2]" $_fisher_plugins
+ case install update remove
+ isatty || read --local --null --array stdin && set --append argv $stdin
+
+ set --local install_plugins
+ set --local update_plugins
+ set --local remove_plugins
+ set --local arg_plugins $argv[2..-1]
+ set --local old_plugins $_fisher_plugins
+ set --local new_plugins
+
+ test -e $fish_plugins && set --local file_plugins (string match --regex -- '^[^\s]+$' <$fish_plugins)
+
+ if ! set --query argv[2]
+ if test "$cmd" != update
+ echo "fisher: Not enough arguments for command: \"$cmd\"" >&2 && return 1
+ else if ! set --query file_plugins
+ echo "fisher: \"$fish_plugins\" file not found: \"$cmd\"" >&2 && return 1
+ end
+ set arg_plugins $file_plugins
+ end
- set -g fish_config $XDG_CONFIG_HOME/fish
- set -g fisher_cache $XDG_CACHE_HOME/fisher
- set -g fisher_config $XDG_CONFIG_HOME/fisher
+ for plugin in $arg_plugins
+ set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin)
+ contains -- "$plugin" $new_plugins || set --append new_plugins $plugin
+ end
- set -q fisher_path; or set -g fisher_path $fish_config
+ if set --query argv[2]
+ for plugin in $new_plugins
+ if contains -- "$plugin" $old_plugins
+ test "$cmd" = remove &&
+ set --append remove_plugins $plugin ||
+ set --append update_plugins $plugin
+ else if test "$cmd" = install
+ set --append install_plugins $plugin
+ else
+ echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1
+ end
+ end
+ else
+ for plugin in $new_plugins
+ contains -- "$plugin" $old_plugins &&
+ set --append update_plugins $plugin ||
+ set --append install_plugins $plugin
+ end
- for path in {$fish_config,$fisher_path}/{functions,completions,conf.d} $fisher_cache
- if test ! -d $path
- command mkdir -p $path
- end
- end
+ for plugin in $old_plugins
+ contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin
+ end
+ end
- if test ! -e $fisher_path/completions/fisher.fish
- echo "fisher complete" >$fisher_path/completions/fisher.fish
- _fisher_complete
- end
+ set --local pid_list
+ set --local source_plugins
+ set --local fetch_plugins $update_plugins $install_plugins
+ set --local fish_path (status fish-path)
- if test -e $fisher_path/conf.d/fisher.fish
- switch "$version"
- case \*-\*
- command rm -f $fisher_path/conf.d/fisher.fish
- case 2\*
- case \*
- command rm -f $fisher_path/conf.d/fisher.fish
- end
- else
- switch "$version"
- case \*-\*
- case 2\*
- echo "fisher copy-user-key-bindings" >$fisher_path/conf.d/fisher.fish
- end
- end
+ echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal)
- switch "$cmd"
- case {,self-}complete
- _fisher_complete
- case copy-user-key-bindings
- _fisher_copy_user_key_bindings
- case ls
- set -e argv[1]
- if test -s "$fisher_path/fishfile"
- set -l file (_fisher_fmt <$fisher_path/fishfile | _fisher_parse -R | command sed "s|@.*||")
- _fisher_ls | _fisher_fmt | command awk -v FILE="$file" "
- BEGIN { for (n = split(FILE, f); ++i <= n;) file[f[i]] } \$0 in file && /$argv[1]/
- " | command sed "s|^$HOME|~|"
- end
- case self-update
- _fisher_self_update (status -f)
- case self-uninstall
- _fisher_self_uninstall
- case {,-}-v{ersion,}
- echo "fisher version $fisher_version" (status -f | command sed "s|^$HOME|~|")
- case {,-}-h{elp,}
- _fisher_help
- case ""
- _fisher_commit --
- case add rm
- if not isatty
- while read -l arg
- set argv $argv $arg
- end
- end
+ for plugin in $fetch_plugins
+ set --local source (command mktemp -d)
+ set --append source_plugins $source
- if test (count $argv) = 1
- echo "fisher: invalid number of arguments" >&2
- _fisher_help >&2
- return 1
- end
+ command mkdir -p $source/{completions,conf.d,themes,functions}
- _fisher_commit $argv
- case \*
- echo "fisher: unknown flag or command \"$cmd\"" >&2
- _fisher_help >&2
- return 1
- end
-end
+ $fish_path --command "
+ if test -e $plugin
+ command cp -Rf $plugin/* $source
+ else
+ set temp (command mktemp -d)
+ set repo (string split -- \@ $plugin) || set repo[2] HEAD
-function _fisher_complete
- complete -ec fisher
- complete -xc fisher -n __fish_use_subcommand -a add -d "Add packages"
- complete -xc fisher -n __fish_use_subcommand -a rm -d "Remove packages"
- complete -xc fisher -n __fish_use_subcommand -a ls -d "List installed packages matching REGEX"
- complete -xc fisher -n __fish_use_subcommand -a --help -d "Show usage help"
- complete -xc fisher -n __fish_use_subcommand -a --version -d "$fisher_version"
- complete -xc fisher -n __fish_use_subcommand -a self-update -d "Update to the latest version"
- for pkg in (fisher ls)
- complete -xc fisher -n "__fish_seen_subcommand_from rm" -a $pkg
- end
-end
+ if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1])
+ set name (string split -- / \$path)[-1]
+ set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz
+ else
+ set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2]
+ end
-function _fisher_copy_user_key_bindings
- if functions -q fish_user_key_bindings
- functions -c fish_user_key_bindings fish_user_key_bindings_copy
- end
- function fish_user_key_bindings
- for file in $fisher_path/conf.d/*_key_bindings.fish
- source $file >/dev/null 2>/dev/null
- end
- if functions -q fish_user_key_bindings_copy
- fish_user_key_bindings_copy
- end
- end
-end
+ echo Fetching (set_color --underline)\$url(set_color normal)
-function _fisher_ls
- for pkg in $fisher_config/*/*/*
- command readlink $pkg; or echo $pkg
- end
-end
+ if curl --silent -L \$url | tar -xzC \$temp -f - 2>/dev/null
+ command cp -Rf \$temp/*/* $source
+ else
+ echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
+ command rm -rf $source
+ end
-function _fisher_fmt
- command sed "s|^[[:space:]]*||;s|^$fisher_config/||;s|^~|$HOME|;s|^\.\/*|$PWD/|;s|^https*:/*||;s|^github\.com/||;s|/*\$||"
-end
+ command rm -rf \$temp
+ end
-function _fisher_help
- echo "usage: fisher add <package...> Add packages"
- echo " fisher rm <package...> Remove packages"
- echo " fisher Update all packages"
- echo " fisher ls [<regex>] List installed packages matching <regex>"
- echo " fisher --help Show this help"
- echo " fisher --version Show the current version"
- echo " fisher self-update Update to the latest version"
- echo " fisher self-uninstall Uninstall from your system"
- echo "examples:"
- echo " fisher add jethrokuan/z rafaelrinaldi/pure"
- echo " fisher add gitlab.com/foo/bar@v2"
- echo " fisher add ~/path/to/local/pkg"
- echo " fisher add <file"
- echo " fisher rm rafaelrinaldi/pure"
- echo " fisher ls | fisher rm"
- echo " fisher ls fish-\*"
-end
+ set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
+ " &
-function _fisher_self_update -a file
- set -l url "https://raw.githubusercontent.com/jorgebucaran/fisher/master/fisher.fish"
- echo "fetching $url" >&2
- command curl -s "$url?nocache" >$file.
-
- set -l next_version (command awk '{ print $4 } { exit }' <$file.)
- switch "$next_version"
- case "" $fisher_version
- command rm -f $file.
- if test -z "$next_version"
- echo "fisher: cannot update fisher -- are you offline?" >&2
- return 1
+ set --append pid_list (jobs --last --pid)
end
- echo "fisher is already up-to-date" >&2
- case \*
- echo "linking $file" | command sed "s|$HOME|~|" >&2
- command mv -f $file. $file
- source $file
- echo "updated to fisher $fisher_version -- hooray!" >&2
- _fisher_complete
- end
-end
-function _fisher_self_uninstall
- for pkg in (_fisher_ls)
- _fisher_rm $pkg
- end
+ wait $pid_list 2>/dev/null
- for file in $fisher_cache $fisher_config $fisher_path/{functions,completions,conf.d}/fisher.fish $fisher_path/fishfile
- echo "removing $file"
- command rm -Rf $file 2>/dev/null
- end | command sed "s|$HOME|~|" >&2
+ for plugin in $fetch_plugins
+ if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
+ if set --local index (contains --index -- "$plugin" $install_plugins)
+ set --erase install_plugins[$index]
+ else
+ set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
+ end
+ end
+ end
- for name in (set -n | command awk '/^fisher_/')
- set -e "$name"
- end
+ for plugin in $update_plugins $remove_plugins
+ if set --local index (contains --index -- "$plugin" $_fisher_plugins)
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
- functions -e (functions -a | command awk '/^_fisher/') fisher
- complete -c fisher --erase
-end
+ if contains -- "$plugin" $remove_plugins
+ for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ emit {$name}_uninstall
+ end
+ printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+ set --erase _fisher_plugins[$index]
+ end
-function _fisher_commit -a cmd
- set -e argv[1]
- set -l elapsed (_fisher_now)
- set -l fishfile $fisher_path/fishfile
+ command rm -rf (string replace -- \~ ~ $$plugin_files_var)
- if test ! -e "$fishfile"
- command touch $fishfile
- echo "created new fishfile in $fishfile" | command sed "s|$HOME|~|" >&2
- end
+ functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
- set -l old_pkgs (_fisher_ls | _fisher_fmt)
- for pkg in (_fisher_ls)
- _fisher_rm $pkg
- end
- command rm -Rf $fisher_config
- command mkdir -p $fisher_config
-
- set -l next_pkgs (_fisher_fmt <$fishfile | _fisher_parse -R $cmd (printf "%s\n" $argv | _fisher_fmt))
- set -l actual_pkgs (_fisher_fetch $next_pkgs)
- set -l updated_pkgs
- for pkg in $old_pkgs
- if contains -- $pkg $actual_pkgs
- set updated_pkgs $updated_pkgs $pkg
- end
- end
+ for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
+ complete --erase --command $name
+ end
- if test -z "$actual_pkgs$updated_pkgs$old_pkgs$next_pkgs"
- echo "fisher: nothing to commit -- try adding some packages" >&2
- return 1
- end
-
- set -l out_pkgs
- if test "$cmd" = "rm"
- set out_pkgs $next_pkgs
- else
- for pkg in $next_pkgs
- if contains -- (echo $pkg | command sed "s|@.*||") $actual_pkgs
- set out_pkgs $out_pkgs $pkg
+ set --erase $plugin_files_var
+ end
end
- end
- end
- printf "%s\n" (_fisher_fmt <$fishfile | _fisher_parse -W $cmd $out_pkgs | command sed "s|^$HOME|~|") >$fishfile
+ if set --query update_plugins[1] || set --query install_plugins[1]
+ command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
+ end
- _fisher_complete
+ for plugin in $update_plugins $install_plugins
+ set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
+ set --local files $source/{functions,themes,conf.d,completions}/*
- command awk -v A=(count $actual_pkgs) -v U=(count $updated_pkgs) -v O=(count $old_pkgs) -v E=(_fisher_now $elapsed) '
- BEGIN {
- res = fmt("removed", O - U, fmt("updated", U, fmt("added", A - U)))
- printf((res ? res : "done") " in %.2fs\n", E / 1000)
- }
- function fmt(action, n, s) {
- return n ? (s ? s ", " : s) action " " n " package" (n > 1 ? "s" : "") : s
- }
- ' >&2
-end
+ if set --local index (contains --index -- $plugin $install_plugins)
+ set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
+ set --local conflict_files
-function _fisher_parse -a mode cmd
- set -e argv[1..2]
- command awk -v FS="[[:space:]]*#+" -v MODE="$mode" -v CMD="$cmd" -v ARGSTR="$argv" '
- BEGIN {
- for (n = split(ARGSTR, a, " "); i++ < n;) pkgs[getkey(a[i])] = a[i]
- }
- !NF { next } { k = getkey($1) }
- MODE == "-R" && !(k in pkgs) && $0 = $1
- MODE == "-W" && (/^#/ || k in pkgs || CMD != "rm") { print pkgs[k] (sub($1, "") ? $0 : "") }
- MODE == "-W" || CMD == "rm" { delete pkgs[k] }
- END {
- for (k in pkgs) {
- if (CMD != "rm" || MODE == "-W") print pkgs[k]
- else print "fisher: cannot remove \""k"\" -- package is not in fishfile" > "/dev/stderr"
- }
- }
- function getkey(s, a) {
- return (split(s, a, /@+|:/) > 2) ? a[2]"/"a[1]"/"a[3] : a[1]
- }
- '
-end
+ for file in (string replace -- $source/ $fisher_path/ $files)
+ contains -- $file $user_files && set --append conflict_files $file
+ end
-function _fisher_fetch
- set -l pkg_jobs
- set -l out_pkgs
- set -l next_pkgs
- set -l local_pkgs
- set -q fisher_user_api_token; and set -l curl_opts -u $fisher_user_api_token
-
- for pkg in $argv
- switch $pkg
- case \~\* /\*
- set -l path (echo "$pkg" | command sed "s|^~|$HOME|")
- if test -e "$path"
- set local_pkgs $local_pkgs $path
- else
- echo "fisher: cannot add \"$pkg\" -- is this a valid file?" >&2
+ if set --query conflict_files[1] && set --erase install_plugins[$index]
+ echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
+ continue
+ end
end
- continue
- end
- command awk -v PKG="$pkg" -v FS=/ '
- BEGIN {
- if (split(PKG, tmp, /@+|:/) > 2) {
- if (tmp[4]) sub("@"tmp[4], "", PKG)
- print PKG "\t" tmp[2]"/"tmp[1]"/"tmp[3] "\t" (tmp[4] ? tmp[4] : "master")
- } else {
- pkg = split(PKG, _, "/") <= 2 ? "github.com/"tmp[1] : tmp[1]
- tag = tmp[2] ? tmp[2] : "master"
- print (\
- pkg ~ /^github/ ? "https://codeload."pkg"/tar.gz/"tag : \
- pkg ~ /^gitlab/ ? "https://"pkg"/-/archive/"tag"/"tmp[split(pkg, tmp, "/")]"-"tag".tar.gz" : \
- pkg ~ /^bitbucket/ ? "https://"pkg"/get/"tag".tar.gz" : pkg \
- ) "\t" pkg
- }
- }
- ' | read -l url pkg branch
-
- if test ! -d "$fisher_config/$pkg"
- fish -c "
- echo fetching $url >&2
- command mkdir -p $fisher_config/$pkg $fisher_cache/(command dirname $pkg)
- if test ! -z \"$branch\"
- command git clone $url $fisher_config/$pkg --branch $branch --depth 1 2>/dev/null
- or echo fisher: cannot clone \"$url\" -- is this a valid url\? >&2
- else if command curl $curl_opts -Ss -w \"\" $url 2>&1 | command tar -xzf- -C $fisher_config/$pkg 2>/dev/null
- command rm -Rf $fisher_cache/$pkg
- command mv -f $fisher_config/$pkg/* $fisher_cache/$pkg
- command rm -Rf $fisher_config/$pkg
- command cp -Rf {$fisher_cache,$fisher_config}/$pkg
- else if test -d \"$fisher_cache/$pkg\"
- echo fisher: cannot connect to server -- looking in \"$fisher_cache/$pkg\" | command sed 's|$HOME|~|' >&2
- command cp -Rf $fisher_cache/$pkg $fisher_config/$pkg/..
- else
- command rm -Rf $fisher_config/$pkg
- echo fisher: cannot add \"$pkg\" -- is this a valid package\? >&2
+ for file in (string replace -- $source/ "" $files)
+ command cp -Rf $source/$file $fisher_path/$file
end
- " >/dev/null &
- set pkg_jobs $pkg_jobs (_fisher_jobs --last)
- set next_pkgs $next_pkgs "$fisher_config/$pkg"
- end
- end
- if set -q pkg_jobs[1]
- while for job in $pkg_jobs
- contains -- $job (_fisher_jobs); and break
- end
- end
- for pkg in $next_pkgs
- if test -d "$pkg"
- set out_pkgs $out_pkgs $pkg
- _fisher_add $pkg
- end
- end
- end
+ set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
- set -l local_prefix $fisher_config/local/$USER
- if test ! -d "$local_prefix"
- command mkdir -p $local_prefix
- end
- for pkg in $local_pkgs
- set -l target $local_prefix/(command basename $pkg)
- if test ! -L "$target"
- command ln -sf $pkg $target
- set out_pkgs $out_pkgs $pkg
- _fisher_add $pkg --link
- end
- end
+ set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
+
+ contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
+ contains -- $plugin $install_plugins && set --local event install || set --local event update
- if set -q out_pkgs[1]
- _fisher_fetch (
- for pkg in $out_pkgs
- if test -s "$pkg/fishfile"
- _fisher_fmt <$pkg/fishfile | _fisher_parse -R
+ printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
+
+ for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
+ source $file
+ if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
+ emit {$name}_$event
+ end
end
- end)
- printf "%s\n" $out_pkgs | _fisher_fmt
- end
-end
+ end
-function _fisher_add -a pkg opts
- for src in $pkg/{functions,completions,conf.d}/**.* $pkg/*.fish
- set -l target (command basename $src)
- switch $src
- case $pkg/conf.d\*
- set target $fisher_path/conf.d/$target
- case $pkg/completions\*
- set target $fisher_path/completions/$target
- case $pkg/{functions,}\*
- switch $target
- case uninstall.fish
- continue
- case {init,key_bindings}.fish
- set target $fisher_path/conf.d/(command basename $pkg)\_$target
- case \*
- set target $fisher_path/functions/$target
+ command rm -rf $source_plugins
+
+ if set --query _fisher_plugins[1]
+ set --local commit_plugins
+
+ for plugin in $file_plugins
+ contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
end
- end
- echo "linking $target" | command sed "s|$HOME|~|" >&2
- if set -q opts[1]
- command ln -sf $src $target
- else
- command cp -f $src $target
- end
- switch $target
- case \*.fish
- source $target >/dev/null 2>/dev/null
- end
- end
-end
-function _fisher_rm -a pkg
- for src in $pkg/{conf.d,completions,functions}/**.* $pkg/*.fish
- set -l target (command basename $src)
- set -l filename (command basename $target .fish)
- switch $src
- case $pkg/conf.d\*
- test "$filename.fish" = "$target"; and emit "$filename"_uninstall
- set target conf.d/$target
- case $pkg/completions\*
- test "$filename.fish" = "$target"; and complete -ec $filename
- set target completions/$target
- case $pkg/{,functions}\*
- test "$filename.fish" = "$target"; and functions -e $filename
- switch $target
- case uninstall.fish
- source $src
- continue
- case {init,key_bindings}.fish
- set target conf.d/(command basename $pkg)\_$target
- case \*
- set target functions/$target
+ for plugin in $_fisher_plugins
+ contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
end
- end
- command rm -f $fisher_path/$target
- end
- if not functions -q fish_prompt
- source "$__fish_datadir$__fish_data_dir/functions/fish_prompt.fish"
- end
-end
-function _fisher_jobs
- jobs $argv | command awk '/^[0-9]+\t/ { print $1 }'
-end
+ printf "%s\n" $commit_plugins >$fish_plugins
+ else
+ set --erase _fisher_plugins
+ command rm -f $fish_plugins
+ end
+
+ set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins)
-function _fisher_now -a elapsed
- switch (command uname)
- case Darwin \*BSD
- command perl -MTime::HiRes -e 'printf("%.0f\n", (Time::HiRes::time() * 1000) - $ARGV[0])' $elapsed
+ test "$total" != "0 0 0" && echo (string join ", " (
+ test $total[1] = 0 || echo "Installed $total[1]") (
+ test $total[2] = 0 || echo "Updated $total[2]") (
+ test $total[3] = 0 || echo "Removed $total[3]")
+ ) plugin/s
case \*
- math (command date "+%s%3N") - "0$elapsed"
+ echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1
+ end
+end
+
+if ! set --query _fisher_upgraded_to_4_4
+ set --universal _fisher_upgraded_to_4_4
+ if functions --query _fisher_list
+ set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share
+ command rm -rf $XDG_DATA_HOME/fisher
+ functions --erase _fisher_{list,plugin_parse}
+ fisher update >/dev/null 2>/dev/null
+ else
+ for var in (set --names | string match --entire --regex '^_fisher_.+_files$')
+ set $var (string replace -- ~ \~ $$var)
+ end
+ functions --erase _fisher_fish_postexec
end
end
diff --git a/.config/fish/functions/fzf_configure_bindings.fish b/.config/fish/functions/fzf_configure_bindings.fish
new file mode 100644
index 00000000..addb55c1
--- /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 options_spec h/help 'directory=?' 'git_log=?' 'git_status=?' 'history=?' 'variables=?' 'processes=?'
+ 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 = variables, 6 = processes
+ set key_sequences \e\cf \e\cl \e\cs \cr \cv \e\cp # \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_variables && set key_sequences[5] "$_flag_variables"
+ set --query _flag_processes && set key_sequences[6] "$_flag_processes"
+
+ # 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_vars_command"
+ test -n $key_sequences[6] && bind --mode $mode $key_sequences[6] _fzf_search_processes
+ 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/fish/functions/git_pull_all.fish b/.config/fish/functions/git_pull_all.fish
new file mode 100644
index 00000000..037f7234
--- /dev/null
+++ b/.config/fish/functions/git_pull_all.fish
@@ -0,0 +1,7 @@
+function git_pull_all
+ for branch in (git branch | sed -E 's/^\*/ /' | awk '{print $1}');
+ git checkout $branch;
+ git pull -p;
+ printf "\n";
+ end
+end
diff --git a/.config/fish/functions/git_sync_all.fish b/.config/fish/functions/git_sync_all.fish
new file mode 100644
index 00000000..35a56b6a
--- /dev/null
+++ b/.config/fish/functions/git_sync_all.fish
@@ -0,0 +1,6 @@
+function git_sync_all
+ for branch in (git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$');
+ git checkout (echo $branch | awk -F'/' '{print $1="\r"; $2="\r"; print;}' | xargs | sed 's/ /\//g');
+ git pull -p
+ end
+end
diff --git a/.config/fish/functions/mm.fish b/.config/fish/functions/mm.fish
new file mode 100644
index 00000000..4c6c470d
--- /dev/null
+++ b/.config/fish/functions/mm.fish
@@ -0,0 +1,153 @@
+function mm --description "MakeMeFish - List all Make targets in the Makefile of the current directory"
+
+ set current_pos 1
+ while test (count $argv) -ge $current_pos
+ # Check if a help flag was passed to mm
+ set help_flags -- -h --help
+ if contains -- $argv[$current_pos] $help_flags
+ echo ""
+ echo " Usage:"
+ echo " " (set_color green)"mm"(set_color normal) "will look for a Makefile in the order specified by GNU Make and list all targets in it."
+ echo " " "To filter for a specific target, just start typing and targets will be filtered as you type."
+ echo " " (set_color green)"mm <keyword>"(set_color normal) "will start MakeMeFish with an initial, editable query" (set_color green)"<keyword>"(set_color normal)
+ echo " " (set_color green)"mm -i"(set_color normal) "will start MakeMeFish in interactive mode. When a target is run, you will return to the selection menu."
+ echo " " (set_color green)"mm -f <filename>"(set_color normal) "to specify what Makefile to load."
+ echo " " "All flags can be combined in any order."
+ echo ""
+ return 0
+ else if test $argv[$current_pos] = "-f"
+ set current_pos (math "$current_pos+1") # skip the next
+ set filename $argv[$current_pos]
+ else if test $argv[$current_pos] = "-i"
+ set interactive 1
+ else
+ if set -q initial_query
+ set initial_query $initial_query $argv[$current_pos]
+ else
+ set initial_query $argv[$current_pos]
+ end
+ end
+ set current_pos (math "$current_pos+1")
+ end
+
+ function __mm_get_makefile_name -a 'filename'
+ if test -n "$filename"
+ set makefile_filenames $filename
+ else
+ set makefile_filenames 'GNUmakefile' 'makefile' 'Makefile'
+ end
+ for filename in $makefile_filenames
+ if test -f $filename
+ echo $filename
+ break
+ end
+ end
+ end
+
+ # Based on:
+ # https://github.com/fish-shell/fish-shell/blob/8e418f5205106b11f83fa1956076a9b20c56f0f9/share/completions/make.fish
+ # and
+ # https://stackoverflow.com/a/26339924
+ function __mm_parse_makefile -a 'filename'
+ # Ensure correct locale set
+ set -lx LC_ALL C
+
+ set makeflags -f $filename
+
+ # first awk merges any line that ends with a backslash with the next line
+ if make --version 2>/dev/null | string match -q 'GNU*'
+ make $makeflags -pRrq : 2>/dev/null |
+ awk '{if (sub(/\\\$/,"")) printf "%s", $0; else print $0}' |
+ awk -F: '/^# Files/,/^# Finished Make data base/ {
+ if ($1 == "# Not a target") skip = 1;
+ if ($1 !~ "^[#.\t]") {
+ if (!skip) print $1; skip=0
+ }
+ }' 2>/dev/null
+ else
+ # BSD make
+ make $makeflags -d g1 -rn >/dev/null 2>| awk -F, '/^#\*\*\* Input graph:/,/^$/ {if ($1 !~ "^#... ") {gsub(/# /,"",$1); print $1}}' 2>/dev/null
+ end
+ end
+
+ function __mm_get_targets -a 'filename'
+ set static_targets
+ set file_targets
+ set generated_targets
+
+ set parsed_makefile (__mm_parse_makefile $filename | sort -f)
+ for row in $parsed_makefile # Loop over all rows in the Makefile
+ set row (string trim $row)
+ if test -n "$row" # No blanks plz
+ if test (string match -r '.\.|\/' $row) # this is a file or path
+ set file_targets $file_targets $row
+ else # grep the target and see if it's generated by a function or a true target
+ set found_in_file (grep "$row:" $filename)
+ if test -n "$found_in_file"
+ set static_targets $static_targets $row # true target
+ else
+ set generated_targets $generated_targets $row # generated by function
+ end
+ end
+ end
+ end
+
+ string split " " $static_targets $file_targets $generated_targets
+ end
+
+ function __mm_fzf_command -a 'filename' -a 'interactive' -a 'make_command' -a 'query'
+ if [ $interactive -eq 1 ]
+ set fzf_interactive "--bind \"enter:execute:$make_command {}; echo; echo 'Done'; sleep 1\""
+ end
+
+ if test -n "$query"
+ set fzf_query "--query=$query"
+ end
+ set fzf_opts "--read0
+ $fzf_query
+ $fzf_interactive
+ --height 60%
+ --layout=reverse
+ --border
+ --preview-window='right:60%'
+ --preview='grep
+ --color=always -A 10 -B 1 \^{}: $filename; or echo -GENERATED TARGET-'"
+
+ set -q FZF_TMUX; or set FZF_TMUX 0
+ set -q FZF_TMUX_HEIGHT; or set FZF_TMUX_HEIGHT 60%
+ if [ $FZF_TMUX -eq 1 ]
+ echo "fzf-tmux -d$FZF_TMUX_HEIGHT $fzf_opts"
+ else
+ echo "fzf $fzf_opts"
+ end
+ end
+
+ if __mm_dependencies
+ set custom_filename $filename
+ set filename (__mm_get_makefile_name $filename)
+ if test -z "$filename"
+ echo 'No makefile found in the current working directory'
+ else
+ set targets (__mm_get_targets $filename)
+ if test -n "$targets"
+ if test -n "$custom_filename"
+ set make_command "make -f $filename"
+ else
+ set make_command "make"
+ end
+ # Interactive?
+ if test -n "$interactive"; and test $interactive -eq 1
+ string join0 -- $targets | eval (__mm_fzf_command $filename 1 $make_command $initial_query)
+ else
+ string join0 -- $targets | eval (__mm_fzf_command $filename 0 $make_command $initial_query) | read -lz result # print targets as a list, pipe them to fzf, put the chosen command in $result
+ set result (string trim -- $result) # Trim newlines and whitespace from the command
+ and commandline -- "$make_command $result" # Prepend the make command
+ commandline -f repaint # Repaint command line
+ end
+ else
+ echo "No targets found in $filename"
+ end
+ end
+ end
+
+end \ No newline at end of file
diff --git a/.config/fish/functions/prometeo-jenkins.fish b/.config/fish/functions/prometeo-jenkins.fish
new file mode 100644
index 00000000..bcd4311b
--- /dev/null
+++ b/.config/fish/functions/prometeo-jenkins.fish
@@ -0,0 +1,3 @@
+function prometeo-jenkins
+ ssh rgonzalez@172.31.1.184
+end
diff --git a/.config/fish/functions/prometeo.fish b/.config/fish/functions/prometeo.fish
index d59f5206..0dec9b9d 100644
--- a/.config/fish/functions/prometeo.fish
+++ b/.config/fish/functions/prometeo.fish
@@ -1,4 +1,4 @@
function prometeo
- cd ~/code/prometeo/prometeo
+ cd ~/code/prometeo/banking_api
source .venv/bin/activate.fish
end
diff --git a/.config/fish/functions/spark.fish b/.config/fish/functions/spark.fish
new file mode 100644
index 00000000..0bbe6ff0
--- /dev/null
+++ b/.config/fish/functions/spark.fish
@@ -0,0 +1,33 @@
+function spark --description Sparklines
+ argparse --ignore-unknown --name=spark v/version h/help m/min= M/max= -- $argv || return
+
+ if set --query _flag_version[1]
+ echo "spark, version 1.1.0"
+ else if set --query _flag_help[1]
+ echo "Usage: spark <numbers ...>"
+ echo " stdin | spark"
+ echo "Options:"
+ echo " --min=<number> Minimum range"
+ echo " --max=<number> Maximum range"
+ echo " -v or --version Print version"
+ echo " -h or --help Print this help message"
+ echo "Examples:"
+ echo " spark 1 1 2 5 14 42"
+ echo " seq 64 | sort --random-sort | spark"
+ else if set --query argv[1]
+ printf "%s\n" $argv | spark --min="$_flag_min" --max="$_flag_max"
+ else
+ command awk -v min="$_flag_min" -v max="$_flag_max" '
+ {
+ m = min == "" ? m == "" ? $0 : m > $0 ? $0 : m : min
+ M = max == "" ? M == "" ? $0 : M < $0 ? $0 : M : max
+ nums[NR] = $0
+ }
+ END {
+ n = split("▁ ▂ ▃ ▄ ▅ ▆ ▇ █", sparks, " ") - 1
+ while (++i <= NR)
+ printf("%s", sparks[(M == m) ? 3 : sprintf("%.f", (1 + (nums[i] - m) * n / (M - m)))])
+ }
+ ' && echo
+ end
+end
diff --git a/.config/fish/functions/tide.fish b/.config/fish/functions/tide.fish
new file mode 100644
index 00000000..87fb8dc4
--- /dev/null
+++ b/.config/fish/functions/tide.fish
@@ -0,0 +1,27 @@
+function tide --description 'Manage your Tide prompt'
+ argparse --stop-nonopt v/version h/help -- $argv
+
+ if set -q _flag_version
+ echo 'tide, version 5.4.0'
+ else if set -q _flag_help
+ _tide_help
+ else if functions --query _tide_sub_$argv[1]
+ _tide_sub_$argv[1] $argv[2..]
+ else
+ _tide_help
+ return 1
+ end
+end
+
+function _tide_help
+ printf %s\n \
+ 'Usage: tide [options] subcommand [options]' \
+ '' \
+ 'Options:' \
+ ' -v or --version print tide version number' \
+ ' -h or --help print this help message' \
+ '' \
+ 'Subcommands:' \
+ ' configure run interactive configuration wizard' \
+ ' bug-report print info for use in bug reports'
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/finish.fish b/.config/fish/functions/tide/configure/choices/all/finish.fish
new file mode 100644
index 00000000..f60a1285
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/finish.fish
@@ -0,0 +1,33 @@
+function finish
+ set_color red
+ _tide_title 'Overwrite tide config?'
+ set_color normal
+
+ _tide_option y Yes
+ echo
+
+ _tide_menu
+ switch $_tide_selected_option
+ case y
+ _tide_finish
+ command -q clear && clear
+ end
+end
+
+function _tide_finish
+ set -e _tide_selected_option # Skip through all the _next_choices
+
+ # Deal with prompt char/vi mode
+ contains character $fake_tide_left_prompt_items || set -p fake_tide_left_prompt_items vi_mode
+
+ # Set the real variables
+ for fakeVar in (set --names | string match -r "^fake_tide.*")
+ set -U (string replace 'fake_' '' $fakeVar) $$fakeVar
+ end
+
+ # Make sure old prompt won't display
+ set -e $_tide_prompt_var 2>/dev/null
+
+ # Re-initialize the prompt
+ source (functions --details fish_prompt)
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/icons.fish b/.config/fish/functions/tide/configure/choices/all/icons.fish
new file mode 100644
index 00000000..e53bffa5
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/icons.fish
@@ -0,0 +1,33 @@
+function icons
+ _tide_title Icons
+
+ _tide_option 1 'Few icons'
+ _tide_display_prompt
+
+ _tide_option 2 'Many icons'
+ _enable_icons
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ _disable_icons
+ end
+ _next_choice all/finish
+end
+
+function _enable_icons
+ set -p fake_tide_left_prompt_items os
+ set -g fake_tide_pwd_icon 
+ set -g fake_tide_pwd_icon_home 
+ set -g fake_tide_cmd_duration_icon 
+ set -g fake_tide_git_icon 
+end
+
+function _disable_icons
+ _tide_find_and_remove os fake_tide_left_prompt_items
+ set fake_tide_pwd_icon
+ set fake_tide_pwd_icon_home
+ set fake_tide_cmd_duration_icon
+ set fake_tide_git_icon
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/prompt_colors.fish b/.config/fish/functions/tide/configure/choices/all/prompt_colors.fish
new file mode 100644
index 00000000..90b1a9d9
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/prompt_colors.fish
@@ -0,0 +1,26 @@
+function prompt_colors
+ _tide_title 'Prompt Colors'
+
+ _tide_option 1 'True color'
+ _tide_display_prompt
+
+ _tide_option 2 '16 colors'
+ _load_config "$_tide_configure_style"_16color
+ set -g _tide_16color true
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ _load_config "$_tide_configure_style"
+ set -e _tide_16color
+ switch $_tide_configure_style
+ case lean rainbow
+ _next_choice all/show_time
+ case classic
+ _next_choice classic/classic_prompt_color
+ end
+ case 2
+ _next_choice all/show_time
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/prompt_connection.fish b/.config/fish/functions/tide/configure/choices/all/prompt_connection.fish
new file mode 100644
index 00000000..ae31ef36
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/prompt_connection.fish
@@ -0,0 +1,28 @@
+function prompt_connection
+ _tide_title 'Prompt Connection'
+
+ _tide_option 1 Disconnected
+ _tide_display_prompt fake_tide_prompt_icon_connection ' '
+
+ _tide_option 2 Dotted
+ _tide_display_prompt fake_tide_prompt_icon_connection '·'
+
+ _tide_option 3 Solid
+ _tide_display_prompt fake_tide_prompt_icon_connection '─'
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_prompt_icon_connection ' '
+ case 2
+ set -g fake_tide_prompt_icon_connection '·'
+ case 3
+ set -g fake_tide_prompt_icon_connection '─'
+ end
+ switch $_tide_configure_style
+ case lean
+ _next_choice all/prompt_connection_andor_frame_color
+ case classic rainbow
+ _next_choice powerline/powerline_prompt_frame
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/prompt_connection_andor_frame_color.fish b/.config/fish/functions/tide/configure/choices/all/prompt_connection_andor_frame_color.fish
new file mode 100644
index 00000000..b8803b40
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/prompt_connection_andor_frame_color.fish
@@ -0,0 +1,36 @@
+function prompt_connection_andor_frame_color
+ if test "$_tide_16color" = true ||
+ test "$fake_tide_left_prompt_frame_enabled" = false -a \
+ "$fake_tide_right_prompt_frame_enabled" = false -a \
+ "$fake_tide_prompt_icon_connection" = ' '
+ _next_choice all/prompt_spacing
+ return 0
+ end
+
+ _tide_title "Connection & Frame Color"
+
+ _tide_option 1 Lightest
+ _tide_display_prompt fake_tide_prompt_color_frame_and_connection 808080
+
+ _tide_option 2 Light
+ _tide_display_prompt fake_tide_prompt_color_frame_and_connection 6C6C6C
+
+ _tide_option 3 Dark
+ _tide_display_prompt fake_tide_prompt_color_frame_and_connection 585858
+
+ _tide_option 4 Darkest
+ _tide_display_prompt fake_tide_prompt_color_frame_and_connection 444444
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_prompt_color_frame_and_connection 808080
+ case 2
+ set -g fake_tide_prompt_color_frame_and_connection 6C6C6C
+ case 3
+ set -g fake_tide_prompt_color_frame_and_connection 585858
+ case 4
+ set -g fake_tide_prompt_color_frame_and_connection 444444
+ end
+ _next_choice all/prompt_spacing
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/prompt_spacing.fish b/.config/fish/functions/tide/configure/choices/all/prompt_spacing.fish
new file mode 100644
index 00000000..a5bb98bc
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/prompt_spacing.fish
@@ -0,0 +1,21 @@
+function prompt_spacing
+ _tide_title 'Prompt Spacing'
+
+ _tide_option 1 Compact
+ _tide_display_prompt
+ printf \e\[1A # Move cursor up 1 row
+ _tide_display_prompt
+
+ _tide_option 2 Sparse
+ _tide_display_prompt
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_prompt_add_newline_before false
+ case 2
+ set -g fake_tide_prompt_add_newline_before true
+ end
+ _next_choice all/icons
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/show_time.fish b/.config/fish/functions/tide/configure/choices/all/show_time.fish
new file mode 100644
index 00000000..8cf18436
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/show_time.fish
@@ -0,0 +1,31 @@
+function show_time
+ _tide_title 'Show current time?'
+
+ _tide_option 1 No
+ _tide_display_prompt
+
+ set -a fake_tide_right_prompt_items time
+
+ _tide_option 2 '24-hour format'
+ _tide_display_prompt fake_tide_time_format %T
+
+ _tide_option 3 '12-hour format'
+ _tide_display_prompt fake_tide_time_format '%r'
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_time_format ''
+ set -e fake_tide_right_prompt_items[-1]
+ case 2
+ set -g fake_tide_time_format %T
+ case 3
+ set -g fake_tide_time_format '%r'
+ end
+ switch $_tide_configure_style
+ case lean
+ _next_choice "$_tide_configure_style"/"$_tide_configure_style"_prompt_height
+ case classic rainbow
+ _next_choice "$_tide_configure_style"/"$_tide_configure_style"_prompt_separators
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/all/style.fish b/.config/fish/functions/tide/configure/choices/all/style.fish
new file mode 100644
index 00000000..ae52bc52
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/all/style.fish
@@ -0,0 +1,57 @@
+function style
+ _tide_title 'Prompt Style'
+
+ _tide_option 1 Lean
+ _load_config lean
+ _tide_display_prompt
+
+ _tide_option 2 Classic
+ _load_config classic
+ _tide_display_prompt
+
+ _tide_option 3 Rainbow
+ _load_config rainbow
+ _tide_display_prompt
+
+ _tide_style_menu
+ switch $_tide_selected_option
+ case 1
+ _load_config lean
+ set -g _tide_configure_style lean
+ case 2
+ _load_config classic
+ set -g _tide_configure_style classic
+ case 3
+ _load_config rainbow
+ set -g _tide_configure_style rainbow
+ end
+ _next_choice all/prompt_colors
+end
+
+function _load_config -a name
+ string replace -r '^' 'set -g fake_' <(status dirname)/../../configs/$name.fish | source
+end
+
+function _tide_style_menu # Exactly like _tide_menu except that it doesn't have (r) option
+ set -l list_with_slashes (string join '/' $_tide_option_list)
+
+ echo '(q) Quit and do nothing'\n
+
+ while true
+ set_color -o
+ read --nchars 1 --prompt-str "Choice [$list_with_slashes/q] " input
+ set_color normal
+
+ switch $input
+ case q
+ set -e _tide_selected_option # Skip through all the _next_choices
+ set -e _tide_option_list
+ command -q clear && clear
+ break
+ case $_tide_option_list
+ set -e _tide_option_list
+ set -g _tide_selected_option $input
+ break
+ end
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/classic/classic_prompt_color.fish b/.config/fish/functions/tide/configure/choices/classic/classic_prompt_color.fish
new file mode 100644
index 00000000..2189f363
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/classic/classic_prompt_color.fish
@@ -0,0 +1,38 @@
+function classic_prompt_color
+ _tide_title 'Prompt Color'
+
+ _tide_option 1 Lightest
+ _set_all_items_bg_color 585858
+ _tide_display_prompt
+
+ _tide_option 2 Light
+ _set_all_items_bg_color 444444
+ _tide_display_prompt
+
+ _tide_option 3 Dark
+ _set_all_items_bg_color 303030
+ _tide_display_prompt
+
+ _tide_option 4 Darkest
+ _set_all_items_bg_color 1C1C1C
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ _set_all_items_bg_color 585858
+ case 2
+ _set_all_items_bg_color 444444
+ case 3
+ _set_all_items_bg_color 303030
+ case 4
+ _set_all_items_bg_color 1C1C1C
+ end
+ _next_choice all/show_time
+end
+
+function _set_all_items_bg_color -a color
+ for var in (set --names | string match -r "fake_.*_bg_color.*")
+ set $var $color
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/classic/classic_prompt_separators.fish b/.config/fish/functions/tide/configure/choices/classic/classic_prompt_separators.fish
new file mode 100644
index 00000000..17b88e46
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/classic/classic_prompt_separators.fish
@@ -0,0 +1,40 @@
+function classic_prompt_separators
+ _tide_title 'Prompt Separators'
+
+ _tide_option 1 Angled
+ set -g fake_tide_left_prompt_separator_same_color 
+ set -g fake_tide_right_prompt_separator_same_color 
+ _tide_display_prompt
+
+ _tide_option 2 Vertical
+ set -g fake_tide_left_prompt_separator_same_color '│'
+ set -g fake_tide_right_prompt_separator_same_color '│'
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_separator_same_color '╱'
+ set -g fake_tide_right_prompt_separator_same_color '╱'
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_separator_same_color ''
+ set -g fake_tide_right_prompt_separator_same_color ''
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_left_prompt_separator_same_color 
+ set -g fake_tide_right_prompt_separator_same_color 
+ case 2
+ set -g fake_tide_left_prompt_separator_same_color '│'
+ set -g fake_tide_right_prompt_separator_same_color '│'
+ case 3
+ set -g fake_tide_left_prompt_separator_same_color '╱'
+ set -g fake_tide_right_prompt_separator_same_color '╱'
+ case 4
+ set -g fake_tide_left_prompt_separator_same_color ''
+ set -g fake_tide_right_prompt_separator_same_color ''
+ end
+ _next_choice powerline/powerline_prompt_heads
+end
diff --git a/.config/fish/functions/tide/configure/choices/lean/lean_prompt_height.fish b/.config/fish/functions/tide/configure/choices/lean/lean_prompt_height.fish
new file mode 100644
index 00000000..4db04a80
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/lean/lean_prompt_height.fish
@@ -0,0 +1,26 @@
+function lean_prompt_height
+ _tide_title 'Prompt Height'
+
+ _tide_option 1 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set -g fake_tide_left_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_option 2 'Two lines'
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items[1..-2] newline $fake_tide_left_prompt_items[-1]
+ set -g fake_tide_left_prompt_suffix ' '
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set fake_tide_left_prompt_suffix ''
+ _next_choice all/prompt_connection_andor_frame_color
+ case 2
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items[1..-2] newline $fake_tide_left_prompt_items[-1]
+ set -g fake_tide_left_prompt_suffix ' '
+ _next_choice all/prompt_connection
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_frame.fish b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_frame.fish
new file mode 100644
index 00000000..19b35884
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_frame.fish
@@ -0,0 +1,46 @@
+function powerline_prompt_frame
+ _tide_title 'Prompt Frame'
+
+ _tide_option 1 'No frame'
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ set -a fake_tide_left_prompt_items character
+ _tide_display_prompt
+ set -e fake_tide_left_prompt_items[-1]
+
+ _tide_option 2 Left
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled false
+ _tide_display_prompt
+
+ _tide_option 3 Right
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled true
+ set -a fake_tide_left_prompt_items character
+ _tide_display_prompt
+ set -e fake_tide_left_prompt_items[-1]
+
+ _tide_option 4 Full
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ set -a fake_tide_left_prompt_items character
+ case 2
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled false
+ case 3
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled true
+ set -a fake_tide_left_prompt_items character
+ case 4
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ end
+ _next_choice all/prompt_connection_andor_frame_color
+end
diff --git a/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_heads.fish b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_heads.fish
new file mode 100644
index 00000000..ac187c9e
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_heads.fish
@@ -0,0 +1,40 @@
+function powerline_prompt_heads
+ _tide_title 'Prompt Heads'
+
+ _tide_option 1 Sharp
+ set -g fake_tide_left_prompt_suffix 
+ set -g fake_tide_right_prompt_prefix 
+ _tide_display_prompt
+
+ _tide_option 2 Blurred
+ set -g fake_tide_left_prompt_suffix '▓▒░'
+ set -g fake_tide_right_prompt_prefix '░▒▓'
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_suffix ''
+ set -g fake_tide_right_prompt_prefix ''
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_suffix ''
+ set -g fake_tide_right_prompt_prefix ''
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_left_prompt_suffix 
+ set -g fake_tide_right_prompt_prefix 
+ case 2
+ set -g fake_tide_left_prompt_suffix '▓▒░'
+ set -g fake_tide_right_prompt_prefix '░▒▓'
+ case 3
+ set -g fake_tide_left_prompt_suffix ''
+ set -g fake_tide_right_prompt_prefix ''
+ case 4
+ set -g fake_tide_left_prompt_suffix ''
+ set -g fake_tide_right_prompt_prefix ''
+ end
+ _next_choice powerline/powerline_prompt_tails
+end
diff --git a/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_height.fish b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_height.fish
new file mode 100644
index 00000000..83fef054
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_height.fish
@@ -0,0 +1,30 @@
+function powerline_prompt_height
+ _tide_title 'Prompt Height'
+
+ _tide_option 1 'One line'
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _tide_display_prompt
+
+ _tide_option 2 'Two lines'
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items newline
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set fake_tide_left_prompt_frame_enabled false
+ set fake_tide_right_prompt_frame_enabled false
+ _next_choice all/prompt_connection_andor_frame_color
+ case 2
+ _tide_find_and_remove newline fake_tide_left_prompt_items
+ set -g fake_tide_left_prompt_items $fake_tide_left_prompt_items newline
+ set fake_tide_left_prompt_frame_enabled true
+ set fake_tide_right_prompt_frame_enabled true
+ _next_choice all/prompt_connection
+ end
+end
diff --git a/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_tails.fish b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_tails.fish
new file mode 100644
index 00000000..02f4609d
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/powerline/powerline_prompt_tails.fish
@@ -0,0 +1,48 @@
+function powerline_prompt_tails
+ _tide_title 'Prompt Tails'
+
+ _tide_option 1 Flat
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_option 2 Blurred
+ set -g fake_tide_left_prompt_prefix '░▒▓'
+ set -g fake_tide_right_prompt_suffix '▓▒░'
+ _tide_display_prompt
+
+ _tide_option 3 Sharp
+ set -g fake_tide_left_prompt_prefix 
+ set -g fake_tide_right_prompt_suffix 
+ _tide_display_prompt
+
+ _tide_option 4 Slanted
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_option 5 Round
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ case 2
+ set -g fake_tide_left_prompt_prefix '░▒▓'
+ set -g fake_tide_right_prompt_suffix '▓▒░'
+ case 3
+ set -g fake_tide_left_prompt_prefix 
+ set -g fake_tide_right_prompt_suffix 
+ case 4
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ case 5
+ set -g fake_tide_left_prompt_prefix ''
+ set -g fake_tide_right_prompt_suffix ''
+ end
+ _next_choice powerline/powerline_prompt_height
+end
diff --git a/.config/fish/functions/tide/configure/choices/rainbow/rainbow_prompt_separators.fish b/.config/fish/functions/tide/configure/choices/rainbow/rainbow_prompt_separators.fish
new file mode 100644
index 00000000..29f6ccc8
--- /dev/null
+++ b/.config/fish/functions/tide/configure/choices/rainbow/rainbow_prompt_separators.fish
@@ -0,0 +1,40 @@
+function rainbow_prompt_separators
+ _tide_title 'Prompt Separators'
+
+ _tide_option 1 Angled
+ set -g fake_tide_left_prompt_separator_diff_color 
+ set -g fake_tide_right_prompt_separator_diff_color 
+ _tide_display_prompt
+
+ _tide_option 2 Vertical
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_option 3 Slanted
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_option 4 Round
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ _tide_display_prompt
+
+ _tide_menu
+ switch $_tide_selected_option
+ case 1
+ set -g fake_tide_left_prompt_separator_diff_color 
+ set -g fake_tide_right_prompt_separator_diff_color 
+ case 2
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ case 3
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ case 4
+ set -g fake_tide_left_prompt_separator_diff_color ''
+ set -g fake_tide_right_prompt_separator_diff_color ''
+ end
+ _next_choice powerline/powerline_prompt_heads
+end
diff --git a/.config/fish/functions/tide/configure/configs/classic.fish b/.config/fish/functions/tide/configure/configs/classic.fish
new file mode 100644
index 00000000..be106d85
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/classic.fish
@@ -0,0 +1,129 @@
+tide_aws_bg_color 444444
+tide_aws_color FF9900
+tide_aws_icon 
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_character_icon ❯
+tide_character_vi_icon_default ❮
+tide_character_vi_icon_replace ▶
+tide_character_vi_icon_visual V
+tide_chruby_bg_color 444444
+tide_chruby_color B31209
+tide_chruby_icon 
+tide_cmd_duration_bg_color 444444
+tide_cmd_duration_color 87875F
+tide_cmd_duration_decimals 0
+tide_cmd_duration_icon
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color 444444
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_docker_bg_color 444444
+tide_docker_color 2496ED
+tide_docker_default_contexts default colima
+tide_docker_icon 
+tide_git_bg_color 444444
+tide_git_bg_color_unstable 444444
+tide_git_bg_color_urgent 444444
+tide_git_color_branch $_tide_color_green
+tide_git_color_conflicted FF0000
+tide_git_color_dirty $_tide_color_gold
+tide_git_color_operation FF0000
+tide_git_color_staged $_tide_color_gold
+tide_git_color_stash $_tide_color_green
+tide_git_color_untracked $_tide_color_light_blue
+tide_git_color_upstream $_tide_color_green
+tide_git_icon
+tide_git_truncation_length 24
+tide_go_bg_color 444444
+tide_go_color 00ACD7
+tide_go_icon 
+tide_java_bg_color 444444
+tide_java_color ED8B00
+tide_java_icon 
+tide_jobs_bg_color 444444
+tide_jobs_color $_tide_color_dark_green
+tide_jobs_icon 
+tide_kubectl_bg_color 444444
+tide_kubectl_color 326CE5
+tide_kubectl_icon ⎈
+tide_left_prompt_frame_enabled true
+tide_left_prompt_items pwd git newline
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color 
+tide_left_prompt_separator_same_color 
+tide_left_prompt_suffix 
+tide_nix_shell_bg_color 444444
+tide_nix_shell_color 7EBAE4
+tide_nix_shell_icon 
+tide_node_bg_color 444444
+tide_node_color 44883E
+tide_node_icon ⬢
+tide_os_bg_color 444444
+tide_os_color EEEEEE
+tide_os_icon $os_branding_icon
+tide_php_bg_color 444444
+tide_php_color 617CBE
+tide_php_icon 
+tide_private_mode_bg_color 444444
+tide_private_mode_color FFFFFF
+tide_private_mode_icon 﫸
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_icon_connection ' '
+tide_prompt_min_cols 34
+tide_prompt_pad_items true
+tide_pwd_bg_color 444444
+tide_pwd_color_anchors $_tide_color_light_blue
+tide_pwd_color_dirs $_tide_color_dark_blue
+tide_pwd_color_truncated_dirs 8787AF
+tide_pwd_icon
+tide_pwd_icon_home
+tide_pwd_icon_unwritable 
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json
+tide_right_prompt_frame_enabled true
+tide_right_prompt_items status cmd_duration context jobs node virtual_env rustc java php chruby go kubectl toolbox terraform aws nix_shell
+tide_right_prompt_prefix 
+tide_right_prompt_separator_diff_color 
+tide_right_prompt_separator_same_color 
+tide_right_prompt_suffix ''
+tide_rustc_bg_color 444444
+tide_rustc_color F74C00
+tide_rustc_icon 
+tide_shlvl_bg_color 444444
+tide_shlvl_color d78700
+tide_shlvl_icon 
+tide_shlvl_threshold 1
+tide_status_bg_color 444444
+tide_status_bg_color_failure 444444
+tide_status_color $_tide_color_dark_green
+tide_status_color_failure D70000
+tide_status_icon ✔
+tide_status_icon_failure ✘
+tide_terraform_bg_color 444444
+tide_terraform_color 844FBA
+tide_terraform_icon
+tide_time_bg_color 444444
+tide_time_color 5F8787
+tide_time_format %T
+tide_toolbox_bg_color 444444
+tide_toolbox_color 613583
+tide_toolbox_icon ⬢
+tide_vi_mode_bg_color_default 444444
+tide_vi_mode_bg_color_insert 444444
+tide_vi_mode_bg_color_replace 444444
+tide_vi_mode_bg_color_visual 444444
+tide_vi_mode_color_default 949494
+tide_vi_mode_color_insert 87AFAF
+tide_vi_mode_color_replace 87AF87
+tide_vi_mode_color_visual FF8700
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_virtual_env_bg_color 444444
+tide_virtual_env_color 00AFAF
+tide_virtual_env_icon 
diff --git a/.config/fish/functions/tide/configure/configs/classic_16color.fish b/.config/fish/functions/tide/configure/configs/classic_16color.fish
new file mode 100644
index 00000000..3a44cefe
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/classic_16color.fish
@@ -0,0 +1,73 @@
+tide_aws_bg_color black
+tide_aws_color yellow
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_chruby_bg_color black
+tide_chruby_color red
+tide_cmd_duration_bg_color black
+tide_cmd_duration_color brblack
+tide_context_bg_color black
+tide_context_color_default yellow
+tide_context_color_root bryellow
+tide_context_color_ssh yellow
+tide_docker_bg_color black
+tide_docker_color blue
+tide_git_bg_color black
+tide_git_bg_color_unstable black
+tide_git_bg_color_urgent black
+tide_git_color_branch brgreen
+tide_git_color_conflicted brred
+tide_git_color_dirty bryellow
+tide_git_color_operation brred
+tide_git_color_staged bryellow
+tide_git_color_stash brgreen
+tide_git_color_untracked brblue
+tide_git_color_upstream brgreen
+tide_go_bg_color black
+tide_go_color brcyan
+tide_java_bg_color black
+tide_java_color yellow
+tide_jobs_bg_color black
+tide_jobs_color green
+tide_kubectl_bg_color black
+tide_kubectl_color blue
+tide_nix_shell_bg_color black
+tide_nix_shell_color brblue
+tide_node_bg_color black
+tide_node_color green
+tide_os_bg_color black
+tide_os_color brwhite
+tide_php_bg_color black
+tide_php_color blue
+tide_private_mode_bg_color black
+tide_private_mode_color brwhite
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pwd_bg_color black
+tide_pwd_color_anchors brcyan
+tide_pwd_color_dirs cyan
+tide_pwd_color_truncated_dirs magenta
+tide_rustc_bg_color black
+tide_rustc_color red
+tide_shlvl_bg_color black
+tide_shlvl_color yellow
+tide_status_bg_color black
+tide_status_bg_color_failure black
+tide_status_color green
+tide_status_color_failure red
+tide_terraform_bg_color black
+tide_terraform_color magenta
+tide_time_bg_color black
+tide_time_color brblack
+tide_toolbox_bg_color black
+tide_toolbox_color magenta
+tide_vi_mode_bg_color_default black
+tide_vi_mode_bg_color_insert black
+tide_vi_mode_bg_color_replace black
+tide_vi_mode_bg_color_visual black
+tide_vi_mode_color_default white
+tide_vi_mode_color_insert cyan
+tide_vi_mode_color_replace green
+tide_vi_mode_color_visual yellow
+tide_virtual_env_bg_color black
+tide_virtual_env_color cyan
diff --git a/.config/fish/functions/tide/configure/configs/lean.fish b/.config/fish/functions/tide/configure/configs/lean.fish
new file mode 100644
index 00000000..7381198c
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/lean.fish
@@ -0,0 +1,129 @@
+tide_aws_bg_color normal
+tide_aws_color FF9900
+tide_aws_icon 
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_character_icon ❯
+tide_character_vi_icon_default ❮
+tide_character_vi_icon_replace ▶
+tide_character_vi_icon_visual V
+tide_chruby_bg_color normal
+tide_chruby_color B31209
+tide_chruby_icon 
+tide_cmd_duration_bg_color normal
+tide_cmd_duration_color 87875F
+tide_cmd_duration_decimals 0
+tide_cmd_duration_icon
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color normal
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_docker_bg_color normal
+tide_docker_color 2496ED
+tide_docker_default_contexts default colima
+tide_docker_icon 
+tide_git_bg_color normal
+tide_git_bg_color_unstable normal
+tide_git_bg_color_urgent normal
+tide_git_color_branch $_tide_color_green
+tide_git_color_conflicted FF0000
+tide_git_color_dirty $_tide_color_gold
+tide_git_color_operation FF0000
+tide_git_color_staged $_tide_color_gold
+tide_git_color_stash $_tide_color_green
+tide_git_color_untracked $_tide_color_light_blue
+tide_git_color_upstream $_tide_color_green
+tide_git_icon
+tide_git_truncation_length 24
+tide_go_bg_color normal
+tide_go_color 00ACD7
+tide_go_icon 
+tide_java_bg_color normal
+tide_java_color ED8B00
+tide_java_icon 
+tide_jobs_bg_color normal
+tide_jobs_color $_tide_color_dark_green
+tide_jobs_icon 
+tide_kubectl_bg_color normal
+tide_kubectl_color 326CE5
+tide_kubectl_icon ⎈
+tide_left_prompt_frame_enabled false
+tide_left_prompt_items pwd git newline character
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color ' '
+tide_left_prompt_separator_same_color ' '
+tide_left_prompt_suffix ' '
+tide_nix_shell_bg_color normal
+tide_nix_shell_color 7EBAE4
+tide_nix_shell_icon 
+tide_node_bg_color normal
+tide_node_color 44883E
+tide_node_icon ⬢
+tide_os_bg_color normal
+tide_os_color normal
+tide_os_icon $os_branding_icon
+tide_php_bg_color normal
+tide_php_color 617CBE
+tide_php_icon 
+tide_private_mode_bg_color normal
+tide_private_mode_color FFFFFF
+tide_private_mode_icon 﫸
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_icon_connection ' '
+tide_prompt_min_cols 34
+tide_prompt_pad_items false
+tide_pwd_bg_color normal
+tide_pwd_color_anchors $_tide_color_light_blue
+tide_pwd_color_dirs $_tide_color_dark_blue
+tide_pwd_color_truncated_dirs 8787AF
+tide_pwd_icon
+tide_pwd_icon_home
+tide_pwd_icon_unwritable 
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json
+tide_right_prompt_frame_enabled false
+tide_right_prompt_items status cmd_duration context jobs node virtual_env rustc java php chruby go kubectl toolbox terraform aws nix_shell
+tide_right_prompt_prefix ' '
+tide_right_prompt_separator_diff_color ' '
+tide_right_prompt_separator_same_color ' '
+tide_right_prompt_suffix ''
+tide_rustc_bg_color normal
+tide_rustc_color F74C00
+tide_rustc_icon 
+tide_shlvl_bg_color normal
+tide_shlvl_color d78700
+tide_shlvl_icon 
+tide_shlvl_threshold 1
+tide_status_bg_color normal
+tide_status_bg_color_failure normal
+tide_status_color $_tide_color_dark_green
+tide_status_color_failure D70000
+tide_status_icon ✔
+tide_status_icon_failure ✘
+tide_terraform_bg_color normal
+tide_terraform_color 844FBA
+tide_terraform_icon
+tide_time_bg_color normal
+tide_time_color 5F8787
+tide_time_format %T
+tide_toolbox_bg_color normal
+tide_toolbox_color 613583
+tide_toolbox_icon ⬢
+tide_vi_mode_bg_color_default normal
+tide_vi_mode_bg_color_insert normal
+tide_vi_mode_bg_color_replace normal
+tide_vi_mode_bg_color_visual normal
+tide_vi_mode_color_default 949494
+tide_vi_mode_color_insert 87AFAF
+tide_vi_mode_color_replace 87AF87
+tide_vi_mode_color_visual FF8700
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_virtual_env_bg_color normal
+tide_virtual_env_color 00AFAF
+tide_virtual_env_icon 
diff --git a/.config/fish/functions/tide/configure/configs/lean_16color.fish b/.config/fish/functions/tide/configure/configs/lean_16color.fish
new file mode 100644
index 00000000..a836852b
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/lean_16color.fish
@@ -0,0 +1,73 @@
+tide_aws_bg_color normal
+tide_aws_color yellow
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_chruby_bg_color normal
+tide_chruby_color red
+tide_cmd_duration_bg_color normal
+tide_cmd_duration_color brblack
+tide_context_bg_color normal
+tide_context_color_default yellow
+tide_context_color_root bryellow
+tide_context_color_ssh yellow
+tide_docker_bg_color normal
+tide_docker_color blue
+tide_git_bg_color normal
+tide_git_bg_color_unstable normal
+tide_git_bg_color_urgent normal
+tide_git_color_branch brgreen
+tide_git_color_conflicted brred
+tide_git_color_dirty bryellow
+tide_git_color_operation brred
+tide_git_color_staged bryellow
+tide_git_color_stash brgreen
+tide_git_color_untracked brblue
+tide_git_color_upstream brgreen
+tide_go_bg_color normal
+tide_go_color brcyan
+tide_java_bg_color normal
+tide_java_color yellow
+tide_jobs_bg_color normal
+tide_jobs_color green
+tide_kubectl_bg_color normal
+tide_kubectl_color blue
+tide_nix_shell_bg_color normal
+tide_nix_shell_color brblue
+tide_node_bg_color normal
+tide_node_color green
+tide_os_bg_color normal
+tide_os_color brwhite
+tide_php_bg_color normal
+tide_php_color blue
+tide_private_mode_bg_color normal
+tide_private_mode_color brwhite
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pwd_bg_color normal
+tide_pwd_color_anchors brcyan
+tide_pwd_color_dirs cyan
+tide_pwd_color_truncated_dirs magenta
+tide_rustc_bg_color normal
+tide_rustc_color red
+tide_shlvl_bg_color normal
+tide_shlvl_color yellow
+tide_status_bg_color normal
+tide_status_bg_color_failure normal
+tide_status_color green
+tide_status_color_failure red
+tide_terraform_bg_color normal
+tide_terraform_color magenta
+tide_time_bg_color normal
+tide_time_color brblack
+tide_toolbox_bg_color normal
+tide_toolbox_color magenta
+tide_vi_mode_bg_color_default normal
+tide_vi_mode_bg_color_insert normal
+tide_vi_mode_bg_color_replace normal
+tide_vi_mode_bg_color_visual normal
+tide_vi_mode_color_default white
+tide_vi_mode_color_insert cyan
+tide_vi_mode_color_replace green
+tide_vi_mode_color_visual yellow
+tide_virtual_env_bg_color normal
+tide_virtual_env_color cyan
diff --git a/.config/fish/functions/tide/configure/configs/rainbow.fish b/.config/fish/functions/tide/configure/configs/rainbow.fish
new file mode 100644
index 00000000..84f15adb
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/rainbow.fish
@@ -0,0 +1,129 @@
+tide_aws_bg_color FF9900
+tide_aws_color 232F3E
+tide_aws_icon 
+tide_character_color $_tide_color_green
+tide_character_color_failure FF0000
+tide_character_icon ❯
+tide_character_vi_icon_default ❮
+tide_character_vi_icon_replace ▶
+tide_character_vi_icon_visual V
+tide_chruby_bg_color B31209
+tide_chruby_color 000000
+tide_chruby_icon 
+tide_cmd_duration_bg_color C4A000
+tide_cmd_duration_color 000000
+tide_cmd_duration_decimals 0
+tide_cmd_duration_icon
+tide_cmd_duration_threshold 3000
+tide_context_always_display false
+tide_context_bg_color 444444
+tide_context_color_default D7AF87
+tide_context_color_root $_tide_color_gold
+tide_context_color_ssh D7AF87
+tide_docker_bg_color 2496ED
+tide_docker_color 000000
+tide_docker_default_contexts default colima
+tide_docker_icon 
+tide_git_bg_color 4E9A06
+tide_git_bg_color_unstable C4A000
+tide_git_bg_color_urgent CC0000
+tide_git_color_branch 000000
+tide_git_color_conflicted 000000
+tide_git_color_dirty 000000
+tide_git_color_operation 000000
+tide_git_color_staged 000000
+tide_git_color_stash 000000
+tide_git_color_untracked 000000
+tide_git_color_upstream 000000
+tide_git_icon
+tide_git_truncation_length 24
+tide_go_bg_color 00ACD7
+tide_go_color 000000
+tide_go_icon 
+tide_java_bg_color ED8B00
+tide_java_color 000000
+tide_java_icon 
+tide_jobs_bg_color 444444
+tide_jobs_color 4E9A06
+tide_jobs_icon 
+tide_kubectl_bg_color 326CE5
+tide_kubectl_color 000000
+tide_kubectl_icon ⎈
+tide_left_prompt_frame_enabled true
+tide_left_prompt_items pwd git newline
+tide_left_prompt_prefix ''
+tide_left_prompt_separator_diff_color 
+tide_left_prompt_separator_same_color 
+tide_left_prompt_suffix 
+tide_nix_shell_bg_color 7EBAE4
+tide_nix_shell_color 000000
+tide_nix_shell_icon 
+tide_node_bg_color 44883E
+tide_node_color 000000
+tide_node_icon ⬢
+tide_os_bg_color $os_branding_bg_color
+tide_os_color $os_branding_color
+tide_os_icon $os_branding_icon
+tide_php_bg_color 617CBE
+tide_php_color 000000
+tide_php_icon 
+tide_private_mode_bg_color F1F3F4
+tide_private_mode_color 000000
+tide_private_mode_icon 﫸
+tide_prompt_add_newline_before true
+tide_prompt_color_frame_and_connection 6C6C6C
+tide_prompt_color_separator_same_color 949494
+tide_prompt_icon_connection ' '
+tide_prompt_min_cols 34
+tide_prompt_pad_items true
+tide_pwd_bg_color 3465A4
+tide_pwd_color_anchors E4E4E4
+tide_pwd_color_dirs E4E4E4
+tide_pwd_color_truncated_dirs BCBCBC
+tide_pwd_icon
+tide_pwd_icon_home
+tide_pwd_icon_unwritable 
+tide_pwd_markers .bzr .citc .git .hg .node-version .python-version .ruby-version .shorten_folder_marker .svn .terraform Cargo.toml composer.json CVS go.mod package.json
+tide_right_prompt_frame_enabled true
+tide_right_prompt_items status cmd_duration context jobs node virtual_env rustc java php chruby go kubectl toolbox terraform aws nix_shell
+tide_right_prompt_prefix 
+tide_right_prompt_separator_diff_color 
+tide_right_prompt_separator_same_color 
+tide_right_prompt_suffix ''
+tide_rustc_bg_color F74C00
+tide_rustc_color 000000
+tide_rustc_icon 
+tide_shlvl_bg_color 808000
+tide_shlvl_color 000000
+tide_shlvl_icon 
+tide_shlvl_threshold 1
+tide_status_bg_color 2E3436
+tide_status_bg_color_failure CC0000
+tide_status_color 4E9A06
+tide_status_color_failure FFFF00
+tide_status_icon ✔
+tide_status_icon_failure ✘
+tide_terraform_bg_color 800080
+tide_terraform_color 000000
+tide_terraform_icon
+tide_time_bg_color D3D7CF
+tide_time_color 000000
+tide_time_format %T
+tide_toolbox_bg_color 613583
+tide_toolbox_color 000000
+tide_toolbox_icon ⬢
+tide_vi_mode_bg_color_default 949494
+tide_vi_mode_bg_color_insert 87AFAF
+tide_vi_mode_bg_color_replace 87AF87
+tide_vi_mode_bg_color_visual FF8700
+tide_vi_mode_color_default 000000
+tide_vi_mode_color_insert 000000
+tide_vi_mode_color_replace 000000
+tide_vi_mode_color_visual 000000
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_virtual_env_bg_color 444444
+tide_virtual_env_color 00AFAF
+tide_virtual_env_icon 
diff --git a/.config/fish/functions/tide/configure/configs/rainbow_16color.fish b/.config/fish/functions/tide/configure/configs/rainbow_16color.fish
new file mode 100644
index 00000000..0a660949
--- /dev/null
+++ b/.config/fish/functions/tide/configure/configs/rainbow_16color.fish
@@ -0,0 +1,77 @@
+tide_aws_bg_color yellow
+tide_aws_color brblack
+tide_character_color brgreen
+tide_character_color_failure brred
+tide_chruby_bg_color red
+tide_chruby_color black
+tide_cmd_duration_bg_color yellow
+tide_cmd_duration_color black
+tide_context_bg_color brblack
+tide_context_color_default yellow
+tide_context_color_root yellow
+tide_context_color_ssh yellow
+tide_docker_bg_color blue
+tide_docker_color black
+tide_git_bg_color green
+tide_git_bg_color_unstable yellow
+tide_git_bg_color_urgent red
+tide_git_color_branch black
+tide_git_color_conflicted black
+tide_git_color_dirty black
+tide_git_color_operation black
+tide_git_color_staged black
+tide_git_color_stash black
+tide_git_color_untracked black
+tide_git_color_upstream black
+tide_go_bg_color brcyan
+tide_go_color black
+tide_java_bg_color yellow
+tide_java_color black
+tide_jobs_bg_color brblack
+tide_jobs_color green
+tide_kubectl_bg_color blue
+tide_kubectl_color black
+tide_nix_shell_bg_color brblue
+tide_nix_shell_color black
+tide_node_bg_color green
+tide_node_color black
+tide_os_bg_color white
+tide_os_color black
+tide_php_bg_color blue
+tide_php_color black
+tide_private_mode_bg_color brwhite
+tide_private_mode_color black
+tide_prompt_color_frame_and_connection brblack
+tide_prompt_color_separator_same_color brblack
+tide_pwd_bg_color blue
+tide_pwd_color_anchors brwhite
+tide_pwd_color_dirs brwhite
+tide_pwd_color_truncated_dirs white
+tide_rustc_bg_color red
+tide_rustc_color black
+tide_shlvl_bg_color yellow
+tide_shlvl_color black
+tide_status_bg_color black
+tide_status_bg_color_failure red
+tide_status_color green
+tide_status_color_failure bryellow
+tide_terraform_bg_color magenta
+tide_terraform_color black
+tide_time_bg_color white
+tide_time_color black
+tide_toolbox_bg_color magenta
+tide_toolbox_color black
+tide_vi_mode_bg_color_default white
+tide_vi_mode_bg_color_insert cyan
+tide_vi_mode_bg_color_replace green
+tide_vi_mode_bg_color_visual yellow
+tide_vi_mode_color_default black
+tide_vi_mode_color_insert black
+tide_vi_mode_color_replace black
+tide_vi_mode_color_visual black
+tide_vi_mode_icon_default D
+tide_vi_mode_icon_insert I
+tide_vi_mode_icon_replace R
+tide_vi_mode_icon_visual V
+tide_virtual_env_bg_color brblack
+tide_virtual_env_color cyan
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_cache_variables.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_cache_variables.fish
new file mode 100644
index 00000000..4661ab15
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_cache_variables.fish
@@ -0,0 +1,41 @@
+function _fake_tide_cache_variables
+ # pwd
+ set_color -o $fake_tide_pwd_color_anchors | read -gx _fake_tide_color_anchors
+ set -gx _fake_tide_color_truncated_dirs "$(set_color $fake_tide_pwd_color_truncated_dirs)"
+ set -gx _fake_tide_reset_to_color_dirs (set_color normal -b $fake_tide_pwd_bg_color; set_color $fake_tide_pwd_color_dirs)
+
+ # git
+ contains git $fake_tide_left_prompt_items $fake_tide_right_prompt_items &&
+ set -gx _fake_tide_location_color "$(set_color $fake_tide_git_color_branch)"
+
+ # private_mode
+ if contains private_mode $fake_tide_left_prompt_items $fake_tide_right_prompt_items && test -n "$fish_private_mode"
+ set -gx _fake_tide_private_mode
+ else
+ set -e _fake_tide_private_mode
+ end
+
+ # Same-color-separator color
+ set -gx _fake_tide_color_separator_same_color "$(set_color $fake_tide_prompt_color_separator_same_color)"
+
+ # two line prompt
+ if contains newline $fake_tide_left_prompt_items
+ set_color $fake_tide_prompt_color_frame_and_connection -b normal | read -gx _fake_tide_prompt_and_frame_color
+ else
+ set -e _fake_tide_prompt_and_frame_color
+ end
+
+ # newline before
+ if test "$fake_tide_prompt_add_newline_before" = true
+ set -g _fake_tide_add_newline ''
+ else
+ set -e _fake_tide_add_newline
+ end
+
+ # item padding
+ if test "$fake_tide_prompt_pad_items" = true
+ set -gx _fake_tide_pad ' '
+ else
+ set -e _fake_tide_pad
+ end
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_character.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_character.fish
new file mode 100644
index 00000000..73ae0554
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_character.fish
@@ -0,0 +1,5 @@
+function _fake_tide_item_character
+ set_color $fake_tide_character_color
+ contains newline $fake_tide_left_prompt_items || echo -ns ' '
+ echo -ns $fake_tide_character_icon
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_cmd_duration.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_cmd_duration.fish
new file mode 100644
index 00000000..5aa13b2b
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_cmd_duration.fish
@@ -0,0 +1,3 @@
+function _fake_tide_item_cmd_duration
+ _fake_tide_print_item cmd_duration $fake_tide_cmd_duration_icon' ' 5s
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_git.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_git.fish
new file mode 100644
index 00000000..fb5b957d
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_git.fish
@@ -0,0 +1,3 @@
+function _fake_tide_item_git
+ _fake_tide_print_item git (set_color $fake_tide_git_color_branch) $fake_tide_git_icon' ' main
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_newline.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_newline.fish
new file mode 100644
index 00000000..c614bab2
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_newline.fish
@@ -0,0 +1,5 @@
+function _fake_tide_item_newline
+ set_color $prev_bg_color -b normal
+ var=fake_tide_"$_fake_tide_side"_prompt_suffix echo $$var
+ set -g add_prefix
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_os.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_os.fish
new file mode 100644
index 00000000..5255721f
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_os.fish
@@ -0,0 +1,3 @@
+function _fake_tide_item_os
+ _fake_tide_print_item os $fake_tide_os_icon
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_item_time.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_item_time.fish
new file mode 100644
index 00000000..bbce0b5a
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_item_time.fish
@@ -0,0 +1,3 @@
+function _fake_tide_item_time
+ _fake_tide_print_item time (date +$fake_tide_time_format)
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_print_item.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_print_item.fish
new file mode 100644
index 00000000..30cd0245
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_print_item.fish
@@ -0,0 +1,22 @@
+function _fake_tide_print_item -a item
+ var=fake_tide_"$item"_bg_color set -f item_bg_color $$var
+
+ if set -e add_prefix
+ set_color $item_bg_color -b normal
+ var=fake_tide_"$_fake_tide_side"_prompt_prefix echo -ns $$var
+ else if test "$item_bg_color" = "$prev_bg_color"
+ var=fake_tide_"$_fake_tide_side"_prompt_separator_same_color echo -ns $_fake_tide_color_separator_same_color$$var
+ else if test "$_fake_tide_side" = left
+ set_color $prev_bg_color -b $item_bg_color
+ echo -ns $fake_tide_left_prompt_separator_diff_color
+ else
+ set_color $item_bg_color -b $prev_bg_color
+ echo -ns $fake_tide_right_prompt_separator_diff_color
+ end
+
+ var=fake_tide_"$item"_color set_color $$var -b $item_bg_color
+
+ echo -ns $_fake_tide_pad $argv[2..] $_fake_tide_pad
+
+ set -g prev_bg_color $item_bg_color
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_prompt.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_prompt.fish
new file mode 100644
index 00000000..11f20caa
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_prompt.fish
@@ -0,0 +1,42 @@
+function _fake_tide_prompt
+ set -g add_prefix
+ _fake_tide_side=left set -f left (for item in $fake_tide_left_prompt_items
+ _fake_tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo -ns $fake_tide_left_prompt_suffix
+ end)
+
+ set -g add_prefix
+ _fake_tide_side=right set -f right (for item in $fake_tide_right_prompt_items
+ _fake_tide_item_$item
+ end
+ if not set -e add_prefix
+ set_color $prev_bg_color -b normal
+ echo -ns $fake_tide_right_prompt_suffix
+ end)
+
+ if set -q _fake_tide_prompt_and_frame_color # If prompt is two lines
+ test "$fake_tide_left_prompt_frame_enabled" = true &&
+ set left[1] "$_fake_tide_prompt_and_frame_color╭─$left[1]" &&
+ set left[2] "$_fake_tide_prompt_and_frame_color╰─$left[2]"
+ test "$fake_tide_right_prompt_frame_enabled" = true &&
+ set right[1] "$right[1]$_fake_tide_prompt_and_frame_color─╮" &&
+ set right[2] "$right[2]$_fake_tide_prompt_and_frame_color─╯"
+
+ # 5 = @PWD@ length which will be replaced
+ math $fake_columns+5-(string length --visible "$left[1]$right[1]") | read -lx dist_btwn_sides
+ echo -ns "$right[2]"\n(string replace @PWD@ (_fake_tide_pwd) "$left[1]")$_fake_tide_prompt_and_frame_color
+
+ string repeat --no-newline --max (math max 0, $dist_btwn_sides-$_tide_pwd_len) $fake_tide_prompt_icon_connection
+ echo -ns "$right[1]"\n"$left[2] "
+ else
+ math $fake_columns+5-(string length --visible "$left[1]$right[1]") -$fake_tide_prompt_min_cols | read -lx dist_btwn_sides
+ string replace @PWD@ (_fake_tide_pwd) "$right[1]" "$left[1] "
+ end
+end
+
+function _fake_tide_item_pwd
+ _fake_tide_print_item pwd @PWD@
+end
diff --git a/.config/fish/functions/tide/configure/functions/_fake_tide_pwd.fish b/.config/fish/functions/tide/configure/functions/_fake_tide_pwd.fish
new file mode 100644
index 00000000..433eafab
--- /dev/null
+++ b/.config/fish/functions/tide/configure/functions/_fake_tide_pwd.fish
@@ -0,0 +1,11 @@
+function _fake_tide_pwd
+ set -l out (
+ set_color $fake_tide_pwd_color_dirs
+ echo -ns $fake_tide_pwd_icon' ' '~/'
+ set_color -o $fake_tide_pwd_color_anchors
+ echo -ns src
+ set_color normal -b $fake_tide_pwd_bg_color
+ )
+ set -g _tide_pwd_len (string length --visible $out)
+ echo -ns $out
+end