自定义 Bash 自动完成文件路径完成

Custom Bash Autocomplete with File Path Completion

我正在为我维护的项目开发 bash 自动完成功能。你可以find the script here。在一些比我更了解完成 API 的贡献者的帮助下,我靠自己的一些技巧拼凑了这个。

我们所拥有的一切都很好——只有一个例外。我们可以像这样管理完成

//type
pestle.phar som[TAB]

//completes to 
pestle.phar some-command-name 

但是,一旦我们到达这里,我们 丢失 文件 path/name 完成,这是库存的一部分 bash shell。也就是说,如果用户键入

,则继续前面的示例
//type
pestle.phar some-command-name /va[TAB]

我们希望它完成到

//completes to the following, because var exists
pestle.phar some-command-name /var

有没有办法告诉 complete 命令类似

Hey, in addition to everything we're telling you to do with our custom bash function, also keep your normal file path completion

如果没有,是否有一些已知的 science/boilerplate 可以在您自己的自定义基本完成函数中重新实现文件路径完成?

一些 and the docs 似乎 表明 -o filenames-o bashdefault 选项应该处理这个——但它没有似乎在 OS X 10.11 上工作。我不确定我是否误解了 -o,或者我的完成文件中的代码是否以某种方式覆盖了 -o 行为,或者如果 OS X 正在做它是 I'我只是一个表现良好的 unix 东西。

此外 - 如果不是很明显 - 这 我的第一个深度 bash 完成牛仔竞技表演。如果我在上面说了一些看似 dumb/naive 的话,请告诉我。我现在可能正在寻找鱼,但我想自己在bash完成河中学习鱼。

我认为 -o default(没有 -o filenames)应该适合你。根据手册:

  • bashdefault
    Perform the rest of the default bash completions if the compspec generates no matches.
  • default
    Use readline's default filename completion if the compspec generates no matches.
  • filenames
    Tell readline that the compspec generates filenames, so it can perform any filename-specific processing (like adding a slash to directory names, quoting special characters, or suppressing trailing spaces). Intended to be used with shell functions.

(有关 -o default-o bashdefault 之间的区别,另请参阅 'complete -d -o default cd' issue。)