如何使zsh自动完成故障转移到compdef _files

时间:2016-04-18 10:38:14

标签: autocomplete zsh zsh-completion

我需要使用以下方法获取ssh密钥的指纹:

$ ssh-keygen -lf ~/.ssh/id_rsa_user.pub
输入后

ssh-keygen -lf ~/.ss TAB 它没有提供任何选项。

我必须这样做:

$ compdef _files ssh-keygen

之后我可以使用文件路径自动完成,但命令autocomplete停止工作,所以如果我输入ssh-keygen - Tab ,我不再看到这个输出:

$ ssh-keygen -
 -- option --
-B  -- show the bubblebabble digest of key
-C  -- provide new comment
-D  -- download key stored in smartcard reader
-N  -- provide new passphrase
-P  -- provide old passphrase
-U  -- upload key to smartcard reader
-b  -- specify number of bits in key
-c  -- change comment in private and public key files
-e  -- export key to SECSH file format
-f  -- key file
-i  -- import key to OpenSSH format
-l  -- show fingerprint of key file
-p  -- change passphrase of private key file
-q  -- silence ssh-keygen
-t  -- specify the type of the key to create
-y  -- get public key from private key

所以想知道是否有一种方法可以启用两个选项,以便我可以执行以下操作:

ssh-keyg TAB 会给我:

$ ssh-keygen

然后我可以做

$ ssh-keygen - TAB

这将打印选项菜单并可以执行:

$ ssh-keygen -lf ~/.ss TAB

并且有可用的选项列表,所以最后我会得到类似的东西:

$ ssh-keygen -lf ~/.ssh/id_rsa_user.pub

现在我只想添加到~/.zshrc这个:

compdef _files ssh-keygen
compdef _files adb
compdef _files mysql
...

但我必须为avery命令执行此操作,我想使用_files完成,因此我想知道是否有一种方法可以始终使用_files或故障转移到它。

有什么想法吗?

在按 Ctrl + d 显示文件选项的情况下,是否可以使其行为类似于csh

更新

我注意到,如果我的最后一个参数是-f,则自动完成功能起作用:

ssh-keygen -l -f ~/.ssh TAB

但是对于自定义脚本,命令什么功能,窗口小部件别名可以帮助强制_files完成。?

1 个答案:

答案 0 :(得分:0)

解决方案是更新为zsh这就是我的做法:

# check the zsh info
brew info zsh

# install zsh
brew install zsh

# add shell path
sudo vim /etc/shells

# add the following line into the very end of the file(/etc/shells)
/usr/local/bin/zsh

# change default shell
chsh -s /usr/local/bin/zsh

我在完成git-flow问题时已通过重新安装--without-completions来解决此问题:

$ brew install git --without-completions