Comment faire fonctionner l'achèvement des onglets PowerShell comme Bash

105

Disons que j'ai les fichiers suivants dans mon répertoire actuel:

buildBar.bat
buildFoo.bat
buildHouse.bat

Et je tape ce qui suit à mon invite de commande, ./bupuis TAB.

  • Dans Bash, il est étendu à ./build

  • Dans PowerShell, il est étendu au ./buildBar.batpremier élément de la liste.

  • Dans Cmd, le comportement est le même que celui de PowerShell.

Je préfère le comportement Bash - existe-t-il un moyen de faire en sorte que PowerShell se comporte comme Bash?

RobSiklos
la source
2
Vous pouvez utiliser Cygwin's bash;)
Blender
13
Oui, c'est ce que je fais depuis une dizaine d'années, mais j'essaie de passer à PowerShell, car je veux pouvoir voler en ligne de commande sur des systèmes autres que le mien, là où Cygwin n'est pas installée.
RobSiklos

Réponses:

175

Les nouvelles versions de PowerShell incluent PSReadline, qui peut être utilisé pour ce faire:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Pour le rendre permanent, placez cette commande dans C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.

svick
la source
26
MenuCompleteau lieu de Completeressemble plus à bash, il vous permet d'utiliser les touches fléchées pour choisir parmi les options disponibles
stib
1
@LeBleu C'est bizarre, car ma toute nouvelle machine Windows 10 est livrée avec PSReadline. Je pensais que le module venait de Microsoft.
Franklin Yu
8
BTW, si le fichier profile.ps1 n'existe pas sur votre machine, vous pouvez en générer un avec une commandenew-item $profile -itemtype file -force
Reinis
2
Il est très probable que votre machine n'aura pas C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.besoin de fonctionnernew-item $profile -itemtype file -force
RF
1
C'est une orthographe vraiment incommode pour touch:-(
SamB
21

Il est désormais possible de faire en sorte que PowerShell effectue un achèvement de style Bash, à l'aide de PSReadline.

Consultez l'article de blog sur l' achèvement des onglets de type Bash dans PowerShell .

Jay Bazuzi
la source
4
Le lien dans l'article du blog est rompu, mais à la fin de la journée, il vous amène à PsReadline (dernier commit en 2012) qui a été bifurqué (dernier commit en 2013)
GameScripting
6
De nos jours, vous pouvez le faire avec un one-liner, comme décrit ici: stackoverflow.com/a/37715242/24874
Drew Noakes
15

Jetez un oeil ici, pas vraiment vos desiderata:

PowerTab

mais je pense que c'est la meilleure fonctionnalité d'extension d'onglets pour la console PowerShell !!!

CB.
la source
Intéressant. S'il y a un moyen de faire quelque chose comme ça, alors il semble tout à fait possible de faire fonctionner l'extension comme dans bash. Je suis loin d'être un expert en PowerShell, cependant, il me manque peut-être quelque chose.
Andriy M
Sûr! Commencez à étudier le code du module PowerTab pour essayer de répondre à vos besoins d'extension. Mais PowerTab propose des extensions pour presque toutes les commandes, wmi, comobject, assemblage avec un moyen de sélection facile!
CB.
7

tab ne complète que le nom de la commande et non ses arguments / paramètres précédents.

pour également compléter automatiquement la commande complète avec des arguments de l'historique, définissez la liaison de touches ci-dessous.

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

Maintenant, tapez quelques caractères du nom de la commande et utilisez la flèche haut / bas pour compléter automatiquement cette commande (avec des arguments) à partir de l'historique.

gain de temps réel.

Gourav
la source
5

Modifiez la fonction TabExpansion pour obtenir ce que vous voulez. Rappelez-vous que peut-être cela se termine jusqu'à la fin si vous appuyez à nouveau sur la touche tab pour modifier la nouvelle suggestion à partir de l'endroit où vous appuyez initialement sur la touche. Je préfère fortement le comportement réel, je veux que la ligne soit écrite le plus vite possible. Enfin, n'oubliez pas l'expansion des caractères génériques, par exemple: bu * h [Tab] se termine automatiquement en buildHouse.bat

mjsr
la source
Modifier la fonction TabExpansion est probablement la voie à suivre, bien plus compliquée que ce que je recherchais. Je pense que je vais avoir besoin de mieux maîtriser PowerShell avant de pouvoir jouer avec ça.
RobSiklos
1

Avec Powershell de base , nous pouvons définir la propriété PredictionSource pour PSReadLine que l' histoire pour obtenir autosuggestion. Reportez-vous à la vidéo YouTube pour plus de détails https://youtu.be/I0iIZe0dUNw

Nilesh Gule
la source
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
徐志鹏
la source