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?


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.


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 .


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 !!!


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.


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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.