Tja, der Code ist ja sehr kompakt und nicht viele kennen sich mit Ansisequenzen aus.
Auch ich nur ein wenig.
Der Code ist aber nicht ordentlich formatiert. Erst wird 12 Zeichen weit eingerückt, aber am Ende sind es noch 8 Zeichen, statt 0.
Ich habe mal umformatiert:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 | #!/bin/bash
function select_option {
ESC=$( printf "\033")
cursor_blink_on() { printf "${ESC}[?25h%s"; }
cursor_blink_off() { printf "${ESC}[?25l%s"; }
cursor_to() { printf "${ESC}[$1;${2:-1}H%s"; }
print_option() { printf " $1%s "; }
print_selected() { printf " ${ESC}[7m%s $1 ${ESC}[27m"; }
get_cursor_row() { IFS=';' read -r -sdR -p $'\E[6n' ROW COL; echo "${ROW#*[}"; }
key_input() { read -r -s -n3 key 2>/dev/null >&2
if [[ $key = ${ESC}[A ]]; then echo up; fi
if [[ $key = ${ESC}[B ]]; then echo down; fi
if [[ $key = "" ]]; then echo enter; fi; }
for opt; do printf "\n"; done
lastrow=$(get_cursor_row)
local startrow=$((lastrow - COL))
trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
cursor_blink_off
local selected=0
while true; do
local idx=0
for opt; do
cursor_to $((startrow + idx))
if [ $idx -eq $selected ]; then
print_selected "$opt"
else
print_option "$opt"
fi
((idx++))
done
case $(key_input) in
enter) break;;
up) ((selected--));
if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;;
down) ((selected++));
if [ "$selected" -ge $# ]; then selected=0; fi;;
esac
done
cursor_to "$lastrow"
printf "\n"
cursor_blink_on
return $selected
}
select_option "${options[@]}"
choice=$?
printf "%s$txt5" | \
sed -e :a -e "s/^.\{1,$(tput cols)\}$/ & /;ta" | \
tr -d '\n' | \
head -c "$(tput cols)"
options=("$menu0" "$menu1" "$menu2")
|
In Zeile 44 wird options benutzt, aber es wird erst in Z. 51 initialisiert.
Das Tool shellcheck bemängelt eine ungenutzte Variable choice
und ein uninitialisiertes txt5.
Offenbar kann man den Code nicht so wie er ist mal starten und ausprobieren. Das wäre aber sehr hilfreich. Stell Dir vor 10 Leute wollten den Code bei sich ausprobieren und müssen ihn alle erst in einen lauffähigen Zustand bringen, ohne zu wissen, was er im einzelnen tut. Wenn Du lauffähigen standalone-Code produzierst hast Du die Arbeit, nicht wir, aber die Arbeit fällt nur 1x an, nicht 10x.
Ich bin auch unsicher, ob alles, was Du da mitlieferst, benötigt wird, um das Problem aufzuzeigen. Oft findet man auf dem Weg, einen minimalen, selbständig ausführbaren Problemprototypen zu zeigen den Fehler selbst, weil man sich auf das Wesentliche konzentriert.
Muss es blinken, um mittig oder nicht-mittig zu sein, macht das einen Unterschied?
Wenn ich Zeile 51 vor Zeile 44 schiebe und das Script starte passiert nichts. Mit Ctrl-C komme ich wieder raus.
Die Beschreibung, was das gewünschte und was das erzielte Verhalten sind, ist auch unklar:
Hallo Ich will, das Menü Rechts und Links ${options[@]} mittig ist.
Soll das heißen "links mittig" und bedeuten, dass ein Menu links ist (also nicht horizontal mittag) und vertikal mittig?
Oder gibt es ein Menu namens "Links" und das soll (horizontal) mittig sein? Dann würde man es kaum "Links" nennen.
Viele haben ja Schwierigkeiten, präzises Deutsch zu schreiben, aber hier kommen so viele Sachen zusammen, dass wirklich unklar bleibt, was Du willst.
Hallo.
Ich will, dass Menü Rechts und Links ${options[@]} mittig ist.
Das dass
muss wohl ein Doppel-S-Dass sein. Könnte aber auch auf ein fehlendes zweites das
hinweisen:
Ich will, dass das Menü rechts und links ${options[@]} mittig ist.
Oder es sind 2 Menüs, dann wäre es:
Ich will, dass Menü "Rechts" und "Links" ${options[@]} mittig sind.
Vielleicht gibt es auch 3 Spalten – options
besteht ja aus menu0, -1 und -2 –, und jedes für sich in seinem Bereich - doch wieder horizontal - mittig ist, und Links
ist menu0
, Rechts menu2
?
| | menu0 | menu1 | menu2 |
|