Italic fonts in iTerm2, tmux, and vim
Recently, I’ve been trying to restrict my coding workflow to the terminal. I’ve always used iTerm2 as my terminal, and, since switching to vim about 18 months, have used MacVim as my editor. I felt I was losing efficiency switching between windows though, and losing power by not exploiting things like splits.
Currently, my setup is using iTerm2 with tmux to manage terminal splits and ‘windows’, and then regular old vim to edit. I like it, but the setup’s for another post.
This one is about enabling italics in these three tools. MacVim has native support for italics, and although iTerm2 has supported italics for sometime, getting my italics back proved to be somewhat cumbersome. I’ll explain what I did to get italics in iTerm2, tmux, and vim, as shown below, in this post.
The font 🔗
In order to see italicised text at all, we need a typeface with a italic variant. I like Consolas, which is included in all recent versions of Windows, and will be present on an OS X system if Microsoft Office has been installed. If you don’t have it, you can probably find it online, or use a free typeface with an italic variant like Ubuntu or Anonymous Pro. (There’s also Menlo, which is included with OS X.)
iTerm2 has support for italics built in. First, make sure it’s enabled in your terminal profile.
Next, we need to tell the terminal what italic actually means, which is done by using a special
(This is not a subject I’m familiar with, but worrying about the technicalities here doesn’t seem to be necessary.)
Luckily, one has already been made for us, courtesy of Stefan Schüssler.
# A xterm-256color based TERMINFO that adds the escape sequences for italic.
xterm-256color-italic|xterm with 256 colors and italic,
Create a file called
xterm-256color-italic.terminfo, where ever you like, with the above contents.
This file needs to be processed and added to the
$ tic xterm-256color-italic.terminfo
Finally, we need to tell iTerm2 to use this new
xterm-256color-italic, by default.
This is done in the terminal pane of whatever profile you’re using.
The new entry probably won’t be in the list, but we can just type it in.
If you close and reopen iTerm2, executing the following should show italicised text.
$ echo `tput sitm`italics`tput ritm`
If you don’t see italicised text, something else might be overriding the
TERM environment variable.
Check its value is
$ echo $TERM
If it’s different, check you’re dotfiles (like
I really like having comments in italic. It differentiates them one step more from the surrounding code, and it makes sense semantically too, as a comment is treated very differently from anything else in the source.
To enable italicised comments in vim, add this line to your
.vimrc file after anything else theme related (like
highlight Comment cterm=italic
Then open up a new vim session and type a comment. Glorious.
You could also edit your colorscheme directly by changing the comment highlighting declaration.
If you open up a new tmux session, and then open vim, you’ll notice the italics aren’t working anymore.
This is because the
TERM for a tmux session is, by default, different to that of a non-tmux session.
# Inside a tmux session
$ echo $TERM
To fix this, we need to install a new
TERM entry, like we did before, and then tell tmux to use it.
So, as before, copy the contents below in to a file, this time called
# A screen-256color based TERMINFO that adds the escape sequences for italic.
screen-256color-italic|screen with 256 colors and italic,
If you squint, you’ll notice the only difference to the previous
.terminfo is replacing all instances of
Then, load this in to the
$ tic screen-256color-italic.terminfo
Add a line to your
tmux.conf to tell tmux to use the new
set -g default-terminal "screen-256color-italic"
I suspect there’s a cleverer way, but I had to kill my tmux process to bring the changes into effect.
$ killall tmux
Starting a new tmux session and opening vim, you should see what we’re after: italics!
ssh in to a remote machine from your tmux session, you might get some errors related to your new
This is because the remote machine doesn’t have the database entry we just installed locally.
To fix this, repeat the installation of the
screen entry isn’t necessary if you won’t be using tmux on the remote machine.)
We can extract the terminfo from our local database, and then upload it to the remote machine.
$ infocmp xterm-256color-italic > xterm-256color-italic.terminfo
$ scp xterm-256color-italic.terminfo user@remote:
$ ssh user@remote
# On the remote machine
$ tic xterm-256-italic.terminfo
Repeat for the
You can delete the
.terminfo files, from both the remote and local machines, once you’ve loaded them with
tmux 2.1 and above 🔗
The release of tmux 2.1 saw several changes to the way tmux handles
the terminal type, amongst other things. For getting italics working, we now
need a new terminfo called
Luckily, there’s already an FAQ on how to add the new terminfo entry with a single command.
$ cat <<EOF|tic -x -
tmux|tmux terminal multiplexer,
ritm=\E[23m, rmso=\E[27m, sitm=\E[3m, smso=\E[7m, Ms@,
tmux-256color|tmux with 256 colors,
We then just need to tell tmux to use this new terminfo.
set -g default-terminal "tmux"
You might need to restart your terminal and/or the tmux server for the changes to take effect.
Thanks to Landon Schropp for pointing this out in the comments.