PowerShell / PowerShell/PowerShellEditorServices
Discussion: Different method of passing $Context to Editor Commands
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C#
- Estrellas
- 767
- Forks
- 266
- Merge medio
- 3 d 16 h
- PR fusionados (30 d)
- 1
Descripción
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.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza rastreando las rutas de Register-EditorCommand, Function y ScriptBlock, y comparando EditorContext con $psEditor; el issue no menciona archivos ni pruebas. Se necesita una decisión del maintainer antes de la implementación, y deben documentarse el comportamiento deseado y las comprobaciones de finalización.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- powershell
- Área
- developer-experience
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Necesita aclaración
- Aptitud para principiantes
- 20/100