Visit Our UNIX and Linux User Community


Control cursor position also at bottom of window


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Control cursor position also at bottom of window
# 15  
Old 02-04-2020
Quote:
Originally Posted by wisecracker
I did quote early on in this thread that some terminals do not respond correctly to some terminal escape codes. Some of those escape codes will not work at all.

So in the first part the outside parentheses create an array in advanced shells like bash so therefore longhand:
Code:
Last login: Tue Feb  4 16:17:10 on ttys000
AMIGA:amiga~> term_size=($( stty size ))
AMIGA:amiga~> 
AMIGA:amiga~> printf "%b\n" "${term_size[0]}"
24
AMIGA:amiga~> 
AMIGA:amiga~> printf "%b\n" "${term_size[1]}"
80
AMIGA:amiga~> _

As for the second 'printf' line, changing the values 24 and 80 to say 30 and 120 will expand the terminal size on certain terminals, (xterm as an exmaple), to that size for the duration of that terminal session. Of course calling it again with 24 and 80 restores it back to the original.
IF and a big if, it doesn't work then many of those terminal commands in the URLs won't work either.

Array... right. I wasn't thinking straight. Was early in the morning then.
Yes, probably quite a few of these escape codes won't work everywhere. Fortunately I don't need to resize the terminal. All I want is to keep the cursor in place until an acceptable answer arrives.
What about those code in man console_codes? Can't those be used to program in a reasonably safe / portable way in Bash?
# 16  
Old 02-04-2020
Hi Ralph..
Is this what you are trying to do?
Code:
#!/bin/bash
# Linux Mint 19, default bash terminal.
clear
echo ""
echo ""
printf "%b" "This is a test line.\033[s\n"
sleep 2
echo ""
echo ""
printf "%b" "\033[u\033[1A\n"
echo "We are here.         "

# 17  
Old 02-04-2020
Quote:
Originally Posted by wisecracker
Hi Ralph..
Is this what you are trying to do?
Code:
#!/bin/bash
# Linux Mint 19, default bash terminal.
clear
echo ""
echo ""
printf "%b" "This is a test line.\033[s\n"
sleep 2
echo ""
echo ""
printf "%b" "\033[u\033[1A\n"
 echo "We are here.         "

This is what I do - the output of my script:
Code:
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
Do you wish to continue? [Y|n] z

When a user enters an answer other than Y, y, N, n or <Enter> - for example 'z' above - then the cursor is supposed to stay where it is until an acceptable answer comes.
That has to work everywhere on the screen.

The problem I had was that the carriage return moved the cursor to the next line, one line below the question. I first fixed it for everywhere except the last line of the window and that's when I posted my original question.

This version works for me now:
Code:
#!/bin/bash

function askYesOrNo {
        printf "\e[1;31;47m$1 [Y|n]\e[0m "      # print $1 in color
        printf "\e[s"                           # save cursor x-pos

        while true ; do
                read answer
                if [ -z "$answer" ] ; then
                        return 0
                elif [ "$(tr -d "NnYy" <<< $answer)" != "$answer" ] ; then
                        break
                fi

                # How many lines in this window?
                LINES=$(tput lines)

                # find cursor y-position ( line number )
                printf "\e[6n" ; read -sd R POS
                CURPOS=${POS#*[}; CUR_Y=${CURPOS%;*}

                if [ "$CUR_Y" -eq "$LINES" ] ; then
#                       printf "\e[u\e[1A\e[K" 
                        printf "\e[u\eM\e[K"
                else
                        printf "\e[u\e[K"
                fi
        done
        if [ "${answer^}" == "Y" ]; then
                return 0
        fi
        return 1
}

for (( i = 100, max = 110; i <= max; i++ )) ; do
        printf " %d\n" $i
        if [ $i -eq $max ] ; then
                if askYesOrNo "Do you wish to continue?" ; then
                        (( max += 10 ))
                fi
        fi
done

Could be condensed a bit but this is easier to read.
It works here. Does it work on your system?
# 18  
Old 02-04-2020
I think the carriage return at the end of the input is scrolling up the terminal. How about prompting for a single Y or N response (no need to CR):

Code:
#!/bin/bash
  
# -----
# function: askYesOrNo
# purpose : ask question passed as $1
# return  : 0 if answer was y or Y,
#           1 otherwise
# -----
function askYesOrNo {
        printf "\e[s"                           # save cursor x-pos

        while true ; do
                printf "\e[1;31;47m$1 [Y|n]\e[0m "      # print $1 in color
                read -n 1 answer
                case $answer in
                   Y|y|N|n) break;;
                esac
                # restore cursor x-pos
               printf "\e[u"
        done
        # restore cursor x-pos, erase rest of line
        printf "\e[u\e[K"
        # set return status
        [ "${answer^}" == "Y" ]
}


for (( i = 100, max = 110; i <= max; i++ )) ; do
        printf " %d\n" $i
        if [ $i -eq $max ] ; then
                if askYesOrNo "Do you wish to continue?" ; then
                        (( max += 10 ))
                fi
        fi
done

# 19  
Old 02-05-2020
Quote:
Originally Posted by Chubler_XL
I think the carriage return at the end of the input is scrolling up the terminal. How about prompting for a single Y or N response (no need to CR):

Code:
#!/bin/bash
  
