show-all-if-ambiguous vs show-all-if-unmodified?

show-all-if-ambiguous vs show-all-if-unmodified?

我找不到关于 Readline 选项 show-all-if-ambiguousshow-all-if-unmodified 之间区别的明确解释,以及它们是否影响不同的事物或相互排斥。关于这个主题的官方文档很少。

默认情况下,如果有多个可能的完成,readline 将不会打印任何可能的完成。此外,如果所有可能的补全共享一个公共前缀,则插入该公共前缀。

讨论的两个选项改变了 readline 的行为:

  • show-all-if-ambiguous 将导致 readline 在第一次 Tab 按下后打印可能的完成,即使有多个.
  • show-all-if-unmodified 会做同样的事情,除了所有完成共享一个公共前缀的情况.

一个例子:

假设我们有两个可能的完成匹配项,并且它们共享一个公共前缀。例如,在一个空目录中,运行:

touch ___1 ___2

现在,输入 :SpaceTab

如果我们打开 show-all-if-ambiguous,屏幕将如下所示:

$ :
___1  ___2
$ : ___

但如果我们只打开 show-all-if-unmodified,屏幕将如下所示:

$ : ___

请注意,在这两种情况下,按 Tab 将触发可能的完成显示。但是,如果我们打开上述选项中的 两个 选项,则不会发生任何事情,我们将不得不再次按 Tab 以获取列表.

使用 man page

中的描述

show-all-if-unmodified

This alters the default behavior of the completion functions in a fashion similar to show-all-if-ambiguous. If set to ‘on’, words which have more than one possible completion without any possible partial completion (the possible completions don’t share a common prefix) cause the matches to be listed immediately instead of ringing the bell. The default value is ‘off’.

这意味着如果可以完成任何部分完成,那么它们将被填充,并且不会显示所有完成。
如果没有部分完成,则显示所有完成。

show-all-if-ambiguous

This alters the default behavior of the completion functions. If set to ‘on’, words which have more than one possible completion cause the matches to be listed immediately instead of ringing the bell. The default value is ‘off’.

这意味着单词将被部分完成直到有歧义的地方AND 将一步打印所有完成。


例子

假设我们有一个文件 abcd.txtabce.txt

正在使用
show-all-if-unmodified

打字

$ls a<tab>

会显示

$ls abc

并再次按 Tab 键(因为没有部分完成)将导致

$ls abc
abcd.txt abce.txt
$ls abc

正在使用
show-all-if-ambiguous

打字

ls a<tab>

会显示

$ls a
abcd.txt abce.txt
$ls abc

所以两个动作一步到位。

还要注意 show-all-if-ambiguous 覆盖 show-all-if-unmodified 所以如果两者都设置为 on 然后行为将还是前者吧。