在 zsh 中完成命令名称本身

Completing command name itself in zsh

我有一堆非常冗长的 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 命令的参数。但是我是否缺少更简单的方法?

在您的 ~/.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 在已经打开的终端中获得可用的别名。)

你可以configure the completion system extensively with the zstyle builtin. By default, completion only tries to add a suffix, but you can change this with a 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,在“匹配控件”下,将其激活为“部分单词完成”。