打包程序的人通常似乎对他们的程序将用于打开的文件类型有过于广泛的看法,如他们创建的 bash 自动完成设置所示。例如,经常发生我有文件a.svg和a.jpg,其中a.jpg是a.svg渲染成位图。我使用 inkscape 来编辑 svg 文件,使用 gimp 来编辑 jpg 文件。但是,如果我输入“inkscape a”或“gimp a”并点击自动完成选项卡,这些程序中的每一个都会像一只过度热情的小狗一样,想象我可能想要编辑 a.svg 或 a.jpg,而我必须消除歧义。
一个更愚蠢的例子(看起来更像是一个错误)是 gimp 提供打开 a.odt (一个 libre Office 文件),但如果我真的尝试这样做,则会出现错误。
如何减少此类程序的自动完成设置,以获得一种可最大程度地减少不便的自定义设置?
答案1
首先,让我澄清一下你的问题中的一些误解。
- 总的来说,完成设置是随 shell 分发的,而不是随单个程序分发的。虽然单个程序可以与完成设置捆绑在一起,就像它们与桌面启动器和菜单项捆绑在一起一样(至少在主要的桌面发行版中),但实际上,应用程序程序员不会编写完成设置,shell 开发人员做。
- 补全通常被调整为补全所有有用的内容,而不仅仅是最常见的情况。例如,Inkscape 可以打开 JPEG 文件,即使它通常不是最好的程序,因此
*.jpg
文件包含在 的补全中inkscape
。此外,默认情况下,补全包括所有文件。
对于 bash,完成设置分布在单独的bash 完成包裹。从版本 2.1 开始,它没有 的设置gimp
,因此完成参数即可gimp
简单地提供所有文件。对于inkspace
,补全函数知道一些选项,并补全一大组图像文件扩展名。
您可以使用以下命令在 bash 中显示或修改完成设置complete
内置。例如:
$ complete -p inkscape
complete -F _inkscape inkscape
$ type _inkscape
_inkscape is a function
_inkscape ()
{
local cur;
COMPREPLY=();
cur=${COMP_WORDS[COMP_CWORD]};
if [[ "$cur" == -* ]]; then
COMPREPLY=($( compgen -W '-? --help --usage -V --version \
-z --without-gui -g --with-gui -f --file= -p --print= \
-e --export-png= -d --export-dpi= -a --export-area= \
-w --export-width= -h --export-height= -i --export-id= \
-j --export-id-only -t --export-use-hints -b --export-background= \
-y --export-background-opacity= -l --export-plain-svg= -s --slideshow' -- $cur ));
else
_filedir '@(ai|ani|bmp|cur|dia|eps|gif|ggr|ico|jpe|jpeg|jpg|pbm|pcx|pdf|pgm|png|ppm|pnm|ps|ras|sk|svg|svgz|targa|tga|tif|tiff|txt|wbmp|wmf|xbm|xpm)';
fi
}
$ complete -p gimp
complete -F _minimal gimp
如果您不喜欢该_inkscape
函数的功能,请编写自己的函数。对于gimp
,bash 不知道完成;一旦您至少尝试完成一次,它就会记录_minimal
为完成函数。如果您想要不同的东西,请定义您自己的函数(通常称为_gimp
,但这不是义务)。
complete -F _gimp gimp
_gimp () {
_filedir '@(ai|ani|bmp|cur|gif|ggr|ico|jpe|jpeg|jpg|pbm|pcx|pgm|png|ppm|pnm|ras|sk|targa|tga|tif|tiff|wbmp|wmf|xbm|xpm)'
}
Zsh 提供更复杂的机制例如完成有限的一组,但如果没有比赛则退回到更广泛的一组。