I would like to use GNU screen as a window manager.
By default screen seems like little more than a persistent shell (that you can resume even after logging out). By itself, this is incredibly useful if you wish to access the exact same terminal session from different locations.
For example, on the command-line you can run screen or start a named session, i.e.,
$ screen -S sessionname
This starts a new shell, which you can detach from by pressing Ctrl-a and then d, i.e.,
^A d
Ctrl-a is the default command-key, you press Ctrl-a followed by a screen command. This is abbreviated as ^A in the screen manual.
By default, you’ll also detach from screen by simply closing your terminal.
You can list existing screen sessions, and then re-attach to a screen session as follows,
$ screen -ls There are screens on: 23762.this (Detached) 23814.that (Detached) 2 Sockets in /var/run/screen/S-timwarnock. $ screen -r that
In this case I’ve re-attached to a screen session named “that”.
If a screen session is already attached, and you want to takeover the session, you can do the following,
$ screen -d -r sessionname
If desired, you can use the -D option which will detach and logout the other terminal. You can also use -R to re-attach to a session or create one if it doesn’t exist.
$ screen -d -r ... detach the current attached terminal and then re-attach $ screen -D -r ... and logout the other terminal $ screen -D -R ... and if no session, create one $ screen -D -RR ... and if more than one session, use the first one
I prefer the following command,
$ screen -dRR
This will connect to the first session, politely detach as needed, or create a new one if no screen session exists.
Once you’re attached to screen, you can run multiple windows, split the screen multiple ways, and various other useful tricks. At the very least, here are the most common commands for everyday use:
^A ? - help ^A c - create new window, or screen -t tabname ^A A - rename screen window ^A k - kill a screen window, or ^D (or exit) to properly exit ^A " - window list, change windows ^A n - next window, or ^A space ^A p - previous window ^AA - switch to previous screen (toggle) ^A [0-9] - go to window [0-9] ^A esc - copy mode (for scrollback), ] or esc to abort
If you want to get more advanced, and see what screen can really do, you’ll want to save a .screenrc in your home directory. Otherwise managing multiple windows and split-screens in a single screen session can be quite confusing.
Here is an example screenrc,
# ^A :source ~/.screenrc bind , source "$HOME/.screenrc" # no default message, no audible bell startup_message off vbell on # more usable scrollback scrollback 5000 # detach on hangup autodetach on # make bold work attrcolor b ".I" attrcolor i "+b" # hardstatus and caption hardstatus alwayslastline "%{= wk}%-w%{= Bw} %n %t %{-}%+w %-= %H [ %Y-%m-%d %c:%s ]" caption splitonly "%{= wK}%-w%?%F%{= bw}%:%{= Wk}%? %n %t %{-}%+w %-= " # resize bind + resize +5 bind - resize -5 bind = resize = # bindings bind % screen -t top top
Using the above screenrc with a resized split-screen looks like this:
The important bits of the screenrc are the hardstatus and caption. The hardstatus can set the bottom line in a terminal, in this case a window-list highlighting the active window, the date and time, and the hostname of the machine running the screen session.
The hostname is also on my command-prompt, but it’s useful for me to know the hostname running the screen session separate from wherever the current shell happens to be logged in.
The caption in this case is set to only display when the screen is split. You can split a screen multiple times. In this case the caption will appear underneath its respective window.
The commands to split a window are as follows,
^A S – split screen ^A Q – return to non split view ^A Tab - move to the next window in split-display ^A :resize [n|+n|-n]
In the above screenrc, I’ve bound custom commands for resizing, this way you simply hit Ctrl-A followed by + or – to resize the active window (or = to return to the default size).
To copy+paste within screen, you enter “copy mode” and can view the scrollback buffer. Once in copy mode you hit enter to start selecting, and enter again to end your selection.
^A esc - copy mode, or ^A ] ^A ] - to paste
If you’re using screen to manage several windows and want to be alerted when something changes on a given window, you can use monitoring. This simply alerts you of activity on a given window, or silence in the case you were expecting activity.
^A M - monitor for activity ^A _ - monitor for silence (default 30 seconds)
Lastly, you can log a screen window or do a simple grab of the contents currently on display, i.e.,
^A h - screen-grab ^A H - logging