emacskey-bindingsido-mode

How to remap keys in ido-find-file?


I have been trying to make a few changes to ido-mode to make it more useful. One of the things which I have been trying to do is to remap some of the keys which I use in ido-find-file. The main one is that I want to use C-d to call the ido-enter-dired function instead of having to press C-f+C-d which does the same thing.

This is my ido setup so far:

(defun ali/ido ()
  "My configuration for ido-mode"
  (require 'ido)
  (setq ido-create-new-buffer 'always)

  ;; Making sure that ido works in M-x
  (global-set-key
      "\M-x"
      (lambda ()
      (interactive)
      (call-interactively
          (intern
          (ido-completing-read
          "M-x "
          (all-completions "" obarray 'commandp))))))

  ;; Ido keybindings
  (defun ido-keybindings ()
    (define-key ido-completion-map (kbd "C-d") 'ido-enter-dired))


  (add-hook 'ido-setup-hook 'ido-keybindings)

  (ido-everywhere t)
  (ido-mode 1))

However whenever, I try to use C-d in ido-find-file I always get this error:

Debugger entered--Lisp error: (error "Command attempted to use minibuffer while in minibuffer")

Solution

  • When called with the minibuffer active, your command uses a recursive minibuffer to read input using ido-completing-read.

    Use this as your command instead:

    (lambda ()
      (interactive)
      (let ((enable-recursive-minibuffers  t)) ; <=====================
        (call-interactively
         (intern
          (ido-completing-read
           "M-x "
           (all-completions "" obarray 'commandp))))))
    

    C-h v enable-recursive-minibuffers tells us:

    enable-recursive-minibuffers is a variable defined in C source code.

    Its value is nil

    Documentation:

    Non-nil means to allow minibuffer commands while in the minibuffer.

    This variable makes a difference whenever the minibuffer window is active. Also see minibuffer-depth-indicate-mode, which may be handy if this variable is non-nil.

    You can customize this variable.