在命令行上使用自定义 Tab 完成仅循环浏览 PS 中的特定文件类型

Cycle through only specific file types in PS using custom tab completion on the command line

我使用 PowerShell 的基于 PSReadline 的制表符完成功能,我希望实现以下自定义完成行为:

我有一个文件夹

File1.java
File1.class
File2.java
File2.class

如果我在 java 之后使用制表符,我会得到一个文件列表:

java .\File
File1.java
File1.class
File2.java
File2.class

但我想使用快捷方式,这样我就可以只滚动浏览 .java 文件,而不会显示扩展名。我还想去掉名称中的“.\”。

所以如果我写 java 并使用制表符,我想要

java File1

下一个选项卡给出

java File2

等等(使用制表符或其他键)。

我也想知道,在编译 java 文件之前我有文件夹

File1.java
File2.java

我现在想写 javac 并使用制表符所以我得到

javac File1.java

然后选项卡再次给出

javac File2.java

等等。

这可能吗?

使用 Register-ArgumentCompleter cmdlet (PSv5+):

# With `java`, cycle through *.java files, but without the extension.
Register-ArgumentCompleter -Native -CommandName java -ScriptBlock {
    param($wordToComplete)
    (Get-ChildItem $wordToComplete*.java).BaseName
}

# With `javac`, cycle through *.java files, but *with* the extension.
Register-ArgumentCompleter -Native -CommandName javac -ScriptBlock {
    param($wordToComplete)
    (Get-ChildItem $wordToComplete*.java).Name
}

要定义调用完成的替代键或和弦,请使用 Set-PSReadLineKeyHandler;例如,要使 Ctrl+K 调用补全:

Set-PSReadLineKeyHandler -Key ctrl+k -Function TabCompleteNext
Set-PSReadLineKeyHandler -Key ctrl+shift+k -Function TabCompletePrevious

请注意,这会影响全局完成 - 您不能以这种方式实现特定于命令的完成键。