fpf-cli 1.6.8 → 1.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/fpf +56 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,6 +38,8 @@ On every OS, default auto mode now includes all supported package managers that
|
|
|
38
38
|
|
|
39
39
|
For no-query startup (`fpf`), each manager uses a lighter default query and per-manager result cap to keep startup responsive.
|
|
40
40
|
|
|
41
|
+
Live reload is enabled by default for single-manager mode (`--manager`), and disabled by default in all-manager mode to avoid lag/flicker while navigating.
|
|
42
|
+
|
|
41
43
|
## Supported Managers
|
|
42
44
|
|
|
43
45
|
- Linux: `apt`, `dnf`, `pacman`, `zypper`, `emerge`
|
|
@@ -86,3 +88,5 @@ Installed packages are marked with `*` in the result list.
|
|
|
86
88
|
- Requires: `bash` + `fzf`
|
|
87
89
|
- If `fzf` is missing, `fpf` auto-installs it using a compatible detected manager.
|
|
88
90
|
- Root managers (`apt`, `dnf`, `pacman`, `zypper`, `emerge`, `snap`) use `sudo` when needed.
|
|
91
|
+
- `FPF_DYNAMIC_RELOAD`: `single` (default), `always`, or `never`
|
|
92
|
+
- `FPF_DISABLE_INSTALLED_CACHE=1` disables installed-package marker cache
|
package/fpf
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
set -euo pipefail
|
|
4
4
|
|
|
5
5
|
SCRIPT_NAME="fpf"
|
|
6
|
-
SCRIPT_VERSION="1.6.
|
|
6
|
+
SCRIPT_VERSION="1.6.9"
|
|
7
7
|
TMP_ROOT="${TMPDIR:-/tmp}/fpf"
|
|
8
8
|
SESSION_TMP_ROOT=""
|
|
9
9
|
HELP_FILE=""
|
|
@@ -608,6 +608,23 @@ join_query() {
|
|
|
608
608
|
printf "%s" "${query}"
|
|
609
609
|
}
|
|
610
610
|
|
|
611
|
+
dynamic_reload_enabled() {
|
|
612
|
+
local manager_count="$1"
|
|
613
|
+
local mode="${FPF_DYNAMIC_RELOAD:-single}"
|
|
614
|
+
|
|
615
|
+
case "${mode}" in
|
|
616
|
+
always|on|1|true|yes)
|
|
617
|
+
return 0
|
|
618
|
+
;;
|
|
619
|
+
never|off|0|false|no)
|
|
620
|
+
return 1
|
|
621
|
+
;;
|
|
622
|
+
single|auto|*)
|
|
623
|
+
[[ "${manager_count}" -eq 1 ]]
|
|
624
|
+
;;
|
|
625
|
+
esac
|
|
626
|
+
}
|
|
627
|
+
|
|
611
628
|
query_is_single_token() {
|
|
612
629
|
local query="$1"
|
|
613
630
|
[[ -n "${query}" && "${query}" != *[[:space:]]* ]]
|
|
@@ -948,14 +965,45 @@ manager_installed_names() {
|
|
|
948
965
|
manager_installed_entries "${manager}" | awk -F'\t' 'NF > 0 { print $1 }'
|
|
949
966
|
}
|
|
950
967
|
|
|
968
|
+
manager_installed_names_cached() {
|
|
969
|
+
local manager="$1"
|
|
970
|
+
local output_file="$2"
|
|
971
|
+
local cache_enabled="${FPF_DISABLE_INSTALLED_CACHE:-0}"
|
|
972
|
+
local cache_dir="${TMP_ROOT}/cache"
|
|
973
|
+
local cache_file="${cache_dir}/installed.${manager}"
|
|
974
|
+
|
|
975
|
+
if [[ "${cache_enabled}" != "1" && -s "${cache_file}" ]]; then
|
|
976
|
+
cp "${cache_file}" "${output_file}"
|
|
977
|
+
return
|
|
978
|
+
fi
|
|
979
|
+
|
|
980
|
+
manager_installed_names "${manager}" >"${output_file}" 2>/dev/null || true
|
|
981
|
+
|
|
982
|
+
if [[ "${cache_enabled}" != "1" && -s "${output_file}" ]]; then
|
|
983
|
+
mkdir -p "${cache_dir}"
|
|
984
|
+
cp "${output_file}" "${cache_file}"
|
|
985
|
+
fi
|
|
986
|
+
}
|
|
987
|
+
|
|
951
988
|
mark_installed_packages() {
|
|
952
989
|
local manager="$1"
|
|
953
990
|
local source_file="$2"
|
|
954
991
|
local output_file="$3"
|
|
955
992
|
local installed_file
|
|
956
993
|
|
|
994
|
+
if [[ "${FPF_SKIP_INSTALLED_MARKERS:-0}" == "1" ]]; then
|
|
995
|
+
awk -F'\t' '
|
|
996
|
+
{
|
|
997
|
+
desc = $2
|
|
998
|
+
if (desc == "") desc = "-"
|
|
999
|
+
print $1 "\t " desc
|
|
1000
|
+
}
|
|
1001
|
+
' "${source_file}" >"${output_file}"
|
|
1002
|
+
return
|
|
1003
|
+
fi
|
|
1004
|
+
|
|
957
1005
|
installed_file="$(mktemp "${SESSION_TMP_ROOT}/installed.XXXXXX")"
|
|
958
|
-
|
|
1006
|
+
manager_installed_names_cached "${manager}" "${installed_file}"
|
|
959
1007
|
|
|
960
1008
|
awk -F'\t' '
|
|
961
1009
|
FILENAME == ARGV[1] {
|
|
@@ -965,7 +1013,7 @@ mark_installed_packages() {
|
|
|
965
1013
|
next
|
|
966
1014
|
}
|
|
967
1015
|
{
|
|
968
|
-
mark = (installed[$1] ? "
|
|
1016
|
+
mark = (installed[$1] ? "* " : " ")
|
|
969
1017
|
desc = $2
|
|
970
1018
|
if (desc == "") desc = "-"
|
|
971
1019
|
print $1 "\t" mark desc
|
|
@@ -1037,9 +1085,9 @@ build_dynamic_reload_command() {
|
|
|
1037
1085
|
fi
|
|
1038
1086
|
|
|
1039
1087
|
if [[ -n "${manager_override}" ]]; then
|
|
1040
|
-
printf "%q --feed-search --manager %q -- {q} 2>/dev/null || true" "${script_path}" "${manager_override}"
|
|
1088
|
+
printf "FPF_SKIP_INSTALLED_MARKERS=1 %q --feed-search --manager %q -- {q} 2>/dev/null || true" "${script_path}" "${manager_override}"
|
|
1041
1089
|
else
|
|
1042
|
-
printf "%q --feed-search -- {q} 2>/dev/null || true" "${script_path}"
|
|
1090
|
+
printf "FPF_SKIP_INSTALLED_MARKERS=1 %q --feed-search -- {q} 2>/dev/null || true" "${script_path}"
|
|
1043
1091
|
fi
|
|
1044
1092
|
}
|
|
1045
1093
|
|
|
@@ -1287,7 +1335,6 @@ run_fuzzy_selector() {
|
|
|
1287
1335
|
--marker='>>' \
|
|
1288
1336
|
--header="${header_line}" \
|
|
1289
1337
|
--info=inline-right \
|
|
1290
|
-
--ansi \
|
|
1291
1338
|
--margin="2%,1%,2%,1%" \
|
|
1292
1339
|
--cycle \
|
|
1293
1340
|
--tiebreak=begin,chunk,length \
|
|
@@ -1465,7 +1512,9 @@ main() {
|
|
|
1465
1512
|
|
|
1466
1513
|
local reload_cmd=""
|
|
1467
1514
|
if [[ "${ACTION}" == "search" && -z "${query}" ]]; then
|
|
1468
|
-
|
|
1515
|
+
if dynamic_reload_enabled "${#managers[@]}"; then
|
|
1516
|
+
reload_cmd="$(build_dynamic_reload_command "${MANAGER_OVERRIDE}")"
|
|
1517
|
+
fi
|
|
1469
1518
|
fi
|
|
1470
1519
|
|
|
1471
1520
|
local selected
|