Desktop in a shell

People are using computers, everywhere, really! ;)

As you might guess correctly, so do I.

Basically, I am using three computers: my laptop (ThinkPad X201s, awesome machine, but pabs told me not to post any more adverts for ThinkPads on Planet Debian g), my smartphone (Motorola Milestone, yes, that counts as a computer) and "random_pc" (for random as in my girlfriends or some other trusted (!!!) friends computer).

My laptop is running Debian GNU/Linux unstable with Xfce4.6, my smartphone is running Android 2.2.1 Froyo, my girlfriend has Ubuntu with GNOME, a friend runs Debian unstable with GNOME, another one Arch Linux with KDE4 and so on. And on all these machines I want be able to work, which means I have to read mail and rss, chat via IRC, JabberXMPP and ICQ, have a look at my to-do list, ssh into different machines, write some code, tweet and dent etc.

In the following series of posts I will describe how I can handle about 90% of my work on every (trusted) computer out there, using ssh, screen, mutt, irssi, BitlBee, newsbeuter etc.

As I am describing the setup as a "Desktop in a shell", let's start with a login- and desktop/window-manager: ssh+screen.


Obviously, you need a machine to ssh into it, where the "Desktop" will live on. For me, that's my home router/fileserver/vm-server dorei, running Debian GNU/Linux LennySqueeze with OpenSSH as a kind of "login manager" ;)

Yes, my user is allowed to login with a password instead of a public key. And well, that's all for the login-manager, no extra configuration needed.


After logging in, I start my "window-manager" with screen -rd, -r for reattach a running screen session, -d for detach it if it is already attached somewhere else. Or I can start a new session by just typing screen. Inside the screen I have multiple windows (one can create new ones with ^A c) with all the needed software running. I can switch windows by pressing ^A N, N being the number of the window, ^A n for the next window, ^A p for the previous one or ^A ^a for the last one. Or I can get a window-list with ^A w. If needed, I can rename windows with ^A A, followed by the new name. That should be enough for almost everyone. Let's just add a window-list to the bottom (as you might have seen on GNOME, Xfce, KDE and even Windows ;) by adding the following to the ~/.screenrc:

caption always " "                    # clear line before hardstatus
hardstatus alwayslastline "%{= kb}[ %{B}%H:$USER %{b}][ %=%{w}%?%-Lw%?%{b}(%{W}%n*%f %t%?(%u)%?%{b})%{w}%?%+Lw%?%?%= %{b}][%{B} %l %{B}%{W}%d.%0m %{b}]"

You get the current host- and username, the machine load and the date for free ;)

Even if it is possible, I do not have any "autostart" like stuff in my .screenrc as the machine is running stable and I start the screen and the apps inside maybe once a year after a reboot.


My .screenrc looks like this:

# detach on hangup
  autodetach on
# don't display the copyright page
  startup_message off
# set scrollback to 2000 lines, default 100
  defscrollback 2000
# set silencewait to 15 seconds, default 30
  silencewait 15
# new shells should be started as login-shells
  shell -$SHELL
# make a fancy statusline
  caption always " "                    # clear line before hardstatus
  hardstatus alwayslastline "%{= kb}[ %{B}%H:$USER %{b}][ %=%{w}%?%-Lw%?%{b}(%{W}%n*%f %t%?(%u)%?%{b})%{w}%?%+Lw%?%?%= %{b}][%{B} %l %{B}%{W}%d.%0m %{b}]"
# make higlighting bold, black on blue background
  sorendition +b bk
