   (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))

 word-wrap t
 vc-follow-symlinks t)

;; Ediff: use existing frame instead of creating a new one
(add-hook! ediff-load
  (setq ediff-diff-options           "-w"
