fpf-cli 1.6.34 → 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 +123 -43
  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.34"
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
@@ -2755,6 +2824,56 @@ collect_search_display_rows() {
2755
2824
  rm -f "${merged_source_file}" "${merged_marked_file}"
2756
2825
  }
2757
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
+
2758
2877
  build_dynamic_reload_command() {
2759
2878
  local manager_override="$1"
2760
2879
  local fallback_file="$2"
@@ -3286,48 +3405,9 @@ main() {
3286
3405
  ensure_fzf "${managers[@]-}"
3287
3406
 
3288
3407
  if [[ "${ACTION}" == "search" ]]; then
3289
- 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[@]-}"
3290
3409
  else
3291
- local part_files=()
3292
- local gather_pids=()
3293
- local part_file
3294
- local gather_pid
3295
-
3296
- for manager in "${managers[@]-}"; do
3297
- part_file="$(mktemp "${SESSION_TMP_ROOT}/part.XXXXXX")"
3298
- part_files+=("${part_file}")
3299
-
3300
- (
3301
- local_source_file="$(mktemp "${SESSION_TMP_ROOT}/source.XXXXXX")"
3302
- manager_installed_entries "${manager}" >"${local_source_file}" || true
3303
- if [[ -s "${local_source_file}" ]]; then
3304
- awk -F'\t' -v mgr="${manager}" '
3305
- NF >= 1 {
3306
- desc = $2
3307
- if (desc == "") desc = "-"
3308
- print mgr "\t" $1 "\t" desc
3309
- }
3310
- ' "${local_source_file}" >"${part_file}"
3311
- fi
3312
- rm -f "${local_source_file}"
3313
- ) &
3314
- gather_pids+=("$!")
3315
- done
3316
-
3317
- for gather_pid in "${gather_pids[@]-}"; do
3318
- wait "${gather_pid}" || true
3319
- done
3320
-
3321
- for part_file in "${part_files[@]-}"; do
3322
- if [[ -s "${part_file}" ]]; then
3323
- cat "${part_file}" >>"${display_file}"
3324
- fi
3325
- rm -f "${part_file}"
3326
- done
3327
-
3328
- if [[ -s "${display_file}" ]]; then
3329
- sort -u "${display_file}" -o "${display_file}"
3330
- fi
3410
+ run_with_loading_indicator "Loading installed packages from ${manager_display}" collect_installed_display_rows "${display_file}" "${managers[@]-}"
3331
3411
  fi
3332
3412
 
3333
3413
  if [[ ! -s "${display_file}" ]]; then
@@ -3370,7 +3450,7 @@ main() {
3370
3450
  if dynamic_reload_enabled "${#managers[@]}"; then
3371
3451
  if [[ -n "${query}" ]]; then
3372
3452
  reload_fallback_file="$(mktemp "${SESSION_TMP_ROOT}/reload-fallback.XXXXXX")"
3373
- 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[@]-}"
3374
3454
  if [[ ! -s "${reload_fallback_file}" ]]; then
3375
3455
  cp "${display_file}" "${reload_fallback_file}"
3376
3456
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpf-cli",
3
- "version": "1.6.34",
3
+ "version": "1.6.35",
4
4
  "description": "Cross-platform fuzzy package finder powered by fzf",
5
5
  "bin": {
6
6
  "fpf": "fpf"