You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
377 lines
9.3 KiB
377 lines
9.3 KiB
# Copy this file into /usr/share/zsh/site-functions/ |
|
# and add 'autoload n-list-input` to .zshrc |
|
# |
|
# This is an internal function not for direct use |
|
|
|
emulate -L zsh |
|
|
|
zmodload zsh/curses |
|
|
|
setopt typesetsilent |
|
|
|
# Compute first to show index |
|
_nlist_compute_first_to_show_idx() { |
|
from_what_idx_list_is_shown=0+((current_idx-1)/page_height)*page_height+1 |
|
} |
|
|
|
_nlist_update_from_keywords() { |
|
keywordisfresh="1" |
|
if [ "$nkeywords" -gt 0 ]; then |
|
curkeyword=$(( (curkeyword+1) % (nkeywords+1) )) |
|
if [ "$curkeyword" -eq "0" ]; then |
|
buffer="" |
|
else |
|
buffer="${keywords[curkeyword]}" |
|
fi |
|
fi |
|
} |
|
|
|
_nlist_iterate_theme() { |
|
themeisfresh="1" |
|
if [ "$1" = "1" ]; then |
|
curtheme=$(( (curtheme+1) % (nthemes+1) )) |
|
else |
|
curtheme=curtheme-1 |
|
[ "$curtheme" -lt 0 ] && curtheme=nthemes |
|
fi |
|
|
|
if [ "$nthemes" -gt 0 ]; then |
|
local theme=${themes[curtheme]} |
|
[ "$curtheme" -eq "0" ] && theme="$backuptheme" |
|
|
|
colorpair="${theme%/*}" |
|
bold="${theme##*/}" |
|
background="${colorpair#*/}" |
|
zcurses bg main "$colorpair" |
|
zcurses bg inner "$colorpair" |
|
fi |
|
} |
|
|
|
_nlist_rotate_buffer() { |
|
setopt localoptions noglob |
|
|
|
local -a words |
|
words=( ${(s: :)buffer} ) |
|
words=( ${words[-1]} ${words[1,-2]} ) |
|
|
|
local space="" |
|
[ "${buffer[-1]}" = " " ] && space=" " |
|
|
|
buffer="${(j: :)words}$space" |
|
} |
|
|
|
typeset -ga reply |
|
reply=( -1 '' ) |
|
integer current_idx="$1" |
|
integer from_what_idx_list_is_shown="$2" |
|
integer page_height="$3" |
|
integer page_width="$4" |
|
integer last_element="$5" |
|
integer hscroll="$6" |
|
local key="$7" |
|
integer search="$8" |
|
local buffer="$9" |
|
integer uniq_mode="$10" |
|
integer f_mode="$11" |
|
|
|
# |
|
# Listening for input |
|
# |
|
|
|
if [ "$search" = "0" ]; then |
|
|
|
case "$key" in |
|
(UP|k|$'\C-P') |
|
# Are there any elements before the current one? |
|
[ "$current_idx" -gt 1 ] && current_idx=current_idx-1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(DOWN|j|$'\C-N') |
|
# Are there any elements after the current one? |
|
[ "$current_idx" -lt "$last_element" ] && current_idx=current_idx+1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(PPAGE|$'\b'|$'\C-?'|BACKSPACE) |
|
current_idx=current_idx-page_height |
|
[ "$current_idx" -lt 1 ] && current_idx=1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(NPAGE|" ") |
|
current_idx=current_idx+page_height |
|
[ "$current_idx" -gt "$last_element" ] && current_idx=last_element; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
($'\C-U') |
|
current_idx=current_idx-page_height/2 |
|
[ "$current_idx" -lt 1 ] && current_idx=1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
($'\C-D') |
|
current_idx=current_idx+page_height/2 |
|
[ "$current_idx" -gt "$last_element" ] && current_idx=last_element; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(HOME|g) |
|
current_idx=1 |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(END|G) |
|
current_idx=last_element |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
($'\n'|ENTER) |
|
# Is that element selectable? |
|
# Check for this only when there is no search |
|
if [[ "$NLIST_SEARCH_BUFFER" != "" || "$NLIST_IS_UNIQ_MODE" -eq 1 || |
|
${NLIST_NONSELECTABLE_ELEMENTS[(r)$current_idx]} != $current_idx ]] |
|
then |
|
# Save current element in the result variable |
|
reply=( $current_idx "SELECT" ) |
|
fi |
|
;; |
|
(H|'?') |
|
# This event needs to be enabled |
|
if [[ "${NLIST_ENABLED_EVENTS[(r)HELP]}" = "HELP" ]]; then |
|
reply=( -1 "HELP" ) |
|
fi |
|
;; |
|
(F1) |
|
# This event needs to be enabled |
|
if [[ "${NLIST_ENABLED_EVENTS[(r)F1]}" = "F1" ]]; then |
|
reply=( -1 "$key" ) |
|
fi |
|
;; |
|
(F4|F5|F6|F7|F8|F9|F10|DC) |
|
# ignore; F2, F3 are used below |
|
;; |
|
(q) |
|
reply=( -1 "QUIT" ) |
|
;; |
|
(/) |
|
search=1 |
|
_nlist_cursor_visibility 1 |
|
;; |
|
($'\t') |
|
reply=( $current_idx "LEAVE" ) |
|
;; |
|
($'\C-L') |
|
reply=( -1 "REDRAW" ) |
|
;; |
|
(\]) |
|
[[ "${(t)NLIST_HOP_INDEXES}" = "array" || "${(t)NLIST_HOP_INDEXES}" = "array-local" ]] && |
|
[ -z "$NLIST_SEARCH_BUFFER" ] && [ "$NLIST_IS_UNIQ_MODE" -eq 0 ] && |
|
for idx in "${(n)NLIST_HOP_INDEXES[@]}"; do |
|
if [ "$idx" -gt "$current_idx" ]; then |
|
current_idx=$idx |
|
_nlist_compute_first_to_show_idx |
|
break |
|
fi |
|
done |
|
;; |
|
(\[) |
|
[[ "${(t)NLIST_HOP_INDEXES}" = "array" || "${(t)NLIST_HOP_INDEXES}" = "array-local" ]] && |
|
[ -z "$NLIST_SEARCH_BUFFER" ] && [ "$NLIST_IS_UNIQ_MODE" -eq 0 ] && |
|
for idx in "${(nO)NLIST_HOP_INDEXES[@]}"; do |
|
if [ "$idx" -lt "$current_idx" ]; then |
|
current_idx=$idx |
|
_nlist_compute_first_to_show_idx |
|
break |
|
fi |
|
done |
|
;; |
|
('<'|'{'|LEFT|'h') |
|
hscroll=hscroll-7 |
|
[ "$hscroll" -lt 0 ] && hscroll=0 |
|
;; |
|
('>'|'}'|RIGHT|'l') |
|
hscroll+=7 |
|
;; |
|
($'\E') |
|
buffer="" |
|
;; |
|
(F3) |
|
if [ "$search" = "1" ]; then |
|
search=0 |
|
_nlist_cursor_visibility 0 |
|
else |
|
search=1 |
|
_nlist_cursor_visibility 1 |
|
fi |
|
;; |
|
(o|$'\C-O') |
|
uniq_mode=1-uniq_mode |
|
;; |
|
(f|$'\C-F') |
|
(( f_mode=(f_mode+1) % 3 )) |
|
;; |
|
($'\x1F'|F2|$'\C-X') |
|
search=1 |
|
_nlist_cursor_visibility 1 |
|
_nlist_update_from_keywords |
|
;; |
|
($'\C-T') |
|
_nlist_iterate_theme 1 |
|
;; |
|
($'\C-G') |
|
_nlist_iterate_theme 0 |
|
;; |
|
($'\C-E'|e) |
|
# This event needs to be enabled |
|
if [[ "${NLIST_ENABLED_EVENTS[(r)EDIT]}" = "EDIT" ]]; then |
|
reply=( -1 "EDIT" ) |
|
fi |
|
;; |
|
($'\C-A') |
|
_nlist_rotate_buffer |
|
;; |
|
(*) |
|
;; |
|
esac |
|
|
|
else |
|
|
|
case "$key" in |
|
($'\n'|ENTER) |
|
if [ "$NLIST_INSTANT_SELECT" = "1" ]; then |
|
if [[ "$NLIST_SEARCH_BUFFER" != "" || "$NLIST_IS_UNIQ_MODE" -eq 1 || |
|
${NLIST_NONSELECTABLE_ELEMENTS[(r)$current_idx]} != $current_idx ]] |
|
then |
|
reply=( $current_idx "SELECT" ) |
|
fi |
|
else |
|
search=0 |
|
_nlist_cursor_visibility 0 |
|
fi |
|
;; |
|
($'\C-L') |
|
reply=( -1 "REDRAW" ) |
|
;; |
|
|
|
# |
|
# Slightly limited navigation |
|
# |
|
|
|
(UP|$'\C-P') |
|
[ "$current_idx" -gt 1 ] && current_idx=current_idx-1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(DOWN|$'\C-N') |
|
[ "$current_idx" -lt "$last_element" ] && current_idx=current_idx+1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(PPAGE) |
|
current_idx=current_idx-page_height |
|
[ "$current_idx" -lt 1 ] && current_idx=1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(NPAGE) |
|
current_idx=current_idx+page_height |
|
[ "$current_idx" -gt "$last_element" ] && current_idx=last_element; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
($'\C-U') |
|
current_idx=current_idx-page_height/2 |
|
[ "$current_idx" -lt 1 ] && current_idx=1; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
($'\C-D') |
|
current_idx=current_idx+page_height/2 |
|
[ "$current_idx" -gt "$last_element" ] && current_idx=last_element; |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(HOME) |
|
current_idx=1 |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(END) |
|
current_idx=last_element |
|
_nlist_compute_first_to_show_idx |
|
;; |
|
(LEFT) |
|
hscroll=hscroll-7 |
|
[ "$hscroll" -lt 0 ] && hscroll=0 |
|
;; |
|
(RIGHT) |
|
hscroll+=7 |
|
;; |
|
(F1) |
|
# This event needs to be enabled |
|
if [[ "${NLIST_ENABLED_EVENTS[(r)F1]}" = "F1" ]]; then |
|
reply=( -1 "$key" ) |
|
fi |
|
;; |
|
(F4|F5|F6|F7|F8|F9|F10|DC) |
|
# ignore; F2, F3 are used below |
|
;; |
|
|
|
# |
|
# The input |
|
# |
|
|
|
($'\b'|$'\C-?'|BACKSPACE) |
|
buffer="${buffer%?}" |
|
;; |
|
($'\C-W') |
|
[ "$buffer" = "${buffer% *}" ] && buffer="" || buffer="${buffer% *}" |
|
;; |
|
($'\C-K') |
|
buffer="" |
|
;; |
|
($'\E') |
|
buffer="" |
|
search=0 |
|
_nlist_cursor_visibility 0 |
|
;; |
|
(F3) |
|
if [ "$search" = "1" ]; then |
|
search=0 |
|
_nlist_cursor_visibility 0 |
|
else |
|
search=1 |
|
_nlist_cursor_visibility 1 |
|
fi |
|
;; |
|
($'\C-O') |
|
uniq_mode=1-uniq_mode |
|
;; |
|
($'\C-F') |
|
(( f_mode=(f_mode+1) % 3 )) |
|
;; |
|
($'\x1F'|F2|$'\C-X') |
|
_nlist_update_from_keywords |
|
;; |
|
($'\C-T') |
|
_nlist_iterate_theme 1 |
|
;; |
|
($'\C-G') |
|
_nlist_iterate_theme 0 |
|
;; |
|
($'\C-E') |
|
# This event needs to be enabled |
|
if [[ "${NLIST_ENABLED_EVENTS[(r)EDIT]}" = "EDIT" ]]; then |
|
reply=( -1 "EDIT" ) |
|
fi |
|
;; |
|
($'\C-A') |
|
_nlist_rotate_buffer |
|
;; |
|
(*) |
|
if [[ $#key == 1 && $((#key)) -lt 31 ]]; then |
|
# ignore all other control keys |
|
else |
|
buffer+="$key" |
|
fi |
|
;; |
|
esac |
|
|
|
fi |
|
|
|
reply[3]="$current_idx" |
|
reply[4]="$from_what_idx_list_is_shown" |
|
reply[5]="$hscroll" |
|
reply[6]="$search" |
|
reply[7]="$buffer" |
|
reply[8]="$uniq_mode" |
|
reply[9]="$f_mode" |
|
|
|
# vim: set filetype=zsh:
|
|
|