diff options
Diffstat (limited to 'plugins/zsh-navigation-tools/doc/n-preview')
-rw-r--r-- | plugins/zsh-navigation-tools/doc/n-preview | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/plugins/zsh-navigation-tools/doc/n-preview b/plugins/zsh-navigation-tools/doc/n-preview new file mode 100644 index 000000000..2d8eea3fb --- /dev/null +++ b/plugins/zsh-navigation-tools/doc/n-preview @@ -0,0 +1,224 @@ +# 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: |