fpf-cli 1.6.33 → 1.6.35

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.
Files changed (3) hide show
  1. package/README.md +1 -0
  2. package/fpf +144 -44
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -98,6 +98,7 @@ Installed packages are marked with `*` in the result list.
98
98
  - `FPF_DYNAMIC_RELOAD`: `always` (default), `single`, or `never`
99
99
  - Live reload uses `change:reload` by default for reliability (`ctrl-r` uses the same reload command).
100
100
  - Set `FPF_DYNAMIC_RELOAD_TRANSPORT=ipc` to opt into `--listen` + IPC query notifications on supported `fzf` builds.
101
+ - Set `FPF_LOADING_INDICATOR=0` to disable the pre-search loading spinner.
101
102
  - `FPF_RELOAD_MIN_CHARS`: minimum query length before live reload (default `2`)
102
103
  - `FPF_RELOAD_DEBOUNCE`: reload debounce seconds (default `0.12`)
103
104
  - `FPF_DISABLE_INSTALLED_CACHE=1` disables installed-package marker cache
package/fpf CHANGED
@@ -3,13 +3,14 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_NAME="fpf"
6
- SCRIPT_VERSION="1.6.33"
6
+ SCRIPT_VERSION="1.6.35"
7
7
  TMP_ROOT="${TMPDIR:-/tmp}/fpf"
8
8
  SESSION_TMP_ROOT=""
9
9
  HELP_FILE=""
10
10
  KBINDS_FILE=""
11
11
  CACHE_FORMAT_VERSION="1"
12
12
  CACHE_ROOT=""
13
+ LOADING_INDICATOR_PID=""
13
14
 
14
15
  ACTION="search"
15
16
  MANAGER_OVERRIDE=""
@@ -27,6 +28,72 @@ log() {
27
28
  printf "%s\n" "$*" >&2
28
29
  }
29
30
 
31
+ loading_indicator_enabled() {
32
+ local indicator_setting=""
33
+
34
+ indicator_setting="$(trim_whitespace "${FPF_LOADING_INDICATOR:-1}")"
35
+ indicator_setting="$(printf "%s" "${indicator_setting}" | tr '[:upper:]' '[:lower:]')"
36
+
37
+ case "${indicator_setting}" in
38
+ 0|false|no|off)
39
+ return 1
40
+ ;;
41
+ esac
42
+
43
+ [[ -t 2 ]]
44
+ }
45
+
46
+ start_loading_indicator() {
47
+ local message="${1:-Loading}"
48
+
49
+ if [[ -n "${LOADING_INDICATOR_PID}" ]]; then
50
+ stop_loading_indicator
51
+ fi
52
+
53
+ loading_indicator_enabled || return 0
54
+
55
+ (
56
+ trap 'exit 0' TERM INT
57
+ local frames='|/-\'
58
+ local frame_index=0
59
+ while true; do
60
+ printf "\r\033[2K%s [%s]" "${message}" "${frames:frame_index:1}" >&2
61
+ frame_index=$(((frame_index + 1) % 4))
62
+ sleep 0.1
63
+ done
64
+ ) &
65
+ LOADING_INDICATOR_PID="$!"
66
+ }
67
+
68
+ stop_loading_indicator() {
69
+ if [[ -z "${LOADING_INDICATOR_PID}" ]]; then
70
+ return 0
71
+ fi
72
+
73
+ kill "${LOADING_INDICATOR_PID}" >/dev/null 2>&1 || true
74
+ wait "${LOADING_INDICATOR_PID}" >/dev/null 2>&1 || true
75
+ LOADING_INDICATOR_PID=""
76
+
77
+ if loading_indicator_enabled; then
78
+ printf "\r\033[2K" >&2
79
+ fi
80
+ }
81
+
82
+ run_with_loading_indicator() {
83
+ local message="$1"
84
+ shift
85
+
86
+ start_loading_indicator "${message}"
87
+ if "$@"; then
88
+ stop_loading_indicator
89
+ return 0
90
+ fi
91
+
92
+ local status="$?"
93
+ stop_loading_indicator
94
+ return "${status}"
95
+ }
96
+
30
97
  die() {
31
98
  log "Error: $*"
32
99
  exit 1
@@ -861,6 +928,8 @@ run_preview_item_action() {
861
928
  }
862
929
 
863
930
  cleanup_session_tmp_root() {
931
+ stop_loading_indicator
932
+
864
933
  if [[ -n "${SESSION_TMP_ROOT}" && -d "${SESSION_TMP_ROOT}" ]]; then
865
934
  rm -rf "${SESSION_TMP_ROOT}"
866
935
  fi
@@ -1339,7 +1408,27 @@ ensure_fzf() {
1339
1408
  }
1340
1409
 
1341
1410
  normalize_manager() {
1342
- printf "%s" "$1" | tr '[:upper:]' '[:lower:]'
1411
+ local manager="$1"
1412
+
1413
+ manager="$(trim_whitespace "${manager}")"
1414
+ manager="$(printf "%s" "${manager}" | tr '[:upper:]' '[:lower:]')"
1415
+
1416
+ case "${manager}" in
1417
+ homebrew)
1418
+ manager="brew"
1419
+ ;;
1420
+ chocolatey|chocolate)
1421
+ manager="choco"
1422
+ ;;
1423
+ "portage (emerge)"|portage-emerge|portage)
1424
+ manager="emerge"
1425
+ ;;
1426
+ win-get)
1427
+ manager="winget"
1428
+ ;;
1429
+ esac
1430
+
1431
+ printf "%s" "${manager}"
1343
1432
  }
