Fast window switching: Bash tricks
As a follow up to Fast window switching, I'm gonna present here a few Bash tricks to have terminal windows title as useful as possible.
Let's list what informations we want:
- user name,
- host name,
- working directory path,
- currently running command,
- a possibility to desambiguate two similar titles if we need to.
To have those informations in the title we use special Bash escape control
character in the PS1
environment variable. The PS1
variable is evaluated after each command is executed and the result of its
expansion is used as your prompt.
PS1="\[\e]0;\u@\h:\w\a\]$PS1"
This line of code in your .bashrc (after you set your usual PS1
value) will make your terminal windows title look like
"username@hostname:/working/directory".
We also said we'd like to have the current command in our windows title. The problem is that as I said before, the evaluation of this variable takes place after the command is executed in order to display your prompt again, and it's not very interesting to have the last command you used in the title. We need to have it while the command is running to be able to easily fast switch to terminals running editors, mail readers or REPL (programming languages, databases...) for instance.
The solution here is a dirty hack: we trap the DEBUG Bash signal and call a function which set the title we want:
function___set_title () { local WD=$(pwd | sed "s/^\/home\/$USER/~/") echo -ne "\e]0;$USER@$HOSTNAME:$WD ($1)\a" } trap '___set_title "$BASH_COMMAND"' DEBUG
These lines in your .bashrc will make your terminal windows title look like "username@hostname:/working/directory (currently running command)".
That's already very good, but you still may have two terminal windows with
the same title. So we need a way to name our windows with a name we can
randomly choose. To acheive this we simply get the ___set_title
function and PS1
to put a specific variable at the beginning of
the title. And we write a little Bash function that will set this variable
value for the current session.
Here is the resulting code:
export LOCALNAME="" function termname () { export LOCALNAME="$1|"; } PS1="\[\e]0;\${LOCALNAME}\u@\h:\w\a\]$PS1" function ___set_title () { local WD=$(pwd | sed "s/^\/home\/$USER/~/") echo -ne "\e]0;${LOCALNAME}$USER@$HOSTNAME:$WD ($1)\a" } trap '___set_title "$BASH_COMMAND"' DEBUG
And this enable you to name your windows using the termname
command with the name you decide as argument. Your window's title will then
look like
"name|username@hostname:/working/directory
(currently running command)" (or without the running command if
there's not one).
Don't forget to also set this up in hosts where you frequently ssh to so the username and hostname in the title are useful for real :-p.