È possibile far funzionare il completamento automatico in Powershell come in bash?


19

Adoro Powershell, ma provenendo da un background Linux ci sono alcune cose che mi infastidiscono davvero. Ad esempio, come funziona il completamento automatico predefinito.

Ad esempio: Get-PS si espande in "Get-PSBreakpoint", che è il primo comando corrispondente. In bash, se esiste un solo comando, bash si espanderà al comando corrispondente. Se ci sono più schede colpite una volta che non fanno nulla, toccando due volte la scheda mostrerà un elenco di comandi corrispondenti ma non espandibili. C'è un modo per far comportare Powershell in questo modo?

E un'altra cosa, se ho scritto una riga e sposta il marker indietro a un comando precedente (il marker è dove è ^):

"Get-PSS ^ | Remove-PSSession" si completa automaticamente in "Get-PSSession ^", rimuovendo tutti i comandi finali. In bash i comandi finali sarebbero rimasti lì inalterati. C'è un modo per impedire a Powershell di rimuovere i comandi finali quando il completamento automatico?

Un bonus sarebbe quello di ottenere CTRL + L per cancellare lo schermo. CTRL + A per andare all'inizio della riga e CTRL + E per andare alla fine della riga.


Ho pubblicato una risposta alla tua domanda, ma la cosa divertente è che sono arrivato a questa domanda perché sto cercando l'esatto contrario ... Voglio il completamento dello stile PowerShell in bash :)
Robert S Ciaccio,

Il completamento dello stile di PowerShell è disponibile in bash - cerca il menu delle funzioni complete
Jason Shirk,

Per fortuna ora abbiamo bash su Windows 10.
byxor,

Risposte:


11

Dai un'occhiata a PSReadline .

Dall'articolo:

Questo modulo sostituisce l'esperienza di modifica della riga di comando in PowerShell.exe. Fornisce:

  • Sintassi colorazione
  • Notifica di errore di sintassi semplice
  • Una buona esperienza multilinea (sia di editing che cronologia)
  • Associazioni chiave personalizzabili
  • Modalità Cmd ed emacs (nessuna delle due è ancora completamente implementata, ma entrambe sono utilizzabili)
  • Molte opzioni di configurazione
  • Completamento stile Bash (opzionale in modalità Cmd, impostazione predefinita in modalità Emacs)
  • Ricerca cronologica interattiva in stile Bash / zsh (CTRL-R)
  • Emacs yank / kill ring
  • Movimento e "uccisione" basati su token di PowerShell
  • Annulla Ripristina
  • Salvataggio automatico della cronologia, inclusa la condivisione della cronologia attraverso sessioni live
  • Completamento "Menu" (un po 'come Intellisense, selezionare il completamento con le frecce) tramite Ctrl + Spazio

Lo uso quotidianamente!


4
Dopo aver installato PSReadLine, devi abilitare il completamento della scheda in stile bash aggiungendo questo al tuo profilo:Set-PSReadlineKeyHandler -Key Tab -Function Complete
brianpeiris

3
PSReadLine è ora installato per impostazione predefinita su Windows 10. Basta inserire la linea di configurazione che @brianpeiris ha menzionato nel tuo profilo e sei a posto.
Don Cruickshank,

Prova a utilizzare CompleteMenuinvece che Completeper un'esperienza più simile a una bash, ti consente di usare i tasti freccia per navigare tra le scelte
stib

3

Forse dovresti dare un'occhiata a Powertab , un'espansione personalizzabile della scheda PowerShell.


2
Grazie! Powertab migliora davvero notevolmente l'espansione delle schede. Tuttavia, c'è il problema che completa qualcosa che non è alla fine del comando.
Peter Moberg,

2

ciao peter basta premere F8 per qualcosa come speedearch. Si completa con i comandi eseguiti in precedenza che iniziano con ciò che si ha nella riga. Il problema con la cancellazione del trailing è fastidioso, scrivo un suggerimento su Connect relativo allo stesso problema. Nella maggior parte dei casi potresti usare Powershell ISE, che si comporta un po 'meglio (non eliminare i caratteri finali).


2

Il vecchio sottosistema command.exe è ancora coinvolto in PowerShell e forza molti comportamenti spiacevoli. Ma a partire da PowerShell v3, la GUI (PowerShell ISE) è ora utilizzabile e include un'esperienza di completamento + colorazione molto più moderna.

inserisci qui la descrizione dell'immagine


2

PowerShell utilizza le stesse funzionalità della console del venerabile Prompt dei comandi; quindi hai la solita Home / End e:

  • F3 per richiamare il comando precedente
  • F1 per copiare un singolo carattere dal comando precedente
  • F7 finestra della cronologia popup

... ma non c'è modo di mostrare tutti i possibili completamenti, per quanto ne so.


Questo è ancora molto limitante rispetto al buon vecchio bash. Ad esempio, è davvero fantastico poter digitare ctrl + r (speedearch) in bash e iniziare a digitare e verrà visualizzato un comando precedente corrispondente.
Peter Moberg,

1

PowerShell normale utilizza cmd come finestra del prompt dei comandi. Ecco perché ha un'enorme eredità (i programmi trasmettono il comportamento del vecchio cmd per anni) che non può essere modificato a causa della comparabilità all'indietro.

Ti consiglio di usare powershell_ise invece di powershell (è incluso nel pacchetto PowerShell standard). La versione 3.0 (non sono sicuro della precedente) supporta Intellisense dalla confezione. Questo è molto vicino allo stile di completamento bash. Premi Ctrl + Spazio invece di Tab. Riscontro problemi con i completamenti personalizzati su PowerTab, ma Intellisense funziona perfettamente. Powershell_ise conserva anche i comandi finali, ha la modalità di selezione normale, supporta Ctrl + C, Ctrl + V, Ctrl + A per selezionare il comando immesso, quindi Ctrl + A, passa all'accattonaggio della linea, Ctrl + A, fino alla fine (o Home /Fine).


0

PowerShell utilizza il proprio parser per i comandi, quindi in un certo senso è una shell diversa rispetto a cmd.exe, anche se condividono lo stesso terminale (finestra della GUI).

A causa di tale differenza, PowerShell consente di sostituire la funzionalità di completamento della scheda con la propria funzione. Non ho avuto il tempo di rovinare tutto da solo, ma fondamentalmente hai la precedenza sulla funzione tabexpansionnel tuo profilo, allo stesso modo in cui puoi ignorare la promptfunzione.

Ho trovato questo articolo , di Lee Holmes (autore del fantastico libro di cucina di Windows PowerShell ), che descrive una sostituzione della scheda che è molto simile a ciò che stai cercando. Probabilmente potresti modificarlo per darti esattamente quello che vuoi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.