Bash 实现对zsh别名的自动补全

Bash 实现对zsh别名的自动补全,bash,zsh,bash-completion,oh-my-zsh,zsh-completion,Bash,Zsh,Bash Completion,Oh My Zsh,Zsh Completion,我正在使用令人敬畏的zsh框架。每天我点击gc,它是git commit的别名,我点击,它会给我正确的提交文件。我真的很想知道这是如何实现的,所以我可以实现我自己的想法,使用别名导航到子目录 我的意思是使用这个别名导航到~/workspace/a-repo,它完成了a-repo,并给了我一些建议,这些建议是~/workspace中的文件夹。我已经使用了这个别名,但我需要知道如何添加正确的自动完成/建议 这是我的别名: -w() { cd ~/workspace/"$*" } 在gc(我假设在o

我正在使用令人敬畏的zsh框架。每天我点击
gc
,它是
git commit
的别名,我点击
,它会给我正确的提交文件。我真的很想知道这是如何实现的,所以我可以实现我自己的想法,使用别名导航到子目录

我的意思是使用这个别名导航到
~/workspace/a-repo
,它完成了
a-repo
,并给了我一些建议,这些建议是
~/workspace
中的文件夹。我已经使用了这个别名,但我需要知道如何添加正确的自动完成/建议

这是我的别名:

-w() { cd ~/workspace/"$*" }

gc
(我假设在oh my zsh的git插件中定义为
alias gc='git commit-v'
)的情况下,
zsh
在尝试完成之前,在内部用实际命令(
git commit-v
)替换别名(
gc
)。这适用于每个别名(除非设置了shell选项
COMPLETE\u alias
,该选项允许为别名设置单独的补全)

至于你想做什么:如果你认为
-w
实际上是一个函数而不是别名,那么你确实需要自己编写一个补全。但是有一种更简单的方法:静态命名目录

命名目录通常只是系统上用户的主目录。最常见的可能是当前用户的主目录的
~
。其他用户目录名为
~USERNAME
。您还可以定义自己的静态命名目录。有两种方法可以做到这一点:

  • 使用
    hash-d
    显式定义名称,类似于别名:
在这两种情况下,您现在都可以使用
~w
来引用您的工作区,在第二种情况下,您还可以使用
$w
(例如,在带引号的字符串中使用)。键入
cd~w/a-repo
将进入
~/workspace/a-repo
。制表符完成与任何其他路径一样,因此按
~w/a
将显示
~w/a-repo
完成

此外,如果设置shell选项AUTO_CD(
setopt AUTO_CD
),则只需键入路径(或目录名)即可切换到目录,而无需
CD

% w="/tmp"
% cd ~w
% pwd
/tmp
% mkdir 1 2 3
% setopt AUTO_CD
% ~w/<TAB>
1 2 3
% ~w/1
% pwd
/tmp/1
%w=“/tmp”
%cd~w
%pwd
/tmp
%mkdir 1 2 3
%setopt自动光碟
%~w/
1 2 3
%~w/1
%pwd
/tmp/1
w="${HOME}/workspace"
% w="/tmp"
% cd ~w
% pwd
/tmp
% mkdir 1 2 3
% setopt AUTO_CD
% ~w/<TAB>
1 2 3
% ~w/1
% pwd
/tmp/1