Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: cursor position in a variable



On Sun, Sep 6, 2015 at 12:50 PM, ZyX <kp-pav@xxxxxxxxx> wrote:
>
>
> 05.09.2015, 22:07, "Mikael Magnusson" <mikachu@xxxxxxxxx>:
>> On Sat, Sep 5, 2015 at 8:36 PM, david sowerby <d_sowerby@xxxxxxxxx> wrote:
>>>  I can get the cursor position by doing:
>>>  print "\e[6n"
>>>  this gives me the row and column. Though oddly the output appears after the next prompt, not on its own line. This
>>>  may (or nor) be why when I do:
>>>  pos=$(print "\e[6n")
>>>  print $pos
>>>  I get an empty line - and the output after the next prompt.
>>>  I want to use the row the cursor is on in a script -- so how do I get that into a variable? If not this way is there a way using ZLE?
>>>  thanks for any help --------------dave
>>
>> When you print a terminal control sequence, the terminal writes the
>> reply on standard input, so you need something like
>>
>> print -n '\e[6n'
>> read pos
>>
>> The problem here is that the terminal doesn't print a newline, so this
>> will hang until you press enter. You can dance around with a loop
>> reading one character at a time and checking if there is more pending
>> input, but I'm not 100% sure what the best way to handle this is. If
>> 'read' had an option "read all pending input", it would be easy, but
>> it does not. :)
>>[snip kinda dumb code]
>
> What’s the point of using IFS with read -k? If you know that terminal does print something the following works fine:
>
>     print -n $'\e[6n' ; pos= ; while read -rs -k1 ; do pos+=$REPLY ; [[ $REPLY == R ]] && break ; done
>
> . Timeout I removed will be needed if you don’t know that terminal will output anything though.

You're right, I coded in a bit of a circle there. I had the timeout in
case the terminal didn't print anything, but then added the loop to
wait until it did, so uh, not sure what I intended with that :).

-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author