+ "$escape_char")
+ expected_input=true
+ read -rsn2 escaped_input
+ skip_input_regex="^[0-9]+$"
+ skip_back=false
+ case $escaped_input in
+ '[D')
+ # skip backward
+ if (( j == 0 )); then
+ echo "no earlier songs"
+ continue
+ fi
+ skip_back=true
+ {
+ line_int=0
+ for (( i=j-1; i >= 0; i-- )); do
+ echo "$line_int | ${ls_lines[i]}"
+ line_int+=1
+ done
+ } | less -F
+ scrolled+=$j
+ ;;
+ '[C')
+ # skip forward, but show the last few songs anyways.
+ skip_start=0
+ if (( j - 3 > skip_start )); then
+ skip_start=$(( j - 3 ))
+ fi
+ {
+ line_int=0
+ for (( i=skip_start; i < id_count; i++ )); do
+ if (( i == j )); then
+ echo " * ${ls_lines[i]}"
+ continue
+ fi
+ echo "$line_int | ${ls_lines[i]}"
+ line_int+=1
+ done
+ } | less -F
+ scrolled+=$(( id_count - skip_start - 1 ))
+ ;;
+ *)
+ expected_input=false
+ ;;
+ esac
+ if $expected_input; then
+ read -r skip_input
+ if [[ $skip_input =~ $skip_input_regex ]]; then
+ if $skip_back; then
+ j=$(( j - skip_input - 2 ))
+ else
+ pre_j_count=$(( j - skip_start ))
+ j=$(( j + skip_input - pre_j_count ))
+ if (( skip_input < pre_j_count )); then
+ j=$(( j - 1 ))
+ fi
+ fi
+ kill %%; wait %% 2>/dev/null ||:
+ break
+ fi
+ fi
+ ;;