【发布时间】:2017-06-30 17:59:26
【问题描述】:
我无法清楚地解释 Readline 选项 show-all-if-ambiguous 和 show-all-if-unmodified 之间的区别,以及它们是影响不同的事物还是相互排斥。官方文档对此主题很少。
【问题讨论】:
标签: bash readline tab-completion
我无法清楚地解释 Readline 选项 show-all-if-ambiguous 和 show-all-if-unmodified 之间的区别,以及它们是影响不同的事物还是相互排斥。官方文档对此主题很少。
【问题讨论】:
标签: bash readline tab-completion
默认情况下,如果有多个可能的完成,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-ambiguous 的方式更改完成函数的默认行为。如果设置为“on”,则具有多个可能完成没有任何可能的部分完成(可能的完成不共享公共前缀)的单词会导致立即列出匹配项而不是响铃钟。默认值为“关闭”。
这意味着如果可以进行任何部分补全,则它们将被填写,并且不会显示所有补全。
如果没有部分完成,则显示所有完成。
如果不明确则全部显示
这会改变完成函数的默认行为。如果设置为“on”,则具有多个可能完成的单词会导致立即列出匹配项,而不是响铃。默认值为“关闭”。
这意味着单词将部分完成,直到出现歧义AND将在一个步骤中打印所有完成。
假设我们有一个文件 abcd.txt 和 abce.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 那么行为将是前者。
【讨论】: