summaryrefslogtreecommitdiffstats
path: root/src/ui.sh
blob: 1395383b8608bba3f95f931e80733f147a98f8ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/env bash

ui::fzf() {
   local -r autoselect="$(dict::get "$OPTIONS" autoselect)"
   local -r with_nth="$(dict::get "$OPTIONS" with-nth)"
   local -r nth="$(dict::get "$OPTIONS" nth)"

   local args
   args+=("--height")
   args+=("100%")
   if ${autoselect:-false}; then
      args+=("--select-1")
   fi
   args+=("--bind"); args+=("ctrl-j:down,ctrl-k:up")

   local -r fzf_cmd="$([ $NAVI_ENV == "test" ] && echo "fzf_mock" || echo "fzf")"
   "$fzf_cmd" ${args[@]:-} --inline-info "$@"
}

ui::select() {
   local -r cheats="$1"

   [[ "${SHELL:-}" =~ 'fish' ]] || local -r sub='$'

   local -r script_path="${NAVI_HOME}/navi"
   local -r preview_cmd="\"${script_path}\" preview ${sub:-}(echo \'{}\' | $(arg::serialize_code) 2> /dev/null)"

   local -r query="$(dict::get "$OPTIONS" query)"
   local -r entry_point="$(dict::get "$OPTIONS" entry_point)"
   local -r preview="$(dict::get "$OPTIONS" preview)"
   local -r best="$(dict::get "$OPTIONS" best)"
   local -r fzf_overrides="$(dict::get "$OPTIONS" fzf-overrides)"

   local args=()
   args+=("-i")
   args+=("--ansi")
   if $preview; then
      args+=("--preview"); args+=("$preview_cmd")
      args+=("--preview-window"); args+=("up:2")
   fi
   if [[ -n "$query" ]] && $best; then
      args+=("--filter"); args+=("${query} ")
   elif  [[ -n "$query" ]] && ! $best; then
      args+=("--query"); args+=("${query} ")
   fi
   if [ "$entry_point" = "search" ]; then
      args+=("--header"); args+=("Displaying online results. Please refer to 'navi --help' for details")
   fi
   args+=("--delimiter"); args+=('\s\s+')
   args+=("--expect"); args+=("ctrl-y")

   export FZF_DEFAULT_OPTS="${FZF_DEFAULT_OPTS} ${fzf_overrides}"

   local -r result="$(echo "$cheats" \
      | cheat::prettify \
      | str::as_column $(printf "$ESCAPE_CHAR_3") \
      | ui::fzf "${args[@]}")"

   local -r key="$(echo "$result" | head -n1)"

   echo "$result" \
      | ($best && head -n1 || tail -n +2) \
      | selection::dict "$cheats" "$key"
}

ui::clear_previous_line() {
   tput cuu1 2>/dev/null && tput el || true
}

ui::width() {
   shopt -s checkwinsize; (:;:) 2> /dev/null || true
   if command_exists tput; then
      tput cols
   else
      echo 130
   fi
}

ui::remove_dep_order() {
   sed -E 's/^[^;]+; //'
}

ui::print_preview() {
   local -r selection="$1"

   local -r comment="$(selection::comment "$selection" | cmd::unescape)"
   local -r snippet="$(selection::snippet "$selection" | cmd::unescape)"
   local -r tags="$(selection::tags "$selection" | cmd::unescape)"

   local -r comment_color="$(style::comment_color)"
   local -r snippet_color="$(style::snippet_color)"
   local -r tag_color="$(style::tag_color)"

   printf "\033[${comment_color}m# "; echo -n "$comment"
   printf " \033[${tag_color}m["; echo -n "$tags"; echo "]"
   printf "\033[${snippet_color}m"
   echo "$snippet" | ui::remove_dep_order
}