Dotfiles commit (try to keep under 50 characters)

Multi-line description of commit,
feel free to be detailed.

[Ticket: X]
~
~
".git/COMMIT_EDITMSG" 14L, 297C
This commit is contained in:
2026-05-05 10:37:59 +02:00
commit dd3895ccbd
63 changed files with 1848 additions and 0 deletions
@@ -0,0 +1,15 @@
function _pure_check_availability \
--description "Ensure command is available on system" \
--argument-names \
feature_flag \
required_command
set FAILURE 1
if not type -q $required_command # command, function or alias are OK
echo (set_color $pure_color_warning) \
"$feature_flag feature requires: `$required_command`" \
(set_color $pure_color_normal)
return $FAILURE
end
end
@@ -0,0 +1,24 @@
function _pure_check_for_new_release \
--description "Check for new release and show command to install"
if test "$pure_check_for_new_release" = true
echo "🛈 Checking for new release…"
set latest (pure_get_latest_release_version "pure-fish/pure")
if test "v"$pure_version != $latest
set --local latest_version (_pure_set_color $pure_color_info)$latest(_pure_set_color $pure_color_normal)
echo -e "🔔 New version available!\n"
echo -e (_pure_set_color $pure_color_success)"fisher install pure-fish/pure@$latest_version\n"
end
end
end
function pure_get_latest_release_version \
--argument-names user_repo
curl \
--silent \
"https://api.github.com/repos/$user_repo/releases/latest" \
| string match --regex '"tag_name": "\K.*?(?=")'
end
@@ -0,0 +1,10 @@
function _pure_detect_container_by_cgroup_method \
--description "Linux method to detect container using cgroup. see https://stackoverflow.com/a/37015387/802365" \
--argument-names cgroup_namespace
set --query cgroup_namespace[1]; or set cgroup_namespace /proc/1/cgroup
string match \
--quiet \
--entire \
--regex '(lxc|docker)' <$cgroup_namespace
end
@@ -0,0 +1,14 @@
function _pure_detect_container_by_pid_method \
--description "Linux method to detect container using /proc. see https://stackoverflow.com/a/37015387/802365" \
--argument-names proc_sched
set --query proc_sched[1]; or set proc_sched /proc/1/sched
if test -e $proc_sched
head -n 1 $proc_sched \
| string match \
--quiet \
--invert \
--regex 'init|systemd|shepherd'
end
end
@@ -0,0 +1,49 @@
set SUCCESS 0
set FAILURE 1
function _pure_format_time \
--description="Format milliseconds to a human readable format" \
--argument-names \
milliseconds \
threshold \
show_subsecond
set --query show_subsecond[1]; or set show_subsecond false
test "$milliseconds" -lt 0; and return $FAILURE
test "$milliseconds" -lt (math --scale=0 "$threshold * 1000"); and echo; and return $SUCCESS
set --local time
set --local days (math --scale=0 "$milliseconds / 86400000")
test "$days" -gt 0; and set --append time (printf "%sd" $days)
set --local hours (math --scale=0 "$milliseconds / 3600000 % 24")
test "$hours" -gt 0; and set --append time (printf "%sh" $hours)
set --local minutes (math --scale=0 "$milliseconds / 60000 % 60")
test "$minutes" -gt 0; and set --append time (printf "%sm" $minutes)
set --local seconds (math --scale=0 "$milliseconds / 1000 % 60")
if test "$show_subsecond" = true
set --local threshold_as_ms (math --scale=0 "$threshold*1000")
set --local subseconds (_pure_format_time_subseconds $milliseconds $threshold_as_ms)
set --append time $seconds$subseconds's'
else
test "$seconds" -gt $threshold; and set --append time (printf "%ss" $seconds)
end
echo -e (string join ' ' $time)
end
function _pure_format_time_subseconds \
--description="Format duration milliseconds to a human readable format" \
--argument-names \
duration \
threshold
set --local subseconds
if test "$duration" -gt $threshold
set --local precision 2
set --local milliseconds (string sub --start -3 --length $precision $duration)
set --append subseconds '.'$milliseconds
end
echo $subseconds
end
@@ -0,0 +1,12 @@
function _pure_get_prompt_symbol \
--description 'Print prompt symbol' \
--argument-names exit_code
set --local prompt_symbol $pure_symbol_prompt
test "$pure_reverse_prompt_symbol_in_vimode" = true
and string match -rq "fish_(vi|hybrid)_key_bindings" $fish_key_bindings
and not contains "$fish_bind_mode" insert replace
and set prompt_symbol $pure_symbol_reverse_prompt
echo "$prompt_symbol"
end
@@ -0,0 +1,25 @@
function _pure_is_inside_container \
--argument-names cgroup_namespace
set --query cgroup_namespace[1]; or set cgroup_namespace /proc/1/cgroup
set --local failure 1
if set --query pure_enable_container_detection; and test "$pure_enable_container_detection" = true
set --local success 0
if test -n "$container"
return $success
end
set --local os_name (uname -s)
# echo $os_name
if test "$os_name" = Linux
if _pure_detect_container_by_cgroup_method $cgroup_namespace
return $success
end
if _pure_detect_container_by_pid_method
return $success
end
end
end
return $failure
end
@@ -0,0 +1,5 @@
function _pure_is_single_line_prompt \
--description 'Test if single line prompt feature is enabled'
set --query pure_enable_single_line_prompt
and test "$pure_enable_single_line_prompt" = true
end
@@ -0,0 +1,3 @@
function _pure_k8s_context
kubectl config current-context 2>/dev/null
end
@@ -0,0 +1,9 @@
function _pure_k8s_namespace
set namespace (kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)
if test -z "$namespace"
set namespace default
end
echo $namespace
end
@@ -0,0 +1,23 @@
function _pure_parse_directory \
--description "Replace '$HOME' with '~'" \
--argument-names max_path_length
set --local folder (fish_prompt_pwd_dir_length=$pure_shorten_prompt_current_directory_length prompt_pwd)
if test -n "$max_path_length"
if test (string length $folder) -gt $max_path_length
# If path exceeds maximum symbol limit, force fish path formating function to use 1 character
set folder (fish_prompt_pwd_dir_length=1 prompt_pwd)
end
end
if test "$pure_truncate_prompt_current_directory_keeps" -ge 1
set folder (
string split '/' $folder \
| tail -n $pure_truncate_prompt_current_directory_keeps \
| string join '/'
)
end
echo $folder
end
@@ -0,0 +1,4 @@
function _pure_parse_git_branch --description "Parse current Git branch name"
command git symbolic-ref --short HEAD 2>/dev/null;
or command git name-rev --name-only HEAD 2>/dev/null
end
@@ -0,0 +1,5 @@
function _pure_place_iterm2_prompt_mark
if functions -q iterm2_prompt_mark
iterm2_prompt_mark
end
end
@@ -0,0 +1,11 @@
function _pure_prefix_root_prompt
set --local username (id -u -n) # current user name
set --local prefix_root_prompt
if set --query pure_show_prefix_root_prompt; and test "$pure_show_prefix_root_prompt" = true -a "$username" = "root"
set --local prefix_color (_pure_set_color $pure_color_prefix_root_prompt)
set prefix_root_prompt "$prefix_color$pure_symbol_prefix_root_prompt"
end
echo "$prefix_root_prompt"
end
@@ -0,0 +1,12 @@
function _pure_print_prompt \
--description 'Concatenate parts single prompt string'
set --local prompt
for prompt_part in $argv
if test (_pure_string_width $prompt_part) -gt 0
set --append prompt "$prompt_part"
end
end
echo (string trim -l $prompt)
end
@@ -0,0 +1,10 @@
function _pure_print_prompt_rows \
--description "Manage default vs. compact prompt"
# print current path, git branch/status, command duration
if _pure_is_single_line_prompt
echo -e -n (_pure_prompt_first_line)
else
echo -e (_pure_prompt_first_line)
end
end
+34
View File
@@ -0,0 +1,34 @@
function _pure_prompt \
--description 'Print prompt symbol'
set --local last_status $argv[-1]
set --local aws_profile (_pure_prompt_aws_profile) # AWS profile name
set --local exit_status (_pure_prompt_exit_status $argv) # List of exit statuses if non-zero
set --local jobs (_pure_prompt_jobs)
set --local nixdevshell (_pure_prompt_nixdevshell) # Nix build environment indicator
set --local pure_symbol (_pure_prompt_symbol $last_status)
set --local root_prefix (_pure_prefix_root_prompt)
set --local space
set --local system_time (_pure_prompt_system_time)
set --local vimode_indicator (_pure_prompt_vimode) # vi-mode indicator
set --local virtualenv (_pure_prompt_virtualenv) # Python virtualenv name
if _pure_is_single_line_prompt
set space ' '
end
echo (\
_pure_print_prompt \
$space \
$system_time \
$root_prefix \
$jobs \
$nixdevshell \
$virtualenv \
$aws_profile \
$vimode_indicator \
$exit_status \
$pure_symbol \
)
end
@@ -0,0 +1,19 @@
function _pure_prompt_aws_profile --description "Display AWS profile name"
if set --query pure_enable_aws_profile;
and test "$pure_enable_aws_profile" = true
set --local aws_profile ''
set --local aws_profile_color (_pure_set_color $pure_color_aws_profile)
if test -n "$AWS_VAULT"
set aws_profile "$AWS_VAULT"
else if test -n "$AWS_PROFILE" -o "$AWS_PROFILE" != default
set aws_profile "$AWS_PROFILE"
end
if test -n $aws_profile
echo "$pure_symbol_aws_profile_prefix$aws_profile_color$aws_profile"
end
end
end
@@ -0,0 +1,7 @@
function _pure_prompt_beginning \
--description 'Clear existing line content'
set --local clear_line "\r\033[K"
echo $clear_line
end
@@ -0,0 +1,11 @@
function _pure_prompt_command_duration
set --local command_duration
# Get command execution duration
if test -n "$CMD_DURATION"
set command_duration (_pure_format_time $CMD_DURATION $pure_threshold_command_duration $pure_show_subsecond_command_duration)
end
set --local command_duration_color (_pure_set_color $pure_color_command_duration)
echo "$command_duration_color$command_duration"
end
@@ -0,0 +1,5 @@
function _pure_prompt_container
if _pure_is_inside_container
echo "$pure_symbol_container_prefix"(_pure_user_at_host)
end
end
@@ -0,0 +1,11 @@
set FAILURE 1
function _pure_prompt_current_folder --argument-names current_prompt_width
if test -z "$current_prompt_width"; return $FAILURE; end
set --local current_folder (_pure_parse_directory (math $COLUMNS - $current_prompt_width - 1))
set --local current_folder_color (_pure_set_color $pure_color_current_directory)
echo "$current_folder_color$current_folder"
end
@@ -0,0 +1,3 @@
function _pure_prompt_ending
echo (set_color normal)" "
end
@@ -0,0 +1,30 @@
function _pure_prompt_exit_status \
--description 'Print list of exit statuses if last command failed'
if set --query pure_show_exit_status;
and test "$pure_show_exit_status" = true
set --local status_color (_pure_set_color $pure_color_exit_status)
set --local command_succeed 0
set --local last_status $argv[-1]
if test $last_status -ne $command_succeed # print only if last status is non-zero
set --local status_text ""
if set --query pure_convert_exit_status_to_signal;
and test "$pure_convert_exit_status_to_signal" = true
for exit_code in $argv
if test -z "$status_text" # don't put a separator before the first code
set status_text (fish_status_to_signal $exit_code)
else
set status_text (string join "$pure_symbol_exit_status_separator" "$status_text" (fish_status_to_signal $exit_code))
end
end
else
set status_text (string join "$pure_symbol_exit_status_separator" $argv)
end
echo "$status_color$pure_symbol_exit_status_prefix$status_text"
end
end
end
@@ -0,0 +1,41 @@
set --global FAILURE 1
function _pure_prompt_first_line \
--description 'Print contextual information before prompt.'
set --local prompt_ssh (_pure_prompt_ssh)
set --local prompt_container (_pure_prompt_container)
set --local prompt_k8s (_pure_prompt_k8s)
set --local prompt_git (_pure_prompt_git)
set --local prompt_command_duration (_pure_prompt_command_duration)
set --local prompt (_pure_print_prompt \
$prompt_ssh \
$prompt_container \
$prompt_k8s \
$prompt_git \
$prompt_command_duration
)
set --local prompt_width (_pure_string_width $prompt)
set --local current_folder (_pure_prompt_current_folder $prompt_width)
set --local prompt_components
if set --query pure_begin_prompt_with_current_directory; and test "$pure_begin_prompt_with_current_directory" = true
set prompt_components \
$current_folder \
$prompt_git \
$prompt_ssh \
$prompt_container \
$prompt_k8s \
$prompt_command_duration
else
set prompt_components \
$prompt_ssh \
$prompt_container \
$prompt_k8s \
$current_folder \
$prompt_git \
$prompt_command_duration
end
echo (_pure_print_prompt $prompt_components)
end
@@ -0,0 +1,26 @@
function _pure_prompt_git \
--description 'Print git repository information: branch name, dirty, upstream ahead/behind'
set ABORT_FEATURE 2
if set --query pure_enable_git; and test "$pure_enable_git" != true
return
end
if not type -q --no-functions git # skip git-related features when `git` is not available
return $ABORT_FEATURE
end
set --local is_git_repository (command git rev-parse --is-inside-work-tree 2>/dev/null)
if test -n "$is_git_repository"
set --local git_prompt (_pure_prompt_git_branch)(_pure_prompt_git_dirty)(_pure_prompt_git_stash)
set --local git_pending_commits (_pure_prompt_git_pending_commits)
if test (_pure_string_width $git_pending_commits) -ne 0
set --append git_prompt $git_pending_commits
end
echo $git_prompt
end
end
@@ -0,0 +1,6 @@
function _pure_prompt_git_branch
set --local git_branch (_pure_parse_git_branch) # current git branch
set --local git_branch_color (_pure_set_color $pure_color_git_branch)
echo "$git_branch_color$git_branch"
end
@@ -0,0 +1,18 @@
function _pure_prompt_git_dirty
set --local git_dirty_symbol
set --local git_dirty_color
set --local is_git_dirty (
# Single git status call that respects status.showUntrackedFiles config.
# Set `git config status.showUntrackedFiles no` in large repos to skip
# the expensive untracked-files scan.
test -n "$(command git status --porcelain --ignore-submodules 2>/dev/null)"
and echo "true"
)
if test -n "$is_git_dirty" # untracked or un-commited files
set git_dirty_symbol "$pure_symbol_git_dirty"
set git_dirty_color (_pure_set_color $pure_color_git_dirty)
end
echo "$git_dirty_color$git_dirty_symbol"
end
@@ -0,0 +1,33 @@
function _pure_prompt_git_pending_commits
set --local git_unpushed_commits
set --local git_unpulled_commits
set --local has_upstream (command git rev-parse --abbrev-ref '@{upstream}' 2>/dev/null)
if test -n "$has_upstream" # check there is an upstream repo configured
and test "$has_upstream" != '@{upstream}' # Fixed #179, dont check the empty repo
command git rev-list --left-right --count 'HEAD...@{upstream}' \
| read --local --array git_status
set --local commit_to_push $git_status[1]
set --local commit_to_pull $git_status[2]
if test "$commit_to_push" -gt 0 # upstream is behind local repo
set --local git_unpushed_commits_color \
(_pure_set_color $pure_color_git_unpushed_commits)
set git_unpushed_commits "$git_unpushed_commits_color$pure_symbol_git_unpushed_commits"
if test "$pure_show_numbered_git_indicator" = true
set git_unpushed_commits "$git_unpushed_commits$commit_to_push"
end
end
if test "$commit_to_pull" -gt 0 # upstream is ahead of local repo
set --local git_unpulled_commits_color \
(_pure_set_color $pure_color_git_unpulled_commits)
set git_unpulled_commits "$git_unpulled_commits_color$pure_symbol_git_unpulled_commits"
if test "$pure_show_numbered_git_indicator" = true
set git_unpulled_commits "$git_unpulled_commits$commit_to_pull"
end
end
end
echo "$git_unpushed_commits$git_unpulled_commits"
end
@@ -0,0 +1,19 @@
function _pure_prompt_git_stash
set --local git_stash_symbol
set --local git_stash_color
set --local git_stash_number
set --local git_stash_count (
command git rev-list --walk-reflogs --count refs/stash 2> /dev/null
or echo "0"
)
if test "$git_stash_count" -gt 0 # has git stash
set git_stash_symbol " $pure_symbol_git_stash"
set git_stash_color (_pure_set_color $pure_color_git_stash)
if test "$pure_show_numbered_git_indicator" = true
set git_stash_number "$git_stash_count"
end
end
echo "$git_stash_color$git_stash_symbol$git_stash_number"
end
@@ -0,0 +1,9 @@
function _pure_prompt_jobs --description "Display number of running jobs"
if set --query pure_show_jobs; and test "$pure_show_jobs" = true
set --local njobs (count (jobs -p))
set --local jobs_color (_pure_set_color $pure_color_jobs)
if test "$njobs" -gt 0
echo "$jobs_color"[$njobs]
end
end
end
@@ -0,0 +1,16 @@
function _pure_prompt_k8s
if set --query pure_enable_k8s;
and test "$pure_enable_k8s" = true;
and _pure_check_availability pure_enable_k8s kubectl
and test -n (_pure_k8s_context) # todo: use $(cmd) syntax when Fish 3.3.1 is dropped
set --local context (_pure_set_color $pure_color_k8s_context)(_pure_k8s_context)
if test -n "$context"
set --local symbol (_pure_set_color $pure_color_k8s_prefix)$pure_symbol_k8s_prefix
set --local namespace (_pure_set_color $pure_color_k8s_namespace)(_pure_k8s_namespace)
echo "$symbol $context/$namespace"
end
end
end
@@ -0,0 +1,11 @@
function _pure_prompt_new_line \
--description "Do not add a line break to a brand new session" \
--on-event fish_prompt
set --local new_line ''
if not _pure_is_single_line_prompt; and test "$_pure_fresh_session" = false
set new_line "\n"
end
echo -e -n (_pure_prompt_beginning)"$new_line"
end
@@ -0,0 +1,13 @@
function _pure_prompt_nixdevshell \
--description "Indicate if nix develop shell is activated"
if set --query pure_enable_nixdevshell;
and test "$pure_enable_nixdevshell" = true;
and test -n "$IN_NIX_SHELL"
set --local prefix (_pure_set_color $pure_color_nixdevshell_prefix)$pure_symbol_nixdevshell_prefix
set --local symbol (_pure_set_color $pure_color_nixdevshell_status)$IN_NIX_SHELL
echo "$prefix$symbol"
end
end
@@ -0,0 +1,5 @@
function _pure_prompt_ssh
if test "$SSH_CONNECTION" != ""
echo "$pure_symbol_ssh_prefix"(_pure_user_at_host)
end
end
@@ -0,0 +1,20 @@
function _pure_prompt_symbol \
--description 'Print prompt symbol' \
--argument-names exit_code
set --local prompt_symbol (_pure_get_prompt_symbol)
set --local symbol_color_success (_pure_set_color $pure_color_prompt_on_success)
set --local symbol_color_error (_pure_set_color $pure_color_prompt_on_error)
set --local command_succeed 0
set --local symbol_color $symbol_color_success # default pure symbol color
if set --query exit_code; and test "$exit_code" -ne $command_succeed
set symbol_color $symbol_color_error # different pure symbol color when previous command failed
if set --query pure_separate_prompt_on_error; and test "$pure_separate_prompt_on_error" = true
set symbol_color "$symbol_color_error$prompt_symbol$symbol_color_success"
end
end
echo "$symbol_color$prompt_symbol"
end
@@ -0,0 +1,6 @@
function _pure_prompt_system_time --description "Display system time"
if set --query pure_show_system_time; and test "$pure_show_system_time" = true
set --local time_color (_pure_set_color $pure_color_system_time)
echo "$time_color"(date $pure_system_time_format)
end
end
@@ -0,0 +1,11 @@
function _pure_prompt_transient \
--description 'Print simplified transient prompt for scrollback history' \
--argument-names exit_code
set --local pure_symbol (_pure_prompt_symbol $exit_code)
echo (\
_pure_print_prompt \
$pure_symbol \
)
end
@@ -0,0 +1,6 @@
function _pure_prompt_vimode
if set --query pure_reverse_prompt_symbol_in_vimode;
and test "$pure_reverse_prompt_symbol_in_vimode" = false
echo (fish_default_mode_prompt)
end
end
@@ -0,0 +1,20 @@
function _pure_prompt_virtualenv --description "Display virtualenv directory"
if set --query pure_enable_virtualenv;
and test "$pure_enable_virtualenv" = true
set --local virtualenv ''
set --local virtualenv_color (_pure_set_color $pure_color_virtualenv)
if test -n "$VIRTUAL_ENV_PROMPT"
set virtualenv "$VIRTUAL_ENV_PROMPT"
else if test -n "$VIRTUAL_ENV"
set virtualenv (basename "$VIRTUAL_ENV")
else if test -n "$CONDA_DEFAULT_ENV"
set virtualenv (basename "$CONDA_DEFAULT_ENV")
end
if test -n $virtualenv
echo "$pure_symbol_virtualenv_prefix$virtualenv_color$virtualenv"
end
end
end
@@ -0,0 +1,19 @@
function _pure_set_color \
--description 'Set color' \
--argument-names var
set --local color $var
# Backwards compatibility for colors defined as control sequencies instead of fish colors
if not string match --quiet --all --regex '\e\[[^m]*m' $color[1]
and set -q $color
set color $$var
end
set --local result $color
if not string match --quiet --all --regex '\e\[[^m]*m' $result[1]
and not test -z $result[1]
set result (set_color $color)
end
echo "$result"
end
@@ -0,0 +1,11 @@
function _pure_set_default \
--description 'Set default value for configuration variable' \
--argument-names var default
set is_available_universally (not set --query --universal $var; or test -z $$var; echo $status)
set is_available_globally (not set --query --global $var; or test -z $$var; echo $status)
if test "$is_available_universally" -eq 0 -a $is_available_globally -eq 0
set --universal $var "$default"
end
end
@@ -0,0 +1,9 @@
function _pure_string_width \
--description 'returns raw string length, i.e. ignore ANSI-color' \
--argument-names prompt
set --local empty ''
set --local raw_prompt (string replace --all --regex '\e\[[^m]*m' $empty -- $prompt)
string length -- $raw_prompt
end
@@ -0,0 +1,13 @@
function _pure_user_at_host
set --local username (id -u -n) # current user name
set --local at_sign "@"
set --local at_sign_color (_pure_set_color $pure_color_at_sign)
set --local hostname_color (_pure_set_color $pure_color_hostname)
set --local username_color (_pure_set_color $pure_color_username_normal) # default color
if test "$username" = root
set username_color (_pure_set_color $pure_color_username_root) # different color for root
end
echo "$username_color$username$at_sign_color$at_sign$hostname_color$hostname"
end
@@ -0,0 +1,2 @@
function fish_mode_prompt
end
+21
View File
@@ -0,0 +1,21 @@
# a called to `_pure_prompt_new_line` is triggered by an event
function fish_prompt
set --local exit_codes $pipestatus # save previous exit codes
# Handle transient prompt (Fish 4.1.0+)
# When --final-rendering is passed, show simplified prompt for scrollback
if contains -- --final-rendering $argv
set --local last_status $exit_codes[-1]
echo -e -n (_pure_prompt_transient $last_status)
echo -e -n (_pure_prompt_ending)
return
end
_pure_print_prompt_rows # manage default vs. compact prompt
_pure_place_iterm2_prompt_mark # place iTerm shell integration mark
echo -e -n (_pure_prompt $exit_codes) # print prompt
echo -e -n (_pure_prompt_ending) # reset colors and end prompt
set _pure_fresh_session false
end
+15
View File
@@ -0,0 +1,15 @@
function fish_title \
--description "Set title to current folder and shell name" \
--argument-names last_command
set --local current_folder (fish_prompt_pwd_dir_length=$pure_shorten_window_title_current_directory_length prompt_pwd)
set --local current_command (status current-command 2>/dev/null; or echo $_)[1] # we use index to ignore extraneous item, see #360
set --local prompt "$current_folder: $last_command $pure_symbol_title_bar_separator $current_command"
if test -z "$last_command"
set prompt "$current_folder $pure_symbol_title_bar_separator $current_command"
end
echo $prompt
end
@@ -0,0 +1,3 @@
function fish_user_key_bindings
fzf_key_bindings
end
+251
View File
@@ -0,0 +1,251 @@
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.8
set --local fish_plugins $__fish_config_dir/fish_plugins
switch "$cmd"
case -v --version
echo "fisher, version $fisher_version"
case "" -h --help
echo "Usage: fisher install <plugins...> Install plugins"
echo " fisher remove <plugins...> Remove installed plugins"
echo " fisher uninstall <plugins...> Remove installed plugins (alias)"
echo " fisher update <plugins...> Update installed plugins"
echo " fisher update Update all installed plugins"
echo " fisher list [<regex>] List installed plugins matching regex"
echo "Options:"
echo " -v, --version Print version"
echo " -h, --help Print this help message"
echo "Variables:"
echo " \$fisher_path Plugin installation path. Default: $__fish_config_dir" | string replace --regex -- $HOME \~
case ls list
string match --entire --regex -- "$argv[2]" $_fisher_plugins
case install update remove uninstall
isatty || read --local --null --array stdin && set --append argv $stdin
test "$cmd" = uninstall && set cmd remove
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 | string replace -- \~ ~)
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
else if test "$cmd" = install && ! set --query old_plugins[1]
set --append 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 resp (command mktemp)
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)
set http (command curl -q --silent -L -o \$resp -w %{http_code} \$url)
if test \"\$http\" = 200 && command tar -xzC \$temp -f \$resp 2>/dev/null
command cp -Rf \$temp/*/* $source
else if test \"\$http\" = 403
echo fisher: GitHub API rate limit exceeded \(HTTP 403\) >&2
command rm -rf $source
else
echo fisher: Invalid plugin name or host unavailable: \\\"$plugin\\\" >&2
command rm -rf $source
end
command rm -rf \$temp
end
set files $source/* && string match --quiet --regex -- .+\.fish\\\$ \$files
" &
set --append pid_list (jobs --last --pid)
end
wait $pid_list 2>/dev/null
for plugin in $fetch_plugins
if set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)] && test ! -e $source
if set --local index (contains --index -- "$plugin" $install_plugins)
set --erase install_plugins[$index]
else
set --erase update_plugins[(contains --index -- "$plugin" $update_plugins)]
end
end
end
for plugin in $update_plugins $remove_plugins
if set --local index (contains --index -- "$plugin" $_fisher_plugins)
set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
if contains -- "$plugin" $remove_plugins
for name in (string replace --filter --regex -- '.+/conf\.d/([^/]+)\.fish$' '$1' $$plugin_files_var)
emit {$name}_uninstall
end
printf "%s\n" Removing\ (set_color red --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
set --erase _fisher_plugins[$index]
end
command rm -rf (string replace -- \~ ~ $$plugin_files_var)
functions --erase (string replace --filter --regex -- '.+/functions/([^/]+)\.fish$' '$1' $$plugin_files_var)
for name in (string replace --filter --regex -- '.+/completions/([^/]+)\.fish$' '$1' $$plugin_files_var)
complete --erase --command $name
end
set --erase $plugin_files_var
end
end
if set --query update_plugins[1] || set --query install_plugins[1]
command mkdir -p $fisher_path/{functions,themes,conf.d,completions}
end
for plugin in $update_plugins $install_plugins
set --local source $source_plugins[(contains --index -- "$plugin" $fetch_plugins)]
set --local files $source/{functions,themes,conf.d,completions}/*
if set --local index (contains --index -- $plugin $install_plugins)
set --local user_files $fisher_path/{functions,themes,conf.d,completions}/*
set --local conflict_files
for file in (string replace -- $source/ $fisher_path/ $files)
contains -- $file $user_files && set --append conflict_files $file
end
if set --query conflict_files[1] && set --erase install_plugins[$index]
echo -s "fisher: Cannot install \"$plugin\": please remove or move conflicting files first:" \n" "$conflict_files >&2
continue
end
end
for file in (string replace -- $source/ "" $files)
command cp -RLf $source/$file $fisher_path/$file
end
set --local plugin_files_var _fisher_(string escape --style=var -- $plugin)_files
set --query files[1] && set --universal $plugin_files_var (string replace -- $source $fisher_path $files | string replace -- ~ \~)
contains -- $plugin $_fisher_plugins || set --universal --append _fisher_plugins $plugin
contains -- $plugin $install_plugins && set --local event install || set --local event update
printf "%s\n" Installing\ (set_color --bold)$plugin(set_color normal) " "$$plugin_files_var | string replace -- \~ ~
for file in (string match --regex -- '.+/[^/]+\.fish$' $$plugin_files_var | string replace -- \~ ~)
source $file
if set --local name (string replace --regex -- '.+conf\.d/([^/]+)\.fish$' '$1' $file)
emit {$name}_$event
end
end
end
command rm -rf $source_plugins
if set --query _fisher_plugins[1]
set --local commit_plugins
for plugin in $file_plugins
contains -- (string lower -- $plugin) (string lower -- $_fisher_plugins) && set --append commit_plugins $plugin
end
for plugin in $_fisher_plugins
contains -- (string lower -- $plugin) (string lower -- $commit_plugins) || set --append commit_plugins $plugin
end
string replace --regex -- $HOME \~ $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
+47
View File
@@ -0,0 +1,47 @@
function fzf-complete -d 'fzf completion and print selection back to commandline'
# As of 2.6, fish's "complete" function does not understand
# subcommands. Instead, we use the same hack as __fish_complete_subcommand and
# extract the subcommand manually.
set -l cmd (commandline -co) (commandline -ct)
switch $cmd[1]
case env sudo
for i in (seq 2 (count $cmd))
switch $cmd[$i]
case '-*'
case '*=*'
case '*'
set cmd $cmd[$i..-1]
break
end
end
end
set cmd (string join -- ' ' $cmd)
set -l complist (complete -C$cmd)
set -l result
string join -- \n $complist | sort | eval (__fzfcmd) -m --select-1 --exit-0 --header '(commandline)' | cut -f1 | while read -l r
set result $result $r
end
set prefix (string sub -s 1 -l 1 -- (commandline -t))
for i in (seq (count $result))
set -l r $result[$i]
switch $prefix
case "'"
commandline -t -- (string escape -- $r)
case '"'
if string match '*"*' -- $r >/dev/null
commandline -t -- (string escape -- $r)
else
commandline -t -- '"'$r'"'
end
case '~'
commandline -t -- (string sub -s 2 (string escape -n -- $r))
case '*'
commandline -t -- (string escape -n -- $r)
end
[ $i -lt (count $result) ]; and commandline -i ' '
end
commandline -f repaint
end
+13
View File
@@ -0,0 +1,13 @@
# ~/.config/fish/functions/fzf.fish
function fzf --wraps="fzf"
# Paste contents of preferred variant here
set -Ux FZF_DEFAULT_OPTS "
--color=fg:#797593,bg:#faf4ed,hl:#d7827e
--color=fg+:#575279,bg+:#f2e9e1,hl+:#d7827e
--color=border:#dfdad9,header:#286983,gutter:#faf4ed
--color=spinner:#ea9d34,info:#56949f
--color=pointer:#907aa9,marker:#b4637a,prompt:#797593
--color=bg:-1,bg+:-1"
command fzf
end
+6
View File
@@ -0,0 +1,6 @@
# ~/.config/fish/functions/pacman.fish
#
function addpkg
# Browse through pacman package and install selection
pacman -Slq | fzf --multi --preview 'pacman -Si {1}' | xargs -ro sudo pacman -S
end
+3
View File
@@ -0,0 +1,3 @@
function pathclean --description "Clean up PATH variable"
set PATH (printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')
end