PowerShell / PowerShell/PowerShellEditorServices
Discussion: Different method of passing $Context to Editor Commands
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- C#
- Star
- 767
- Fork
- 266
- Merge trung bình
- 3 ngày 16 giờ
- Pull request đã merge (30 ngày)
- 1
Mô tả
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.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách lần theo các đường dẫn của Register-EditorCommand, Function và ScriptBlock, đồng thời so sánh EditorContext với $psEditor; issue không nêu tệp hoặc bài kiểm thử nào. Cần có quyết định của maintainer trước khi triển khai, đồng thời phải ghi lại hành vi mong muốn và các bước kiểm tra hoàn tất.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- powershell
- Lĩnh vực
- developer-experience
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 20/100