我在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
答案 0 :(得分:2)
你问了几个不同的问题。
首先,没有用于定义自定义shell完成的跨平台或跨shell解决方案。你发布的那个适用于bash,但是在tcsh中,你使用tcsh的complete
命令,它的工作方式与bash不同。
其次,在pip install
时获取包含完成定义的文件并不会带来太多好处。完成可能在该会话中起作用,但您可能希望它们在将来的会话(即shell调用)中生效。为此,每次shell启动时都必须提供您的文件(例如,在.bashrc
的情况下,来自用户bash
内)。
这个测量"安装"您的文件只是意味着将它们放在某处,并建议用户从各自的dot-rc文件中获取它们。即使你可以,你也不应该试图强迫"它。如果需要,可以让用户选择将其添加到他们的dot-rc文件中。
最好的方法可能是在您的包中包含每个受支持的shell的完成定义文件,例如: complete.bash
,complete.tcsh
,上帝知道什么是Windows(抱歉,我不是Windows用户)。