在命令行中使用自定义选项补全,仅循环遍历特定文件类型。
在命令行中使用自定义选项补全,仅循环遍历特定文件类型。
我使用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这种情况可能吗?
问题的出现原因:
在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命令会对所有脚本生效,无法实现命令特定的按键绑定。如果有这方面的需求,建议提问一个新的问题来获取更详细的解答。