PowerShell / PowerShell/PowerShellEditorServices

Discussion: Different method of passing $Context to Editor Commands

Aperta
#249 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Area-Extension Terminal Issue-Discussion
Lingua principale
C#
Stelle
767
Fork
266
Merge medio
3g 16h
PR unite (30g)
1

Descrizione

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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia tracciando i percorsi di Register-EditorCommand, Function e ScriptBlock e confrontando EditorContext con $psEditor; l’issue non indica file né test. Prima dell’implementazione è necessaria una decisione del maintainer, documentando il comportamento desiderato e i controlli di completamento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
powershell
Ambito
developer-experience
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
20/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.