¿Por qué algunos comandos terminan al salir del minibúfer (isearch) mientras que otros no (find-file)?


6

De vez en cuando empiezo a abrir un archivo, y antes de seleccionar el archivo, por alguna razón, lo ejecuto C-x oantes de responder el mensaje. Luego, cada vez que intento ejecutar de find-filenuevo, se queja de que Command intentó usar minibúfer mientras estaba en minibúfer . Sin embargo, si uso un comando como isearch-forward-regexp, (incluso si ya está en una find-filesolicitud), el error no se produce y no puedo volver a usar el minibúfer other-window.
¿Por qué algunas indicaciones actualizan temporalmente el minibúfer para que other-windowconsidere que el minibúfer sea un posible objetivo, y otras no?


Solo para aclarar, no estoy preguntando cómo despegarse.
Originalmente, cuando me encontraba con esto, cambiaba al minibúfer y hacía Esc Esc Esco C-gpara escapar del indicador, de modo que pudiera iniciar un nuevo comando que usara el minibúfer. Sin embargo, al reflexionar sobre esta pregunta, me di cuenta de que abort-recursive-edit( C-]) cerrará este minibúfer en progreso sin tener que hacer other-window+ keyboard-quit.

Aún así, no estoy muy seguro de para qué sirve el caso de uso original. Tal vez, ¿está destinado a ayudar a copiar el pegado en un indicador de minibúfer, o para ayudar a ejecutar un comando en el medio de una macro?

Lo que quiero saber es si hay una manera de deshabilitar esta recursividad de la forma en que está isearch. ¿Es isearchseguro porque usa read-event en lugar de un aviso de bloqueo? ¿Hay un gancho para disparar abort-recursive-edital salir del minibúfer?


TL; DR

  1. ¿Por qué algunos comandos del minibúfer actualizan el minibúfer a un destino other-windowy bloquean la ejecución de nuevos comandos del minibúfer, mientras que otros isearchno lo hacen?
  2. ¿Hay alguna manera de desactivar esto?
  3. ¿Cuál es el caso de uso previsto de esta característica?

2
Tu pregunta no está clara, para mí. ¿Qué estás tratando de hacer? C-]aborta un nivel de minibúfer, sí. Isearch no usa el minibúfer. ¿Y qué tiene que ver " atrapado en el aviso " con el resto de lo que usted describe? No debería necesitar usar switch-windownada, en tales contextos. Pero no está claro lo que está tratando de hacer. Intente separar las diversas piezas de su descripción e intente formular una sola pregunta.
Dibujó

2
Intente configurar enable-recursive-minibufferspara tevitar que el Comando intente usar minibúfer mientras está en el mensaje minibúfer . Podría ayudar a aclarar la pregunta original, si la publicó por recursive-editseparado.
Vamsi

Respuestas:


5
  1. Muchos comandos interactivos leen la entrada del minibúfer. find-fileEs uno de esos comandos. La lectura de la entrada del minibúfer "activa" la ventana del minibúfer, por lo que puede cambiar a ella con el other-windowcomando. Interactivo isearches especial porque se implementa como un modo menor. Técnicamente, no lee su cadena de búsqueda del minibúfer, sino que captura sus pulsaciones de teclas a medida que escribe y las repite en el minibúfer message. Por eso ves que te other-windowcomportas de manera diferente.
  2. Esto puede o no ayudarlo, pero técnicamente puede modificar el comportamiento inmediato find-fileal modificar la función almacenada en read-file-name-function. No he intentado aconsejar la función basada en la respuesta de @ kaushalmodi, pero si eso funciona, actualizaré esto.
  3. No puedo hablar por ninguno de los hackers que trabajaron en el código en minibuffer.el, pero a partir de la siguiente descripción en el manual , supongo que el comportamiento está diseñado para permitirle matar y tirar texto:

Cuando el minibúfer está activo, el área de eco se trata como una ventana Emacs normal. Por ejemplo, puede cambiar a otra ventana (con Cx o), editar el texto allí y luego regresar a la ventana del minibúfer para finalizar el argumento. Incluso puede eliminar texto en otra ventana, volver a la ventana del minibúfer y arrastrar el texto al argumento.


2

El siguiente fragmento [ Fuente ] cancela la edición recursiva cuando el foco se aleja del minibúfer. Esto es para evitar las ocasiones irritantes en las que C-gpresionar repetidamente no edita el minibúfer cuando el foco del cursor se ha salido de él.

(defun stop-using-minibuffer ()
  "matar al minibúfer"
  (cuando (y (> = (profundidad de recursión) 1) (active-minibuffer-window))
    (abortar-recursivo-editar)))
(add-hook 'mouse-leave-buffer-hook' stop-using-minibuffer)

1

Drew ya ha comentado sobre esto, pero ...

isearch1 en realidad no usa el minibúfer, que probablemente explica parte de su confusión. Muestra cosas en el área de eco (que está en la misma ventana que el minibúfer, pero en realidad no es el minibúfer).

Siendo ese el caso, la noción de cambiar hacia y desde el minibúfer mientras se ejecuta una búsqueda no tiene ningún sentido.

1 comandos Ignorar como isearch-edit-stringla que hacen uso de la minibuffer, pero no forman parte de la más básica isearch flujo de trabajo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.