【问题标题】:show-all-if-ambiguous vs show-all-if-unmodified?显示所有如果模棱两可与显示所有如果未修改?
【发布时间】:2017-06-30 17:59:26
【问题描述】:

我无法清楚地解释 Readline 选项 show-all-if-ambiguousshow-all-if-unmodified 之间的区别,以及它们是影响不同的事物还是相互排斥。官方文档对此主题很少。

【问题讨论】:

    标签: bash readline tab-completion


    【解决方案1】:

    默认情况下,如果有多个可能的完成,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 才能获得列表。

    【讨论】:

      【解决方案2】:

      使用来自man page的描述

      如果未修改则全部显示

      这会以类似于 show-all-if-ambiguous 的方式更改完成函数的默认行为。如果设置为“on”,则具有多个可能完成没有任何可能的部分完成(可能的完成不共享公共前缀)的单词会导致立即列出匹配项而不是响铃钟。默认值为“关闭”。

      这意味着如果可以进行任何部分补全,则它们将被填写,并且不会显示所有补全。
      如果没有部分完成,则显示所有完成。

      如果不明确则全部显示

      这会改变完成函数的默认行为。如果设置为“on”,则具有多个可能完成的单词会导致立即列出匹配项,而不是响铃。默认值为“关闭”。

      这意味着单词将部分完成,直到出现歧义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 那么行为将是前者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多