Exporting VIM Syntax Highlight

by Jean-Michel Lacroix on

I've been looking for a tool to replace the GitHub Gists I'm using to highlight code on these pages. Gists are great, but I wanted something that doesn't rely on JavaScript (for SEO, accessibility and performance reasons).

While taking a look at 3rd party libs, I flashed: why not use the output of my favorite editor, VIM? It has powerful syntax highlighting and a lot of syntax files. I can even use color schemes and some of VIM's settings, such as line numbering, to make my life easier (and it reads my vimrc!).

So instead of using simple tools, I went for the complicated solution. I made two script to help extracting HTML-formatted syntax and its associated CSS styles. Note that these scripts outputs their results on stdout, so they won't alter your files.

Converting to HTML

highlight.sh outputs HTML-formatted syntax highlight of a file:

#/bin/bash

OUTFILE=$(mktemp -t highlight)

INFILE=$1
PARAM="set nonumber"

if [ -z "$INFILE" ]
then
    echo "usage: $0 source.file"
    exit
fi

vim +"$PARAM" \
    +'let html_use_css=1' \
    +'TOhtml' \
    +'/<pre>/,/<\/pre>/d a' \
    +'g/./d' \
    +'1pu! a' \
    +'$d' \
    +"wq! $OUTFILE" \
    +'q!' $INFILE &>/dev/null

cat $OUTFILE && rm $OUTFILE

Try the script on itself:

$ bash highlight.sh highlight.sh

Extracting CSS

syntax.sh loads VIM's syntax test and outputs its generated CSS styles:

#!/bin/bash

OUTFILE=$(mktemp -t syntax)

vim +'so $VIMRUNTIME/syntax/hitest.vim' \
    +'let html_use_css=1' \
    +'TOhtml' \
    +'v/^\./d' \
    +"wq! $OUTFILE" \
    +'q!' &>/dev/null

cat $OUTFILE && rm $OUTFILE

Extract current vim colors as CSS:

$ bash syntax.sh

Further Integration

Currently, it's not the best way to integrate code into my posts. It's not automated and I need to manually insert the HTML. I've made an awk script to help with this task. I'll post about it when it's integrated into my process.