1344
1433
 
1345
1434
  os_release_field() {
@@ -2735,6 +2824,56 @@ collect_search_display_rows() {
2735
2824
  rm -f "${merged_source_file}" "${merged_marked_file}"
2736
2825
  }
2737
2826
 
2827
+ collect_installed_display_rows() {
2828
+ local output_file="$1"
2829
+ shift
2830
+ local managers=("$@")
2831
+ local part_files=()
2832
+ local gather_pids=()
2833
+ local manager
2834
+ local part_file
2835
+ local gather_pid
2836
+
2837
+ : >"${output_file}"
2838
+
2839
+ for manager in "${managers[@]-}"; do
2840
+ part_file="$(mktemp "${SESSION_TMP_ROOT}/part.XXXXXX")"
2841
+ part_files+=("${part_file}")
2842
+
2843
+ (
2844
+ local local_source_file
2845
+ local_source_file="$(mktemp "${SESSION_TMP_ROOT}/source.XXXXXX")"
2846
+ manager_installed_entries "${manager}" >"${local_source_file}" || true
2847
+ if [[ -s "${local_source_file}" ]]; then
2848
+ awk -F'\t' -v mgr="${manager}" '
2849
+ NF >= 1 {
2850
+ desc = $2
2851
+ if (desc == "") desc = "-"
2852
+ print mgr "\t" $1 "\t" desc
2853
+ }
2854
+ ' "${local_source_file}" >"${part_file}"
2855
+ fi
2856
+ rm -f "${local_source_file}"
2857
+ ) &
2858
+ gather_pids+=("$!")
2859
+ done
2860
+
2861
+ for gather_pid in "${gather_pids[@]-}"; do
2862
+ wait "${gather_pid}" || true
2863
+ done
2864
+
2865
+ for part_file in "${part_files[@]-}"; do
2866
+ if [[ -s "${part_file}" ]]; then
2867
+ cat "${part_file}" >>"${output_file}"
2868
+ fi
2869
+ rm -f "${part_file}"
2870
+ done
2871
+
2872
+ if [[ -s "${output_file}" ]]; then
2873
+ sort -u "${output_file}" -o "${output_file}"
2874
+ fi
2875
+ }
2876
+
2738
2877
  build_dynamic_reload_command() {
2739
2878
  local manager_override="$1"
2740
2879
  local fallback_file="$2"
@@ -3266,48 +3405,9 @@ main() {
3266
3405
  ensure_fzf "${managers[@]-}"
3267
3406
 
3268
3407
  if [[ "${ACTION}" == "search" ]]; then
3269
- collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
3408
+ run_with_loading_indicator "Loading packages from ${manager_display}" collect_search_display_rows "${query}" "${display_file}" "${managers[@]-}"
3270
3409
  else
3271
- local part_files=()
3272
- local gather_pids=()
3273
- local part_file
3274
- local gather_pid
3275
-
3276
- for manager in "${managers[@]-}"; do
3277
- part_file="$(mktemp "${SESSION_TMP_ROOT}/part.XXXXXX")"
3278
- part_files+=("${part_file}")
3279
-
3280
- (
3281
- local_source_file="$(mktemp "${SESSION_TMP_ROOT}/source.XXXXXX")"
3282
- manager_installed_entries "${manager}" >"${local_source_file}" || true
3283
- if [[ -s "${local_source_file}" ]]; then
3284
- awk -F'\t' -v mgr="${manager}" '
3285
- NF >= 1 {
3286
- desc = $2
3287
- if (desc == "") desc = "-"
3288
- print mgr "\t" $1 "\t" desc
3289
- }
3290
- ' "${local_source_file}" >"${part_file}"
3291
- fi
3292
- rm -f "${local_source_file}"
3293
- ) &
3294
- gather_pids+=("$!")
3295
- done
3296
-
3297
- for gather_pid in "${gather_pids[@]-}"; do
3298
- wait "${gather_pid}" || true
3299
- done
3300
-
3301
- for part_file in "${part_files[@]-}"; do
3302
- if [[ -s "${part_file}" ]]; then
3303
- cat "${part_file}" >>"${display_file}"
3304
- fi
3305
- rm -f "${part_file}"
3306
- done
3307
-
3308
- if [[ -s "${display_file}" ]]; then
3309
- sort -u "${display_file}" -o "${display_file}"
3310
- fi
3410
+ run_with_loading_indicator "Loading installed packages from ${manager_display}" collect_installed_display_rows "${display_file}" "${managers[@]-}"
3311
3411
  fi
3312
3412
 
3313
3413
  if [[ ! -s "${display_file}" ]]; then
@@ -3350,7 +3450,7 @@ main() {
3350
3450
  if dynamic_reload_enabled "${#managers[@]}"; then
3351
3451
  if [[ -n "${query}" ]]; then
3352
3452
  reload_fallback_file="$(mktemp "${SESSION_TMP_ROOT}/reload-fallback.XXXXXX")"
3353
- collect_search_display_rows "" "${reload_fallback_file}" "${managers[@]-}"
3453
+ run_with_loading_indicator "Preparing baseline search results" collect_search_display_rows "" "${reload_fallback_file}" "${managers[@]-}"
3354
3454
  if [[ ! -s "${reload_fallback_file}" ]]; then
3355
3455
  cp "${display_file}" "${reload_fallback_file}"
3356
3456
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.33",
3
+ "version": "1.6.35",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"