fork(1) download
  1. #!/bin/bash
  2. list=( {a..z} )
  3. init(){
  4. MIN_INDEX=0
  5. MAX_INDEX=$(( ${#list[@]} - 1 ))
  6. ITEM_NUM=${#list[@]}
  7. PAGE_SIZE=10
  8. PAGE_WIDTH=10
  9. PAGE_NUM=$(( ( MAX_INDEX % PAGE_SIZE ) ? MAX_INDEX / PAGE_SIZE + 1: MAX_INDEX / PAGE_SIZE ))
  10. BAR_LEN=$(( (PAGE_SIZE - 2) / PAGE_NUM ))
  11. (( BAR_LEN <= 0 )) && BAR_LEN=1
  12. index=0
  13. }
  14.  
  15. draw(){
  16. local i page_index page_start page_end bar_len bar_start
  17. tput cup 0 0
  18. (( page_index = index / PAGE_SIZE ))
  19.  
  20. (( page_start = page_index*PAGE_SIZE ))
  21. (( page_end = page_start + PAGE_SIZE - 1 ))
  22.  
  23. (( bar_start = page_index * (PAGE_SIZE - 2) /PAGE_NUM ))
  24.  
  25. printf "index=%2d, page_index=%2d, bar_len=%2d, bar_start=%2d\n" $index $page_index $BAR_LEN $bar_start
  26.  
  27. for (( i=page_start; i <=page_end; ++i ))
  28. do
  29. (( i == index )) && echo -ne "\033[1;37;44m"
  30. printf "%-${PAGE_WIDTH}s" "${list[$i]}"
  31.  
  32. if (( i == page_start )) ; then
  33. echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0262\033[m"
  34. elif (( i == page_end )) ; then
  35. echo -e "\033[${PAGE_WIDTH}G\033[1;30;47m\0342\0226\0274\033[m"
  36. elif (( i >= page_start + bar_start + 1 && i <= page_start + bar_start + BAR_LEN + 1)) ; then
  37. echo -e "\033[${PAGE_WIDTH}G\033[1;44m \033[m"
  38. else
  39. echo -e "\033[${PAGE_WIDTH}G\033[1;47m \033[m"
  40. fi
  41. done
  42. }
  43. input(){
  44. echo -ne "\033[?25l"
  45. aKey=(0 0 0 0)
  46. cESC=`echo -ne "\033"`
  47. while :
  48. do
  49. read -s -n 1 key
  50. aKey=( "${aKey[@]:1}" "$key")
  51.  
  52. if [[ $key${aKey[2]} = $cESC$cESC ]] ; then break
  53. elif [[ "${aKey[@]:1:2}$key" = "${cESC} [A" ]] ; then (( --index ))
  54. elif [[ "${aKey[@]:1:2}$key" = "${cESC} [B" ]] ; then (( ++index ))
  55. elif [[ "${aKey[@]}" = "${cESC} [ 5 ~" ]] ; then (( index-=PAGE_SIZE ))
  56. elif [[ "${aKey[@]}" = "${cESC} [ 6 ~" ]] ; then (( index+=PAGE_SIZE ))
  57. else continue
  58. fi
  59.  
  60. if (( index < MIN_INDEX )) ; then index=$MIN_INDEX
  61. elif (( index > MAX_INDEX )) ; then index=$MAX_INDEX
  62. fi
  63.  
  64. draw $INDEX
  65.  
  66. done
  67. echo -ne "\033[?25h"
  68. }
  69. clear
  70. init
  71. draw
  72. input
  73.  
  74.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty