Bạn có muốn tối ưu hóa quá trình gõ code trong PowerShell không? Bài viết này sẽ hướng dẫn bạn cách tùy chỉnh Tab Expansion để tự động thêm dấu ngoặc đơn đóng ")" khi hoàn thành các phương thức không có tham số. Điều này giúp tiết kiệm thời gian và giảm thiểu lỗi chính tả. Chúng ta sẽ khám phá hai phương pháp tiếp cận khác nhau, từ đó bạn có thể chọn lựa giải pháp phù hợp nhất với nhu cầu của mình.
Khi sử dụng Tab Expansion trong PowerShell, đôi khi bạn sẽ gặp tình huống phương thức được hoàn thành nhưng lại thiếu dấu ngoặc đơn đóng, đặc biệt là với các phương thức không có tham số. Ví dụ:
''.GetT
''.GetType(
''.GetType()
Việc phải tự tay thêm dấu ngoặc đơn đóng có thể gây phiền toái và làm chậm tốc độ gõ code của bạn. May mắn thay, PowerShell cho phép bạn tùy chỉnh Tab Expansion để tự động hóa quá trình này.
Chúng ta sẽ sử dụng hàm TabExpansion2
để tùy chỉnh hành vi của Tab Expansion. Có hai phương pháp chính để thực hiện điều này:
CompletionResult
mới cho các phương thức không có tham số, thêm dấu ngoặc đơn đóng. Đây là cách an toàn và dễ bảo trì hơn.CompletionText
của các đối tượng CompletionResult
hiện có. Cách này có thể hiệu quả hơn về hiệu năng nhưng cũng tiềm ẩn rủi ro hơn do phụ thuộc vào các trường riêng tư có thể thay đổi trong các phiên bản PowerShell tương lai.Phương pháp này tạo một đối tượng CompletionResult
mới, đảm bảo tính toàn vẹn của dữ liệu và giảm thiểu khả năng xảy ra lỗi. Dưới đây là đoạn code minh họa:
function TabExpansion2 {
[CmdletBinding(DefaultParameterSetName = 'ScriptInputSet')]
[OutputType([System.Management.Automation.CommandCompletion])]
param(
[Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 0)]
[AllowEmptyString()]
[string]$inputScript,
[Parameter(ParameterSetName = 'ScriptInputSet', Position = 1)]
[int]$cursorColumn = $inputScript.Length,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 0)]
[System.Management.Automation.Language.Ast]$ast,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 1)]
[System.Management.Automation.Language.Token[]]$tokens,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 2)]
[System.Management.Automation.Language.IScriptPosition]$positionOfCursor,
[Parameter(ParameterSetName = 'ScriptInputSet', Position = 2)]
[Parameter(ParameterSetName = 'AstInputSet', Position = 3)]
[Hashtable]$options = $null
)
end {
if ($psCmdlet.ParameterSetName -eq 'ScriptInputSet') {
$toComplete = [System.Management.Automation.CommandCompletion]::CompleteInput(
$inputScript,
$cursorColumn,
$options
)
} else {
$toComplete = [System.Management.Automation.CommandCompletion]::CompleteInput(
$ast,
$tokens,
$positionOfCursor,
$options
)
}
for ($i = 0; $i -lt $toComplete.CompletionMatches.Count; $i++) {
$match = $toComplete.CompletionMatches[$i]
if ($match.ToolTip.EndsWith('()')) {
$toComplete.CompletionMatches[$i] =
[System.Management.Automation.CompletionResult]::new(
$match.CompletionText + ')',
$match.ListItemText,
$match.ResultType,
$match.ToolTip
)
}
}
$toComplete
}
}
Phương pháp này trực tiếp sửa đổi đối tượng CompletionResult
thông qua Reflection. Mặc dù có thể nhanh hơn, nhưng nó phụ thuộc vào cấu trúc bên trong của đối tượng và có thể bị ảnh hưởng bởi các thay đổi trong tương lai. Dưới đây là code ví dụ:
function TabExpansion2 {
[CmdletBinding(DefaultParameterSetName = 'ScriptInputSet')]
[OutputType([System.Management.Automation.CommandCompletion])]
param(
[Parameter(ParameterSetName = 'ScriptInputSet', Mandatory = $true, Position = 0)]
[AllowEmptyString()]
[string]$inputScript,
[Parameter(ParameterSetName = 'ScriptInputSet', Position = 1)]
[int]$cursorColumn = $inputScript.Length,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 0)]
[System.Management.Automation.Language.Ast]$ast,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 1)]
[System.Management.Automation.Language.Token[]]$tokens,
[Parameter(ParameterSetName = 'AstInputSet', Mandatory = $true, Position = 2)]
[System.Management.Automation.Language.IScriptPosition]$positionOfCursor,
[Parameter(ParameterSetName = 'AstInputSet', Position = 3)]
[Parameter(ParameterSetName = 'ScriptInputSet', Position = 2)]
[Hashtable]$options = $null
)
end {
if ($psCmdlet.ParameterSetName -eq 'ScriptInputSet') {
$toComplete = [System.Management.Automation.CommandCompletion]::CompleteInput(
$inputScript,
$cursorColumn,
$options
)
} else {
$toComplete = [System.Management.Automation.CommandCompletion]::CompleteInput(
$ast,
$tokens,
$positionOfCursor,
$options
)
}
# Cache the FieldInfo for performance
if (-not $script:_fieldInfo) {
$fieldName = 'completionText'
if ($IsCoreCLR) {
# In PowerShell 7 the field starts with `_`
$fieldName = '_completionText'
}
$script:_fieldInfo = [System.Management.Automation.CompletionResult].GetField(
$fieldName,
[System.Reflection.BindingFlags]'Instance, NonPublic'
)
}
foreach ($match in $toComplete.CompletionMatches) {
if ($match.ToolTip.EndsWith('()')) {
$script:_fieldInfo.SetValue(
$match,
$match.CompletionText + ')'
)
}
}
$toComplete
}
}
Để triển khai, bạn có thể lưu một trong hai đoạn code trên vào một file .ps1
(ví dụ: TabExpansion.ps1
) và import nó vào profile PowerShell của bạn. Thêm dòng sau vào profile của bạn (thường nằm ở $PROFILE
):
. C:\Path\To\Your\TabExpansion.ps1
Sau khi import, hãy khởi động lại PowerShell và thử lại Tab Expansion với các phương thức không có tham số. Bạn sẽ thấy dấu ngoặc đơn đóng được tự động thêm vào.
Bằng cách tùy chỉnh TabExpansion2
, bạn có thể cải thiện đáng kể hiệu quả gõ code trong PowerShell. Việc tự động thêm dấu ngoặc đơn đóng cho các phương thức không có tham số giúp bạn tiết kiệm thời gian và giảm thiểu lỗi chính tả. Hãy chọn phương pháp phù hợp nhất với nhu cầu và kỹ năng của bạn, và tận hưởng trải nghiệm coding mượt mà hơn!
Bài viết liên quan