From 5768e36b65fb5e9843c520fa58d966b8aa34bdf1 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Tue, 4 Oct 2022 23:56:33 -0400 Subject: [PATCH] more fish, fisher --- config/fish/completions/fisher.fish | 7 + config/fish/conf.d/hydro.fish | 136 +++++++++++ config/fish/fish_plugins | 2 + config/fish/fish_variables | 5 + config/fish/functions/fish_mode_prompt.fish | 21 ++ config/fish/functions/fish_prompt.fish | 34 +-- config/fish/functions/fisher.fish | 240 ++++++++++++++++++++ shell_funcs.fish | 1 + 8 files changed, 415 insertions(+), 31 deletions(-) create mode 100644 config/fish/completions/fisher.fish create mode 100644 config/fish/conf.d/hydro.fish create mode 100644 config/fish/fish_plugins create mode 100644 config/fish/functions/fish_mode_prompt.fish create mode 100644 config/fish/functions/fisher.fish diff --git a/config/fish/completions/fisher.fish b/config/fish/completions/fisher.fish new file mode 100644 index 0000000..6d23ce4 --- /dev/null +++ b/config/fish/completions/fisher.fish @@ -0,0 +1,7 @@ +complete --command fisher --exclusive --long help --description "Print help" +complete --command fisher --exclusive --long version --description "Print version" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments install --description "Install plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments update --description "Update installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments remove --description "Remove installed plugins" +complete --command fisher --exclusive --condition __fish_use_subcommand --arguments list --description "List installed plugins matching regex" +complete --command fisher --exclusive --condition "__fish_seen_subcommand_from update remove" --arguments "(fisher list)" diff --git a/config/fish/conf.d/hydro.fish b/config/fish/conf.d/hydro.fish new file mode 100644 index 0000000..4c272cc --- /dev/null +++ b/config/fish/conf.d/hydro.fish @@ -0,0 +1,136 @@ +status is-interactive || exit + +set --global _hydro_git _hydro_git_$fish_pid + +function $_hydro_git --on-variable $_hydro_git + commandline --function repaint +end + +function _hydro_pwd --on-variable PWD --on-variable hydro_ignored_git_paths --on-variable fish_prompt_pwd_dir_length + set --local git_root (command git --no-optional-locks rev-parse --show-toplevel 2>/dev/null) + set --local git_base (string replace --all --regex -- "^.*/" "" "$git_root") + set --local path_sep / + + test "$fish_prompt_pwd_dir_length" = 0 && set path_sep + + if set --query git_root[1] && ! contains -- $git_root $hydro_ignored_git_paths + set --erase _hydro_skip_git_prompt + else + set --global _hydro_skip_git_prompt + end + + set --global _hydro_pwd ( + string replace --ignore-case -- ~ \~ $PWD | + string replace -- "/$git_base/" /:/ | + string replace --regex --all -- "(\.?[^/]{"( + string replace --regex --all -- '^$' 1 "$fish_prompt_pwd_dir_length" + )"})[^/]*/" "\$1$path_sep" | + string replace -- : "$git_base" | + string replace --regex -- '([^/]+)$' "\x1b[1m\$1\x1b[22m" | + string replace --regex --all -- '(?!^/$)/|^$' "\x1b[2m/\x1b[22m" + ) +end + +function _hydro_postexec --on-event fish_postexec + set --local last_status $pipestatus + set --global _hydro_status "$_hydro_newline$_hydro_color_prompt$hydro_symbol_prompt" + + for code in $last_status + if test $code -ne 0 + set --global _hydro_status "$_hydro_color_error| "(echo $last_status)" $_hydro_newline$_hydro_color_prompt$_hydro_color_error$hydro_symbol_prompt" + break + end + end + + test "$CMD_DURATION" -lt 1000 && set _hydro_cmd_duration && return + + set --local secs (math --scale=1 $CMD_DURATION/1000 % 60) + set --local mins (math --scale=0 $CMD_DURATION/60000 % 60) + set --local hours (math --scale=0 $CMD_DURATION/3600000) + + set --local out + + test $hours -gt 0 && set --local --append out $hours"h" + test $mins -gt 0 && set --local --append out $mins"m" + test $secs -gt 0 && set --local --append out $secs"s" + + set --global _hydro_cmd_duration "$out " +end + +function _hydro_prompt --on-event fish_prompt + set --query _hydro_status || set --global _hydro_status "$_hydro_newline$_hydro_color_prompt$hydro_symbol_prompt" + set --query _hydro_pwd || _hydro_pwd + + command kill $_hydro_last_pid 2>/dev/null + + set --query _hydro_skip_git_prompt && set $_hydro_git && return + + fish --private --command " + set branch ( + command git symbolic-ref --short HEAD 2>/dev/null || + command git describe --tags --exact-match HEAD 2>/dev/null || + command git rev-parse --short HEAD 2>/dev/null | + string replace --regex -- '(.+)' '@\$1' + ) + + test -z \"\$$_hydro_git\" && set --universal $_hydro_git \"\$branch \" + + ! command git diff-index --quiet HEAD 2>/dev/null || + count (command git ls-files --others --exclude-standard) >/dev/null && set info \"$hydro_symbol_git_dirty\" + + for fetch in $hydro_fetch false + command git rev-list --count --left-right @{upstream}...@ 2>/dev/null | + read behind ahead + + switch \"\$behind \$ahead\" + case \" \" \"0 0\" + case \"0 *\" + set upstream \" $hydro_symbol_git_ahead\$ahead\" + case \"* 0\" + set upstream \" $hydro_symbol_git_behind\$behind\" + case \* + set upstream \" $hydro_symbol_git_ahead\$ahead $hydro_symbol_git_behind\$behind\" + end + + set --universal $_hydro_git \"\$branch\$info\$upstream \" + + test \$fetch = true && command git fetch --no-tags 2>/dev/null + end + " & + + set --global _hydro_last_pid (jobs --last --pid) +end + +function _hydro_fish_exit --on-event fish_exit + set --erase $_hydro_git +end + +function _hydro_uninstall --on-event hydro_uninstall + set --names | + string replace --filter --regex -- "^(_?hydro_)" "set --erase \$1" | + source + functions --erase (functions --all | string match --entire --regex "^_?hydro_") +end + +set --global hydro_color_normal (set_color normal) + +for color in hydro_color_{pwd,git,error,prompt,duration} + function $color --on-variable $color --inherit-variable color + set --query $color && set --global _$color (set_color $$color) + end && $color +end + +function hydro_multiline --on-variable hydro_multiline + if test "$hydro_multiline" = true + set --global _hydro_newline "\n" + else + set --global _hydro_newline "" + end +end && hydro_multiline + +set --query hydro_color_error || set --global hydro_color_error $fish_color_error +set --query hydro_symbol_prompt || set --global hydro_symbol_prompt ❱ +set --query hydro_symbol_git_dirty || set --global hydro_symbol_git_dirty • +set --query hydro_symbol_git_ahead || set --global hydro_symbol_git_ahead ↑ +set --query hydro_symbol_git_behind || set --global hydro_symbol_git_behind ↓ +set --query hydro_multiline || set --global hydro_multiline false diff --git a/config/fish/fish_plugins b/config/fish/fish_plugins new file mode 100644 index 0000000..95cbf4c --- /dev/null +++ b/config/fish/fish_plugins @@ -0,0 +1,2 @@ +jorgebucaran/fisher +jorgebucaran/hydro diff --git a/config/fish/fish_variables b/config/fish/fish_variables index 1b4481a..caed444 100644 --- a/config/fish/fish_variables +++ b/config/fish/fish_variables @@ -1,6 +1,11 @@ # This file contains fish universal variable definitions. # VERSION: 3.0 SETUVAR __fish_initialized:3100 +SETUVAR _fisher_jorgebucaran_2F_fisher_files:\x7e/\x2econfig/fish/functions/fisher\x2efish\x1e\x7e/\x2econfig/fish/completions/fisher\x2efish +SETUVAR _fisher_jorgebucaran_2F_hydro_files:\x7e/\x2econfig/fish/functions/fish_mode_prompt\x2efish\x1e\x7e/\x2econfig/fish/functions/fish_prompt\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/hydro\x2efish +SETUVAR _fisher_plugins:jorgebucaran/fisher\x1ejorgebucaran/hydro +SETUVAR _fisher_upgraded_to_4_4:\x1d +SETUVAR _hydro_git_34773:main\u2022\x20 SETUVAR fish_color_autosuggestion:555\x1ebrblack SETUVAR fish_color_cancel:\x2dr SETUVAR fish_color_command:005fd7 diff --git a/config/fish/functions/fish_mode_prompt.fish b/config/fish/functions/fish_mode_prompt.fish new file mode 100644 index 0000000..2b6b28c --- /dev/null +++ b/config/fish/functions/fish_mode_prompt.fish @@ -0,0 +1,21 @@ +function fish_mode_prompt + if test "$fish_key_bindings" != fish_default_key_bindings + set --local vi_mode_color + set --local vi_mode_symbol + switch $fish_bind_mode + case default + set vi_mode_color (set_color $fish_color_selection) + set vi_mode_symbol N + case insert + set vi_mode_color (set_color $fish_color_selection) + set vi_mode_symbol I + case replace replace_one + set vi_mode_color (set_color $fish_color_match) + set vi_mode_symbol R + case visual + set vi_mode_color (set_color $fish_color_match) + set vi_mode_symbol V + end + echo -e "$vi_mode_color $vi_mode_symbol \x1b[0m " + end +end diff --git a/config/fish/functions/fish_prompt.fish b/config/fish/functions/fish_prompt.fish index 27701f7..c8cf475 100644 --- a/config/fish/functions/fish_prompt.fish +++ b/config/fish/functions/fish_prompt.fish @@ -1,31 +1,3 @@ -function fish_prompt --description 'Write out the prompt' - # virtualenv stuff - if set -q VIRTUAL_ENV - echo -n -s (set_color -b blue white) "(" (basename "$VIRTUAL_ENV") ")" (set_color normal) " " - end - set -l last_status $status - - if not set -q __fish_prompt_normal - set -g __fish_prompt_normal (set_color normal) - end - - # PWD - set_color $fish_color_cwd - echo -n (prompt_pwd) - set_color normal - - printf '%s ' (__fish_git_prompt) - - if not test $last_status -eq 0 - set_color $fish_color_error - end - - # Set a pretty date - set_color -b black yellow - echo -n '['(date "+%I:%M %P")']' - set_color normal - - echo -n ' $ ' - - set_color normal -end \ No newline at end of file +function fish_prompt --description Hydro + echo -e "$_hydro_color_pwd$_hydro_pwd$hydro_color_normal $_hydro_color_git$$_hydro_git$hydro_color_normal$_hydro_color_duration$_hydro_cmd_duration$hydro_color_normal$_hydro_status$hydro_color_normal " +end diff --git a/config/fish/functions/fisher.fish b/config/fish/functions/fisher.fish new file mode 100644 index 0000000..a4666a1 --- /dev/null +++ b/config/fish/functions/fisher.fish @@ -0,0 +1,240 @@ +function fisher --argument-names cmd --description "A plugin manager for Fish" + set --query fisher_path || set --local fisher_path $__fish_config_dir + set --local fisher_version 4.4.2 + set --local fish_plugins $__fish_config_dir/fish_plugins + + switch "$cmd" + case -v --version + echo "fisher, version $fisher_version" + case "" -h --help + echo "Usage: fisher install Install plugins" + echo " fisher remove Remove installed plugins" + echo " fisher update Update installed plugins" + echo " fisher update Update all installed plugins" + echo " fisher list [] 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 + + for plugin in $arg_plugins + set plugin (test -e "$plugin" && realpath $plugin || string lower -- $plugin) + contains -- "$plugin" $new_plugins || set --append new_plugins $plugin + end + + if set --query argv[2] + for plugin in $new_plugins + if contains -- "$plugin" $old_plugins + test "$cmd" = remove && + set --append remove_plugins $plugin || + set --append update_plugins $plugin + else if test "$cmd" = install + set --append install_plugins $plugin + else + echo "fisher: Plugin not installed: \"$plugin\"" >&2 && return 1 + end + end + else + for plugin in $new_plugins + contains -- "$plugin" $old_plugins && + set --append update_plugins $plugin || + set --append install_plugins $plugin + end + + for plugin in $old_plugins + contains -- "$plugin" $new_plugins || set --append remove_plugins $plugin + end + end + + set --local pid_list + set --local source_plugins + set --local fetch_plugins $update_plugins $install_plugins + set --local fish_path (status fish-path) + + echo (set_color --bold)fisher $cmd version $fisher_version(set_color normal) + + for plugin in $fetch_plugins + set --local source (command mktemp -d) + set --append source_plugins $source + + command mkdir -p $source/{completions,conf.d,themes,functions} + + $fish_path --command " + if test -e $plugin + command cp -Rf $plugin/* $source + else + set temp (command mktemp -d) + set repo (string split -- \@ $plugin) || set repo[2] HEAD + + if set path (string replace --regex -- '^(https://)?gitlab.com/' '' \$repo[1]) + set name (string split -- / \$path)[-1] + set url https://gitlab.com/\$path/-/archive/\$repo[2]/\$name-\$repo[2].tar.gz + else + set url https://api.github.com/repos/\$repo[1]/tarball/\$repo[2] + end + + echo Fetching (set_color --underline)\$url(set_color normal) + + if 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 + + command rm -rf \$temp + end + + set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files + " & + + set --append pid_list (jobs --last --pid) + end + + wait $pid_list 2>/dev/null + + for plugin in $fetch_plugins + if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source + if set --local index (contains --index -- "$plugin" $install_plugins) + set --erase install_plugins[$index] + else + set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)] + end + end + end + + for plugin in $update_plugins $remove_plugins + if set --local index (contains --index -- "$plugin" $_fisher_plugins) + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + + if contains -- "$plugin" $remove_plugins + for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var) + emit {$name}_uninstall + end + printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~ + set --erase _fisher_plugins[$index] + end + + command rm -rf (string replace -- \~ ~ $$plugin_files_var) + + functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var) + + for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var) + complete --erase --command $name + end + + set --erase $plugin_files_var + end + end + + if set --query update_plugins[1] || set --query install_plugins[1] + command mkdir -p $fisher_path/{functions,themes,conf.d,completions} + end + + for plugin in $update_plugins $install_plugins + set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] + set --local files $source/{functions,themes,conf.d,completions}/* + + if set --local index (contains --index -- $plugin $install_plugins) + set --local user_files $fisher_path/{functions,themes,conf.d,completions}/* + set --local conflict_files + + for file in (string replace -- $source/ $fisher_path/ $files) + contains -- $file $user_files && set --append conflict_files $file + end + + if set --query conflict_files[1] && set --erase install_plugins[$index] + echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2 + continue + end + end + + for file in (string replace -- $source/ "" $files) + command cp -Rf $source/$file $fisher_path/$file + end + + set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files + + set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~) + + contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin + contains -- $plugin $install_plugins && set --local event install || set --local event update + + printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~ + + for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~) + source $file + if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file) + emit {$name}_$event + end + end + end + + command rm -rf $source_plugins + + if set --query _fisher_plugins[1] + set --local commit_plugins + + for plugin in $file_plugins + contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin + end + + for plugin in $_fisher_plugins + contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin + end + + printf "%s\n" $commit_plugins >$fish_plugins + else + set --erase _fisher_plugins + command rm -f $fish_plugins + end + + set --local total (count $install_plugins) (count $update_plugins) (count $remove_plugins) + + test "$total" != "0 0 0" && echo (string join ", " ( + test $total[1] = 0 || echo "Installed $total[1]") ( + test $total[2] = 0 || echo "Updated $total[2]") ( + test $total[3] = 0 || echo "Removed $total[3]") + ) plugin/s + case \* + echo "fisher: Unknown command: \"$cmd\"" >&2 && return 1 + end +end + +if ! set --query _fisher_upgraded_to_4_4 + set --universal _fisher_upgraded_to_4_4 + if functions --query _fisher_list + set --query XDG_DATA_HOME[1] || set --local XDG_DATA_HOME ~/.local/share + command rm -rf $XDG_DATA_HOME/fisher + functions --erase _fisher_{list,plugin_parse} + fisher update >/dev/null 2>/dev/null + else + for var in (set --names | string match --entire --regex '^_fisher_.+_files$') + set $var (string replace -- ~ \~ $$var) + end + functions --erase _fisher_fish_postexec + end +end diff --git a/shell_funcs.fish b/shell_funcs.fish index 3e5ba80..495a66f 100644 --- a/shell_funcs.fish +++ b/shell_funcs.fish @@ -17,6 +17,7 @@ alias pg='pushd "(git rev-parse --show-toplevel)"' alias ppjson="python -m json.tool" alias shrug="echo -n '¯\_(ツ)_/¯' | pbcopy" alias vimini="vim ~/.config/nvim/init.vim" +alias vim=nvim # Functions function httpdiff