   (interactive)
   (unless username
     (setf username
-          (ido-completing-read "Switch to username: "
-                               (directory-files "~/.emacs.d/lisp/user/users/" nil "^[^.].*$"))))
+          (kotct/user-ask-username "Switch to username: ")))
   (kotct/user-unload-username)
   ;; make sure that if the load fails we reload the stuff we just unloaded
   ;; so that we are actually loaded with current-username's config

    (require (intern (concat username "-hub")))
    (setf kotct/user-current-username username)))

(defun kotct/user-unload-username (&optional username)
  "Unload the personal config of USERNAME, or if USERNAME is nil, `kotct/user-current-username'."
  (unless username (setf username kotct/user-current-username))

  nil
  "The username associated with the currently loaded personal config.")

(defvar kotct/user-default-username-file
  "~/.emacs.d/lisp/user/default-username"
  "The file that sets the default username for the machine.
(Ignored by git.)")

(defun kotct/user-fetch-config (username)
  "Fetch USERNAME's personal config from GitHub, out of the
repository USERNAME/.emacs."
  (message "fetching config for %s" username)
  (let ((default-directory "~/.emacs.d/lisp/user/users")
        (url (format "git://github.com/%s/.emacs" username)))
