来自命令输出的 ZSH 自定义完成

来自命令输出的 ZSH 自定义完成

我正在为我的命令创建一个自定义完成ipadd,它将自动完成OS X.它有一个参数--device,允许您指定系统上的网络设备。

列出网络设备的命令OS X

networksetup -listallnetworkservices

它的输出是;

An asterisk (*) denotes that a network service is disabled.
Ethernet
Wi-Fi

然而,命令的第一行不是网络接口,我已经修改了该命令,以便它只显示EthernetWi-Fi

networksetup -listallnetworkservices | sed -n '2,$p'

其输出是;

Ethernet
Wi-Fi

我的问题是如何存储该命令并将其用于自动完成我的ipadd命令。我知道您可以使用_files但这是为了完成系统内的文件。

提前致谢 :)

答案1

  1. 创建一个名为的文件_ipadd并将以下内容放入其中:
    #compdef ipadd
    
    # The line above declares this function as providing completions to 
    # `ipadd`. In addition, it's important that the file name starts with 
    # an `_`, otherwise `compinit` won't autoload it.
    
    local output=$(networksetup -listallnetworkservices)
    
    # Split the output on newlines.
    local -a services=( ${(f)output} )
    
    # Offer the second to the last line as completions.
    _arguments "*:network service:( ${services[2,-1]} )"
    
  2. 确保包含此文件的文件夹位于您的$fpath.因此,如果我们假设它位于 中~/func,那么您可以在文件中执行以下操作.zshrc
    fpath+=( ~/func )
    
  3. 确保您调用compinit了您的~/.zshrc文件将目录添加到您的$fpath.否则,它将不会用于完成。
    autoload -Uz compinit && compinit
    

相关内容