Vim, Rust, and Uzbl

Vim has a convenient feature called keywordprg which allows you to easily access documentation for the keyword currently under the cursor. This is typically set to man, meaning you can typically only get documentation for shell scripts, system calls and the C standard libraries.

Rust, however, has wonderful documentation for their standard library as well as a few other crates shipped along with it.

To marry these two seems like a great idea, and I must admit that someone beat me to the punch there, but I still don’t find this solution complete for most common browsers (e.g. Firefox, Chrome, etc).

The problem is that a new browser window or tab will be opened for each search, but this usually just gets in the way. You typically want to see just the documentation you have most recently requested, and you always want it to show up in the same place. This predictability and seamless integration with your editor allows you to forget about the process of viewing documentation altogether, which is the ultimate goal.

Enter Uzbl

Uzbl is a browser based around the UNIX philosophy of doing one thing and doing it well, and being easily composable with other tools via text streams. This means that a uzbl-core instance is just the pure essence of a browser: it can navigate to a page and render it. All other aspects of what one might consider a modern browser are added to this core via (typically) python scripts.

What makes this perfect for our application is that a single uzbl instance can be controlled by writing simple text commands to a named pipe. The script for keywordprg then becomes as simple as creating a uzbl instance if it does not exist, and then sending it a command to browse to the Rust documentation for the given keyword.

This means the uzbl window will always reflect the latest request for documentation, without the need for opening more windows or tabs (which aren’t supported by uzbl-core anyway: those are a matter of window management).

uzbl-browser

uzbl-core would work for our purposes, but since it does not support navigation it would be more complicated for the user to explore the documentation.

Luckily a set of wrapper scripts around uzbl-core, called uzbl-browser, have already been developed. Even nicer, their default configuration very closely mimics Vim, with a status bar and modal approach to browsing, closing the gap between editing and browsing documentation even further.

keywordprg

The final script looks something like this:

#!/bin/fish

set SEARCH_TERM $argv[1]
set SEARCH_URI "http://doc.rust-lang.org/std/?search=$SEARCH_TERM"
set UZBL_FIFO_VIM "/tmp/uzbl_fifo_vim"

# Direct existing uzbl instance to search uri, or spawn one if none exists.
if test -p $UZBL_FIFO_VIM
    echo "uri $SEARCH_URI" > $UZBL_FIFO_VIM
else
    uzbl-browser -u $SEARCH_URI -n vim >/dev/null ^&1 &
end

This is written in fish shell, but it could easily be written in any shell or scripting language. I’ve pushed it to a GitHub repo, and would welcome pull requests with versions written in other languages.