用shell完成pip安装

Nic*_*ich 7 python pip bash-completion

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

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

pip安装mypackage

它还将获取bash文件.

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

data_file=[
    ('/etc/bash_completion.d', ['bin/completion.bash'])
],  
Run Code Online (Sandbox Code Playgroud)

但是我怎么能这样做,所以它是平台和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
Run Code Online (Sandbox Code Playgroud)

我目前正在通过运行来安装它 source completion.bash

shx*_*hx2 5

您在问几个不同的问题。

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

其次,在当时获取包含这些完成定义的文件pip install不会有太大作用。补全可能在该会话中起作用,但您可能希望它们也在未来的会话(即 shell 调用)中生效。为此,每次 shell 启动时都必须获取您的文件(例如.bashrc,在 的情况下,从用户的 内部bash)。

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

最好的方法可能是在你的包中包含每个支持的 shell 的完成定义文件,例如complete.bashcomplete.tcsh、 ,天知道 Windows 的情况如何(抱歉,我不是 Windows 用户)。

  • 这是参考:https://pip.pypa.io/en/stable/user_guide/#command-completion (3认同)