# some fixes, no I do not know where they come from :)
  termcap  xterm hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l
  terminfo xterm hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l
  termcapinfo  xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l
  termcapinfo xterm* OL=100
  termcapinfo xterm 'VR=\E[?5h:VN=\E[?5l'
  termcapinfo xterm 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~'
  termcapinfo xterm 'kh=\EOH:kI=\E[2~:kD=\E[3~:kH=\EOF:kP=\E[5~:kN=\E[6~'
  termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'
  termcapinfo xterm 'vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l'
  termcapinfo xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334,{\344,|\366,}\374,~\337'
  termcapinfo xterm* be
  termcapinfo xterm|xterms|xs ti@:te=\E[2J
  termcapinfo wy75-42 xo:hs@
  termcapinfo wy* CS=\E[?1h:CE=\E[?1l:vi=\E[?25l:ve=\E[?25h:VR=\E[?5h:VN=\E[?5l:cb=\E[1K:CD=\E[1J
  termcapinfo  hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@'
  termcap  vt100* ms:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC
  terminfo vt100* ms:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC
  termcapinfo linux C8
# some bindings
  bind k
  bind ^k
  bind .
  bind ^\
  bind \\
  bind ^h
  bind h
  bind 'w' windowlist -b
  bind 'W' windows
  bind 'K' kill
  bind 'I' login on
  bind 'O' login off
  bind '}' history
  bind = resize =
  bind + resize +3
  bind - resize -3
# Mutt demands this
 defbce on
 term screen-bce

That's all for my screen setup. The obvious, boring screenshot follows:

See you next time, when I will present my mutt setup here.


Drinkmilk wrote on 2011-02-20 18:55:

Interesting, thanks. I am looking forward to the next posts of this serie.

Nate wrote on 2011-02-21 00:35:

Very interesting post. I have considered using screen but ran into some issue with the way Vim behaved so I’ve kept it on the back burner. I am looking forward to your post.

One question, are you running your initial screen session from a terminal emulator or the console? I am running XFCE4 on my Sid box which I log into to read my mail remotely with its terminal emulator. I know little about the terminfo settings in your screenrc so I don’t know if they will conflict in some way with XFCE4′s terminal.


evgeni wrote on 2011-02-21 12:26:

I rarely use Vim, so no issues with that here :)

The initial session is usually started from my laptop via ssh using Xfce4 and it’s xfce4-terminal. So no conflicts here. And I must admit I have no clue what the terminfo stuff does, as my screenrc is based on some friends and these lines were just copied over.

Nate wrote on 2011-02-21 13:46:

I tried screen on my desktop and while I like your changes, there are still two issues that may keep me from using it. First is that I get no audible bell, i.e. PC speaker beep from within screen. Second is that attempting to navigate by word in Vim using Ctl-arrow results in some weird text manipulation. I was hurriedly replying to a message on Debian User so I didn’t investigate further.

Typically, I only use Mutt, or Midnight Commander, or Bash aliases on my remote login sessions so it isn’t critical that I keep a program running. That said, since switching Mutt to Maildir it does not seem to mind much if I leave the one on the desktop running and then work with mail via a remote login.

What editor do you use? I’m always looking for Mutt tips so your next post should be interesting.

evgeni wrote on 2011-02-21 14:11:

Yeah, Ctrl-Arrow eats lines here too. With and without my .screenrc. No idea why.

And no idea about audible bell either, I do not like that feature anyways :)

Editor? nano with text highlighting and stuff. And geany on the “real” desktop.

Iñigo wrote on 2011-02-21 15:47:

Hi, nice post.

I’ve this in my shell rc, so I don’t need to launch screen:

[ -n "$SSH_CONNECTION" ] && \

[ "x$TERM" != 'xscreen' ] && \

screen -dR


evgeni wrote on 2011-02-21 15:50:

This looks cool, but does not perfectly match my usecase, as I sometimes connect to the box without wanting to open the screen.

Thanks for the tip, I bet it will be useful for someone :)

Seegras wrote on 2011-02-22 12:58:

I’m one of those people too, with mutt, newsbeuter etc. on the console. And generally happy with it, but…

Right now I use calcurse as calendar, however, I’m not really satisfied with it. I took a look at remind/wyrd, and even wrote the beginnings of a conversion-script from calcurse to remind, but there is one thing that this still lacks: caldave-support.

And on a related note, a way to synchronize address-books with mutt to whatever (e.g. kaddressbook, android, maybe via webdav) would also be very useful.

So in my opinion, the “console-desktop” just isn’t here right now ;)

Marcel wrote on 2011-02-22 14:23:

Did you check out byobu? It is a screen wrapper that comes with a nice set of status messages and so on – no need to write your own .screenrc ;) It was written for Ubuntu but is in the Debian repos as well (but an older version of it).

evgeni wrote on 2011-02-22 14:29:

Nope, didn’t know about byobu yet. Thanks for the tip, will check it out.

Send your comments to and I will publish them here (if you want).