123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- # Copy this file into /usr/share/zsh/site-functions/
- # and add 'autoload n-preview` to .zshrc
- #
- # This is partially a test if n-list-draw and n-list-input can be
- # used multiple times to create multiple lists. It might become
- # more usable if someone adds more features like previewing of
- # archive contents.
- emulate -L zsh
- zmodload zsh/curses
- setopt typesetsilent extendedglob
- trap "return" TERM INT QUIT
- trap "_vpreview_exit" EXIT
- local IFS="
- "
- [ -f ~/.config/znt/n-list.conf ] && . ~/.config/znt/n-list.conf
- [[ "$colorpair" = "" ]] && colorpair="white/black"
- local background="${colorpair#*/}"
- # Drawing and input
- autoload n-list-draw n-list-input
- # Cleanup before any exit
- _vpreview_exit() {
- zcurses 2>/dev/null delwin files
- zcurses 2>/dev/null delwin body
- zcurses 2>/dev/null delwin status
- zcurses 2>/dev/null refresh
- zcurses end
- }
- # Outputs a message in the bottom of the screen
- _vpreview_status_msg() {
- zcurses move status 1 2
- zcurses clear status eol
- zcurses string status "$1"
- }
- # Prefer tput, then module terminfo
- _nlist_cursor_visibility() {
- if type tput 2>/dev/null 1>&2; then
- [ "$1" = "1" ] && tput cvvis
- [ "$1" = "0" ] && tput civis
- elif [ "$has_termcap" = "1" ]; then
- [ "$1" = "1" ] && [ -n $terminfo[cvvis] ] && echo -n $terminfo[cvvis]
- [ "$1" = "0" ] && [ -n $terminfo[civis] ] && echo -n $terminfo[civis]
- fi
- }
- #
- # Main code
- #
- integer term_height="$LINES"
- integer term_width="$COLUMNS"
- if [[ "$term_height" -lt 1 || "$term_width" -lt 1 ]]; then
- local stty_out=$( stty size )
- term_height="${stty_out% *}"
- term_width="${stty_out#* }"
- fi
- integer status_height=3
- integer status_width=term_width
- integer status_page_height=1
- integer status_page_width=term_width-2
- integer files_height=term_height-status_height
- integer files_width=term_width/5
- integer files_page_height=files_height-2
- integer files_page_width=files_width-2
- integer body_height=term_height-status_height
- integer body_width=term_width-files_width
- integer body_page_height=body_height-2
- integer body_page_width=body_width
- integer _from_what_idx_list_is_shown_1=1
- integer current_1=1
- integer _from_what_idx_list_is_shown_2=1
- integer current_2=1
- integer hscroll_2=0
- integer active_window=0
- local ansi_mode="ansi"
- [ -f ~/.config/znt/n-preview.conf ] && . ~/.config/znt/n-preview.conf
- typeset -a hcmd
- #if type pygmentize 2>/dev/null 1>&2; then
- # hcmd=( pygmentize -g )
- if type highlight 2>/dev/null 1>&2; then
- hcmd=( highlight -q --force -O ansi )
- elif type source-highlight 2>/dev/null 1>&2; then
- # Warning: source-highlight can have problems
- hcmd=( source-highlight --failsafe -fesc -o STDOUT -i )
- else
- ansi_mode="noansi"
- fi
- zcurses init
- zcurses addwin status "$status_height" "$status_width" $(( term_height - status_height )) 0
- zcurses addwin files "$files_height" "$files_width" 0 0
- zcurses addwin body "$body_height" "$body_width" 0 "$files_width"
- zcurses bg status white/black
- zcurses bg files white/black
- zcurses bg body white/black
- #
- # Listening for input
- #
- local key keypad
- # Clear input buffer
- zcurses timeout status 0
- zcurses input status key keypad
- zcurses timeout status -1
- key=""
- keypad=""
- typeset -a filenames
- integer last_element_1
- typeset -a body
- integer last_element_2
- filenames=( *(N) )
- filenames=( "${(@M)filenames:#(#i)*$1*}" )
- local NLIST_GREP_STRING="$1"
- integer last_element_1="$#filenames"
- integer last_element_2=0
- local selection action final_key
- while (( 1 )); do
- # Output the lists
- integer end_idx=$(( _from_what_idx_list_is_shown_1 + files_page_height - 1 ))
- [ "$end_idx" -gt "$last_element_1" ] && end_idx=last_element_1
- n-list-draw "$(( (current_1 -1) % files_page_height + 1 ))" \
- "$files_page_height" "$files_page_width" 1 2 0 files \
- "${(@)filenames[_from_what_idx_list_is_shown_1, end_idx]}"
- if [ "$#body" -ge 1 ]; then
- end_idx=$(( _from_what_idx_list_is_shown_2 + body_page_height - 1 ))
- [ "$end_idx" -gt "$last_element_2" ] && end_idx=last_element_2
- n-list-draw "$(( (current_2 -1) % body_page_height + 1 ))" \
- "$body_page_height" "$body_page_width" 1 0 "$hscroll_2" body \
- "${(@)body[_from_what_idx_list_is_shown_2, end_idx]}"
- fi
- [[ "$active_window" -eq 0 ]] && zcurses border files
- zcurses border status
- zcurses refresh files body status
- # Wait for input
- zcurses input status key keypad
- # Get the special (i.e. "keypad") key or regular key
- if [ -n "$key" ]; then
- final_key="$key"
- elif [ -n "$keypad" ]; then
- final_key="$keypad"
- else
- _vpreview_status_msg "Inproper input detected"
- zcurses refresh status
- fi
- if [ "$active_window" -eq 0 ]; then
- zcurses clear files
- n-list-input "$current_1" "$_from_what_idx_list_is_shown_1" "$files_page_height" \
- "$files_page_width" "$last_element_1" 0 "$final_key"
- selection="$reply[1]"
- action="$reply[2]"
- current_1="$reply[3]"
- _from_what_idx_list_is_shown_1="$reply[4]"
- if [ "$action" = "SELECT" ]; then
- # Load new file and refresh the displaying window
- local filename="$filenames[$selection]"
- if [ "$ansi_mode" = "ansi" ]; then
- body=( "${(@f)"$( "$hcmd[@]" "$filename" )"}" )
- else
- body=( "${(@f)"$(<$filename)"}" )
- fi
- last_element_2="$#body"
- current_2=1
- _from_what_idx_list_is_shown_2=1
- zcurses clear body
- fi
- elif [ "$active_window" -eq 1 ]; then
- zcurses clear body
- n-list-input "$current_2" "$_from_what_idx_list_is_shown_2" "$body_page_height" \
- "$body_page_width" "$last_element_2" "$hscroll_2" "$final_key"
- selection="$reply[1]"
- action="$reply[2]"
- current_2="$reply[3]"
- _from_what_idx_list_is_shown_2="$reply[4]"
- hscroll_2="$reply[5]"
- fi
- if [ "$action" = "LEAVE" ]; then
- active_window=1-active_window
- elif [ "$action" = "QUIT" ]; then
- break
- elif [ "$action" = "REDRAW" ]; then
- zcurses clear files redraw
- zcurses clear body redraw
- zcurses clear status redraw
- fi
- done
- # vim: set filetype=zsh:
|