Ist es möglich, die Autovervollständigung in Powershell wie in Bash arbeiten zu lassen?

19

Ich liebe Powershell, aber mit einem Linux-Hintergrund gibt es ein paar Dinge, die mich wirklich nerven. Wie zum Beispiel, wie die standardmäßige automatische Vervollständigung funktioniert.

Beispiel: Get-PS wird zu "Get-PSBreakpoint" erweitert, dem ersten übereinstimmenden Befehl. Wenn es in bash nur einen passenden Befehl gibt, wird bash zum passenden Befehl erweitert. Wenn es mehrere Treffer gibt, führt ein doppeltes Tippen auf die Registerkarte zu einer Liste übereinstimmender Befehle, die jedoch nicht erweitert werden. Gibt es eine Möglichkeit, Powershell so zu machen?

Und eine andere Sache, wenn ich eine Zeile geschrieben habe und den Marker zurück zu einem früheren Befehl verschiebe (Marker ist dort, wo das ^ ist):

"Get-PSS ^ | Remove-PSSession" wird automatisch zu "Get-PSSession ^" vervollständigt, wobei alle nachfolgenden Befehle entfernt werden. In der Bash wären die nachfolgenden Befehle dort noch nicht betroffen. Gibt es eine Möglichkeit, Powershell zu veranlassen, die nachfolgenden Befehle bei der automatischen Vervollständigung nicht zu entfernen?

Ein Bonus wäre STRG + L, um den Bildschirm zu löschen. STRG + A, um zum Zeilenanfang zu gelangen, und STRG + E, um zum Zeilenende zu gelangen.

Peter Moberg
quelle
Ich habe eine Antwort auf Ihre Frage gepostet, aber das Komische ist, dass ich auf diese Frage gestoßen bin, weil ich genau das Gegenteil suche ... Ich möchte, dass der PowerShell-Stil in bash vervollständigt wird :)
Robert S Ciaccio
Die Vervollständigung des PowerShell-Stils ist in Bash verfügbar - suchen Sie nach der Funktion menu-complete
Jason Shirk,
Zum Glück haben wir jetzt Bash auf Windows 10.
Bis zum

Antworten:

11

Check out PSReadline .

Aus dem Artikel:

Dieses Modul ersetzt die Befehlszeilenbearbeitung in PowerShell.exe. Es bietet:

  • Syntax Färbung
  • Einfache Benachrichtigung bei Syntaxfehlern
  • Eine gute Erfahrung mit mehreren Zeilen (sowohl Bearbeitung als auch Verlauf)
  • Anpassbare Tastenbelegungen
  • Cmd- und Emacs-Modi (beide sind noch nicht vollständig implementiert, aber beide sind verwendbar)
  • Viele Konfigurationsmöglichkeiten
  • Bash-Stil-Vervollständigung (optional im Cmd-Modus, standardmäßig im Emacs-Modus)
  • Interaktive Verlaufssuche im Bash / Zsh-Stil (STRG-R)
  • Emacs reißen / töten Ring
  • PowerShell-Token-basierte "Wort" -Bewegung und Tötung
  • Rückgängig wiederholen
  • Automatisches Speichern des Verlaufs, einschließlich der Weitergabe des Verlaufs über Live-Sitzungen
  • Vervollständigung "Menü" (ähnlich wie Intellisense, Vervollständigung mit Pfeilen auswählen) über Strg + Leertaste

Ich benutze es täglich!

David Mohundro
quelle
4
Sobald Sie PSReadLine installiert haben, müssen Sie das Vervollständigen von Registerkarten im Bash-Stil aktivieren, indem Sie Set-PSReadlineKeyHandler -Key Tab -Function Complete
Folgendes
3
PSReadLine ist jetzt standardmäßig unter Windows 10 installiert. Fügen Sie einfach die von @brianpeiris erwähnte Konfigurationszeile in Ihr Profil ein, und schon kann es losgehen.
Don Cruickshank
Versuchen Sie es mit CompleteMenustatt Completefür eine bash-ähnliche Erfahrung, können Sie die Pfeiltasten verwenden, um die Auswahl zu navigieren
Stib
3

