Jak sprawić, by uzupełnianie kart PowerShell działało jak Bash

105

Powiedzmy, że mam następujące pliki w moim bieżącym katalogu:

buildBar.bat
buildFoo.bat
buildHouse.bat

I wpisuję następujące polecenie w wierszu polecenia, ./bua następnie TAB.

  • W Bash rozszerza się do ./build

  • W PowerShell zostaje rozwinięty do ./buildBar.bat- pierwszej pozycji na liście.

  • W Cmd zachowanie jest takie samo jak w programie PowerShell.

Wolę zachowanie Bash - czy istnieje sposób, aby PowerShell zachowywał się jak Bash?

RobSiklos
źródło
2
Możesz użyć Cygwina bash;)
Blender.
13
Tak - to właśnie robię przez ostatnią dekadę, ale próbuję przejść na PowerShell, ponieważ chcę mieć możliwość latania w wierszu poleceń na systemach innych niż mój własny, gdzie Cygwin nie jest zainstalowany.
RobSiklos

Odpowiedzi:

175

Nowe wersje programu PowerShell obejmują PSReadline, którego można użyć do tego:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Aby to było trwałe, umieść to polecenie w C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.

svick
źródło
26
MenuCompletezamiast Completejest bardziej podobny do basha, pozwala za pomocą klawiszy strzałek wybierać spośród dostępnych opcji
stib
1
@LeBleu To dziwne, ponieważ mój nowy komputer z systemem Windows 10 został wyposażony w PSReadline. Myślałem, że moduł pochodzi od firmy Microsoft.
Franklin Yu
8
BTW, jeśli plik profile.ps1 nie istnieje na twoim komputerze, możesz go wygenerować za pomocą polecenianew-item $profile -itemtype file -force
Reinis
2
Jest bardzo prawdopodobne, że twoja maszyna nie będzie musiała C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.faktycznie działaćnew-item $profile -itemtype file -force
RF,
1
To naprawdę niewygodna pisownia dla touch:-(
SamB
21

Możliwe jest teraz, aby PowerShell wykonywał uzupełnianie w stylu Bash, używając PSReadline.

Sprawdź wpis na blogu Uzupełnianie kart w stylu Bash w PowerShell .

Jay Bazuzi
źródło
4
Link w poście na blogu jest uszkodzony, ale pod koniec dnia prowadzi do PsReadline (ostatnie zatwierdzenie w 2012 r.), Które zostało rozwidlone (ostatnie zatwierdzenie w 2013 r.)
GameScripting
6
Obecnie możesz to zrobić za pomocą jednej linijki, jak opisano tutaj: stackoverflow.com/a/37715242/24874
Drew Noakes
15

Spójrz tutaj, a nie tak naprawdę swoje dezyderaty:

PowerTab

ale myślę, że to najlepsza funkcja rozszerzania zakładek dla konsoli PowerShell !!!

CB.
źródło
Ciekawy. Jeśli istnieje sposób na zrobienie czegoś takiego, wydaje się całkiem możliwe, aby rozszerzenie działało jak w bash. Daleko mi jednak do bycia ekspertem w PowerShell, więc może czegoś brakuje.
Andriy M,
Pewnie! Zacznij studiować kod modułu PowerTab, aby spróbować zaspokoić potrzeby związane z rozbudową. Ale PowerTab oferuje rozszerzenia dla prawie każdego polecenia, wmi, comobject, assembler z łatwym sposobem wyboru!
CB.
7

tab uzupełnia tylko nazwę polecenia, a nie poprzednie argumenty / parametry.

aby również automatycznie uzupełnić kompletne polecenie z argumentami z historii, ustaw poniższe przypisanie klawiszy.

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

Teraz wpisz kilka znaków nazwy polecenia i użyj strzałek w górę / w dół, aby automatycznie uzupełnić to polecenie (z argumentami) z historii.

oszczędność czasu rzeczywistego.

Gourav
źródło
5

Zmodyfikuj funkcję TabExpansion, aby osiągnąć to, co chcesz. Pamiętaj, że być może zakończy się to do końca, jeśli ponownie naciśniesz klawisz Tab, nowa sugestia zmodyfikuj od miejsca, w którym pierwotnie nacisnąłeś klawisz. Zdecydowanie wolę rzeczywiste zachowanie, chcę, aby wiersz został napisany tak szybko, jak to możliwe. Na koniec nie zapomnij o rozwinięciu symboli wieloznacznych, na przykład: bu * h [Tab] automatycznie kończy tworzenie buildHouse.bat

mjsr
źródło
Modyfikacja funkcji TabExpansion jest prawdopodobnie drogą do zrobienia, wciąż jednak o wiele bardziej skomplikowana niż to, czego szukałem. Myślę, że będę musiał lepiej posługiwać się PowerShell, zanim będę mógł się z tym bawić.
RobSiklos
1

Dzięki Powershell Core możemy ustawić właściwość PredictionSource dla PSReadLine jako History, aby uzyskać automatyczną sugestię. Więcej informacji można znaleźć w filmie YouTube https://youtu.be/I0iIZe0dUNw

Nilesh Gule
źródło
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
徐志鹏
źródło