【问题标题】:Completing command name itself in zsh在 zsh 中完成命令名称本身
【发布时间】:2020-03-16 11:53:27
【问题描述】:

我有一堆非常冗长的 ZSH 函数,我想对它们使用 zsh 补全。示例:

qq-enum-dns-txfr-host
qq-enum-dns-brute-rev
qq-enum-dns-tcpdump
qq-enum-web-php-lfi-logfile
qq-enum-smb-tcpdump
qq-enum-web-php-ffuf-common-php
qq-enum-ftp-tcpdump

当我输入 qq-tcpTab 时,我想完成:

qq-enum-dns-tcpdump
qq-enum-smb-tcpdump
qq-enum-ftp-tcpdump

我能找到的所有文档都涉及如何完成给定命令或函数的参数,但没有说明如何使用子字符串(不是前缀)完成来确定首先使用哪个函数。

我想我可以重构,使每个函数都成为qq 命令的参数。但是我错过了一种更简单的方法吗?

【问题讨论】:

    标签: zsh zsh-completion


    【解决方案1】:

    您可以使用 zstyle 内置 configure the completion system extensively。默认情况下,补全仅尝试添加后缀,但您可以使用 matcher-list 样式更改它。要将样式应用于所有完成:

    zstyle ':completion:*' matcher-list …
    

    仅当上下文为command 时应用样式,并且仅适用于函数命令:

    zstyle ':completion:*:*:-command-:*:functions matcher-list …
    

    matcher-list 之后是completion matching control specifications 的列表。 Zsh 按顺序尝试它们,并在找到匹配项时立即停止。使用空规范只添加一个后缀;你通常会首先想要这个,除非在非常特定的情况下,这使得很难达到某些完成。您可以使用r 规范来允许标点符号左侧的部分补全:r:|[-+./_]=* 表示只要要补全的字符串包含一个字符 -+./_,匹配补全可以包含任何内容(任何匹配 * ,它匹配所有内容)在这个标点符号的左边。例如,qq-tcpTab 完成任何匹配 qq*-tcp* 的内容(最后的 * 来自常规后缀完成)。

    zstyle ':completion:*' matcher-list '' 'r:|[-+./_]=*'
    

    您可以通过交互式基本自定义界面compinstall,在“匹配控制”下,作为“部分单词完成”来激活它。

    【讨论】:

    • 这正是我要找的,谢谢!我还有其他问题,但我会提出一个新问题。
    • 后续问题here,如果您有一些空闲周期。谢谢!
    【解决方案2】:

    在您的~/.zshrc 中,您可以声明别名,这些别名将用于完成

    alias qq-tcpdump-enum-dns='qq-enum-dns-tcpdump'
    alias qq-tcpdump-enum-smb='qq-enum-smb-tcpdump'
    alias qq-tcpdump-enum-ftp='qq-enum-ftp-tcpdump'
    

    (然后您可以在已经打开的终端中source ~/.zshrc 以获取可用的别名。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多