代码之家  ›  专栏  ›  技术社区  ›  TheSmartMonkey

如何在PowerShell选项卡完成中启用子字符串匹配?

  •  0
  • TheSmartMonkey  · 技术社区  · 4 月前

    我正在尝试修改PowerShell的选项卡完成行为,使其不仅仅与 开始 一个词,但也允许 子字符串匹配

    例子

    • 通常,如果我打字 under<TAB> ,PowerShell不会建议 code-understanding 因为它不是从 under
    • 我希望PowerShell能够 在任何地方建议包含我输入的任何单词 (例如。, 代码理解 , file-underlined 等等)

    我试过的

    我已经设置好了 PSReadLine 增强功能以更好地完成菜单样式:

    Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
    

    这改善了预测,但仍然 仅匹配单词的开头

    我的问题

    有没有当地的方式 PowerShell 7+ 使 TAB 完成比赛 子字符串 而不仅仅是单词的开头?

    1 回复  |  直到 4 月前
        1
  •  1
  •   mklement0    4 月前

    太长,读不下去了

    Mathias 提供了关键的指针:

    PowerShell的选项卡完成(又名命令完成)支持 通配符 表达式,而不是试图滚动复杂的自定义解决方案,您可以简单地 在子字符串前加上 * ;举个例子:

    *under 选项卡 将完成两者 code-understanding file-underlined (反复按压 选项卡 在比赛中循环;根据您的定制 Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete ,所有完成项都将显示在菜单中)。


    背景信息:

    基于通配符的命令完成:
    • 字面意义的 字符串,PowerShell的命令完成使用 前缀 匹配,即输入字符串必须与 开始 命令。

      • 表达方式为 wildcard 条款, under 选项卡 表现得像 (Get-Command).Name -like 'under*' 即a 尾随 * 暗指的 .
    • 通配符 表达式是这样匹配的(除了尾随的 * 总是 暗示),以及a 前面的 * 因此有效地执行 子字符串 匹配,即文字部分在命令名称中的任何位置都匹配。

      • 您甚至可以使用通配符元字符 倍数 时代;例如。, *readl*handler 选项卡 完成到 Get-PSReadLineKeyHandler , Remove-PSReadLineKeyHandler ,以及 Set-PSReadLineKeyHandler .
    基于大写字母的命令完成:

    PowerShell (Core) 7 提供了一种基于匹配的鲜为人知的命令完成方法 大写字母 在命令名称中。

    例如。, t-mm 完成 Test-ModuleManifest ,但请注意以下几点:

    • 首都 动词 命令名称的一部分( Test 在这个例子中)后面必须跟 -

    • 每一个 必须指定大写字母(按顺序)以匹配命令名称;例如。, s-t 完成到 Start-Transcript Stop-Transcript 但是 Start-ThreadJob 因为后者有一个额外的资本, J (即, s-tj 需要与之匹配)。

    • 这种方法可以 可以与通配符结合使用。

    还要注意,许多内置的cmdlet表面上看起来都很相似 aliases 使用标准化别名 前缀 为每个人定义 approved verb 例如。 sa 对于 Start- ,随后- 没有 干预 - -非标准化的字母序列 名词 部分。例如。, jb 用于表示 Job 部分在 Start-Job .
    也就是说,提交别名 sajb as is是使用基于资本的命令完成的替代方案
    s-j 选项卡 .
    要查看为给定命令定义了哪些别名(如果有的话),请使用
    Get-Alias -Definition <command-name>


    [1] 请注意,即使有 - approved 动词。