PowerShell / PowerShell/PowerShellEditorServices
Discussion: Different method of passing $Context to Editor Commands
Personne n'a encore pris cette issue.
- Langage dominant
- C#
- Étoiles
- 767
- Forks
- 266
- Merge moyen
- 3 j 16 h
- PR mergées (30 j)
- 1
Description
I wanted to start a discussion on how PSES could improve the way it passes $Context to Editor Commands.
The way $Context is made accessible to an Editor Command currently, is it is passed as a parameter to the Command. This is not immediately evident and I can see this causing confusion.
In a scriptblock, this can be handled by adding a context param.
Register-EditorCommand `
-Name "Teamviewer.ConnectDevice" `
-DisplayName "Connect to Teamviewer Device" `
-SuppressOutput `
-ScriptBlock {
param([Microsoft.PowerShell.EditorServices.Extensions.EditorContext]$context)
Connect-Teamviewer
}
However, if you were to just specify the function you may get some results you didn't expect.
Register-EditorCommand `
-Name "Teamviewer.ConnectDevice" `
-DisplayName "Connect to Teamviewer Device" `
-SuppressOutput `
-Function Connect-Teamviewer
In the above example, Connect-Teamviewer will be passed $context as a parameter when executed as an Editor Command.
function Connect-Teamviewer
{
[Cmdletbinding()]
param
(
[parameter(Mandatory=$true)]
[string]$ComputerName
)
If your function looks something like the above code the command will actually error. $context will be passed to the $CompuerName parameter. Meaning you would need to write your functions with this in mind.
function Connect-Teamviewer
{
[Cmdletbinding()]
param
(
[parameter(Mandatory=$false)]
[[Microsoft.PowerShell.EditorServices.Extensions.EditorContext]]$Context,
[parameter(Mandatory=$true)]
[string]$ComputerName
)
This is likely not a good solution ether. It is going to be confusing to those writing their first commands, and there could potentially be some unwanted results. I have not tested it, but I wonder of the potential issues of a parameter not checking for a type and being passed context to do something like delete something.
function Delete-Stuff
{
[Cmdletbinding()]
param
(
$Stuff
)
Process
{
foreach ($item in $Stuff)
{
Delete-AllTheThings $item
}
}
}
One question I wanted to ask, could the information in $Context, be added to $psEditor? Is there a reason it has to be passed to the function @daviwil ?
$psEditor.context.cursorposition
Something along the lines of that. When I was first learning the Editor commands, this is sort of what I thought $psEditor was doing. I didn't realize there was a difference between $Context and $psEditor. @daviwil can you better explain the exact differences between the 2? I'd like to get a better grasp of exactly how each differ.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par suivre les chemins de Register-EditorCommand, Function et ScriptBlock, puis comparez EditorContext à $psEditor ; l’issue ne nomme aucun fichier ni test. Une décision du maintainer est nécessaire avant l’implémentation, et le comportement attendu ainsi que les vérifications de fin doivent être documentés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- powershell
- Domaine
- developer-experience
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 20/100