Terminals, titles, and prompts.
Posted Mon, 28 Dec 2009
I'll start with prompts.
I use zsh. My prompt looks like this:
# Plain snack(~) % # Long directory is truncated at the left snack(...jects/grok/ruby/test/general) % # I get exit status only if it is nonzero: snack(~) % true snack(~) % false snack(~) !1! % # if I am root, and using zsh, the '%' becomes '#' snack(~) #This is all achieved with the following PS1 in zsh:
PS1='%m(%35<...<%~) %(?..!%?! )%# 'We have configurable prompts to give us all kinds of information, why? It's a place to gather context from. I include host, directory, exit status, and an "am i root" flag.
PS1 isn't the only place you can store useful state. I like to have similar information in my terminal's titlebar, too. I use screen and xterm, and both can be fed some delicious data.
I use this in my .screenrc, which tells screen to have some default status format and tells screen how to change xterm's title. I have it include the screen window number (%n), hostname (%h), and terminal title (%t):
hardstatus string "[%n] %h - %t" termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen (not title yet)\007' windowlist title "Num Name%=Location Flags" windowlist string "%03n %t%=%h %f"I also use this bit of .vimrc, which tells vim what kind of title I want, and if the $TERM is screen, how to tell screen about it.
" Set title string and push it to xterm/screen window title set titlestring=vim\ %<%F%(\ %)%m%h%w%=%l/%L-%P set titlelen=70 if &term == "screen" set t_ts=^[k set t_fs=^[\ endif if &term == "screen" || &term == "xterm" set title endifAnd then use this bit of my zshrc.
All of these combined together make for some pretty good terminal and screen titles. The functions preexec, precmd, and title, mentioned below, come from the above zshrc link.
The preexec function in my zshrc runs before each command execution and allows me to change the terminal title to reflect the command I am running. It also supports resumed execution of a process: if you run 'cat', then hit ^Z, then type 'fg', the title will correctly be set to 'cat' again.
The precmd function runs before each prompt. Rather than cluttering up $PS1 with byte strings to set the title, I just make precmd set the title to 'zsh - $PWD'.
The title function takes care of any necessary escaping and also does nice things like string truncation if it is too long (similar to how my $PS1 is configured).
I only use vim's titlestring options because it gives me some better context on what I am doing in vim at the time, mainly because vim allows you to edit multiple files at once.
Here's an example of a few screen windows in a single screen session when viewed in the windowlist:
The same data listed above is combined into the actual terminal's title. Window 2 above would have this title in xterm:
 jls - zsh - /home/jsissel
I mentioned above that I use screen and xterm together. I do this for everything using run-xterm.sh. This script will run screen in an xterm with a randomly chosen, dark color background. I find the dark-random color selection quite a nice deviation from the solid-black my desktop used to bear. Here's what it looks like if I run a 20+ xterms on a blank desktop: