【问题标题】:pip install with shell completion带有外壳完成的 pip install
【发布时间】:2014-09-22 18:34:03
【问题描述】:

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

例如: 我有一个completion.bash 文件。当有人这样做时

pip 安装我的包

它还将获取 bash 文件。

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

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

但我怎样才能做到这一点,使其独立于平台和外壳?我需要它在 bash 和 zsh 中为 mac/linux 工作。如果可能的话,甚至支持windows。

这可能吗?如果有,怎么做?


如果重要的话,这是我的 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 来安装它

【问题讨论】:

    标签: python pip bash-completion


    【解决方案1】:

    你问了几个不同的问题。

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

    其次,在pip install 时采购包含那些完成定义的文件不会有多大好处。完成可能在那个会话中起作用,但您可能希望它们在未来的会话(即 shell 调用)中也生效。为此,每次 shell 启动时都必须获取您的文件(例如,从用户的 .bashrc 中获取,如果是 bash)。

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

    最好的方法可能是在你的包中包含每个支持的 shell 的完成定义文件,例如complete.bashcomplete.tcsh,天知道 windows 是什么(对不起,我不是 windows 用户)。

    【讨论】:

    • 查看 pip 以获取可跨几个 shell 工作的完成的示例参考。要查看哪个,请运行 python -m pip completion --help 如果您使用的是 BASH,您将在您的配置文件/rc 中附加 python -m pip completion --bash
    猜你喜欢
    • 2017-01-14
    • 2019-11-20
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多