我如何从自己的脚本中为fishshell提供制表符补全?

62o28rlo  于 2023-08-07  发布在  Shell
关注(0)|答案(3)|浏览(101)

Ubuntu 13.10和fish 2.1.0我想自己写一个Python脚本来从命令行执行一些任务。脚本将需要命令行参数。
我如何编写我的脚本,以便fish可以请求并获得给定参数的可能值。潜在值的列表是动态的。也就是说,它将以编程方式确定(例如,匹配某些标准的文件夹名称的列表)。
我想要的最终结果是这样的:

user@machine ~> myprog argument=fol<TAB>
folder1  folder2  folder3

字符串
其中myprog是我的脚本文件,argument是参数名称,folder1等是由我的脚本中的某个函数生成的有效值。
这可能吗?如果可能,又是如何做到的呢?

33qvvth1

33qvvth11#

改编自zanchey在GitHub上的评论:
如果你有一个程序myprog,它接受--_completion选项,你可以为myprog写一个完整的存根,看起来像这样:

complete --command myprog --arguments '(myprog --_completion (commandline -cp)'

字符串
然后,您的程序将作为myprog --_completion myprog some arguments here被调用,您可以使用适当的补全来响应。它应该只返回当前正在完成的token(您也可以使用(commandline -ct)将其传递给程序,或者自己标记它),然后可以选择一个选项卡和一个简短的描述。多个完成用新行分隔。
备注:

  • --_completionpython-selfcompletion库建议的约定,但是您可以使用任何您想要的东西,并且这个答案不是Python特有的
  • 没有办法指定dbarnett/python-selfcompletion#2(GitHub注解)中描述的默认完成。您肯定必须为每个命令创建一个短存根。

对于Python脚本,以下库可能会在将来的某个时候支持fish补全(但目前还没有):

lvjbypge

lvjbypge2#

你应该为你的脚本创建一个fish autocomplete functionsource,或者把它放在~/.config/fish/completions/myprog.fish文件夹中。
参考:fish docs

yduiuuwa

yduiuuwa3#

我想在一些边缘情况下完成@lofidevops的答案。
在我的例子中,我使用的是https://pkg.go.dev/github.com/jessevdk/go-flags,它的工作原理类似,但希望所有参数都单独传递,而不仅仅是一个带有空格的参数。(commandline -cp)不返回参数列表,而是返回一个带空格的字符串。
在我的例子中,以下完整的函数工作起来很有魅力:

complete -c my_prog -f  -a "(GO_FLAGS_COMPLETION=1 my_prog (string split ' ' (commandline -cp)))"

字符串

相关问题