Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A killer GNU Screen Config
# the following two lines give a two-line status, with the current window highlighted
hardstatus alwayslastline
hardstatus string '%{= kG}[%{G}%H%? %1`%?%{g}][%= %{= kw}%-w%{+b yk} %n*%t%?(%u)%? %{-}%+w %=%{g}][%{B}%m/%d %{W}%C%A%{g}]'
# huge scrollback buffer
defscrollback 5000
# no welcome message
startup_message off
# 256 colors
attrcolor b ".I"
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
defbce on
# mouse tracking allows to switch region focus by clicking
mousetrack on
# default windows
screen -t Shell1 1 bash
screen -t Shell2 2 bash
screen -t Python 3 python
screen -t Media 4 bash
select 0
bind c screen 1 # window numbering starts at 1 not 0
bind 0 select 10
# get rid of silly xoff stuff
bind s split
# layouts
layout autosave on
layout new one
select 1
layout new two
select 1
split
resize -v +8
focus down
select 4
focus up
layout new three
select 1
split
resize -v +7
focus down
select 3
split -v
resize -h +10
focus right
select 4
focus up
layout attach one
layout select one
# navigating regions with Ctrl-arrows
bindkey "^[[1;5D" focus left
bindkey "^[[1;5C" focus right
bindkey "^[[1;5A" focus up
bindkey "^[[1;5B" focus down
# switch windows with F3 (prev) and F4 (next)
bindkey "^[OR" prev
bindkey "^[OS" next
# switch layouts with Ctrl+F3 (prev layout) and Ctrl+F4 (next)
bindkey "^[O1;5R" layout prev
bindkey "^[O1;5S" layout next
# F2 puts Screen into resize mode. Resize regions using hjkl keys.
bindkey "^[OQ" eval "command -c rsz" # enter resize mode
# use hjkl keys to resize regions
bind -c rsz h eval "resize -h -5" "command -c rsz"
bind -c rsz j eval "resize -v -5" "command -c rsz"
bind -c rsz k eval "resize -v +5" "command -c rsz"
bind -c rsz l eval "resize -h +5" "command -c rsz"
# quickly switch between regions using tab and arrows
bind -c rsz \t eval "focus" "command -c rsz" # Tab
bind -c rsz -k kl eval "focus left" "command -c rsz" # Left
bind -c rsz -k kr eval "focus right" "command -c rsz" # Right
bind -c rsz -k ku eval "focus up" "command -c rsz" # Up
bind -c rsz -k kd eval "focus down" "command -c rsz" # Down
@jesseschoff
Copy link

jesseschoff commented Oct 27, 2019

I'm having the same issue as other regarding using the F keys. The screen just flashes and inserts a ~

Can anyone explain how this works?

@joaopizani
Copy link
Author

joaopizani commented Oct 29, 2019

For the people who are having general problems with some keybindings not working: in almost all cases this happens because the keystrokes that are sent to Screen by your terminal emulator do not match the keystrokes that are bound. Different terminal emulators have different opinions on what the hell should happen when keys are pressed, but there is a way to solve your problems:

Produce the escaped literal keystrokes yourself and bind the just-produced keystrokes to whatever you want.

Example: let's say I wanna bind F2, and want to be sure that I bind the correct keystrokes for the terminal I'm using. So:

  • I go to my command-line (wherever), press Ctrl-V followed by the F2 key.
  • The literal (escaped) keystroke will just be put at the cursor position (the terminal does not try to interpret it).
    • In my case (mate-terminal) I got ^[OQ.
  • Then just carefully copy-paste only the character sequence just produced, and insert them in the right place that you want to bind.
    • Example: bindkey "^[OQ" eval "command -c rsz"

This may need to be re-done whenever you change terminal emulator and things don't match again.

@cpasternack
Copy link

cpasternack commented Nov 14, 2019

Many thanks! Reading the manual, and then actually trying to figure out how to get stuff to work is always a bit tricky. This saved me a good few hours of frustration.

window numbering starts at 1 not 0

I missed this, where ever this was mentioned, and then wondered why things didn't work!

@Gabro1984
Copy link

Gabro1984 commented May 21, 2020

Thanks a lot!

@unnamedd
Copy link

unnamedd commented Sep 7, 2020

Amazing configuration man! Thanks a lot! It is helping me a lot to use screen on the iPad with iSH.

@syreal17
Copy link

syreal17 commented Feb 8, 2021

This is really great, thanks! Who knew screen could be so well-configured? XD

@fevisera
Copy link

fevisera commented Feb 14, 2021

Great configuration! Thanks!

I have just find out that lines 68 and 69 (Lines) won't work for me.

Instead of them, I had to conffigure ^[[1;5R and ^[[1;5S keys.

So, it would be:

bindkey "^[[1;5R" layout prev
bindkey "^[[1;5S" layout next

@mudhoney
Copy link

mudhoney commented Jul 10, 2021

Thanks a lot for the configuration!!!
I also use defutf8 on in my .screenrc, helps a lot if you need to work with utf8

@ifrantzis
Copy link

ifrantzis commented Oct 21, 2021

Instead of changing the window numbering to start at 1 I added
bind ` select 0
That key is left of 1 on my keyboard and allows Keyboard position to match the tabs in screen.

@hydrargyrum
Copy link

hydrargyrum commented Jun 3, 2022

@fevisera Tip: it's possible to bind F2 without using terminal-specific sequences, e.g. replace

bindkey "^[OQ" eval "command -c rsz" # enter resize mode

with

bindkey -k k2 eval "command -c rsz" # enter resize mode

because k2 is the termcap name for F2, see man termcap or man terminfo.
Every terminal will set its termcap and screen will use it, no need to hardcode the terminal-specific sequence.

Shift-F2 and Ctrl-F2 are less obvious but do exist in termcap/terminfo:

  • Shift-F2 is equivalent to F14 (F2 + 12 function keys), so is F4 in termcap (bindkey -k)
  • Ctrl-F2 is equivalent to F26 (F2 + 12 + 12 function keys), so is FG in termcap (bindkey -k)

Ctrl-Shift-F2 is F38 though, I don't know why.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment