mirror of
https://github.com/jorgebucaran/fisher
synced 2024-11-03 15:40:27 +00:00
280 lines
7.5 KiB
Fish
280 lines
7.5 KiB
Fish
function fisher_search -d "Search plugin index"
|
|
set -l fields
|
|
set -l query
|
|
set -l index
|
|
set -l join "||"
|
|
set -l format
|
|
set -l option
|
|
set -l stdout /dev/stdout
|
|
set -l color (set_color $fish_color_match)
|
|
set -l color_normal (set_color normal)
|
|
|
|
getopts $argv | while read -l 1 2 3
|
|
switch "$1"
|
|
case _
|
|
switch "$2"
|
|
case \*/\*
|
|
set -l url (__fisher_plugin_validate $2)
|
|
|
|
if test ! -z "$url"
|
|
set 2 $url
|
|
end
|
|
|
|
set query $query "url==\"$2\"" $join
|
|
|
|
case \*
|
|
set query $query "name==\"$2\"" $join
|
|
end
|
|
|
|
case name url info author
|
|
if test -z "$2"
|
|
set fields $fields $1 ,
|
|
else
|
|
switch "$2"
|
|
case ~\*
|
|
set query $query "$1$3$2" $join
|
|
|
|
case \*
|
|
if test -z "$3"
|
|
set 3 =
|
|
end
|
|
set query $query "$1$3=\"$2\"" $join
|
|
end
|
|
end
|
|
|
|
case tag{,s}
|
|
if test -z "$2"
|
|
set fields $fields "tags(0)" ,
|
|
else
|
|
set query $query "$3 tags(\"$2\")" $join
|
|
end
|
|
|
|
case long longline
|
|
set format long
|
|
|
|
case full
|
|
set format full
|
|
|
|
case a and
|
|
set join "&&"
|
|
|
|
case o or
|
|
set join "||"
|
|
|
|
case C no-color
|
|
set color
|
|
set color_normal
|
|
set option no-color
|
|
|
|
case query
|
|
set query $query $2
|
|
|
|
case index
|
|
set index $2
|
|
|
|
case q quiet
|
|
set stdout /dev/null
|
|
|
|
case h
|
|
printf "Usage: fisher search [<plugins>] [--long] [--full] [--no-color]\n"
|
|
printf " [--quiet] [--help]\n\n"
|
|
|
|
printf " --long Display results in long format\n"
|
|
printf " --full Display results in full format\n"
|
|
printf " -C --no-color Turn off color display\n"
|
|
printf " -q --quiet Enable quiet mode\n"
|
|
printf " -h --help Show usage help\n"
|
|
return
|
|
|
|
case \*
|
|
printf "fisher: '%s' is not a valid option.\n" $1 > /dev/stderr
|
|
fisher_search -h > /dev/stderr
|
|
return 1
|
|
end
|
|
end
|
|
|
|
if test -z "$index"
|
|
set index $fisher_cache/.index
|
|
|
|
set fisher_last_update (math (date +%s) - "0$fisher_last_update")
|
|
|
|
if not set -q fisher_update_interval
|
|
set -g fisher_update_interval 50
|
|
end
|
|
|
|
if test $fisher_last_update -gt $fisher_update_interval -o ! -f $index
|
|
debug "Update index start"
|
|
|
|
if spin "__fisher_index_update" --error=/dev/null -f " $color@$color_normal\r" > /dev/null
|
|
debug "Update index ok"
|
|
__fisher_complete_reset
|
|
else
|
|
debug "Update index fail"
|
|
end
|
|
end
|
|
|
|
set -U fisher_last_update (date +%s)
|
|
end
|
|
|
|
set -e fields[-1]
|
|
set -e query[-1]
|
|
|
|
set -l options -v OFS=';' -v compact=1
|
|
|
|
if test -z "$fields[1]"
|
|
set options -v OFS='\n'
|
|
|
|
if test -z "$format"
|
|
if test -z "$fisher_search_format"
|
|
set format default
|
|
else
|
|
set format "$fisher_search_format"
|
|
end
|
|
end
|
|
|
|
set -l color_name (set_color $fish_color_command -o)
|
|
set -l color_url (set_color $fish_color_quote -u)
|
|
set -l color_tag (set_color $fish_color_quote)
|
|
set -l color_weak (set_color white -o)
|
|
set -l color_author (set_color -u)
|
|
set -l color_normal (set_color $fish_color_normal)
|
|
|
|
if contains -- no-color $option
|
|
set color_name
|
|
set color_url
|
|
set color_tag
|
|
set color_weak
|
|
set color_author
|
|
set color_normal
|
|
end
|
|
|
|
set legend
|
|
set local (fisher_list | awk '
|
|
!/^@/ {
|
|
if (append) {
|
|
printf("|")
|
|
}
|
|
|
|
printf("%s", substr($0, 3))
|
|
|
|
append++
|
|
}
|
|
'
|
|
)
|
|
|
|
if test ! -z "$local"
|
|
set legend " "
|
|
end
|
|
|
|
set fields '
|
|
legend="*"
|
|
len = length($3)
|
|
|
|
if ($1 == "'"$fisher_prompt"'") {
|
|
legend = ">"
|
|
}
|
|
|
|
if ("'"$local"'" && $1~/'"$local"'/) {
|
|
'
|
|
|
|
switch "$format"
|
|
case default
|
|
set fields $fields '
|
|
printf("%s '"$color_weak"'%-22s'"$color_normal"' %s\n", legend, $1, normalize($3, len + 28))
|
|
} else {
|
|
printf("'"$legend$color_name"'%-22s'"$color_normal"' %s\n", $1, normalize($3, len + 28))
|
|
}
|
|
'
|
|
set options $options -v compact=1
|
|
|
|
case long
|
|
set fields $fields '
|
|
printf("%-40s %s '"$color_weak"'%-22s'"$color_normal"' %s\n", humanize_url($2), legend, $1, normalize($3, len + 70))
|
|
} else {
|
|
printf("'"$color_tag"'%-40s'"$color_normal"' '"$legend$color_name"'%-22s'"$color_normal"' %s\n", humanize_url($2), $1, normalize($3, len + 70))
|
|
}
|
|
'
|
|
set options $options -v compact=1
|
|
|
|
case full
|
|
set fields $fields '
|
|
printf("'"$color_weak"'%s %s by %s\n%s'"$color_normal"'\n%s\n", legend, $1, $5, $3, humanize_url($2))
|
|
} else {
|
|
printf("'"$color_name"'%s'"$color_normal"' by '"$color_author"'%s'"$color_normal"'\n%s\n'"$color_url"'%s'"$color_normal"'\n", $1, $5, $3, humanize_url($2))
|
|
}
|
|
'
|
|
end
|
|
else
|
|
if test "$fields" = author
|
|
set options $options -v unique=1
|
|
end
|
|
|
|
set fields print $fields
|
|
end
|
|
|
|
set -l cols (tput cols)
|
|
|
|
awk -v FS='\n' -v RS='' $options "
|
|
|
|
function normalize(s, len) {
|
|
x = len - $cols
|
|
if (len >= $cols) {
|
|
return substr(s, 1, length(s) - x)\"...\"
|
|
} else {
|
|
return s
|
|
}
|
|
}
|
|
|
|
function humanize_url(url) {
|
|
gsub(\"(https?://)?(www.)?|/\$\", \"\", url)
|
|
return url
|
|
}
|
|
|
|
function tags(tag, _list) {
|
|
if (!tag) {
|
|
for (i in tag_list) {
|
|
if (!seen[tag_list[i]]++) {
|
|
_list = tag_list[i] \"\n\" _list
|
|
}
|
|
}
|
|
return substr(_list, 1, length(_list) - 1)
|
|
}
|
|
for (i in tag_list) {
|
|
if (tag == tag_list[i]) {
|
|
return 1
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
{
|
|
delete tag_list
|
|
|
|
if (\$4) {
|
|
split(\$4, tag_list, \" \")
|
|
}
|
|
|
|
name = \$1
|
|
url = \$2
|
|
info = \$3
|
|
author = \$5
|
|
}
|
|
|
|
$query {
|
|
if (has_records && !compact) {
|
|
print \"\"
|
|
}
|
|
|
|
if (!unique_author[\$5] || !unique) {
|
|
unique_author[\$5] = 1
|
|
$fields
|
|
}
|
|
|
|
has_records = 1
|
|
}
|
|
|
|
END { exit !has_records }
|
|
|
|
" $index > $stdout ^ /dev/null
|
|
end
|