|
@@ -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:
|