   (sp-local-pair '(xml-mode nxml-mode php-mode)
                  "<!--" "-->"   :post-handlers '(("| " "SPC"))))
 
+;; Branching & persistent undo
+(def-package! undo-tree
+  :init
+  (add-transient-hook! 'find-file-hook (require 'undo-tree))
+  :config
+  (setq undo-tree-auto-save-history t
+        undo-tree-history-directory-alist (list (cons "." (concat doom-cache-dir "undo-tree-hist/"))))
+
+  (defun doom*silent-undo-tree-load-history-hook (orig-fn &rest args)
+    "Silence undo-tree load errors."
+    (quiet! (apply orig-fn args)))
+  (advice-add #'undo-tree-load-history-hook :around #'doom*silent-undo-tree-load-history-hook))
+
+;; Keep track of recently opened files
+(def-package! recentf
+  :defer 1
+  :config
+  (setq recentf-save-file (concat doom-cache-dir "recentf")
+        recentf-exclude (list "/tmp/" "/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$"
+                              "^/var/folders/.+$" doom-local-dir)
+        recentf-max-menu-items 0
+        recentf-max-saved-items 250
+        recentf-filename-handlers '(abbreviate-file-name))
+  (quiet! (recentf-mode 1)))
+
 
 ;;
 ;; Autoloaded Plugins


;; Handles whitespace (tabs/spaces) settings externally. This way projects can
;; specify their own formatting rules.
(def-package! editorconfig :demand t
  :mode ("\\.?editorconfig$" . editorconfig-conf-mode)
  :init
  (def-setting! :editorconfig (action value)
    `(after! editorconfig
       ,(cond ((eq action :add)
               `(push ',value editorconfig-indentation-alist))

  ;; Show whitespace in tabs indentation mode
  (add-hook! 'editorconfig-custom-hooks
    (if indent-tabs-mode (whitespace-mode +1))))

;; NOTE I've extracted some of savehist/saveplace's init code into def-package
;; blocks so that they can benefit from deferred loading.

;; persistent history
(def-package! savehist
  :commands (savehist-minibuffer-hook savehist-autosave)
  :init
  (add-hook 'minibuffer-setup-hook #'savehist-minibuffer-hook)
  (add-hook 'kill-emacs-hook #'savehist-autosave)
  :config
  (setq savehist-file (concat doom-cache-dir "savehist")
        savehist-save-minibuffer-history t
        savehist-autosave-interval nil ; save on kill only
        savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
  (savehist-mode 1))

;; persistent point
(def-package! saveplace
  :commands (save-place-find-file-hook save-place-dired-hook save-place-kill-emacs-hook save-place-to-alist)
  :init
  (add-hook 'find-file-hook #'save-place-find-file-hook t)
  (add-hook 'dired-initial-position-hook #'save-place-dired-hook)
  (add-hook 'kill-buffer-hook #'save-place-to-alist)
  (unless noninteractive
    (add-hook 'kill-emacs-hook #'save-place-kill-emacs-hook))
  :config
  (setq save-place-file (concat doom-cache-dir "saveplace"))
  (save-place-mode +1))

;; Auto-close delimiters and blocks as you type
(def-package! smartparens :demand t
