                             (remove-hook 'after-load-functions #',fun)
                             (apply #'evil-define-key*
                                    ',state ,map-sym ',filtered-bindings))))
-             (add-hook 'after-load-functions fun t))))
-    (puthash map-sym record evil-collection--bindings-record)))
+             (add-hook 'after-load-functions fun t))))))
+
+(defun evil-collection--binding-lessp (a b)
+  "Comparison function used to sort bindings of the form (state key def)."
+  (let ((a-state (symbol-name (nth 0 a)))
+        (b-state (symbol-name (nth 0 b)))
+        (a-key (nth 1 a))
+        (b-key (nth 1 b)))
+    (if (not (string= a-state b-state))
+        (string-lessp a-state b-state)
+      (string-lessp a-key b-key))))
 
 (defun evil-collection-describe-all-bindings ()
   "Print bindings made by Evil Collection to separate buffer."

    (with-current-buffer buf
      (erase-buffer)
      (org-mode)
      (maphash
       (lambda (package bindings)
         (insert "\n\n* " (symbol-name package) )
         (insert "
| Key | Definition |
|-----|------------|
")
         (maphash
          (lambda (key def)
            ;; Don't print nil definitions
            (when def
              (insert (format "| %s | %S |\n"
                              (replace-regexp-in-string
                               "|" "¦" (key-description key))
                              def))))
          bindings)
         (org-table-align))
       evil-collection--bindings-record))))

(defun evil-collection--translate-key (state keymap-symbol
                                             translations

(defvar evil-collection--bindings-record (make-hash-table :test 'eq)
  "Record of bindings currently made by Evil Collection. This is
a hash-table with the package symbol as a key.  The associated
values are the package's bindings which are stored as a list of
the form ((STATE KEY BINDING)).")

(defvar evil-collection-setup-hook nil
  "Hook run by `evil-collection-init' for each mode that is evilified.
