feat(config): fish configs

This commit is contained in:
2025-02-14 00:04:09 +02:00
parent 4e4a2eaab1
commit b436472bbb
160 changed files with 6324 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
function .c --wraps='cd ~/Code' --description 'alias .c=cd ~/Code'
cd ~/Code $argv
end

View File

@@ -0,0 +1,4 @@
function .d --wraps='cd ~/.dotfiles' --description 'alias .d=cd ~/.dotfiles'
cd ~/.dotfiles $argv
end

View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# Copyright (c) 2022 Huang-Huang Bao
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
# shellcheck disable=SC2076
set -e
disallowd_vars_arr=(
_
fish_kill_signal
fish_killring
fish_pid
history
hostname
PWD
pipestatus
SHLVL
status
status_generation
version
)
disallowd_vars=" ${disallowd_vars_arr[*]} "
fish_escape() {
value="${1//\\/\\\\}"
value="${value//\'/\\\'}"
echo "'${value}'"
}
flag_impure="$__FISH_BASH2ENV_IMPURE"
unset __FISH_BASH2ENV_IMPURE
if [[ -z "$flag_impure" ]]; then
old_env=" $(env -0 | tr '\0' ' ') "
fi
eval_status=
eval "$*" 1>&2 || eval_status=$?
env -0 | while IFS= read -rs -d $'\0' line; do
if [[ -z "$flag_impure" && "${old_env}" =~ " ${line} " ]]; then
continue
fi
name="${line%%=*}"
if [[ "${disallowd_vars}" =~ " ${name} " ]]; then
continue
fi
value="$(fish_escape "${line#*=}")"
echo "set -gx ${name} ${value}"
done
exit $eval_status

View File

@@ -0,0 +1,53 @@
# @halostatue/fish-macos/functions/__macos_app_bundleid.fish:v7.0.0
function __macos_app_bundleid
argparse --name 'app bundleid' x/exact a/all h/help q/quiet s/short -- $argv
or return 1
if set --query _flag_help
echo 'Usage: app bundleid [options] pattern...
Shows the bundle identifier for each of the applications found for the
pattern (see `app find` for how applications are found).
Options:
-x, --exact Perform exact matches only
-a, --all Show all matches
-q, --quiet Suppress error output
-s, --short Prints out the bundle IDs only
-h, --help Show this help
Examples:
> app bundleid 1password
/Applications/1Password for Safari.app: com.1password.safari
/Applications/1Password.app: com.1password.1password
> app bundleid -x 1password
/Applications/1Password.app: com.1password.1password'
return 0
end
if test (count $argv) -eq 0
echo >&2 'app bundleid: Not enough arguments.'
__macos_app_bundleid --help >&2
return 1
end
set --function apps (__macos_app_find $_flag_exact $_flag_all $argv)
or return 1
for app in $apps
set --local bundle_id (mdls -name kMDItemCFBundleIdentifier -r $app)
if test -z $bundle_id
set --query _flag_quiet
or echo >&2 'Error getting bundle ID for "'$app'"'
else
if set --query _flag_short
echo $bundle_id
else
echo $app: $bundle_id
end
end
end
end

View File

@@ -0,0 +1,85 @@
# @halostatue/fish-macos/functions/__macos_app_find.fish:v7.0.0
function __macos_app_find
argparse --name 'app find' x/exact a/all q/quiet h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: app find [options] pattern...
Shows installed apps by the provided pattern or patterns. Searches for
apps in /Applications, /Applications/Setapp, /Applications/Utilities,
~/Applications, /Appliciations/Xcode.app/Contents/Applications,
/Developer/Applications, and /System/Applications.
Options:
-x, --exact Perform exact matches only
-a, --all Show all matches
-q, --quiet Do not print matches
-h, --help Show this help
Examples:
> app find --all 1password
/Applications/1Password for Safari.app
/Applications/1Password.app
> app find --exact 1password
/Applications/1Password.app'
return 0
end
if test (count $argv) -eq 0
echo >&2 'app find: Not enough arguments.'
__macos_app_find --help >&2
return 1
end
set --function a Applications
set --function paths \
/$a \
~/$a \
/$a/Setapp \
/$a/Utilities \
/$a/Xcode.app/Contents/$a \
/Developer/Applications \
/System/Applications
set --function found 0
for pattern in $argv
set pattern (string replace '\.app/?$' '' $pattern)
set --local apps {$paths}/*.app {$paths}/*.localized/*.app
for candidate in $apps
set --local found_item 0
if set --query _flag_exact
if string match --ignore-case --entire --quiet /$pattern.app $candidate
set found_item 1
end
else if string match --ignore-case --entire --quiet $pattern $candidate
set found_item 1
end
if test $found_item -eq 1
set --query _flag_quiet
or echo $candidate
set found (math $found + $found_item)
set --query _flag_quiet
and return 0
set --query _flag_all
or return 0
end
end
end
test $found -gt 0
and return 0
set --query _flag_quiet
or echo >&2 'No applications found.'
return 1
end

View File

@@ -0,0 +1,110 @@
# @halostatue/fish-macos/functions/__macos_app_frontmost.fish:v7.0.0
function __macos_app_frontmost::info
set --function value (lsappinfo info -only $argv[2] $argv[1] | string split =)[2]
or return 1
string replace --all '"' '' $value
return 0
end
function __macos_app_frontmost
argparse --name 'app frontmost' \
h/help b/bundle-id p/path n/name P/pid a/all \
-- $argv
or return 1
if set --query _flag_help
echo 'Usage: app frontmost [options]
Retrieves details about the front-most application.
Options:
-b, --bundle-id Shows the app bundle ID
-p, --path Shows the app path
-n, --name Shows the app name
-P, --pid Shows the PID of the app
-a, --all Shows all details
-h, --help Show this help
Example:
> app frontmost
iTerm2'
return 0
end
set --function front (lsappinfo front)
or return 1
set --function items 0
if set --query _flag_all
set items 4
else
set --query _flag_bundle_id _flag_path _flag_name _flag_pid
set --local missing $status
switch $missing
case 0
set _flag_all 1
set items 4
case 4
set _flag_name 1
set items 1
case '*'
set items (math 4 - $missing)
end
end
if set --query _flag_name || set --query _flag_all
set --function name (__macos_app_frontmost::info $front name)
or return 1
end
if set --query _flag_bundle_id || set --query _flag_all
set --function bundle_id (__macos_app_frontmost::info $front bundleID)
or return 1
end
if set --query _flag_path || set --query _flag_all
set --function bundle_path (__macos_app_frontmost::info $front bundlepath)
or return 1
end
if set --query _flag_pid || set --query _flag_all
set --function pid (__macos_app_frontmost::info $front pid)
or return 1
end
if set --query _flag_all
printf "%s: %s %s (%s)\n" $name $bundle_id $bundle_path $pid
else
if set --query _flag_name
printf "%s" $name
test $items -gt 1 && printf ": "
set items (math $items - 1)
end
if set --query _flag_bundle_id
printf "%s" $bundle_id
test $items -gt 1 && printf " "
set items (math $items - 1)
end
if set --query _flag_path
printf "%s" $bundle_path
test $items -gt 1 && printf " "
set items (math $items - 1)
end
if set --query _flag_pid
if test $items -gt 1
printf "(%s)" $pid
else
printf "%s" $pid
end
end
printf "\n"
end
end

View File

@@ -0,0 +1,94 @@
# @halostatue/fish-macos/functions/__macos_app_icon.fish:v7.0.0
function __macos_app_icon
argparse --name 'app quit' x/exact h/help 'o/output=' 'w/width=' -- $argv
or return 1
if set --query _flag_help
echo 'Usage: app icon [options] pattern...
Extracts macOS app icons as PNG (see `app find` for how applications
are found).
Options:
-x, --exact Perform exact matches only
-oOUTPUT Output to the file or directory specified
--output OUTPUT Output to the file or directory specified
-wWIDTH Outputs to a maximum of WIDTH pixels
--width WIDTH Outputs to a maximum of WIDTH pixels
-h, --help Show this help'
return 0
end
if test (count $argv) -eq 0
echo >&2 'app icon: Not enough arguments.'
__macos_app_icon --help >&2
return 1
end
if set --query _flag_exact
set --function apps (__macos_app_find --exact $argv)
or return 1
else
set --function apps (__macos_app_find --all $argv)
or return 1
end
set --function app_count (count $apps)
set --function output_path $PWD
if not test -z $_flag_output
if test -e $_flag_output
if test -f $_flag_output
if test $app_count -gt 1
echo >&2 'app icon: More than one application found, but only one output file specified.'
return 1
end
set output_path (dirname $_flag_output)
set output_file (basename $_flag_output)
else if test -d $_flag_output
set output_path $_flag_output
else
echo >&2 'app icon: Output to a non-file or directory specified.'
return 1
end
else
set output_path $_flag_output
mkdir -p $output_path
end
end
for app in $apps
set --local icon $app/Contents/Resources/(
defaults read $app/Contents/Info CFBundleIconFile |
string replace --regex '\.icns$' ''
).icns
set --local name (basename $app .app)_icon.png
set --local tmp $TMPDIR/$name
set --local max_width (sips -g pixelWidth $icon | tail -1 | awk '{ print $2; }')
set --local outfile
set --local width
if test -z $output_file
set outfile $output_path/$name
else
set outfile $output_path/$output_file
end
if test -z $_flag_width
set width $max_width
else if test $_flag_width -gt $max_width
set width $max_width
else
set width $_flag_width
end
sips -s format png --resampleHeightWidthMax $width $icon --out $outfile >/dev/null 2>&1
echo Wrote $app icon to $outfile.
end
end

View File

@@ -0,0 +1,42 @@
# @halostatue/fish-macos/functions/__macos_app_quit.fish:v7.0.0
function __macos_app_quit
argparse --name 'app quit' x/exact r/restart h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: app quit [options] pattern...
Quits apps identified by the provided pattern or patterns (see
`app find` for how applications are found).
Options:
-x, --exact Quits only applications with exact matches
-r, --restart Restarts the application that was quit
-h, --help Show this help'
return 0
end
if test (count $argv) -eq 0
echo >&2 'app bundleid: Not enough arguments.'
__macos_app_quit --help >&2
return 1
end
if set --query _flag_exact
set --function apps (__macos_app_find --exact $argv)
or return 1
else
set --function apps (__macos_app_find --all $argv)
or return 1
end
for app in $apps
printf 'quit app "%s"' $app | osascript >/dev/null
if set --query _flag_restart
sleep 2
open -a $app
end
end
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_cd.fish:v7.0.0
function __macos_finder_cd
argparse --name 'finder cd' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder cd [options] [window#]
Changes the current path to the path of the Finder window.
Options:
-h, --help Show this help'
return 0
end
cd (__macos_finder_pwd::get $argv[1])
end

View File

@@ -0,0 +1,30 @@
# @halostatue/fish-macos/functions/__macos_finder_clean.fish:v7.0.0
function __macos_finder_clean
argparse --name 'finder clean' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder clean [options] [path...]
Removes .DS_Store files from the paths provided, or the current path if
one is not provided.
Options:
-h, --help Show this help'
return 0
end
if set --query argv[1]
set --function paths $argv
else
set --function paths .
end
for path in $paths
test -d $path
or continue
find $path -type f -name '*.DS_Store' -ls -delete
end
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_column.fish:v7.0.0
function __macos_finder_column
argparse --name 'finder column' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder column [options] [window#]
Updates the Finder window to PWD using column view.
Options:
-h, --help Show this help'
return 0
end
__macos_finder_pwd::update --column $argv
end

View File

@@ -0,0 +1,44 @@
# @halostatue/fish-macos/functions/__macos_finder_desktop_icons.fish:v7.0.0
function __macos_finder_desktop_icons
argparse --name 'finder desktop-icons' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder desktop-icons [options] STATE
Shows or hides the desktop icons. If not specified, shows the current state.
States:
off Hides the desktop icons
on Shows the desktop icons
[status] Shows desktop icon visibility
toggle Toggles desktop icon visibility
Options:
-h, --help Show this help'
return 0
end
set --function action (string lower -- $argv[1])
set --function key CreateDesktop
switch $action
case off
__macos_finder_defaults::set $key false
case on
__macos_finder_defaults::set $key true
case toggle
if test (__macos_mac_defaults_query com.apple.Finder $key 1) -eq 1
__macos_finder_defaults::set $key false
else
__macos_finder_defaults::set $key true
end
case status ''
if test (__macos_mac_defaults_query com.apple.Finder $key 1) -eq 1
echo 'Desktop icons are hidden.'
else
echo 'Desktop icons are visible.'
end
end
end

View File

@@ -0,0 +1,45 @@
# @halostatue/fish-macos/functions/__macos_finder_hidden.fish:v7.0.0
function __macos_finder_hidden
argparse --name 'finder hidden' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder hidden [options] STATE
Shows or hides files that are normally hidden from the Finder. If not
specified, shows the current state.
States:
off Hides files that are normally hidden from the Finder
on Shows files that are normally hidden from the Finder
[status] Shows the status of the hidden files setting
toggle Toggles the hidden files setting
Options:
-h, --help Show this help'
return 0
end
set --function action (string lower -- $argv[1])
set --function key AppleShowAllFiles
switch $action
case off
__macos_finder_defaults::set $key false
case on
__macos_finder_defaults::set $key true
case toggle
if test (__macos_mac_defaults_query com.apple.Finder $key 0) -eq 1
__macos_finder_defaults::set $key false
else
__macos_finder_defaults::set $key true
end
case status ''
if test (__macos_mac_defaults_query com.apple.Finder $key 0) -eq 1
echo 'Hidden files are visible in finder.'
else
echo 'Hidden files are hidden in finder.'
end
end
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_icon.fish:v7.0.0
function __macos_finder_icon
argparse --name 'finder icon' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder icon [options] [window#]
Updates the Finder window to PWD using icon view.
Options:
-h, --help Show this help'
return 0
end
__macos_finder_pwd::update --icon $argv
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_list.fish:v7.0.0
function __macos_finder_list
argparse --name 'finder list' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder list [options] [window#]
Updates the Finder window to PWD using list view.
Options:
-h, --help Show this help'
return 0
end
__macos_finder_pwd::update --list $argv
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_pushd.fish:v7.0.0
function __macos_finder_pushd
argparse --name 'finder pushd' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder pushd [options] [window#]
Changes the current path to the path of the Finder window with pushd.
Options:
-h, --help Show this help'
return 0
end
pushd (__macos_finder_pwd::get $argv[1])
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_pwd.fish:v7.0.0
function __macos_finder_pwd
argparse --name 'finder pwd' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder pwd [options] [window#]
Prints the path of the Finder window.
Options:
-h, --help Show this help'
return 0
end
__macos_finder_pwd::get $argv[1]
end

View File

@@ -0,0 +1,60 @@
# @halostatue/fish-macos/functions/__macos_finder_quarantine.fish:v7.0.0
function __macos_finder_quarantine::run
set --query argv[1]
or return 1
set --function databases ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV*
set --function cmd sqlite3 -separator ' | '
for db in $databases
$cmd $db $argv
end
end
function __macos_finder_quarantine
argparse --name 'finder quarantine' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder [options] [SUBCOMMAND] [FILE...]
Manage quarantine events.
Subcommands:
[show] Shows quarantine events by agent and URL.
clean FILE... Removes quarantine attributes from the specified file(s).
At least one file is required.
clear Clears all quarantine events.
Options:
-h, --help Show this help'
return 0
end
set --function verb (string lower -- $argv[1])
set --erase argv[1]
switch $verb
case show ''
__macos_finder_quarantine::run "
SELECT LSQuarantineAgentName, LSQuarantineDataURLString
FROM LSQuarantineEvent
WHERE LSQuarantineDataURLString != ''
ORDER BY LSQuarantineAgentName, LSQuarantineDataURLString;"
case clear
__macos_finder_quarantine::run 'DELETE FROM LSQuarantineEvent;'
case clean
if not set --query argv[1]
echo >&2 'finder quarantine clean requires at least one file parameter'
return 1
end
for attr in com.apple.{metadata:{kMDItemDownloadedDate,kMDItemWhereFroms},quarantine}
xattr -r -d $attr $argv
end
case '*'
echo >&2 "finder quarantine: unknown command '"$verb"'. Use 'show', 'clear', or 'clean'."
return 1
end
end

View File

@@ -0,0 +1,28 @@
# @halostatue/fish-macos/functions/__macos_finder_selected.fish:v7.0.0
function __macos_finder_selected
argparse --name 'finder selected' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder selected [options] [window#]
Print the selected files on the command-line.
Options:
-h, --help Show this help'
return 0
end
echo '
tell application "Finder" to set theSelection to selection
set output to ""
set itemCount to count theSelection
repeat with itemIndex from 1 to itemCount
if itemIndex is less than itemCount then set theDelimiter to "\n"
if itemIndex is itemCount then set theDelimiter to ""
set currentItem to (item itemIndex of theSelection as alias)
set currentItem to POSIX path of currentItem
set output to output & currentItem & theDelimiter
end repeat' | osascript
end

View File

@@ -0,0 +1,26 @@
# @halostatue/fish-macos/functions/__macos_finder_track.fish:v7.0.0
function __macos_finder_track
argparse --name 'finder track' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder track [options]
Makes the first Finder window track with the shell PWD. This should be used
in a single shell instance only, and updates only when the PWD value is
updated.
Options:
-h, --help Show this help'
return 0
end
if not functions --query __macos_finder_tracking
function __macos_finder_tracking --on-variable PWD
__macos_finder_pwd::update
end
end
__macos_finder_pwd::update
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_untrack.fish:v7.0.0
function __macos_finder_untrack
argparse --name 'finder untrack' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder untrack [options]
Unlinks the shell PWD from the first Finder window.
Options:
-h, --help Show this help'
return 0
end
functions --erase __macos_finder_tracking
end

View File

@@ -0,0 +1,18 @@
# @halostatue/fish-macos/functions/__macos_finder_update.fish:v7.0.0
function __macos_finder_update
argparse --name 'finder update' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: finder update [options] [window#]
Updates the Finder window to PWD.
Options:
-h, --help Show this help'
return 0
end
__macos_finder_pwd::update $argv
end

View File

@@ -0,0 +1,45 @@
# @halostatue/fish-macos/functions/__macos_mac_airdrop.fish:v7.0.0
function __macos_mac_airdrop
argparse --name 'mac airdrop' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac airdrop STATE
Turns AirDrop on or off. Requires administrative permissions and
executes with sudo.
States:
off Disables AirDrop.
on Enables AirDrop.
[status] Shows the status of AirDrop.
toggle Toggles the status of AirDrop.
Options:
-h, --help Show this help'
return 0
end
set --function subcommand (string lower -- $argv[1])
set --erase argv[1]
switch $subcommand
case on
sudo ifconfig awdl0 up
case off
sudo ifconfig awdl0 down
case status ''
ifconfig awdl0 | awk '/status:/ { print $2; }'
case toggle
if test (__macos_mac_airdrop status) == active
__macos_mac_airdrop off
else
__macos_mac_airdrop on
end
case '*'
echo >&2 'mac airdrop: unknown state.'
__macos_mac_airdrop --help >&2
return 1
end
end

View File

@@ -0,0 +1,75 @@
# @halostatue/fish-macos/functions/__macos_mac_airport.fish:v7.0.0
function __macos_mac_airport::ssid
__macos_mac_airport::run -I | string replace --filter --regex '\s+SSID: (\S+)' '$1'
end
function __macos_mac_airport::run
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport \
$argv
end
function __macos_mac_airport
argparse --name 'mac airport' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac airport STATE
mac airport SUBCOMMAND [SSID]
Performs various WiFi (AirPort) operations. If no state or subcommand is
provided, the scan subcommand will be run by default. Otherwise a state (off,
on, toggle) or a subcommand must be provided.
States:
off Disables the WiFi adapter.
on Enables the WiFi adapter.
toggle Toggles the status of the WiFi adapter.
Subcommands:
password [SSID] Shows the password of the current or specified SSID.
scan Scans for WiFi networks..
ssid Shows the current WiFi network SSID.
status Shows the status of the WiFi adapter.
Options:
-h, --help Show this help'
return 0
end
set --function cmd (string lower -- $argv[1])
set --erase argv[1]
switch $cmd
case scan ''
printf "Scanning...\r"
__macos_mac_airport::run -s
case network ssid
__macos_mac_airport::ssid
case off
networksetup -setairportpower en0 off
case on
networksetup -setairportpower en0 on
case status
networksetup -getairportpower en0 | string replace --regex '^[^:]+: ' '' | string lower
case toggle
if test (__macos_mac_airport status) == on
__macos_mac_airport off
else
__macos_mac_airport on
end
case password
set --local ssid
if set --query argv[1]
set ssid $argv[1]
else
set ssid (__macos_mac_airport::ssid)
end
security find-generic-password -D "AirPort network password" -l $ssid -gw
case '*'
echo >&2 'mac airport: Unknown command.'
__macos_mac_airport --help >&2
return 1
end
end

View File

@@ -0,0 +1,38 @@
# @halostatue/fish-macos/functions/__macos_mac_brightness.fish:v7.0.0
function __macos_mac_brightness
argparse --name 'mac brightness' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac brightness [options] DIRECTION
Adjust the screen brightness level.
Direction:
up Increases the screen brightness level.
down Decreases the screen brightness level.
Options:
-h, --help Show this help'
return 0
end
set --function direction (string lower -- $argv[1])
set --erase argv[1]
switch $direction
case down
echo 'tell application "System Events"
key code 145
end tell' | osascript >/dev/null
case up ''
echo 'tell application "System Events"
key code 144
end tell' | osascript >/dev/null
case '*'
echo >&2 'mac brightness: Unknown direction'
__macos_mac_brightness --help >&2
return 1
end
end

View File

@@ -0,0 +1,9 @@
# @halostatue/fish-macos/functions/__macos_mac_defaults_query.fish:v7.0.0
function __macos_mac_defaults_query
if set --function value (defaults read $argv[1] $argv[2] 2>/dev/null)
echo $value
else
echo $argv[3]
end
end

View File

@@ -0,0 +1,19 @@
# @halostatue/fish-macos/functions/__macos_mac_flushdns.fish:v7.0.0
function __macos_mac_flushdns
argparse --name 'mac flushdns' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac flushdns [options]
Flushes the DNS cache. Requires sudo.
Options:
-h, --help Show this help'
return 0
end
sudo dscacheutil -flushcache
and sudo killall -HUP mDNSResponder
end

View File

@@ -0,0 +1,62 @@
# @halostatue/fish-macos/functions/__macos_mac_font_smoothing.fish:v7.0.0
function __macos_mac_font_smoothing
argparse --name 'mac font-smoothing' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac font-smoothing [options] off|on [APP...]
Enables or disables font smoothing. If no apps are provided, sets the
global font smoothing preference. If apps are provided, font smoothing
will be set for each app. See `app bundleid` for how apps are resolved.
States:
off Turns off font smoothing
on Turns on font smoothing
Options:
-h, --help Show this help'
return 0
end
set --function state (string lower -- $argv[1])
set --erase argv[1]
switch $state
case on
if test (count $argv) -eq 0
defaults delete -g CGFontRenderingFontSmoothingDisabled
else
for app in (__macos_app_bundleid --exact --short --all $argv)
defaults delete $app CGFontRenderingFontSmoothingDisabled
if test $app = com.microsoft.VSCode
defaults delete $app.helper CGFontRenderingFontSmoothingDisabled
defaults delete $app.helper.EH CGFontRenderingFontSmoothingDisabled
defaults delete $app.helper.NP CGFontRenderingFontSmoothingDisabled
end
end
end
case off
if test (count $argv) -eq 0
defaults write -g CGFontRenderingFontSmoothingDisabled -bool false
else
for app in (__macos_app_bundleid --exact --short --all $argv)
defaults write $app CGFontRenderingFontSmoothingDisabled -bool false
if test $app = com.microsoft.VSCode
defaults write $app.helper CGFontRenderingFontSmoothingDisabled -bool false
defaults write $app.helper.EH CGFontRenderingFontSmoothingDisabled -bool false
defaults write $app.helper.NP CGFontRenderingFontSmoothingDisabled -bool false
end
end
end
case '*'
echo >&2 'mac font-smoothing: Unknown state.'
__macos_mac_font_smoothing --help >&2
return 1
end
end

View File

@@ -0,0 +1,20 @@
# @halostatue/fish-macos/functions/__macos_mac_lsclean.fish:v7.0.0
function __macos_mac_lsclean
argparse --name 'mac lsclean' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac lsclean [options]
Cleans the LaunchServices registration list.
Options:
-h, --help Show this help'
return 0
end
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister \
-kill -r -domain local -domain system -domain user
and killall Finder
end

View File

@@ -0,0 +1,68 @@
# @halostatue/fish-macos/functions/__macos_mac_mail.fish:v7.0.0
# Speed up Mail.app by vacuuming the Envelope Index
# - Code from: http://web.archive.org/web/20071008123746/http://www.hawkwings.net/2007/03/03/scripts-to-automate-the-mailapp-envelope-speed-trick/
# - Originally by "pmbuko" with modifications by Romulo
# - Updated by Brett Terpstra 2012
# - Updated by Mathias Törnblom 2015 to support V3 in El Capitan and still keep backwards compatibility
# - Updated by Andrei Miclaus 2017 to support V4 in Sierra
# - Updated by Austin Ziegler 2022 to not actually care what the OS version is (and translated to fish). The only
# restriction is that you must have opened Mail.app at least once on any OS upgrade so that if any version changes
# have happened, Mail.app has taken care of that for you.
function __macos_mac_mail
argparse --name 'mac mail' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac mail [options] SUBCOMMAND [arg]
Performs operations on Mail.app configuration and database.
Before running vacuum after any OS upgrade, Mail.app must have been opened
at least once so that the database and index formats have been updated.
Subcommands:
vacuum Vacuums the envelope index to improve performance.
attachments inline Sets Mail.app attachment handling to inline.
attachments icon Sets Mail.app attachment handling to icon.
Options:
-h, --help Show this help'
return 0
end
set --function subcommand (string lower -- $argv[1])
set --erase argv[1]
switch $subcommand
case vacuum
set --function mail_version (
path filter --type dir ~/Library/Mail/* |
path basename |
string match --all --entire --regex V\\d
)
set --function mail_path ~/Library/Mail/$mail_version/MailData/Envelope\ Index
osascript -e 'tell application "Mail" to quit'
set --function before (ls -lnah $mail_path | awk '{ print $5; }')
/usr/bin/sqlite3 $mail_path vacuum
set --function after (ls -lnah $mail_path | awk '{ print $5; }')
printf "Mail index before: %s\nMail index after: %s\n" $before $after
osascript -e 'tell application "Mail" to activate'
case attachments
switch (string lower -- $argv[1])
case inline
defaults delete com.apple.mail DisableInlineAttachmentViewing
case icon
defaults write com.apple.mail DisableInlineAttachmentViewing -bool true
end
case '*'
echo >&2 'mac mail: Unknown command.'
__macos_mac_mail --help >&2
return 1
end
end

View File

@@ -0,0 +1,66 @@
# @halostatue/fish-macos/functions/__macos_mac_proxy_icon.fish:v7.0.0
function __macos_mac_proxy_icon
argparse --name 'mac proxy-icon' h/help q/query -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac proxy-icon [options] STATE
Enables or disables the visibility of the proxy icon without delay. macOS
versions older than Monterey always show the proxy icon.
States:
FLOAT Sets the display of the proxy icon to FLOAT fractional seconds.
off Sets the display of the proxy icon to default.
on Sets the display of the proxy icon to 0 seconds.
[status] Shows the duration of the proxy icon display.
toggle Toggles the display of the proxy icon.
Options:
-q, --query When getting status, suppresses output.
-h, --help Show this help'
return 0
end
set --function state (string lower -- $argv[1])
set --erase argv[1]
switch $state
case status ''
set --function value (__macos_mac_defaults_query -g NSToolbarTitleViewRolloverDelay 0.5)
if set --query _flag_query
test $value -eq 0
else if test $value -eq 0
printf "immediate (0 seconds)\n"
else
printf "%0.2f seconds\n" $value
end
case toggle
if __macos_mac_proxy_icon --query status
__macos_mac_proxy_icon off
else
__macos_mac_proxy_icon on
end
case on
defaults write -g NSToolbarTitleViewRolloverDelay -float 0
and killall Finder
case off
defaults delete -g NSToolbarTitleViewRolloverDelay
and killall Finder
case '*'
if string match --regex '^\\d+$|^\\d*\.\\d+$' $state
defaults write -g NSToolbarTitleViewRolloverDelay -float $state
and killall Finder
else
echo >&2 'mac proxy-icon: Unknown state.'
__macos_mac_proxy_icon --help >&2
return 1
end
end
end

View File

@@ -0,0 +1,22 @@
# @halostatue/fish-macos/functions/__macos_mac_serialnumber.fish:v7.0.0
function __macos_mac_serialnumber
argparse --name 'mac serialnumber' h/help c/copy -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac serialnumber [options]
Gets the serial number for the current macOS device.
Options:
-c, --copy Copy to the clipboard
-h, --help Show this help'
return 0
end
set --function serial (ioreg -l | string replace --filter --regex --all '^.*"IOPlatformSerialNumber"\s+=\s+"([^"]+)"' '$1')
set --query _flag_copy && echo $serial | pbcopy
echo $serial
end

View File

@@ -0,0 +1,42 @@
# @halostatue/fish-macos/functions/__macos_mac_touchid.fish:v7.0.0
function __macos_mac_touchid
argparse --name 'mac touchid' h/help q/quiet -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac touchid SUBSYSTEM [STATE]
Enables or disables Touch ID support. Requires administrative permissions
and executes with sudo.
Subsystems:
sudo Manages Touch ID support for sudo
States:
off Disables Touch ID.
on Enables Touch ID.
[status] Shows the status of Touch ID.
toggle Toggles the status of Touch ID.
Options:
-h, --help Show this help'
return 0
end
set --function subsystem (string lower -- $argv[1])
set --erase argv[1]
if set --query _flag_quiet
set --append argv --quiet
end
switch $subsystem
case sudo
__macos_mac_touchid_sudo $argv
case '*'
echo >&2 'mac touchid: unknown subsystem.'
__macos_mac_touchid --help >&2
return 1
end
end

View File

@@ -0,0 +1,195 @@
# @halostatue/fish-macos/functions/__macos_mac_touchid_sudo.fish:v7.0.0
# Massively simplified. This version _only_ works if /etc/pam.d/sudo includes `auth
# include sudo_local` and requires manual removal of `pam_reattach` and `pam_tid` from
# `/etc/pam.d/sudo` _manually_ if present.
function __macos_mac_touchid_sudo::check_supported
if string match -rq '^\s*auth\s+include\s+sudo_local$' </etc/pam.d/sudo
return 0
end
echo "Unsupported sudo configuration, cannot find 'auth include sudo_local'. \
If your macOS installation supports 'include', add this at the top:" |
fmt -s >&2
printf >&2 "\n auth include sudo_local\n\n"
printf >&2 "Once this has been added, try again.\n"
return 1
end
function __macos_mac_touchid_sudo::check_old_install
set --function found
string match -rq '^\s*auth\s+sufficient\s+pam_tid\.so' </etc/pam.d/sudo
and set --append found pam_tid
string match -rq '^\s*auth\s+optional\s+.+pam_reattach\.so' </etc/pam.d/sudo
and set --append found pam_reattach
if set --query found[1]
set found (string join ' and ' $found)
printf >&2 "Sudo support for "$found" present in /etc/pam.d/sudo.\n\n"
echo "This is unsupported by 'mac touchid sudo' and must be manually \
removed before continuing." | fmt -s >&2
return 0
end
return 1
end
function __macos_mac_touchid_sudo::print_status
set --query _flag_quiet
or printf "%-15s: %s\n" $argv
end
function __macos_mac_touchid_sudo::remove_one
path is --type file --perm read /etc/pam.d/sudo_local
and grep -q $argv[1] /etc/pam.d/sudo_local
and sudo sed -i '' -e "/$argv[1]/d" /etc/pam.d/sudo_local
end
function __macos_mac_touchid_sudo::remove
osascript -e 'tell application "System Preferences" to quit'
for ext in pam_tid pam_reattach
__macos_mac_touchid_sudo::remove_one {$ext} /etc/pam.d/sudo_local
and __macos_mac_touchid_sudo::print_status $ext disabled
end
if ! test -s /etc/pam.d/sudo_local
# If /etc/pam.d/sudo_local is empty, remove it.
sudo rm -f /etc/pam.d/sudo_local
end
end
function __macos_mac_touchid_sudo::add
set --function targets
test -f /etc/pam.d/sudo_local
or sudo touch /etc/pam.d/sudo_local
if set --query argv[1]
set --function reattach $argv[1]
if string match -rq '^\s*auth\s+optional\s+'$argv[1] </etc/pam.d/sudo_local
if string match -rq '^\s*auth\s+sufficient\s+pam_tid\.so' </etc/pam.d/sudo_local
__macos_mac_touchid_sudo::print_status pam_reattach enabled
__macos_mac_touchid_sudo::print_status pam_tid enabled
return 0
end
end
set --append targets pam_reattach pam_tid
else if string match -rq '^\s*auth\s+sufficient\s+pam_tid\.so' </etc/pam.d/sudo_local
__macos_mac_touchid_sudo::print_status pam_tid enabled
else
set --append targets pam_tid
end
osascript -e 'tell application "System Preferences" to quit'
for target in $targets
if grep -q $target /etc/pam.d/sudo_local
__macos_mac_touchid_sudo::remove_one $target /etc/pam.d/sudo_local
end
end
if set --query reattach
printf "%-10s %-14s %s\n" \
auth optional $reattach \
auth sufficient pam_tid.so |
sudo tee -a /etc/pam.d/sudo_local >/dev/null
and begin
__macos_mac_touchid_sudo::print_status pam_reattach enabled
__macos_mac_touchid_sudo::print_status pam_tid enabled
end
else
printf "%-10s %-14s %s\n" auth sufficient pam_tid.so |
sudo tee -a /etc/pam.d/sudo_local >/dev/null
and __macos_mac_touchid_sudo::print_status pam_tid enabled
end
end
function __macos_mac_touchid_sudo
argparse --name 'mac touchid sudo' h/help q/quiet -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac touchid sudo [STATE]
Enables or disables Touch ID support for sudo. Requires administrative
permissions to edit /etc/pam.d/sudo_local and executes with sudo.
If pam_reattach is installed, this will be managed as well. Note that if
pam_reattach is installed using sudo, it is imperative that Touch ID
support be disabled first or you may be in a situation where you cannot
use sudo. Note that MacPorts-installed pam_reattach will never be used.
States:
off Disables Touch ID.
on Enables Touch ID.
[status] Shows the status of Touch ID.
toggle Toggles the status of Touch ID.
Options:
-h, --help Show this help'
return 0
end
__macos_mac_touchid_sudo::check_supported
or return
__macos_mac_touchid_sudo::check_old_install
and return
set --function subcommand (string lower -- $argv[1])
set --erase argv[1]
switch $subcommand
case on
set --local reattach /opt/local /opt/homebrew /usr/local /usr
set reattach (path filter --type file $reattach/lib/pam/pam_reattach.so)
if set --query reattach[1]
set reattach (string replace --all --regex / \\/ $reattach[1])
end
__macos_mac_touchid_sudo::add $reattach
case off
__macos_mac_touchid_sudo::remove
case status ''
set --local pam_tid disabled
set --local pam_reattach disabled
grep -q pam_tid.so /etc/pam.d/sudo_local
and set pam_tid enabled
grep -q pam_reattach.so /etc/pam.d/sudo_local
and set pam_reattach enabled
if set --query _flag_quiet
test $pam_tid = enabled
else
__macos_mac_touchid_sudo::print_status pam_tid $pam_tid
__macos_mac_touchid_sudo::print_status pam_reattach $pam_reattach
end
case toggle
if __macos_mac_touchid_sudo status --quiet
__macos_mac_touchid_sudo off
else
__macos_mac_touchid_sudo on
end
case '*'
echo >&2 'mac touchid: unknown state.'
__macos_mac_touchid_sudo --help >&2
return 1
end
end

View File

@@ -0,0 +1,60 @@
# @halostatue/fish-macos/functions/__macos_mac_transparency.fish:v7.0.0
function __macos_mac_transparency
argparse --name 'mac transparency' h/help q/query -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac transparency [options] STATE
Enables or disables interface transparency by setting the universal
access "reduce transparency" setting.
States:
off Disables interface transparency
on Enables interface transparency
[status] Shows the status of interface transparency
toggle Toggles interface transparency
Options:
-q, --query When getting status, suppresses output.
-h, --help Show this help'
return 0
end
set function state (string lower -- $argv[1])
set --erase argv[1]
switch $state
case status ''
set function value (__macos_mac_defaults_query com.apple.universalaccess reduceTransparency 0)
if set --query _flag_query
test $value -eq 0
else
if test $value -eq 0
echo on
else
echo off
end
end
case on
defaults delete com.apple.universalaccess reduceTransparency
case off
defaults write com.apple.universalaccess reduceTransparency -bool true
case toggle
if __macos_mac_transparency status --query
__macos_mac_transparency off
else
__macos_mac_transparency on
end
case '*'
echo >&2 'mac transparency: unknown state'
__macos_mac_transparency --help >&2
return 1
end
end

View File

@@ -0,0 +1,86 @@
# @halostatue/fish-macos/functions/__macos_mac_version.fish:v7.0.0
function __macos_mac_version
argparse \
--exclusive s,v \
--exclusive l,v \
--exclusive s,c \
--exclusive l,c \
--exclusive v,c \
h/help s/simple l/lowercase v/version c/comparable -- $argv
if set --query _flag_help
echo 'Usage: mac version [options]
Shows the current mac version.
Options:
-s, --simple Removes spaces from the version displayed
-l, --lowercase Converts the version to all lowercase
-c, --comparable Outputs the comparable version value
-v, --version Outputs the macOS version (same as sw_vers -productVersion)'
return 0
end
set --function os_version (sw_vers -productVersion)
if set --query _flag_version
echo $os_version
return $status
end
set os_version (__macos_version_to_comparable $os_version)
or return 1
if set --query _flag_comparable
echo $os_version
return 0
end
switch $os_version
case 1005000
set os_version Leopard
case 1006000
set os_version Snow Leopard
case 1007000
set os_version Lion
case 1008000
set os_version Mountain Lion
case 1009000
set os_version Mavericks
case 1010000
set os_version Yosemite
case 1011000
set os_version El Capitan
case 1012000
set os_version Sierra
case 1013000
set os_version High Sierra
case 1014000
set os_version Mojave
case 1015000
set os_version Catalina
case 1100000
set os_version Big Sur
case 1200000
set os_version Monterey
case 1300000
set os_version Ventura
case 1400000
set os_version Sonoma
case 1500000
set os_version Sequoia
case '*'
return 1
end
if set --query _flag_simple
set os_version (string replace --all ' ' '' "$os_version")
end
if set --query _flag_lowercase
set os_version (string lower -- "$os_version")
end
echo $os_version
end

View File

@@ -0,0 +1,45 @@
# @halostatue/fish-macos/functions/__macos_mac_vol.fish:v7.0.0
function __macos_mac_vol
argparse --name 'mac vol' h/help -- $argv
or return 1
if set --query _flag_help
echo 'Usage: mac vol [options] LEVEL
Control the volume level.
Levels:
mute Mutes the volume level.
unmute Unmutes the volume level.
0 .. 100 Sets the volume level at LEVEL %.
[show] Shows the current volume level.
Options:
-h, --help Show this help'
return 0
end
set --function action (string lower -- $argv[1])
set --erase argv[1]
switch $action
case mute
osascript -e 'set volume output muted true'
case unmute
osascript -e 'set volume output muted false'
case (seq 0 100)
osascript -e "set volume output volume "$action
case show ''
if test (osascript -e 'output muted of (get volume settings)') = true
echo muted
else
osascript -e "output volume of (get volume settings)"
end
case '*'
echo >&2 'mac vol: Unknown level'
__macos_mac_vol --help >&2
return 1
end
end

View File

@@ -0,0 +1,23 @@
function __ssh_agent_is_started -d "check if ssh agent is already started"
if test -n "$SSH_CONNECTION"
# This is an SSH session
ssh-add -l > /dev/null 2>&1
if test $status -eq 0 -o $status -eq 1
# An SSH agent was forwarded
return 0
end
end
if begin; test -f "$SSH_ENV"; and test -z "$SSH_AGENT_PID"; end
source $SSH_ENV > /dev/null
end
if test -z "$SSH_AGENT_PID"
return 1
end
ssh-add -l > /dev/null 2>&1
if test $status -eq 2
return 1
end
end

View File

@@ -0,0 +1,5 @@
function __ssh_agent_start -d "start a new ssh agent"
ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
chmod 600 $SSH_ENV
source $SSH_ENV > /dev/null
end

View File

@@ -0,0 +1,174 @@
function __z -d "Jump to a recent directory."
function __print_help -d "Print z help."
printf "Usage: $Z_CMD [-celrth] string1 string2...\n\n"
printf " -c --clean Removes directories that no longer exist from $Z_DATA\n"
printf " -d --dir Opens matching directory using system file manager.\n"
printf " -e --echo Prints best match, no cd\n"
printf " -l --list List matches and scores, no cd\n"
printf " -p --purge Delete all entries from $Z_DATA\n"
printf " -r --rank Search by rank\n"
printf " -t --recent Search by recency\n"
printf " -x --delete Removes the current directory from $Z_DATA\n"
printf " -h --help Print this help\n\n"
end
function __z_legacy_escape_regex
# taken from escape_string_pcre2 in fish
# used to provide compatibility with fish 2
for c in (string split -- '' $argv)
if contains $c (string split '' '.^$*+()?[{}\\|-]')
printf \\
end
printf '%s' $c
end
end
set -l options h/help c/clean e/echo l/list p/purge r/rank t/recent d/directory x/delete
argparse $options -- $argv
if set -q _flag_help
__print_help
return 0
else if set -q _flag_clean
__z_clean
printf "%s cleaned!\n" $Z_DATA
return 0
else if set -q _flag_purge
echo >$Z_DATA
printf "%s purged!\n" $Z_DATA
return 0
else if set -q _flag_delete
sed -i -e "\:^$PWD|.*:d" $Z_DATA
return 0
end
set -l typ
if set -q _flag_rank
set typ rank
else if set -q _flag_recent
set typ recent
end
set -l z_script '
function frecent(rank, time) {
dx = t-time
if( dx < 3600 ) return rank*4
if( dx < 86400 ) return rank*2
if( dx < 604800 ) return rank/2
return rank/4
}
function output(matches, best_match, common) {
# list or return the desired directory
if( list ) {
cmd = "sort -nr"
for( x in matches ) {
if( matches[x] ) {
printf "%-10s %s\n", matches[x], x | cmd
}
}
} else {
if( common ) best_match = common
print best_match
}
}
function common(matches) {
# find the common root of a list of matches, if it exists
for( x in matches ) {
if( matches[x] && (!short || length(x) < length(short)) ) {
short = x
}
}
if( short == "/" ) return
for( x in matches ) if( matches[x] && index(x, short) != 1 ) {
return
}
return short
}
BEGIN {
hi_rank = ihi_rank = -9999999999
}
{
if( typ == "rank" ) {
rank = $2
} else if( typ == "recent" ) {
rank = $3 - t
} else rank = frecent($2, $3)
if( $1 ~ q ) {
matches[$1] = rank
} else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
if( matches[$1] && matches[$1] > hi_rank ) {
best_match = $1
hi_rank = matches[$1]
} else if( imatches[$1] && imatches[$1] > ihi_rank ) {
ibest_match = $1
ihi_rank = imatches[$1]
}
}
END {
# prefer case sensitive
if( best_match ) {
output(matches, best_match, common(matches))
} else if( ibest_match ) {
output(imatches, ibest_match, common(imatches))
}
}
'
set -l qs
for arg in $argv
set -l escaped $arg
if string escape --style=regex '' >/dev/null 2>&1 # use builtin escape if available
set escaped (string escape --style=regex -- $escaped)
else
set escaped (__z_legacy_escape_regex $escaped)
end
# Need to escape twice, see https://www.math.utah.edu/docs/info/gawk_5.html#SEC32
set escaped (string replace --all -- \\ \\\\ $escaped)
set qs $qs $escaped
end
set -l q (string join -- '.*' $qs)
if set -q _flag_list
# Handle list separately as it can print common path information to stderr
# which cannot be captured from a subcommand.
command awk -v t=(date +%s) -v list="list" -v typ="$typ" -v q="$q" -F "|" $z_script "$Z_DATA"
return
end
set target (command awk -v t=(date +%s) -v typ="$typ" -v q="$q" -F "|" $z_script "$Z_DATA")
if test "$status" -gt 0
return
end
if test -z "$target"
printf "'%s' did not match any results\n" "$argv"
return 1
end
if set -q _flag_echo
printf "%s\n" "$target"
else if set -q _flag_directory
if test -n "$ZO_METHOD"
type -q "$ZO_METHOD"; and "$ZO_METHOD" "$target"; and return $status
echo "Cannot open with ZO_METHOD set to $ZO_METHOD"; and return 1
else if test "$OS" = Windows_NT
# Be careful, in msys2, explorer always return 1
type -q explorer; and explorer "$target"
return 0
echo "Cannot open file explorer"
return 1
else
type -q xdg-open; and xdg-open "$target"; and return $status
type -q open; and open "$target"; and return $status
echo "Not sure how to open file manager"; and return 1
end
else
pushd "$target"
end
end

View File

@@ -0,0 +1,49 @@
function __z_add -d "Add PATH to .z file"
test -n "$fish_private_mode"; and return 0
for i in $Z_EXCLUDE
if string match -r $i $PWD >/dev/null
return 0 #Path excluded
end
end
set -l tmpfile (mktemp $Z_DATA.XXXXXX)
if test -f $tmpfile
set -l path (string replace --all \\ \\\\ $PWD)
command awk -v path=$path -v now=(date +%s) -F "|" '
BEGIN {
rank[path] = 1
time[path] = now
}
$2 >= 1 {
if( $1 == path ) {
rank[$1] = $2 + 1
time[$1] = now
}
else {
rank[$1] = $2
time[$1] = $3
}
count += $2
}
END {
if( count > 1000 ) {
for( i in rank ) print i "|" 0.9*rank[i] "|" time[i] # aging
}
else for( i in rank ) print i "|" rank[i] "|" time[i]
}
' $Z_DATA 2>/dev/null >$tmpfile
if test ! -z "$Z_OWNER"
chown $Z_OWNER:(id -ng $Z_OWNER) $tmpfile
end
#
# Don't use redirection here as it can lead to a race condition where $Z_DATA is clobbered.
# Note: There is a still a possible race condition where an old version of $Z_DATA is
# read by one instance of Fish before another instance of Fish writes its copy.
#
command mv $tmpfile $Z_DATA
or command rm $tmpfile
end
end

View File

@@ -0,0 +1,11 @@
function __z_clean -d "Clean up .z file to remove paths no longer valid"
set -l tmpfile (mktemp $Z_DATA.XXXXXX)
if test -f $tmpfile
while read line
set -l path (string split '|' $line)[1]
test -d $path; and echo $line
end <$Z_DATA >$tmpfile
command mv -f $tmpfile $Z_DATA
end
end

View File

@@ -0,0 +1,13 @@
function __z_complete -d "add completions"
complete -c $Z_CMD -a "(__z -l | string replace -r '^\\S*\\s*' '')" -f -k
complete -c $ZO_CMD -a "(__z -l | string replace -r '^\\S*\\s*' '')" -f -k
complete -c $Z_CMD -s c -l clean -d "Cleans out $Z_DATA"
complete -c $Z_CMD -s e -l echo -d "Prints best match, no cd"
complete -c $Z_CMD -s l -l list -d "List matches, no cd"
complete -c $Z_CMD -s p -l purge -d "Purges $Z_DATA"
complete -c $Z_CMD -s r -l rank -d "Searches by rank, cd"
complete -c $Z_CMD -s t -l recent -d "Searches by recency, cd"
complete -c $Z_CMD -s h -l help -d "Print help"
complete -c $Z_CMD -s x -l delete -d "Removes the current directory from $Z_DATA"
end

View File

@@ -0,0 +1,20 @@
function _nvm_index_update
test ! -d $nvm_data && command mkdir -p $nvm_data
set --local index $nvm_data/.index
if not command curl -q --location --silent $nvm_mirror/index.tab >$index.temp
command rm -f $index.temp
echo "nvm: Can't update index, host unavailable: \"$nvm_mirror\"" >&2
return 1
end
command awk -v OFS=\t '
/v0.9.12/ { exit } # Unsupported
NR > 1 {
print $1 (NR == 2 ? " latest" : $10 != "-" ? " lts/" tolower($10) : "")
}
' $index.temp >$index
command rm -f $index.temp
end

View File

@@ -0,0 +1,14 @@
function _nvm_list
set --local versions $nvm_data/*
set --query versions[1] &&
string match --entire --regex -- (
string replace --all -- $nvm_data/ "" $versions |
string match --regex -- "v\d.+" |
string escape --style=regex |
string join "|"
) <$nvm_data/.index
command --all node |
string match --quiet --invert --regex -- "^$nvm_data" && echo system
end

View File

@@ -0,0 +1,4 @@
function _nvm_version_activate --argument-names ver
set --global --export nvm_current_version $ver
set --prepend PATH $nvm_data/$ver/bin
end

View File

@@ -0,0 +1,5 @@
function _nvm_version_deactivate --argument-names ver
test "$nvm_current_version" = "$ver" && set --erase nvm_current_version
set --local index (contains --index -- $nvm_data/$ver/bin $PATH) &&
set --erase PATH[$index]
end

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,77 @@
# 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*' 'mingw*_nt*' 'msys_nt*'
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\n000000 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\n000000 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 linuxmint
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 opensuse-microos
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 void
printf %s\n  FFFFFF 478061 # from https://alpha.de.repo.voidlinux.org/logos/void.svg
case '*'
return 1
end
end

View File

@@ -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

View File

@@ -0,0 +1,7 @@
function _tide_fish_colorize
if command -q fish_indent
echo -ns "$argv" | fish_indent --ansi
else
echo -ns "$argv"
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,12 @@
function _tide_item_cmd_duration
test $CMD_DURATION -gt $tide_cmd_duration_threshold && t=(
math -s0 "$CMD_DURATION/3600000" # Hours
math -s0 "$CMD_DURATION/60000"%60 # Minutes
math -s$tide_cmd_duration_decimals "$CMD_DURATION/1000"%60) if test $t[1] != 0
_tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[1]h $t[2]m $t[3]s"
else if test $t[2] != 0
_tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[2]m $t[3]s"
else
_tide_print_item cmd_duration $tide_cmd_duration_icon' ' "$t[3]s"
end
end

View File

@@ -0,0 +1,14 @@
function _tide_item_context
if set -q SSH_TTY
set -fx tide_context_color $tide_context_color_ssh
else if test "$EUID" = 0
set -fx tide_context_color $tide_context_color_root
else if test "$tide_context_always_display" = true
set -fx tide_context_color $tide_context_color_default
else
return
end
string match -qr "^(?<h>(\.?[^\.]*){0,$tide_context_hostname_parts})" @$hostname
_tide_print_item context $USER$h
end

View File

@@ -0,0 +1,6 @@
function _tide_item_crystal
if path is $_tide_parent_dirs/shard.yml
crystal --version | string match -qr "(?<v>[\d.]+)"
_tide_print_item crystal $tide_crystal_icon' ' $v
end
end

View File

@@ -0,0 +1,7 @@
function _tide_item_direnv
set -q DIRENV_DIR || return
direnv status | string match -q 'Found RC allowed false' &&
set -lx tide_direnv_color $tide_direnv_color_denied &&
set -lx tide_direnv_bg_color $tide_direnv_bg_color_denied
_tide_print_item direnv $tide_direnv_icon
end

View File

@@ -0,0 +1,4 @@
function _tide_item_distrobox
test -e /etc/profile.d/distrobox_profile.sh && test -e /run/.containerenv &&
_tide_print_item distrobox $tide_distrobox_icon' ' (string match -rg 'name="(.*)"' </run/.containerenv)
end

View File

@@ -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

View File

@@ -0,0 +1,4 @@
function _tide_item_elixir
path is $_tide_parent_dirs/mix.exs &&
_tide_print_item elixir $tide_elixir_icon' ' (elixir --short-version)
end

View File

@@ -0,0 +1,8 @@
function _tide_item_gcloud
set -q CLOUDSDK_CONFIG || set -l CLOUDSDK_CONFIG ~/.config/gcloud
path is $CLOUDSDK_CONFIG/active_config &&
read -l config <$CLOUDSDK_CONFIG/active_config &&
path is $CLOUDSDK_CONFIG/configurations/config_$config &&
string match -qr '^\s*project\s*=\s*(?<project>.*)' <$CLOUDSDK_CONFIG/configurations/config_$config &&
_tide_print_item gcloud $tide_gcloud_icon' ' $project
end

View File

@@ -0,0 +1,72 @@
function _tide_item_git
if git branch --show-current 2>/dev/null | string shorten -"$tide_git_truncation_strategy"m$tide_git_truncation_length | 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 shorten -"$tide_git_truncation_strategy"m$tide_git_truncation_length | 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
# Turn ANY into ALL, via double negation
if not path is -v $gdir/rebase-merge/{msgnum,end}
read -f step <$gdir/rebase-merge/msgnum
read -f total_steps <$gdir/rebase-merge/end
end
test -f $gdir/rebase-merge/interactive && set -f operation rebase-i || set -f operation rebase-m
else if test -d $gdir/rebase-apply
if not path is -v $gdir/rebase-apply/{next,last}
read -f step <$gdir/rebase-apply/next
read -f total_steps <$gdir/rebase-apply/last
end
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
set -l 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

View File

@@ -0,0 +1,6 @@
function _tide_item_go
if path is $_tide_parent_dirs/go.mod
go version | string match -qr "(?<v>[\d.]+)"
_tide_print_item go $tide_go_icon' ' $v
end
end

View File

@@ -0,0 +1,6 @@
function _tide_item_java
if path is $_tide_parent_dirs/pom.xml
java -version &| string match -qr "(?<v>[\d.]+)"
_tide_print_item java $tide_java_icon' ' $v
end
end

View File

@@ -0,0 +1,7 @@
function _tide_item_jobs
set -q _tide_jobs && if test $_tide_jobs -ge $tide_jobs_number_threshold
_tide_print_item jobs $tide_jobs_icon' ' $_tide_jobs
else
_tide_print_item jobs $tide_jobs_icon
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,6 @@
function _tide_item_node
if path is $_tide_parent_dirs/package.json
node --version | string match -qr "v(?<v>.*)"
_tide_print_item node $tide_node_icon' ' $v
end
end

View File

@@ -0,0 +1,3 @@
function _tide_item_os
_tide_print_item os $tide_os_icon
end

View File

@@ -0,0 +1,6 @@
function _tide_item_php
if path is $_tide_parent_dirs/composer.json
php --version | string match -qr "(?<v>[\d.]+)"
_tide_print_item php $tide_php_icon' ' $v
end
end

View File

@@ -0,0 +1,3 @@
function _tide_item_private_mode
set -q _tide_private_mode && _tide_print_item private_mode $tide_private_mode_icon
end

View File

@@ -0,0 +1,19 @@
function _tide_item_pulumi
if path filter $_tide_parent_dirs/Pulumi.yaml | read -l yaml_path
if command -q sha1sum
echo -n "$yaml_path" | sha1sum | string match -qr "(?<path_hash>.{40})"
else if command -q shasum
echo -n "$yaml_path" | shasum | string match -qr "(?<path_hash>.{40})"
else
return
end
string match -qr 'name: *(?<project_name>.*)' <$yaml_path
set -l workspace_file "$HOME/.pulumi/workspaces/$project_name-$path_hash-workspace.json"
if test -e $workspace_file
string match -qr '"stack": *"(?<stack>.*)"' <$workspace_file
_tide_print_item pulumi $tide_pulumi_icon' ' $stack
end
end
end

View File

@@ -0,0 +1,27 @@
function _tide_item_python
if test -n "$VIRTUAL_ENV"
if command -q python3
python3 --version | string match -qr "(?<v>[\d.]+)"
else
python --version | string match -qr "(?<v>[\d.]+)"
end
string match -qr "^.*/(?<dir>.*)/(?<base>.*)" $VIRTUAL_ENV
# 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.
if test "$dir" = virtualenvs
string match -qr "(?<base>.*)-.*" $base
_tide_print_item python $tide_python_icon' ' "$v ($base)"
else if contains -- "$base" virtualenv venv .venv env # avoid generic names
_tide_print_item python $tide_python_icon' ' "$v ($dir)"
else
_tide_print_item python $tide_python_icon' ' "$v ($base)"
end
else if path is .python-version Pipfile __init__.py pyproject.toml requirements.txt setup.py
if command -q python3
python3 --version | string match -qr "(?<v>[\d.]+)"
else
python --version | string match -qr "(?<v>[\d.]+)"
end
_tide_print_item python $tide_python_icon' ' $v
end
end

View File

@@ -0,0 +1,6 @@
function _tide_item_ruby
if path is $_tide_parent_dirs/{*.gemspec,Gemfile,Rakefile,.ruby-version}
ruby --version | string match -qr "(?<v>[\d.]+)"
_tide_print_item ruby $tide_ruby_icon' ' $v
end
end

View File

@@ -0,0 +1,6 @@
function _tide_item_rustc
if path is $_tide_parent_dirs/Cargo.toml
rustc --version | string match -qr "(?<v>[\d.]+)"
_tide_print_item rustc $tide_rustc_icon' ' $v
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,5 @@
function _tide_item_terraform
path is $_tide_parent_dirs/.terraform &&
terraform workspace show | string match -v default | read -l w &&
_tide_print_item terraform $tide_terraform_icon' ' $w
end

View File

@@ -0,0 +1,3 @@
function _tide_item_time
_tide_print_item time (date +$tide_time_format)
end

View File

@@ -0,0 +1,4 @@
function _tide_item_toolbox
test -e /run/.toolboxenv &&
_tide_print_item toolbox $tide_toolbox_icon' ' (string match -rg 'name="(.*)"' </run/.containerenv)
end

View File

@@ -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

View File

@@ -0,0 +1,6 @@
function _tide_item_zig
if path is $_tide_parent_dirs/build.zig
zig version | string match -qr "(?<v>[\d.]+(-dev)?)"
_tide_print_item zig $tide_zig_icon' ' $v
end
end

View File

@@ -0,0 +1,7 @@
function _tide_parent_dirs --on-variable PWD
set -g _tide_parent_dirs (string escape (
for dir in (string split / -- $PWD)
set -la parts $dir
string join / -- $parts
end))
end

View File

@@ -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

View File

@@ -0,0 +1,42 @@
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
string match -qr \"(?<trunc>\..|.)\" \$dir_section
set -l glob \$parent_dir/\$trunc*/
set -e glob[(contains -i \$parent_dir/\$dir_section/ \$glob)] # This is faster than inverse string match
while string match -qr \"^\$parent_dir/\$(string escape --style=regex \$trunc)\" \$glob &&
string match -qr \"(?<trunc>\$(string escape --style=regex \$trunc).)\" \$dir_section
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"

View File

@@ -0,0 +1,25 @@
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 crystal direnv distrobox docker elixir gcloud git go java kubectl nix_shell node php pulumi python ruby rustc terraform toolbox zig
contains $item $tide_left_prompt_items $tide_right_prompt_items || continue
set -l cli_names $item
switch $item
case distrobox # there is no 'distrobox' command inside the container
set cli_names distrobox-export # 'distrobox-export' and 'distrobox-host-exec' are available
case nix_shell
set cli_names nix nix-shell
case python
set cli_names python python3
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

View File

@@ -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@v6"
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

View File

@@ -0,0 +1,156 @@
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
set -l choices (path basename (status dirname)/tide/configure/choices/**.fish | path change-extension '')
argparse auto $choices= -- $argv
for var in (set -l --names | string match -e _flag)
set -x $var $$var
end
if set -q _flag_auto
set -fx _flag_finish 'Overwrite your current tide config'
else 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
set -q _flag_auto && return
command -q clear && clear
set_color -o
string pad --width (math --scale=0 "$fake_columns/2" + (string length $text)/2) $text
set_color normal
set -g _tide_configure_first_option_after_title
end
function _tide_option -a symbol text
set -ga _tide_symbol_list $symbol
set -ga _tide_option_list $text
if not set -q _flag_auto
set -g _tide_configure_first_prompt_after_option
set_color -o
set -e _tide_configure_first_option_after_title || echo
echo "($symbol) $text"
set_color normal
end
end
function _tide_menu -a func
if set -q _flag_auto
set -l flag_var_name _flag_$func
set -g _tide_selected_option $$flag_var_name
if test -z "$_tide_selected_option"
echo "Missing input for choice '$func'"
_tide_exit_configure
else if not contains $_tide_selected_option $_tide_option_list
echo "Invalid input '$_tide_selected_option' for choice '$func'"
_tide_exit_configure
else
set -e _tide_symbol_list
set -e _tide_option_list
end
return
end
argparse no-restart -- $argv # Add no-restart option for first menu
echo
if not set -q _flag_no_restart
set -f r r
echo '(r) Restart from the beginning'
end
echo '(q) Quit and do nothing'\n
while read --nchars 1 --prompt-str \
"$(set_color -o)Choice [$(string join '/' $_tide_symbol_list $r q)] $(set_color normal)" input
switch $input
case r
set -q _flag_no_restart && continue
set -e _tide_symbol_list
set -e _tide_option_list
_next_choice all/style
break
case q
_tide_exit_configure
set -e _tide_symbol_list
set -e _tide_option_list
command -q clear && clear
break
case $_tide_symbol_list
set -g _tide_selected_option $_tide_option_list[(contains -i $input $_tide_symbol_list)]
test "$func" != finish &&
set -a _tide_configure_current_options --$func=(string escape $_tide_selected_option)
set -e _tide_symbol_list
set -e _tide_option_list
break
end
end
end
function _tide_display_prompt
set -q _flag_auto && return
_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"
if set -q _configure_transient
if contains newline $fake_tide_left_prompt_items
string unescape $prompt[3..]
else
_fake_tide_item_character
echo
end
else
if not set -q _tide_configure_first_prompt_after_option
test "$fake_tide_prompt_add_newline_before" = true && echo
end
string unescape $prompt[2..]
end
set -e _tide_configure_first_prompt_after_option
set_color normal
end
function _tide_exit_configure
set -e _tide_selected_option # Skip through all switch and _next_choice
end

View File

@@ -0,0 +1,3 @@
function _tide_sub_reload
source (functions --details fish_prompt)
end

View File

@@ -0,0 +1,46 @@
# @halostatue/fish-macos/functions/app.fish:v7.0.0
function app --description 'Operate on macOS applications'
argparse --stop-nonopt h/help -- $argv
if set --query _flag_help
echo 'Usage: app [options] subcommand [arguments...]
Operates on macOS apps by name.
Subcommands:
bundleid Shows the bundleID for installed matching apps
find Shows installed matching apps
frontmost Shows the frontmost application
icon Saves the icon for matching apps to disk
quit Quits and optionally restarts matching apps
Options:
-h, --help Show this help'
return 0
end
set --function cmd $argv[1]
set --erase argv[1]
switch (string lower -- $cmd)
case bundleid
__macos_app_bundleid $argv
case find
__macos_app_find $argv
case frontmost
__macos_app_frontmost $argv
case icon
__macos_app_icon $argv
case quit
__macos_app_quit $argv
case ''
echo >&2 'app: No command provided.'
app --help >&2
return 1
case '*'
echo >&2 'app: Unknown command.'
app --help >&2
return 1
end
end

View File

@@ -0,0 +1,39 @@
# Copyright (c) 2022 Huang-Huang Bao
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
function bash2env -d "Import environment variables modified by given bash command"
argparse --stop-nonopt h/help i/impure -- $argv
or set argv
function _print_usage
echo 'Usage:' \
(set_color $fish_color_command)'bash2env' \
(set_color $fish_color_normal)'[-i/--impure]' \
(set_color $fish_color_param)"<bash command>"
end
if test -n "$_flag_help"
_print_usage
return
end
if test (count $argv) -eq 0
_print_usage
return 22
end
if test -n "$_flag_impure"
set _flag_impure 1
end
set -l DIR (dirname (status -f))
__FISH_BASH2ENV_IMPURE=$_flag_impure command \
bash $DIR/__bash2env.sh $argv | source
for code in $pipestatus
if test $code != 0
return $code
end
end
end

View File

@@ -0,0 +1,151 @@
# @halostatue/fish-macos/functions/finder.fish:v7.0.0
function __macos_finder_defaults::query
set --query argv[1]
or return 1
set --function value (defaults read com.apple.Finder $argv[1] 2>/dev/null)
or return 1
switch $value
case 1
true
case '*'
false
end
end
function __macos_finder_defaults::set
set --query argv[1]
or return 1
set --query argv[2]
or return 1
defaults write com.apple.Finder $argv[1] -bool $argv[2]
and killall Finder
end
function __macos_finder_pwd::get
set --function window 1
if set --query argv[1]
set window $argv[1]
end
echo 'tell application "Finder"
if ('$window' <= (count Finder windows)) then
get POSIX path of (target of window '$window' as alias)
else
get POSIX path of (desktop as alias)
end if
end tell' | osascript
end
function __macos_finder_pwd::update
argparse --exclusive column,list,icon column list icon -- $argv
or return 1
set --function window_count 1
set --function view ''
set --function view_type ''
if set --query _flag_column
set view_type column
else if set --query _flag_list
set view_type list
else if set --query _flag_icon
set view_type icon
end
if test $view_type != ''
set view 'set the current view of the front Finder window to '$view_type' view'
end
set --query argv[1]; and set window_count $argv[1]
echo 'tell application "Finder"
if ('$window_count' <= (count Finder windows)) then
set the target of window '$window_count' to (POSIX file "'$PWD'") as string
else
open (POSIX file "'$PWD'") as string
end if
' $view '
end tell' | osascript >/dev/null
end
# Based on bashfinder: https://github.com/NapoleonWils0n/bashfinder.git
# and my port to zsh.
function finder --description 'Manipulate the finder with the current shell'
argparse --stop-nonopt h/help -- $argv
if set --query _flag_help
echo 'Usage: finder [options] subcommand [arguments...]
Interacts with the Finder. If a window number parameter is accepted in a
command, the first (front-most) window is number 1. If a lower window is
specified, or no window is specified, that window becomes the first window.
Subcommands:
cd Changes to the path of the Finder window
clean Removes .DS_Store files
column Changes the Finder window to PWD using column view
desktop-icons Shows or hides the desktop icons
hidden Shows or hides files that are normally hidden from the Finder
icon Changes the Finder window to PWD using icon view
list Changes the Finder window to PWD using list view
pushd Changes to the path of the Finder window with pushd
pwd Prints the path of the Finder window
quarantine Manages quarantine events
selected Print the selected files on the command-line
track Makes the first Finder window track with the shell PWD
untrack Disables Finder directory tracking
update Updates the Finder window to PWD
Options:
-h, --help Show this help'
return 0
end
set --function verb (string lower -- $argv[1])
set --erase argv[1]
switch $verb
case cd
__macos_finder_cd $argv
case clean
__macos_finder_clean $argv
case desktop-icons
__macos_finder_desktop_icons $argv
case hidden
__macos_finder_hidden $argv
case update
__macos_finder_update $argv
case list
__macos_finder_list $argv
case icon
__macos_finder_icon $argv
case column
__macos_finder_column $argv
case pwd
__macos_finder_pwd::get $argv[1]
case pushd
__macos_finder_pushd $argv
case quarantine
__macos_finder_quarantine $argv
case selected
__macos_finder_selected
case track
__macos_finder_track
case untrack
__macos_finder_untrack
case ''
echo >&2 'finder: No command provided.'
finder --help >&2
return 1
case '*'
echo $verb
echo >&2 'finder: Unknown command.'
finder --help >&2
return 1
end
end

View File

@@ -0,0 +1 @@
# Disable default vi prompt

View File

@@ -0,0 +1,171 @@
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
_tide_parent_dirs
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)
if test "$tide_prompt_transient_enabled" = true
eval "
function fish_prompt
_tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
jobs -q && jobs -p | count | read -lx _tide_jobs
$fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") 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
if not set -q _tide_transient
math \$COLUMNS-(string length -V \"\$$prompt_var[1][1]\$$prompt_var[1][3]\")+$column_offset | read -lx dist_btwn_sides
echo -n $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 \"\$$prompt_var[1][3]$top_right_frame\"
end
echo -n \e\[0J\"$bot_left_frame\$$prompt_var[1][2]$color_normal \"
end
function fish_right_prompt
set -e _tide_transient || string unescape \"\$$prompt_var[1][4]$bot_right_frame$color_normal\"
end"
else
eval "
function fish_prompt
_tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
jobs -q && jobs -p | count | read -lx _tide_jobs
$fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") 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"
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"
if test "$tide_prompt_transient_enabled" = true
eval "
function fish_prompt
set -lx _tide_status \$status
_tide_pipestatus=\$pipestatus if not set -e _tide_repaint
jobs -q && jobs -p | count | read -lx _tide_jobs
$fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") 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
if set -q _tide_transient
echo -n \e\[0J
add_prefix= _tide_item_character
echo -n '$color_normal '
else
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
end
function fish_right_prompt
set -e _tide_transient || string unescape \"\$$prompt_var[1][2]$color_normal\"
end"
else
eval "
function fish_prompt
_tide_status=\$status _tide_pipestatus=\$pipestatus if not set -e _tide_repaint
jobs -q && jobs -p | count | read -lx _tide_jobs
$fish_path -c \"set _tide_pipestatus \$_tide_pipestatus
set _tide_parent_dirs \$_tide_parent_dirs
PATH=\$(string escape \"\$PATH\") 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
end
eval "function _tide_on_fish_exit --on-event fish_exit
set -e $prompt_var
end"
if test "$tide_prompt_transient_enabled" = true
function _tide_enter_transient
# If the commandline will be executed, or is empty
if commandline --is-valid || test -z "$(commandline)"
# Pager open usually means selecting, not running
# Can be untrue, but it's better than the alternative
if not commandline --paging-mode
set -g _tide_transient
set -g _tide_repaint
commandline -f repaint
end
end
commandline -f execute
end
bind \r _tide_enter_transient
bind \n _tide_enter_transient
bind -M insert \r _tide_enter_transient
bind -M insert \n _tide_enter_transient
end

View File

@@ -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.5
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 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
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 | 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
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 command curl -q --silent -L \$url | command 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 -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

View File

@@ -0,0 +1,14 @@
# @halostatue/fish-macos/functions/has_app.fish:v7.0.0
function has_app --description 'Returns true if the named application exists'
# Suppress these flags being passed to __macos_app_find
argparse a/all q/quiet -- $argv
or return 1
if not set --query argv[1]
echo >&2 Usage: (status function) APPNAME...
return 1
end
__macos_app_find --exact --quiet $argv
end

View File

@@ -0,0 +1,23 @@
# @halostatue/fish-brew/functions/has_cask.fish:v3.2.1
function has_cask --description 'Test if the named cask or casks are installed'
command --query brew
or return 1
argparse --min-args 1 A/all -- $argv
or return 1
set --function found 0
for cask in $argv
if test -d (brew --prefix)/Caskroom/$cask
set found (math $found + 1)
end
end
if set --query _flag_all
test $found -eq (count $argv)
else
test $found -ne 0
end
end

View File

@@ -0,0 +1,23 @@
# @halostatue/fish-brew/functions/has_keg.fish:v3.2.1
function has_keg --description 'Test if the named keg or kegs are installed'
command --query brew
or return 1
argparse --min-args 1 A/all -- $argv
or return 1
set --function found 0
for keg in $argv
if test -d (brew --prefix)/Cellar/$keg
set found (math $found + 1)
end
end
if set --query _flag_all
test $found -eq (count $argv)
else
test $found -ne 0
end
end

Some files were not shown because too many files have changed in this diff Show More