# -----
# function: askYesOrNo
# purpose : ask question passed as $1
# return  : 0 if answer was y or Y,
#           1 otherwise
# -----
function askYesOrNo {
        printf "\e[s"                           # save cursor x-pos

        while true ; do
                printf "\e[1;31;47m$1 [Y|n]\e[0m "      # print $1 in color
                read -n 1 answer
                case $answer in
                   Y|y|N|n) break;;
                esac
                # restore cursor x-pos
               printf "\e[u"
        done
        # restore cursor x-pos, erase rest of line
        printf "\e[u\e[K"
        # set return status
        [ "${answer^}" == "Y" ]
}


for (( i = 100, max = 110; i <= max; i++ )) ; do
        printf " %d\n" $i
        if [ $i -eq $max ] ; then
                if askYesOrNo "Do you wish to continue?" ; then
                        (( max += 10 ))
                fi
        fi
 done


Yes, read -n 1 - I did that and it works but I wanted to have it my way. Smilie

And my final version finally does what I want. Smilie
# 20  
Old 02-05-2020
Mind to share your final version here?
# 21  
Old 02-05-2020
Quote:
Originally Posted by RudiC
Mind to share your final version here?

It's still the same as what I posted earlier. A bit longer than it has to be because of all the ifs and comments. I like the way you used parameter expansion in your version, but your version didn't scroll right on my system - an ordinary terminal emulator running Bash 5 on a Debian Linux.


Here my currently final version again:
Code:
function askYesOrNo {
        printf "\e[1;31;47m$1 [Y|n]\e[0m "      # print $1 in color
        printf "\e[s"                           # save cursor x-pos

        while true ; do
                read answer
                if [ -z "$answer" ] ; then
                        return 0
                elif [ "$(tr -d "NnYy" <<< $answer)" != "$answer" ] ; then
                        break
                fi

                # How many lines in this window?
                LINES=$(tput lines)

                # find cursor y-position ( line number )
                printf "\e[6n" ; read -sd R POS
                CURPOS=${POS#*[}; CUR_Y=${CURPOS%;*}

                if [ "$CUR_Y" -eq "$LINES" ] ; then
#                       printf "\e[u\e[1A\e[K" 
                        printf "\e[u\eM\e[K"
                else
                        printf "\e[u\e[K"
                fi
        done
        if [ "${answer^}" == "Y" ]; then
                return 0
        fi
        return 1
}

for (( i = 100, max = 110; i <= max; i++ )) ; do
        printf " %d\n" $i
        if [ $i -eq $max ] ; then
                if askYesOrNo "Do you wish to continue?" ; then
                        (( max += 10 ))
                fi
        fi
done

Only complaint now is that when the question is asked at the very bottom of the window the cursor still jumps to the next line, the window scrolls but the cursor jumps back to the end of the question. That can be avoided by using read -n 1 - as wisecracker suggested - but I like to use the Enter key to confirm.


Does it run the same way on your system?

Last edited by Ralph; 02-05-2020 at 11:24 AM.. Reason: typos

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Holding cursor position on one line

Hi there. It's easier to explain this with a pseudo code, I hope this makes sense: var1=hello echo $var1 some kind of loop echo loop counter done How do I hold the cursor position immediately behind the last output so I'd get something like: hello123456789 DOS used to use ","... (5 Replies)
Discussion started by: MuntyScrunt
5 Replies

2. Shell Programming and Scripting

Getting the cursor position

I need to get the cursor position, and put it inside a variable. Problem is, i don't have the tput command, or ncurses. Apparently I was supposed to try the following: echo -e '\E But I don't get a value or anything. Please help. (3 Replies)
Discussion started by: tinman47
3 Replies

3. Shell Programming and Scripting

ksh - moving cursor position

hi all, am trying to modify a ksh script to group server names together depending on the cluster they sit in. currently the script does a find . -name '*.pid' to find all running servers and prints out their pids and names. current output looks something like this : serverA ... (1 Reply)
Discussion started by: cesarNZ
1 Replies

4. UNIX for Dummies Questions & Answers

Cursor position

Is there a way of finding the current cursor position (line & column) within AIX (4 Replies)
Discussion started by: gefa
4 Replies

5. UNIX and Linux Applications

read position mouse cursor

Hi to all! I'm a teacher of maths and physics in an italian high school in Milan, Italy. I need a simple program that read the position of mouse cursor in function of time and write the coordinates in a text file. The time resolution have to be something like 1/10 sec or better (I have to know... (2 Replies)
Discussion started by: chris75
2 Replies

6. Shell Programming and Scripting

Changing cursor position using shell script

Hi, Pleae help me on this. Normally, when we say read username, the cursor will come in the first position of next line, but I want the output of the below Normal usage ------------- please enter username: _ I want like the below ---------------------- please enter username: ... (2 Replies)
Discussion started by: balamv
2 Replies

7. Programming

get terminal width and cursor position

I want to get the screen width and cursor positions. When I used curses, all the screen content was cleared. So Can I use curses to get the screen size without clearing anything in the window? Or is there any other alternative??? I can use only C or C++. (0 Replies)
Discussion started by: Sreejesh.S
0 Replies

8. HP-UX

Command to know the terminal cursor position

Dear all, How can i get the current cursor position..is thr any command to find the same? Thanks in Advance Aneesh (3 Replies)
Discussion started by: aneesha
3 Replies

9. Programming

Cursor Global Position

Hello all, How can i get the global position of the cursor? (i'm using c language, and suse 10.1 linux) Thanks. (3 Replies)
Discussion started by: boogy
3 Replies

10. Shell Programming and Scripting

Get the cursor position

Hello, Is there a way to get the current cursor position? I know "tput sc" saves it. Is there a way to find out the value saved? Thanks. (0 Replies)
Discussion started by: bestbuyernc
0 Replies

Featured Tech Videos