       (eval-print-last-sexp)))
   (load bootstrap-file nil 'nomessage))
 
-;; use-package
-;; -----------
+;; Feature Organization Helper - use-package
+;; =========================================
+;;
+;; use-package is a macro that helps you keep a modular configuration for the
+;; features that you use and customize, which also results in minimal Emacs
+;; startup time.
+;;
+;; It is the next most important package to install as the goal is to have
+;; everything in the init file be encapsulated in use-package forms.
 (straight-use-package 'use-package)
 (setq use-package-always-ensure t)
 
-;; Startup
-;; =======
+;; Libraries
+;; =========
 ;;
-;; Prevent Emacs from creating "~/.emacs.d/auto-save-list" directory on
-;; startup.
-(setq auto-save-list-file-prefix nil)
+;; Declare any libraries that may be used in the init file itself so that they
+;; are available to use.
 
-;; Built-in Minor Modes
-;; ====================
+;; Keybinding Related Libraries
+;; ----------------------------
+;;
+;; Because Emacs relies so heavily on keyboard shortcuts for it's usage,
+;; keybinding configuration is likely going to be in a lot of places.
+;; Therefore, any additional third party packages that provide functionality
+;; for configuring keybindings should be installed next in the init file.
+
+;; :demand t allows :general keyword to be used in use-package forms.
+(use-package general :demand t)
+(use-package hydra   :defer  t)
+
+;; Evil Mode
+;; =========
+;;
+;; Evil mode is a special keybinding related package that brings Vim-like
+;; modality to Emacs as a global minor mode. As it is global and also heavily
+;; involved with configuring keybindings, it should be installed and configured
+;; next.
+(use-package evil
+  :demand t)
+
+;; Remaining Minor Modes
+;; =====================
+;;
+;; Minor modes are usually activated over a variety of buffer types, and are
+;; commonly even global. Hence it makes sense to configure them next.
+
+;; Built-in
+;; --------
 (use-package cus-edit
   :ensure nil
   :demand t

  :config
  (load custom-file))

;; Third Party Major Modes
;; =======================
(use-package circe)

;; Font

;; Startup
;; =======
;;
;; Code that doesn't fit in any use-package form (except for code under Theme
;; and Font sections)... mainly only code that configures the Emacs startup
;; sequence.

;; Prevent Emacs from creating "~/.emacs.d/auto-save-list" directory on
;; startup.
(setq auto-save-list-file-prefix nil)

;; Bootstrap Primary Elisp Package Manager - straight.el
;; =====================================================
;;
;; Since the majority of Emacs packages I use are pure elisp, i.e. do not
;; require any other external dependencies (apart from potentially other elisp
;; packages, which may not be pure elisp), I consider it acceptable (for now)
;; to use a package manager separate from Nix to manage them.
;;
;; The main reason I want to do this is because it is more straightforward to
;; update packages compared to using Nix, where you would have to generate a
;; completely new set of Nix expressions for each Emacs package, on every
;; update.
;;
;; "Non-pure" Emacs packages would of course still be managed with Nix though.

;; Taken from: https://github.com/raxod502/straight.el#getting-started
(let ((bootstrap-file (concat user-emacs-directory "straight/bootstrap.el"))
      (bootstrap-version 2))
