在 fish shell 中抑制 filename/directory 完成
Suppress filename/directory completion in fish shell
我正在为 Hub 编写完成脚本。
这是我的第一个完成脚本,我 运行 遇到了一些问题。从 git.fish 完成脚本中汲取灵感,这是我目前所拥有的:
# statement starting with 'hub'
function __fish_hub_needs_command
set cmd (commandline -opc)
if [ (count $cmd) -eq 1 -a $cmd[1] = 'hub' ]
return 0
end
return 1
end
# statement starting with 'hub COMMAND'
function __fish_hub_using_command
set cmd (commandline -opc)
if [ (count $cmd) -gt 1 ]
if [ $argv[1] = $cmd[2] ]
return 0
end
end
return 1
end
# help
# show '--help' for every command
complete -f -c hub -n '__fish_hub_needs_command' -a help -d 'Display enhanced git-help(1)'
complete -f -c hub -n 'not __fish_hub_needs_command' -l help -d 'Display enhanced git-help(1)'
# alias
complete -f -c hub -n '__fish_hub_needs_command' -a alias -d 'Shows shell instructions for wrapping git.'
complete -f -c hub -n '__fish_hub_using_command alias' -s s -d 'Output shell script suitable for eval.'
现在,当键入 hub <tab>
时,它会正确显示 help
和 alias
作为可能的补全。但是在输入 hub alias <tab>
之后,即使我在那里提供了 -f
选项,它也会向我显示一个目录列表。
这里有什么问题?为什么会这样?在这种情况下,有没有办法抑制 file/directory 完成?
帮助将不胜感激。谢谢。
据我所知,完全禁止制表符补全是不可能的。如果没有可用的特定命令补全,根据有总比没有好的理论,您将始终获得文件。
-f
标志的作用是防止文件与您的选项一起显示:
> complete -c test_cmd -a 'alpha beta'
> test_cmd <tab>
您会看到文件与 alpha
和 beta
混合在一起。现在:
> complete -f -c test_cmd -a 'gamma'
> test_cmd <tab>
由于 -f
标志,文件已丢失。
将来这些内容将包含在基于 docopt 的完成语法 (#478) 中,这应该会使其更加直接。
我正在为 Hub 编写完成脚本。
这是我的第一个完成脚本,我 运行 遇到了一些问题。从 git.fish 完成脚本中汲取灵感,这是我目前所拥有的:
# statement starting with 'hub'
function __fish_hub_needs_command
set cmd (commandline -opc)
if [ (count $cmd) -eq 1 -a $cmd[1] = 'hub' ]
return 0
end
return 1
end
# statement starting with 'hub COMMAND'
function __fish_hub_using_command
set cmd (commandline -opc)
if [ (count $cmd) -gt 1 ]
if [ $argv[1] = $cmd[2] ]
return 0
end
end
return 1
end
# help
# show '--help' for every command
complete -f -c hub -n '__fish_hub_needs_command' -a help -d 'Display enhanced git-help(1)'
complete -f -c hub -n 'not __fish_hub_needs_command' -l help -d 'Display enhanced git-help(1)'
# alias
complete -f -c hub -n '__fish_hub_needs_command' -a alias -d 'Shows shell instructions for wrapping git.'
complete -f -c hub -n '__fish_hub_using_command alias' -s s -d 'Output shell script suitable for eval.'
现在,当键入 hub <tab>
时,它会正确显示 help
和 alias
作为可能的补全。但是在输入 hub alias <tab>
之后,即使我在那里提供了 -f
选项,它也会向我显示一个目录列表。
这里有什么问题?为什么会这样?在这种情况下,有没有办法抑制 file/directory 完成?
帮助将不胜感激。谢谢。
据我所知,完全禁止制表符补全是不可能的。如果没有可用的特定命令补全,根据有总比没有好的理论,您将始终获得文件。
-f
标志的作用是防止文件与您的选项一起显示:
> complete -c test_cmd -a 'alpha beta'
> test_cmd <tab>
您会看到文件与 alpha
和 beta
混合在一起。现在:
> complete -f -c test_cmd -a 'gamma'
> test_cmd <tab>
由于 -f
标志,文件已丢失。
将来这些内容将包含在基于 docopt 的完成语法 (#478) 中,这应该会使其更加直接。