tl;dr
Je souhaite trouver une version Powershell de la fonction bash
edit-and-execute-command
ou le widget zsh
edit-command-line
widget.
Contexte
Les commandes courtes sont exécutées directement sur la ligne de commande, les commandes longues et compliquées sont exécutées à partir de scripts. Cependant, avant qu'elles ne deviennent "longues", il est utile de pouvoir tester des commandes de longueur moyenne sur la ligne de commande. Pour ce faire, il est très utile d'éditer la commande dans un éditeur externe. AFAIK Powershell ne supporte pas cela nativement comme par exemple bash
y zsh
faire.
Ma tentative actuelle
Je suis novice en matière de Powershell, je vais donc faire beaucoup d'erreurs, mais j'ai avoir proposer une solution opérationnelle en utilisant les fonctionnalités de l'application [Microsoft.Powershell.PSConsoleReadLine]
classe. Je suis capable de copier la ligne de commande actuelle dans un fichier, de modifier le fichier, puis de réinjecter la version modifiée dans la ligne de commande :
Set-PSReadLineKeyHandler -Chord "Alt+e" -ScriptBlock {
$CurrentInput = $null
# Copy current command-line input, save it to a file and clear it
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref] $CurrentInput, [ref] $null)
Set-Content -Path "C:\Temp\ps_${PID}.txt" -Value "$CurrentInput"
[Microsoft.PowerShell.PSConsoleReadLine]::KillRegion()
# Edit the command with gvim
Start-Job -Name EditCMD -ScriptBlock { gvim "C:\Temp\ps_${Using:PID}.txt" }
Wait-Job -Name EditCMD
# Get command back from file the temporary file and insert it into the command-line
$NewInput = (Get-Content -Path "C:\Temp\ps_${PID}.txt") -join "`n"
[Microsoft.PowerShell.PSConsoleReadLine]::Insert($NewInput)
}
Questions
La solution que j'ai trouvée jusqu'à présent me semble lourde et quelque peu fragile. Existe-t-il d'autres solutions ? La solution actuelle peut-elle être améliorée ?
Environnement
- OS Windows 10.0.19043.0
- Powershell version 5.1.19041.1320
- PSReadLine version 2.0.0
La solution que j'ai choisie
Créer un exécutable "cuit" similaire à ce que l'on trouve dans mklement0 a montré. Je préfère vim
au lieu de `gvim, car il s'exécute directement dans la console :
'@vim -f %*' > psvim.cmd
$env:EDITOR = "psvim"
Set-PSReadLineKeyHandler -Chord "Alt+e" -Function ViEditVisually