在fish shell中禁止文件名/目录完成

时间:2015-06-26 03:29:11

标签: git shell tab-completion fish

我正在为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>时,它会正确显示helpalias作为可能的完成情况。但是在输入hub alias <tab>之后,即使我在那里提供了-f选项,它也会显示一个目录列表。

这里有什么问题?为什么会这样?有没有办法在这种情况下抑制文件/目录的完成?

帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

AFAIK不可能完全抑制标签完成。如果没有可用的特定于命令的完成,那么你总是会得到文件,理论是什么比什么都好。

-f标志的作用是阻止文件与您的选项一起显示:

> complete -c test_cmd -a 'alpha beta'
> test_cmd <tab>

您会看到与alphabeta混合的文件。现在:

> complete -f -c test_cmd -a 'gamma'
> test_cmd <tab>

由于-f标志,文件已消失。

将来这个东西将被基于docopt的完成语法(#478)所包含,这将使它更直接。