2012-05-31 13 views
6

Me gusta incluir el estado de repo de Mercurial/Git en el indicador de PowerShell. A veces, esto ralentiza considerablemente la función prompt(), lo que provoca una larga espera hasta que pueda comenzar a escribir en el shell. Me pregunto, ¿es posible actualizar el prompt async?¿Es posible actualizar de manera asincrónica el aviso de PowerShell?

ideal sería:

  1. Write-Host el directorio actual (símbolo típico)
  2. comenzar a recoger el estado de recompra en el fondo.
  3. Cuando se recopila el estado de repositorio, suponiendo que el prompt no se ha vuelto a llamar, inserte el estado de repositorio en el aviso.

¿Alguien ha hecho esto antes?

+0

Imagino que funcionaría algo como esto. ** 1. ** 'Start-Job' en' prompt() '(cancelando cualquier trabajo que ya esté en ejecución), y ** 2. ** Pase la posición del cursor al trabajo para que el trabajo sepa dónde insertar el texto en la cáscara. Simplemente no estoy seguro de cómo se manejaría refluir el texto que el usuario podría haber tipeado después de que apareciera el mensaje. – joshuapoehls

+2

Me gusta esta idea; parece mucho trabajo hacer la parte de reflujo. Un truco sería tener un indicador de dos líneas. La primera línea es estado, etc. y la segunda línea donde ingresa el usuario real ... –

+0

Definitivamente estaría bien con 2 líneas. Buen pensamiento. Podría tener que probar esto ... – joshuapoehls

Respuesta

5

No per se.

No puede actualizar la solicitud de forma asincrónica porque la solicitud solo devuelve texto, y se llama en un host cada vez que se realiza un comando de nivel superior.

Puede volver a escribir el aviso para hacer algo como verificar una fuente de datos o una variable que actualice de forma asincrónica. Por lo tanto, el mensaje no cambiará mientras el comando se está ejecutando, pero no se bloqueará por un tiempo porque solo buscará datos.

Lo más complicado de esto es que se mete en el juego de intentar echar un vistazo a los resultados de ejecución después del hecho. PowerShell no los mantiene a menos que estén asignados a algo. Entonces, para hacer esto bien, uno debe anular Out-Default (que solo funciona bien en ISE, PowerGUI, etc., no en powershell.exe). Sobrescribir esto no es tan difícil, pero es necesario saber mucho de vudú de PowerShell, incluso para mis impresionantes estándares.

En el lado brillante, obviamente he estado pensando esto mucho, y tengo un módulo que hace mucho de esto, solo estoy determinando lo que voy a hacer con él y si permanece en su propio módulo o se une a uno de los otros módulos que construimos.

Lo actualizaré cuando salga, pero esta hoja de ruta debería ayudar considerablemente.

La respuesta corta es que no puede actualizar el aviso asincrónico, pero puede hacer que sea muy rápido, y los trucos necesarios para hacerlo abren muchas puertas más frías.

Espero que esto ayude

Cuestiones relacionadas