Cómo hacer que la finalización de pestañas de PowerShell funcione como Bash

105

Digamos que tengo los siguientes archivos en mi directorio actual:

buildBar.bat
buildFoo.bat
buildHouse.bat

Y escribo lo siguiente en mi símbolo del sistema, ./buy luego TAB.

  • En Bash, se expande a ./build

  • En PowerShell, se expande al ./buildBar.batprimer elemento de la lista.

  • En Cmd, el comportamiento es el mismo que en PowerShell.

Prefiero el comportamiento Bash: ¿hay alguna manera de hacer que PowerShell se comporte como Bash?

RobSiklos
fuente
2
Podrías usar Cygwin's bash;)
Blender
12
Sí, eso es lo que he estado haciendo durante la última década más o menos, pero estoy tratando de hacer la transición a PowerShell, porque quiero poder volar en la línea de comandos en sistemas que no sean el mío, donde Cygwin no está instalado.
RobSiklos

Respuestas:

174

Las nuevas versiones de PowerShell incluyen PSReadline, que se puede usar para hacer esto:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Para hacerlo permanente, coloque este comando en C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.

svick
fuente
25
MenuCompleteen lugar de Completees más como bash, le permite usar las teclas de flecha para elegir entre las opciones disponibles
stib
1
@LeBleu Eso es extraño, porque mi nueva máquina con Windows 10 vino con PSReadline. Pensé que el módulo era de Microsoft.
Franklin Yu
8
Por cierto, si el archivo profile.ps1 no existe en su máquina, puede generar uno con un comandonew-item $profile -itemtype file -force
Reinis
2
Es muy probable que su máquina no tenga C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.Realmente necesita ejecutarnew-item $profile -itemtype file -force
RF
1
Esa es una ortografía realmente inconveniente para touch:-(
SamB
21

Ahora es posible hacer que PowerShell realice una finalización al estilo Bash, usando PSReadline.

Consulte la publicación de blog sobre la finalización de pestañas similar a Bash en PowerShell .

Jay Bazuzi
fuente
4
El enlace en la publicación del blog está roto, sin embargo, al final del día, lo lleva a PsReadline (última confirmación en 2012) que se ha bifurcado (última confirmación en 2013)
GameScripting
6
Hoy en día puede hacer esto con una sola línea, como se describe aquí: stackoverflow.com/a/37715242/24874
Drew Noakes
15

Eche un vistazo aquí, no es realmente su desiderata:

PowerTab

¡Pero creo que es la mejor función de expansión de pestañas para la consola PowerShell!

CB.
fuente
Interesante. Si hay una manera de hacer algo así, entonces parece bastante posible que la expansión funcione como en bash. Sin embargo, estoy lejos de ser un experto en PowerShell, por lo que es posible que me falte algo.
Andriy M
¡Por supuesto! Empiece a estudiar el código del módulo PowerTab para intentar satisfacer sus necesidades de expansión. ¡Pero PowerTab ofrece expansiones para casi cualquier comando, wmi, comobject, ensamblado con una forma de selección fácil!
CB.
7

tab solo completa el nombre del comando, no sus argumentos / parámetros anteriores.

para también autocompletar el comando completo con argumentos del historial, configure la combinación de teclas a continuación.

Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward

Ahora, escriba algunos caracteres del nombre del comando y use las flechas arriba / abajo para autocompletar este comando (con argumentos) del historial.

ahorro de tiempo real.

JerryGoyal
fuente
5

Modifique la función TabExpansion para lograr lo que desea. Recuerde que quizás se complete hasta el final si presiona tabulador nuevamente la nueva sugerencia modifica desde donde originalmente presionó la tecla. Prefiero mucho el comportamiento real, quiero que la línea se escriba lo más rápido posible. Finalmente, no olvide la expansión de comodines, por ejemplo: bu * h [Tab] se completa automáticamente para buildHouse.bat

mjsr
fuente
Modificar la función TabExpansion es probablemente el camino a seguir, aunque es mucho más complicado de lo que estaba buscando. Creo que tendré que ser más fluido en PowerShell antes de poder jugar con eso.
RobSiklos
1

Con Powershell Core podemos establecer la propiedad PredictionSource para PSReadLine como Historial para obtener sugerencias automáticas. Consulte el video de YouTube para obtener más detalles https://youtu.be/I0iIZe0dUNw

Nilesh Gule
fuente
1
# keep or reset to powershell default
Set-PSReadlineKeyHandler -Key Shift+Tab -Function TabCompletePrevious

# define Ctrl+Tab like default Tab behavior
Set-PSReadlineKeyHandler -Key Ctrl+Tab -Function TabCompleteNext

# define Tab like bash
Set-PSReadlineKeyHandler -Key Tab -Function Complete
徐志鹏
fuente