> Would you mind sharing your .screenrc? I feel like I could learn a lot from
> it. Or if you have a dotfiles repo on github that would be fantastic too.
Sure. I don’t have them in a public repo. If anything isn’t clear, please
ask. Hope this is interesting/helpful to someone!
I almost always have a KiTTY (which is a fork of PuTTY) ssh window open to my
servers. I have a desktop and laptop which I work from interchangeably. I
like being able to just pop open my laptop and continue where I was without
having to mess around ssh’ing in. It’s “always on”. Second thing I do a lot
is flip around between 4 screens: 3 shells and an emacs. I bound F9 to F12 to
these 4 screens for easy. I use Ctrl-^ Ctrl-L to repaint the scrollback buffer.
I start Screen from my .bash_login script which looks for currently running
screens. This is reminiscent of the old Tops-20 when it would ask you to
reattach to a detached tree (This message may not be exactly the same as
Tops-20, please forgive me).
.bash_login:
screen -wipe
# Get list of screens available to re-attach to
a=`screen -ls | awk '/pts/ { print $1 }'`
if [ "$a" ]; then
set $a
if [ $# = 1 ]; then
# Single screen running
if [ "$AUTOLOGIN" ]; then
exec screen -U -xRR
fi
read -n1 -r -p"--Attach Your Detached Tree-- (y/n) [space=y]" && [[
("$REPLY" = "y") || ("$REPLY" = " ") || ("$REPLY" = "0") ]] && exec screen -U
-xRR
else
# Multiple screens running
read -n1 -r -p"--Attach A Detached Tree- (number) [space=1]-"
echo got $REPLY
if [[ "$REPLY" = " " ]]; then REPLY=1; fi
if [[ $REPLY =~ [0-9] ]]; then
b=`echo $a | awk 'NF='$REPLY' { print $0 }'`
exec screen -U -x -r $b
fi
fi
fi
# Screen not running
echo "type 'screen' to start screen"
This needs some explanation of the auto-login, auto-starting of screen stuff.
In /etc/ssh/sshd_config I have this to allow me to pass this env variable:
AcceptEnv AUTOLOGIN
At some point, I got tired of hitting space each time I logged in so I added an
this environment variable to bypass that. AUTOLOGIN = 1 is set in KiTTY’s
Connection->Data->Environment variables section (this variable is my own flag,
not part of anything else). KiTTY allows auto-reconnect (Connection->Reconnect
options), which works well with this setup. This variable is simply telling my
.bash_login script that I enabled KiTTY’s auto reconnect feature. The
bash_login script above, if it sees AUTOLOGIN set to something, it bypasses
asking the question and just restarts screen. This is really just a safety in
case something is messed up. I should still be able to log into my server by
unsetting this variable and bypassing automatically starting screen. Trust me,
it’s saved me plenty of times!
My .screenrc:
# Set the Attention character to Ctrl-^ because this is generally not used.
Ctrl-A is used for beginning of the line in shell and emacs.
escape ^^^^
startup_message off
vbell off
multiuser on
fit
pastefont on
defscrollback 10000
# fix delete key
bindkey -k kD stuff "^?"
bindkey "\033[3~" stuff "^?"
# f9,f10,f11,f12 selects window 3,0,1,2
# (f11 = shift-f1, f12 = shift-f2)
bindkey -k k8 select 0
bindkey -k k9 select 1
bindkey -k k; select 2
bindkey -k F1 select 3
bindkey -k F2 select 4
# same thing but for Sun keyboard
bindkey "\033[231z" select 0
bindkey "\033[232z" select 1
bindkey "\033[233z" select 2
bindkey "\033[192z" select 3
bindkey "\033[193z" select 4
#markkeys "h=^B:j=^P:k=^N:l=^F:$=^E"
# This script “repaints” the scrollback buffer. Ctrl-^ Ctrl-L writes the
scrollback buffer to
# a temp file and then cats it back out. Doesn’t save the coloring but best I
could do.
register A "\036[g G$>\000\036:exec /home/mgrant/bin/redraw-screen\015"
bind ^l process A
# \036 is the ctrl-^ character (which was ctrl-a before using the escape
command 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#Exec)
# redraw-screen is this command below
# \015 is a newline which ends this whole sequence by entering the command
# so the current directory, some tabs and the server time can be put in the
status line
hardstatus alwayslastline
# trused users on my system so that we can share a screen
acladd friend1,friend2
# My hard status line is: machine-name [load] tabs | datetime
# The current window’s name is inversed so it looks like a tab, it’s the same
color as the background of the ssh window
hardstatus string "%{= KW}%H %{= Kk}[%l]%{-} %{= Kw}|%{-} %-Lw%{= kW} %n%f %t
%{-}%+Lw | %{= KR}%u%{-} %=%Y-%M-%d %0c"
#
# http://www.gnu.org/software/screen/manual/html_node/String-Escapes.html
#
# %{= KW} : set colors to bright white text (W) on grey background (K) and keep
current text styles (=)
# %H : hostname
# [ : opening bracket character
# %l : print load
# ] : closing bracket character
# %{= Kw} : set colors to white text (w) on grey background (K) and keep
current text styles (=)
# | : bar character
# ${-} : restore colors to previous colors / undo last color change
# list of windows with active window in black:
# %-Lw : list windows before current window (L [optional] = "include
flags")
# %{= bW} : set colors to bright white (W) on black (k) and keep current text
styles (=)
# %f : window flags (see http://aperiodic.net/screen/window_flags)
# %t : window title
# %{-} : restore colors to previous colors / undo last color change
# %+Lw : list windows after current window (L [optional] = "include flags")
# | : bar character
# %{= KR} : set the colors to bright red text (R) on grey background (K) and
keep current text styles (=)
# %u : list other users of this window
# %{-} : restore colors to previous colors / undo last color change
# %= : expand to fill all space (used here to make remaining content flush
right)
# %Y : current year
# - : hyphen character
# %m : current month (0-padded; %M for "Jan" etc.)
# - : hyphen character
# %d : current date (0-padded)
# %c : current time (12-hr is %C; 24-hr is %c)
# %a : am/pm (lowercase; uppercase is %A)
# Start 3 shells and an emacs which I flip around using F9 to F12.
# F9 = shell 1
# F10 = shell 2
# F11 = shell 3
# F12 = emacs
screen 1
screen 2
screen 3
screen 4 emacs
/home/mgrant/bin/redraw-screen:
#!/usr/bin/perl
use Time::HiRes qw(usleep nanosleep);
# expects screen dump to already be in /tmp/screen-exchange
# from the '>' write screen-exchange command in screen
# See screen(1) man page “C-a <” or search for ‘screen-exchange’.
open(FP,"</tmp/screen-exchange");
# read screen dump into $a
@a=<FP>;
# print out lines not too fast or it messes things up
for ($i=0; $i<@a-1; $i++) {
print $a[$i];
usleep(50);
}
# special case, if the prompt is the last thing in the dump
# append a space
#$a[$i] =~ s/(\d+])$/\1 /sm;
print $a[$i]." ";
# delete the screen dump file
unlink "/tmp/screen-exchange";