用shell完成pip安装

时间:2014-09-22 18:34:04

标签: python pip bash-completion

我在python中编写命令行工具并使用pip来分发它。我编写了一些脚本(一个用于bash,一个用于zsh)以允许工具完成选项卡。当有人进行pip安装时,有没有办法让pip安装这些脚本?

例如: 我有一个completion.bash文件。有人的时候

  

pip install mypackage

它还会获取bash文件。

我很确定我可以通过将脚本放在setup.py脚本中的data_files部分来为linux和bash执行此操作。

data_file=[
    ('/etc/bash_completion.d', ['bin/completion.bash'])
],  

但是我怎么能这样做,所以它是平台和shell独立的?我需要它在bash和zsh中为mac / linux工作。如果可能,甚至支持窗口。

这可能吗?如果是这样,怎么样?


如果重要,这是我的bash脚本:

_foo_complete() {
 COMPREPLY=()
 local words=( "${COMP_WORDS[@]}" )
 local word="${COMP_WORDS[COMP_CWORD]}"
 words=("${words[@]:1}")
 local completions="$(foo completer --cmplt=\""${words[*]}"\")"
 COMPREPLY=( $(compgen -W "$completions" -- "$word") )
}

complete -F _foo_complete foo

我目前正在通过运行source completion.bash

来安装它

1 个答案:

答案 0 :(得分:2)

你问了几个不同的问题。

首先,没有用于定义自定义shell完成的跨平台或跨shell解决方案。你发布的那个适用于bash,但是在tcsh中,你使用tcsh的complete命令,它的工作方式与bash不同。

其次,在pip install时获取包含完成定义的文件并不会带来太多好处。完成可能在该会话中起作用,但您可能希望它们在将来的会话(即shell调用)中生效。为此,每次shell启动时都必须提供您的文件(例如,在.bashrc的情况下,来自用户bash内)。

这个测量"安装"您的文件只是意味着将它们放在某处,并建议用户从各自的dot-rc文件中获取它们。即使你可以,你也不应该试图强迫"它。如果需要,可以让用户选择将其添加到他们的dot-rc文件中。

最好的方法可能是在您的包中包含每个受支持的shell的完成定义文件,例如: complete.bashcomplete.tcsh,上帝知道什么是Windows(抱歉,我不是Windows用户)。