screen-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help using eval in screenrc


From: Michael Grant
Subject: Re: Help using eval in screenrc
Date: Sat, 28 Mar 2020 17:34:11 -0400

On Sat, Mar 28, 2020 at 04:20:51PM -0400, dan d. wrote:
> 
> I recently asked how one can stack commands with one keybinding in screenrc
> 
> One poster pointed me to eval, which is surely the solution.  Much googling 
> for examples confirmed it can work.
> 
> But alas I have had no joy trying to modify the examples for my purpose with 
> multiple trial and errow attempts.
> I want to do a keybinding with eval to stack these commands which work now 
> when entered manually:
> 
> 1. enter the command c-a, defined for me as ^F.  I couldn't find in the 
> examples if this a literal ^F or some
> other representation of the command key.
> 
> 2. do a "hardcopy entering h, one example suggests a -X hardcopy works, no 
> joy. wen tried.
> 
> 3.. Enter an already defined keybind with exec which runs a shell script 
> manipulating the hardcopy text file.
> -- 
> Has anyone experience/suggestions for this?
> 
> Many thanks.
> 
> Dan
> XB

First, I have my c-a key bound to c-^.  I don't know who thought c-a
was a reasonable choice since it's often used for the beginning of line
in most shells I use.  c-^ is unused by most everything that I have found.

Add this line to your .screenrc to do this:

    escape ^^^^

I don't know if this will help but I created
for myself a key which repainted the scrollback buffer.

    pastefont on
    defscrollback 2000
    register A "\036[g G$>\000\036:exec /home/mgrant/bin/redraw-screen\015"
    bind ^l process A

Some explanation of register A:

\036 is the ctrl-^ character (which was ctrl-a before using the escape comm=
and above)
[       is the copy command (see 
https://www.gnu.org/software/screen/manual/html_=
node/Copy.html#Copy)
g       moves to the beginning of the scrollback buffer (see 
https://www.gnu.org/=
software/screen/manual/html_node/Movement.html#Movement)
<space> sets the first line to be marked
G       moves to the end of the scrollback buffer
$       writes the marked selection to /tmp/screen-exchange (see 
https://www.gnu.=
org/software/screen/manual/html_node/Specials.html#Specials)
\000    ends the command <---- THIS MAY ANSWER YOUR QUESTION
\036    is the ctrl-^ again
:       introduces a command (see 
https://www.gnu.org/software/screen/manual/html=
_node/Colon.html#Colon)
exec    (see https://www.gnu.org/software/screen/manual/html_node/Exec.html#Ex=
ec)
redraw-screen is this command below
\015    is a newline which ends this whole sequence by entering the command

In order to get all of that into a key, I put it in a register and bound a =
key to process that register.

Here is my redraw-screen command:

    #!/usr/bin/perl

    # Use sleep to create a delay so as not to overrun Screen
    use Time::HiRes qw(usleep nanosleep);

    # expects screen dump to already be in /tmp/screen-exchange
    # from the '>' write screen-exchange command in screen
    open(FP,"</tmp/screen-exchange");

    # read screen dump into $a
    @a=3D<FP>;

    for ($i=3D0; $i<@a-1; $i++) {
        print $a[$i];
        usleep(50);
    }
    # special case, if the prompt is the last thing in the dump
    # append a space (you may need to uncomment this)
    #$a[$i] =3D~ s/(\d+])$/\1 /sm;
    print $a[$i]." ";

    # delete the screen dump file
    unlink "/tmp/screen-exchange";

And finally, to use this, you would simply do c-^ c-l and it redraws
the scrollback buffer.  This is extremely useful when you change
screens and change back to a screen and you want to scroll back up.
In my opinion, Screen should do this by default!

And, if anyone else has a better way of redrawing a screen's
scrollback buffer than this, please post!  I spent ages working this
out.  The only thing it does not redraw is the color, though I have
'paste font' enabled.

Hope this helps!

Michael Grant

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]