Vielleicht sollten Sie einen Blick auf Powertab werfen , eine anpassbare PowerShell Tab-Erweiterung.

Harrymc
quelle
2
Vielen Dank! Powertab verbessert die Tab-Erweiterung erheblich. Dennoch ist das Problem, dass etwas nicht am Ende des Befehls vervollständigt wird, vorhanden.
Peter Moberg
2

Hallo Peter drücken Sie einfach F8 für so etwas wie Speed. Es wird mit den Befehlen vervollständigt, die Sie zuvor ausgeführt haben und die mit dem beginnen, was Sie in der Zeile haben. Das Problem mit dem Löschen des Trailings ist ärgerlich, ich schreibe in Connect einen Vorschlag zum selben Thema. In der Hauptzeit könnten Sie Powershell ISE verwenden, das sich etwas besser verhält (die nachfolgenden Zeichen nicht löschen).

mjsr
quelle
2

Das alte Subsystem command.exe ist immer noch in PowerShell involviert und erzwingt viele unangenehme Verhaltensweisen. Ab PowerShell v3 ist die grafische Benutzeroberfläche (PowerShell ISE) jetzt verwendbar und bietet eine viel modernere Vervollständigungserfahrung und Kolorierung.

Bildbeschreibung hier eingeben

Jay Bazuzi
quelle
2

PowerShell verwendet dieselben Konsolenfunktionen wie die ehrwürdige Eingabeaufforderung. Sie haben also das übliche Zuhause / Ende und:

  • F3 um den vorherigen Befehl aufzurufen
  • F1 um ein einzelnes Zeichen aus dem vorherigen Befehl zu kopieren
  • F7 Popup-Verlaufsfenster

... aber meines Wissens gibt es keine Möglichkeit, alle möglichen Vervollständigungen anzuzeigen.

njd
quelle
Dies ist immer noch sehr begrenzt im Vergleich zu guten alten Bash. Zum Beispiel ist es großartig, Strg + R (Geschwindigkeitssuche) in Bash eingeben zu können und einfach mit der Eingabe zu beginnen. Ein passender vorheriger Befehl wird angezeigt.
Peter Moberg
1

Reguläre Powershell verwendet cmd als Eingabeaufforderungsfenster. Das ist der Grund, warum es ein riesiges Erbe gibt (Programme geben das Verhalten von alten cmd seit Ewigkeiten wieder), das aufgrund der Rückwärtsvergleichbarkeit nicht geändert werden kann.

Ich empfehle, dass Sie Powershell_ise anstelle von Powershell verwenden (im Standard-Powershell-Bundle enthalten). Version 3.0 (ich bin mir nicht sicher) unterstützt Intellisense von Anfang an. Dies ist sehr nahe an der Bash-Fertigstellung. Drücken Sie einfach Strg + Leertaste anstelle der Tabulatortaste. Ich habe Probleme mit benutzerdefinierten Vervollständigungen auf PowerTab, aber Intellisense funktioniert einwandfrei. Powershell_ise behält auch nachfolgende Befehle bei, verfügt über einen normalen Auswahlmodus und unterstützt Strg + C, Strg + V, Strg + A für die Auswahl des eingegebenen Befehls /Ende).

xvorsx
quelle
0

PowerShell verwendet einen eigenen Parser für Befehle. In gewissem Sinne handelt es sich also um eine andere Shell als cmd.exe, obwohl sie dasselbe Terminal (GUI-Fenster) verwenden.

Aufgrund dieses Unterschieds können Sie in PowerShell die Tab-Vervollständigungsfunktion mit Ihrer eigenen Funktion überschreiben. Ich hatte selbst keine Zeit, mich damit zu beschäftigen, aber Sie überschreiben im Grunde die Funktion tabexpansionin Ihrem Profil, genauso wie Sie die promptFunktion überschreiben können.

Ich habe diesen Artikel von Lee Holmes (Autor des großartigen Windows PowerShell-Kochbuchs ) gefunden, der eine Tab-Erweiterungsüberschreibung beschreibt, die dem sehr ähnlich ist, wonach Sie suchen. Sie könnten es wahrscheinlich optimieren, um genau das zu erhalten, was Sie wollen.

Robert S. Ciaccio
quelle