forked from extern/ohmyzsh
068feca15d
BREAKING CHANGE: the `zsh-navigation-tools` plugin now bundles the version from the zdharma-continuum project, which republished the projects that psprint deleted (we don't yet know yet why). In theory this change doesn't break anything, but be aware of the change and that the upstream repository now lives somewhere else. Source: https://github.com/zdharma-continuum/zsh-navigation-tools/commit/67b24e1
225 lines
6.2 KiB
Bash
225 lines
6.2 KiB
Bash
# 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:
|