Fix documentation formatting
diff --git a/doc/index.rst b/doc/index.rst
index 043078f..ca3da7b 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -1,8 +1,3 @@
-.. Bluejay documentation master file, created by
-   sphinx-quickstart on Sun May 30 17:09:32 2021.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
 The Bluejay Operating System
 ============================
 
@@ -10,7 +5,7 @@
    :target: https://builds.sr.ht/~swisschili/bluejay/commits/.build.yml?
 
 .. toctree::
-   :maxdepth: 2
+   :maxdepth: 4
    :caption: Contents:
    :glob:
    :hidden:
diff --git a/doc/lisp-std.rst b/doc/lisp-std.rst
index b0a33f8..261f388 100644
--- a/doc/lisp-std.rst
+++ b/doc/lisp-std.rst
@@ -11,44 +11,65 @@
 Built-in "functions"
 --------------------
 
+.. function:: (defun function-name (arg1 ... argN) & body)
+
+    Define a function ``function-name`` that takes N arguments with names
+    ``arg1`` ... ``argN``. ``body`` is evaluated in order, with the whole
+    function evaluating to the last expression.
+
+    .. code-block:: lisp
+        
+        (defun greet (name)
+          (string-concat "Hello, " name))
+        ; string-concat isn't even implemented yet, but you get the picture.
+
 .. function:: (if condition true-condition [false-condition])
 
-	Evaluates ``condition``, if it is truthy (non-``nil``) ``true-condition`` is
-	evaluated. Otherwise ``false-condition`` is evaluated. If
-	``false-condition`` is not provided, ``if`` will evaluate to ``nil``.
+    Evaluates ``condition``, if it is truthy (non-``nil``) ``true-condition`` is
+    evaluated. Otherwise ``false-condition`` is evaluated. If
+    ``false-condition`` is not provided and ``condition`` is ``nil``, ``if``
+    will evaluate to ``nil``.
+
+    .. code-block:: lisp
+
+        (print (if (= 2 3)
+                  "2 = 3"
+                  "2 /= 3"))
+        ; 2 /= 3
 
 .. function:: (let1 (variable binding) & body)
 
-	Evaluates ``binding`` and binds it to ``variable``, then evaluates ``body``.
-	After ``body`` is evaluated ``variable`` is unbound.
+    Evaluates ``binding`` and binds it to ``variable``, then evaluates ``body``.
+    After ``body`` is evaluated ``variable`` is unbound.
 
-	.. code-block:: lisp
+    .. code-block:: lisp
 
-		(let1 (greeting (greet "John"))
-		  (do-something greeting)
-		  (print greeting))
-		; greeting is no longer bound
+        (let1 (greeting (greet "John"))
+          (do-something greeting)
+          (print greeting))
+        ; greeting is no longer bound
 
 .. function:: (gc)
 
-	Force the garbage collector (GC) to run.
+    Force the garbage collector (GC) to run.
 
 Functions
 ---------
 
 .. function:: (car pair)
 
-	Return the first item in ``pair``.
+    Return the first item in ``pair``.
 
 .. function:: (cdr pair)
 
-	Return the second (last) item in ``pair``.
+    Return the second (last) item in ``pair``.
 
 .. function:: (cons a b)
 
-	Return a cons-pair containing ``a`` and ``b``.
+    Return a cons-pair containing ``a`` and ``b``.
 
 .. function:: (print val)
 
-	Print out ``val`` to standard output. This will not be formatted as an
-	s-expression, but in a manner more similar to the internal representation.
\ No newline at end of file
+    Print out ``val`` to standard output. This will not be formatted as an
+    s-expression, but in a manner more similar to the internal representation.
+
diff --git a/doc/logging.rst b/doc/logging.rst
index fd43282..9663d98 100644
--- a/doc/logging.rst
+++ b/doc/logging.rst
@@ -5,8 +5,10 @@
 (currently only VGA since it is the only display target implemented) using
 ``kprintf`` in ``include/kernel/log.h``. Additional defines in the same file may
 help differentiate different types of log messages (i.e. errors, debug
-information, etc). ::
+information, etc).
+
+.. code-block:: c
 
     kprintf(OKAY "Something succeeded\n");
-	kprintf(ERROR "Something failed :(\n");
-	// etc, see log.h for details
+    kprintf(ERROR "Something failed :(\n");
+    // etc, see log.h for details