¿Es posible hacer que el autocompletado en Powershell funcione como en bash?

19

Me encanta Powershell, pero viniendo de un entorno Linux hay algunas cosas que realmente me están molestando. Por ejemplo, cómo funciona la finalización automática predeterminada.

Por ejemplo: Get-PS se expande a "Get-PSBreakpoint", que es el primer comando coincidente. En bash si solo hay un comando, bash coincidente se expandirá al comando correspondiente. Si hay varias pestañas de golpe una vez que no hace nada, tocar dos veces la pestaña mostrará una lista de comandos coincidentes pero no se expandirá. ¿Hay alguna manera de hacer que Powershell se comporte así?

Y otra cosa, si he escrito una línea, y mueve el marcador a un comando anterior (el marcador es donde está el ^):

"Get-PSS ^ | Remove-PSSession" se completa automáticamente en "Get-PSSession ^", eliminando todos los comandos finales. En bash, los comandos finales seguirían allí sin verse afectados. ¿Hay alguna manera de hacer que Powershell no elimine los comandos finales cuando se completa automáticamente?

Una ventaja sería obtener CTRL + L para borrar la pantalla. CTRL + A para ir al principio de la línea y CTRL + E para ir al final de la línea.

Peter Moberg
fuente
Publiqué una respuesta a su pregunta, pero lo curioso es que llegué a esta pregunta porque estoy buscando exactamente lo contrario ... Quiero completar el estilo PowerShell en bash :)
Robert S Ciaccio
La finalización del estilo PowerShell está disponible en bash - busque el menú de funciones completo
Jason Shirk
Afortunadamente, tenemos bash en Windows 10 ahora.
byxor

Respuestas:

11

Echa un vistazo a PSReadline .

Del artículo:

Este módulo reemplaza la experiencia de edición de línea de comandos en PowerShell.exe. Proporciona:

  • Coloración de sintaxis
  • Notificación de error de sintaxis simple
  • Una buena experiencia multilínea (tanto edición como historial)
  • Atajos de teclas personalizables
  • Modos cmd y emacs (ninguno de los dos está completamente implementado todavía, pero ambos son utilizables)
  • Muchas opciones de configuración
  • Finalización del estilo Bash (opcional en modo Cmd, predeterminado en modo Emacs)
  • Búsqueda de historial interactivo de estilo Bash / zsh (CTRL-R)
  • Emacs yank / kill ring
  • PowerShell token basado en movimiento de "palabras" y matar
  • Deshacer rehacer
  • Guardado automático del historial, que incluye compartir el historial en sesiones en vivo
  • Finalización del "menú" (algo así como Intellisense, seleccione la finalización con flechas) a través de Ctrl + Espacio

Lo uso a diario!

David Mohundro
fuente
44
Una vez que instale PSReadLine, debe habilitar la finalización de la pestaña de estilo bash agregando esto a su perfil:Set-PSReadlineKeyHandler -Key Tab -Function Complete
brianpeiris
3
PSReadLine ahora está instalado de manera predeterminada en Windows 10. Simplemente coloque la línea de configuración que @brianpeiris mencionó en su perfil y ya está listo.
Don Cruickshank
Intente usar en CompleteMenulugar de Completeuna experiencia más bash, le permite usar las teclas de flecha para navegar por las opciones
stib
3

Tal vez debería echar un vistazo a Powertab , una expansión personalizable de PowerShell Tab.

harrymc
fuente
2
¡Gracias! Powertab realmente hace que la expansión de pestañas sea mucho mejor. Aún así, el problema al completar algo que no está al final del comando está ahí.
Peter Moberg el
2

hola peter solo presiona F8 para algo como la búsqueda rápida. Se completa con los comandos que ejecuta anteriormente que comienzan con lo que tiene en la línea. El problema con la eliminación del final es molesto, escribo una sugerencia en Connect sobre el mismo problema. En la mayoría de los casos, podría usar Powershell ISE, que se comporta un poco mejor (no elimine los caracteres finales).

mjsr
fuente
2

El antiguo subsistema command.exe todavía está involucrado en PowerShell y obliga a muchos comportamientos desagradables. Pero a partir de PowerShell v3, la GUI (PowerShell ISE) ahora es utilizable, e incluye una experiencia de finalización mucho más moderna + coloración.

ingrese la descripción de la imagen aquí

Jay Bazuzi
fuente
2

PowerShell utiliza las mismas funciones de consola que el símbolo del sistema venerable; entonces tienes el Inicio / Fin habitual y:

  • F3 para abrir el comando anterior
  • F1 copiar un solo personaje del comando anterior
  • F7 ventana emergente de historial

... pero no hay posibilidad de mostrar todas las terminaciones posibles, que yo sepa.

njd
fuente
Esto sigue siendo muy limitante en comparación con la buena y vieja fiesta. Por ejemplo, es realmente genial poder escribir ctrl + r (búsqueda de velocidad) en bash y simplemente comenzar a escribir y aparecerá un comando anterior correspondiente.
Peter Moberg el
1

PowerShell normal usa cmd como ventana de símbolo del sistema. Es por eso que tiene un gran legado (los programas se basan en el comportamiento de cmd antiguo por años) que no se puede cambiar debido a la comparabilidad hacia atrás.

Le recomiendo que use powershell_ise en lugar de powershell (se incluye en el paquete estándar de powershell). La versión 3.0 (no estoy seguro sobre la anterior) admite Intellisense desde el cuadro. Esto está muy cerca del estilo de finalización de bash. Simplemente presione Ctrl + Espacio en lugar de Tab. Experimento problemas con las finalizaciones personalizadas en PowerTab, pero Intellisense funciona bien con él. Powershell_ise también conserva los comandos finales, tiene el modo de selección normal, admite Ctrl + C, Ctrl + V, Ctrl + A para seleccionar el comando ingresado, por lo que Ctrl + A, salta al inicio de la línea, Ctrl + A, hasta el final (o Inicio /Final).

xvorsx
fuente
0

PowerShell utiliza su propio analizador para los comandos, por lo que, en cierto sentido, es un shell diferente que cmd.exe, a pesar de que comparten el mismo terminal (ventana de interfaz gráfica de usuario).

Debido a esa diferencia, PowerShell le permite anular la funcionalidad de finalización de tabulación con su propia función. No he tenido tiempo de meterme con esto, pero básicamente anula la función tabexpansionen su perfil, de la misma manera que puede anular la promptfunción.

Encontré este artículo , de Lee Holmes (autor del impresionante Libro de cocina de Windows PowerShell ), que describe una anulación de expansión de la tabla que es muy similar a lo que estás buscando. Probablemente podría ajustarlo para darle exactamente lo que desea.

Robert S Ciaccio
fuente