2011-07-21 18 views
6

He estado usando ido-mode durante unos meses, con ido-everywhere activado, y en general estoy muy contento con él. Sin embargo, hay una cosa que deseo poder cambiar. Cuando escribo C-u M-x shell para crear un nuevo búfer de caparazón con un nombre específico, ido me ofrece una lista de finalización de todos mis búferes abiertos. Si elijo uno, se lanza un nuevo shell en ese buffer y se pone en modo shell, sin importar lo que contenga. Es difícil imaginar un caso de uso útil para esto.¿Deshabilita el modo ido para comandos específicos?

¿Hay alguna manera de desactivar ido-mode solo para el comando de shell? (Así como cualquier otro comando similar que pueda encontrar en el futuro, por supuesto.)

+0

sé que para algunos comandos, utilizando el último acceso directo dos veces desactiva temporalmente ido (por ejemplo, para abrir un archivo, Cx Cf Cf' utiliza la interfaz de abrir el archivo de clásico en el minibúfer) pero yo don' lo sé con los comandos 'Mx'. – Seki

Respuesta

5

Heh, resulta que obtendrá las mismas opciones de finalización si tiene ido-everywhere activado o no.

No hay una forma incorporada de hacer lo que quiera. ido-mode solo proporciona ganchos para que pueda anular si el comportamiento find-file es asumido o no por ido. El read-buffer es actualmente siempre anulado por ido-everywhere.

Por suerte, un poco de Lisp de Emacs puede obtener lo que desea:

(put 'shell 'ido 'ignore) 
(defadvice ido-read-buffer (around ido-read-buffer-possibly-ignore activate) 
    "Check to see if use wanted to avoid using ido" 
    (if (eq (get this-command 'ido) 'ignore) 
     (let ((read-buffer-function nil)) 
     (run-hook-with-args 'ido-before-fallback-functions 'read-buffer) 
     (setq ad-return-value (apply 'read-buffer (ad-get-args 0)))) 
    ad-do-it)) 

y para cualquier otro comando que no quieren siguiente ido-everywhere para la selección de memoria intermedia se puede personalizar con sólo añadir una nueva expresión a su archivo. emacs:

(put 'other-command-i-want-untouched 'ido 'ignore) 
+1

¡Impresionante, gracias! – Sean

+2

... Aunque esto no funciona como está escrito, como descubrí más tarde. Tienes que decir '(setq ad-return-value (aplicar 'read-buffer (ad-get-args 0)))' en lugar de simplemente '(aplicar' read-buffer (ad-get-args 0))'. – Sean

+0

@Sean duh, solo revisé para ver si la finalización cambiaba, me olvidé de usarla. Gracias, he actualizado la respuesta. –

Cuestiones relacionadas