在命令行中使用自定义选项补全,仅循环遍历特定文件类型。

12 浏览
0 Comments

在命令行中使用自定义选项补全,仅循环遍历特定文件类型。

我使用PowerShell的PSReadline基于的制表符自动完成功能,并且我希望实现以下自定义完成行为:\n在一个文件夹中,我有以下文件:\n

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

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

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

\n但是我想要使用一个快捷方式,这样我就可以只滚动浏览.java文件但不显示文件后缀。我还想去掉文件名中的\".\\\"。\n所以如果我输入java并使用制表符,我希望得到:\n

java File1

\n然后再次使用制表符得到:\n

java File2

\n以此类推(使用制表符或其他按键)。\n我还想知道,在编译java文件之前,我有以下文件夹:\n

File1.java
File2.java

\n现在我想输入javac并使用制表符,这样我就可以得到:\n

javac File1.java

\n再次使用制表符得到:\n

javac File2.java

\n以此类推。\n这种情况可能吗?

0
0 Comments

问题的出现原因:

在PowerShell中,当使用Tab键进行命令补全时,会遍历当前目录下的所有文件类型。然而,有时候我们只想遍历特定的文件类型,而不是所有文件。这就需要自定义命令补全的功能。

解决方法:

可以使用PowerShell的Register-ArgumentCompleter cmdlet(PSv5+版本)来注册自定义的命令补全功能。通过注册一个脚本块,可以实现只遍历特定文件类型的功能。

具体实现如下:

使用Register-ArgumentCompleter命令来定义java命令的补全功能,只遍历没有扩展名的*.java文件:

Register-ArgumentCompleter -Native -CommandName java -ScriptBlock {
    param($wordToComplete)
    (Get-ChildItem $wordToComplete*.java).BaseName
}

使用Register-ArgumentCompleter命令来定义javac命令的补全功能,遍历带有扩展名的*.java文件:

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

需要注意的是,这会全局影响补全功能,无法实现命令特定的按键绑定。

如果想要修改快捷键,比如使用ALT或CTRL,而不是TAB键,可以参考上述的修改按键的示例。但需要注意的是,无法使用单独的修饰键,如ALT或CTRL,必须将它们与非修饰键组合使用。

另外,有用户提问是否可以将CTRL+K绑定到特定的命令(例如javac和java),而不是全局生效。回答是,Set-PSReadLineKeyHandler命令会对所有脚本生效,无法实现命令特定的按键绑定。如果有这方面的需求,建议提问一个新的问题来获取更详细的解答。

0