ubuntuusers.de

Menu Mittig

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

gerasifbesmumu

Anmeldungsdatum:
11. Dezember 2019

Beiträge: 21

Hallo Ich will, das Menü Rechts und Links ${options[@]} mittig ist. Code ist in #!/bin/bash

 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
#!/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")

Code

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17596

Wohnort: Berlin

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?

1
 |     menu0     |    menu1   |   menu2   |
Antworten |