diff --git a/doc/pydoc/test.tc_ui.html b/doc/pydoc/test.tc_ui.html
new file mode 100644
index 00000000..fcea943d
--- /dev/null
+++ b/doc/pydoc/test.tc_ui.html
@@ -0,0 +1,294 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module test.tc_ui</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="test.html"><font color="#ffffff">test</font></a>.tc_ui</strong></big></big></font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/work/ranger/test/tc_ui.py">/home/hut/work/ranger/test/tc_ui.py</a></font></td></tr></table>
+ <p></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="curses.html">curses</a><br>
+</td><td width="25%" valign=top><a href="ranger.gui.ui.html">ranger.gui.ui</a><br>
+</td><td width="25%" valign=top><a href="unittest.html">unittest</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom> <br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt> </tt></td><td> </td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="unittest.html#TestCase">unittest.TestCase</a>(<a href="builtins.html#object">builtins.object</a>)
+</font></dt><dd>
+<dl>
+<dt><font face="helvetica, arial"><a href="test.tc_ui.html#Test">Test</a>
+</font></dt></dl>
+</dd>
+</dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom> <br>
+<font color="#000000" face="helvetica, arial"><a name="Test">class <strong>Test</strong></a>(<a href="unittest.html#TestCase">unittest.TestCase</a>)</font></td></tr>
+
+<tr><td bgcolor="#ffc8d8"><tt> </tt></td><td> </td>
+<td width="100%"><dl><dt>Method resolution order:</dt>
+<dd><a href="test.tc_ui.html#Test">Test</a></dd>
+<dd><a href="unittest.html#TestCase">unittest.TestCase</a></dd>
+<dd><a href="builtins.html#object">builtins.object</a></deight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */#!/usr/bin/env zsh
# Helper to more conveniently open commonly-used SubX programs.
if [ $# -eq 0 ]
then
echo "Usage: $0 <file root without subdirectory or .subx extension>"
echo
echo "Naming convention: Files starting with 'ex' will be assumed to live in examples/"
echo "Other files will be assumed to live in apps/"
exit 1
fi
if [[ $EDITOR == *'vim'* ]]
then
$EDITOR -S vimrc.vim apps/$1.subx
else
$EDITOR apps/$1.subx
fi
t;TestCase</a> subclasses that need to register<br>
+their own type equality functions to provide nicer error messages.<br>
+ <br>
+Args:<br>
+ typeobj: The data type to call this function on when both values<br>
+ are of the same type in <a href="#Test-assertEqual">assertEqual</a>().<br>
+ function: The callable taking two arguments and an optional<br>
+ msg= argument that raises self.<strong>failureException</strong> with a<br>
+ useful error message when the two arguments are not equal.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertAlmostEqual"><strong>assertAlmostEqual</strong></a>(self, first, second, *, places<font color="#909090">=7</font>, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are unequal as determined by their<br>
+difference rounded to the given number of decimal places<br>
+(default 7) and comparing to zero.<br>
+ <br>
+Note that decimal places (from zero) are usually not the same<br>
+as significant digits (measured from the most signficant digit).</tt></dd></dl>
+
+<dl><dt><a name="Test-assertAlmostEquals"><strong>assertAlmostEquals</strong></a> = assertAlmostEqual(self, first, second, *, places<font color="#909090">=7</font>, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are unequal as determined by their<br>
+difference rounded to the given number of decimal places<br>
+(default 7) and comparing to zero.<br>
+ <br>
+Note that decimal places (from zero) are usually not the same<br>
+as significant digits (measured from the most signficant digit).</tt></dd></dl>
+
+<dl><dt><a name="Test-assertDictContainsSubset"><strong>assertDictContainsSubset</strong></a>(self, expected, actual, msg<font color="#909090">=None</font>)</dt><dd><tt>Checks whether actual is a superset of expected.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertDictEqual"><strong>assertDictEqual</strong></a>(self, d1, d2, msg<font color="#909090">=None</font>)</dt></dl>
+
+<dl><dt><a name="Test-assertEqual"><strong>assertEqual</strong></a>(self, first, second, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are unequal as determined by the '=='<br>
+operator.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertEquals"><strong>assertEquals</strong></a> = assertEqual(self, first, second, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are unequal as determined by the '=='<br>
+operator.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertFalse"><strong>assertFalse</strong></a>(self, expr, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail the test if the expression is true.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertGreater"><strong>assertGreater</strong></a>(self, a, b, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a > b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertGreaterEqual"><strong>assertGreaterEqual</strong></a>(self, a, b, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a >= b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertIn"><strong>assertIn</strong></a>(self, member, container, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a in b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertIs"><strong>assertIs</strong></a>(self, expr1, expr2, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a is b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertIsNone"><strong>assertIsNone</strong></a>(self, obj, msg<font color="#909090">=None</font>)</dt><dd><tt>Same as <a href="#Test-assertTrue">assertTrue</a>(obj is None), with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertIsNot"><strong>assertIsNot</strong></a>(self, expr1, expr2, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a is not b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertIsNotNone"><strong>assertIsNotNone</strong></a>(self, obj, msg<font color="#909090">=None</font>)</dt><dd><tt>Included for symmetry with assertIsNone.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertLess"><strong>assertLess</strong></a>(self, a, b, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a < b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertLessEqual"><strong>assertLessEqual</strong></a>(self, a, b, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a <= b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertListEqual"><strong>assertListEqual</strong></a>(self, list1, list2, msg<font color="#909090">=None</font>)</dt><dd><tt>A list-specific equality assertion.<br>
+ <br>
+Args:<br>
+ list1: The first list to compare.<br>
+ list2: The second list to compare.<br>
+ msg: Optional message to use on failure instead of a list of<br>
+ differences.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertMultiLineEqual"><strong>assertMultiLineEqual</strong></a>(self, first, second, msg<font color="#909090">=None</font>)</dt><dd><tt>Assert that two multi-line strings are equal.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertNotAlmostEqual"><strong>assertNotAlmostEqual</strong></a>(self, first, second, *, places<font color="#909090">=7</font>, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are equal as determined by their<br>
+difference rounded to the given number of decimal places<br>
+(default 7) and comparing to zero.<br>
+ <br>
+Note that decimal places (from zero) are usually not the same<br>
+as significant digits (measured from the most signficant digit).</tt></dd></dl>
+
+<dl><dt><a name="Test-assertNotAlmostEquals"><strong>assertNotAlmostEquals</strong></a> = assertNotAlmostEqual(self, first, second, *, places<font color="#909090">=7</font>, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are equal as determined by their<br>
+difference rounded to the given number of decimal places<br>
+(default 7) and comparing to zero.<br>
+ <br>
+Note that decimal places (from zero) are usually not the same<br>
+as significant digits (measured from the most signficant digit).</tt></dd></dl>
+
+<dl><dt><a name="Test-assertNotEqual"><strong>assertNotEqual</strong></a>(self, first, second, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are equal as determined by the '=='<br>
+operator.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertNotEquals"><strong>assertNotEquals</strong></a> = assertNotEqual(self, first, second, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail if the two objects are equal as determined by the '=='<br>
+operator.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertNotIn"><strong>assertNotIn</strong></a>(self, member, container, msg<font color="#909090">=None</font>)</dt><dd><tt>Just like <a href="#Test-assertTrue">assertTrue</a>(a not in b), but with a nicer default message.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertRaises"><strong>assertRaises</strong></a>(self, excClass, callableObj<font color="#909090">=None</font>, *args, **kwargs)</dt><dd><tt>Fail unless an exception of class excClass is thrown<br>
+by callableObj when invoked with arguments args and keyword<br>
+arguments kwargs. If a different type of exception is<br>
+thrown, it will not be caught, and the test case will be<br>
+deemed to have suffered an error, exactly as for an<br>
+unexpected exception.<br>
+ <br>
+If called with callableObj omitted or None, will return a<br>
+context object used like this::<br>
+ <br>
+ with <a href="#Test-assertRaises">assertRaises</a>(some_error_class):<br>
+ do_something()</tt></dd></dl>
+
+<dl><dt><a name="Test-assertRaisesRegexp"><strong>assertRaisesRegexp</strong></a>(self, expected_exception, expected_regexp, callable_obj<font color="#909090">=None</font>, *args, **kwargs)</dt><dd><tt>Asserts that the message in a raised exception matches a regexp.<br>
+ <br>
+Args:<br>
+ expected_exception: Exception class expected to be raised.<br>
+ expected_regexp: Regexp (re pattern object or string) expected<br>
+ to be found in error message.<br>
+ callable_obj: Function to be called.<br>
+ args: Extra args.<br>
+ kwargs: Extra kwargs.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertRegexpMatches"><strong>assertRegexpMatches</strong></a>(self, text, expected_regex, msg<font color="#909090">=None</font>)</dt></dl>
+
+<dl><dt><a name="Test-assertSameElements"><strong>assertSameElements</strong></a>(self, expected_seq, actual_seq, msg<font color="#909090">=None</font>)</dt><dd><tt>An unordered sequence specific comparison.<br>
+ <br>
+Raises with an error message listing which elements of expected_seq<br>
+are missing from actual_seq and vice versa if any.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertSequenceEqual"><strong>assertSequenceEqual</strong></a>(self, seq1, seq2, msg<font color="#909090">=None</font>, seq_type<font color="#909090">=None</font>)</dt><dd><tt>An equality assertion for ordered sequences (like lists and tuples).<br>
+ <br>
+For the purposes of this function, a valid orderd sequence type is one<br>
+which can be indexed, has a length, and has an equality operator.<br>
+ <br>
+Args:<br>
+ seq1: The first sequence to compare.<br>
+ seq2: The second sequence to compare.<br>
+ seq_type: The expected datatype of the sequences, or None if no<br>
+ datatype should be enforced.<br>
+ msg: Optional message to use on failure instead of a list of<br>
+ differences.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertSetEqual"><strong>assertSetEqual</strong></a>(self, set1, set2, msg<font color="#909090">=None</font>)</dt><dd><tt>A set-specific equality assertion.<br>
+ <br>
+Args:<br>
+ set1: The first set to compare.<br>
+ set2: The second set to compare.<br>
+ msg: Optional message to use on failure instead of a list of<br>
+ differences.<br>
+ <br>
+For more general containership equality, assertSameElements will work<br>
+with things other than sets. This uses ducktyping to support<br>
+different types of sets, and is optimized for sets specifically<br>
+(parameters must support a difference method).</tt></dd></dl>
+
+<dl><dt><a name="Test-assertTrue"><strong>assertTrue</strong></a>(self, expr, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail the test unless the expression is true.</tt></dd></dl>
+
+<dl><dt><a name="Test-assertTupleEqual"><strong>assertTupleEqual</strong></a>(self, tuple1, tuple2, msg<font color="#909090">=None</font>)</dt><dd><tt>A tuple-specific equality assertion.<br>
+ <br>
+Args:<br>
+ tuple1: The first tuple to compare.<br>
+ tuple2: The second tuple to compare.<br>
+ msg: Optional message to use on failure instead of a list of<br>
+ differences.</tt></dd></dl>
+
+<dl><dt><a name="Test-assert_"><strong>assert_</strong></a> = assertTrue(self, expr, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail the test unless the expression is true.</tt></dd></dl>
+
+<dl><dt><a name="Test-countTestCases"><strong>countTestCases</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Test-debug"><strong>debug</strong></a>(self)</dt><dd><tt>Run the test without collecting errors in a TestResult</tt></dd></dl>
+
+<dl><dt><a name="Test-defaultTestResult"><strong>defaultTestResult</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Test-doCleanups"><strong>doCleanups</strong></a>(self)</dt><dd><tt>Execute all cleanup functions. Normally called for you after<br>
+tearDown.</tt></dd></dl>
+
+<dl><dt><a name="Test-fail"><strong>fail</strong></a>(self, msg<font color="#909090">=None</font>)</dt><dd><tt>Fail immediately, with the given message.</tt></dd></dl>
+
+<dl><dt><a name="Test-failIf"><strong>failIf</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failIfAlmostEqual"><strong>failIfAlmostEqual</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failIfEqual"><strong>failIfEqual</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failUnless"><strong>failUnless</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failUnlessAlmostEqual"><strong>failUnlessAlmostEqual</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failUnlessEqual"><strong>failUnlessEqual</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-failUnlessRaises"><strong>failUnlessRaises</strong></a> = deprecated_func(*args, **kwargs)</dt></dl>
+
+<dl><dt><a name="Test-id"><strong>id</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Test-run"><strong>run</strong></a>(self, result<font color="#909090">=None</font>)</dt></dl>
+
+<dl><dt><a name="Test-shortDescription"><strong>shortDescription</strong></a>(self)</dt><dd><tt>Returns both the test method name and first line of its docstring.<br>
+ <br>
+If no docstring is given, only returns the method name.<br>
+ <br>
+This method overrides unittest.<a href="unittest.html#TestCase">TestCase</a>.<a href="#Test-shortDescription">shortDescription</a>(), which<br>
+only returns the first line of the docstring, obscuring the name<br>
+of the test upon failure.</tt></dd></dl>
+
+<dl><dt><a name="Test-skipTest"><strong>skipTest</strong></a>(self, reason)</dt><dd><tt>Skip this test.</tt></dd></dl>
+
+<hr>
+Data descriptors inherited from <a href="unittest.html#TestCase">unittest.TestCase</a>:<br>
+<dl><dt><strong>__dict__</strong></dt>
+<dd><tt>dictionary for instance variables (if defined)</tt></dd>
+</dl>
+<dl><dt><strong>__weakref__</strong></dt>
+<dd><tt>list of weak references to the object (if defined)</tt></dd>
+</dl>
+<hr>
+Data and other attributes inherited from <a href="unittest.html#TestCase">unittest.TestCase</a>:<br>
+<dl><dt><strong>failureException</strong> = <class 'AssertionError'><dd><tt>Assertion failed.</tt></dl>
+
+<dl><dt><strong>longMessage</strong> = False</dl>
+
+</td></tr></table></td></tr></table>
+</body></html>
\ No newline at end of file
|