zsh别名扩展

zsh别名扩展

问题描述:

是否可以配置zsh在选项卡完成期间扩展全局别名?例如,我有共同的别名:zsh别名扩展

alias -g '...'='../..' 
alias -g '....'='../../..' 

,但是当我输入,例如,cd .../some<tab>也不会扩大到cd .../somethingcd ../../something。因此,我经常不会使用这些方便的别名,因为它们与制表符完成不兼容。

+2

查看`man zshcompsys`并搜索“_expand_alias”。对不起,我没有机会深入学习zsh完成。你也可以试试unix.stackexchange.com。 – 2011-01-19 20:22:03

我的的Mikael马格努松的rationalise-dot用户。在我的zshrc中:

# This was written entirely by Mikael Magnusson (Mikachu) 
# Basically type '...' to get '../..' with successive .'s adding /.. 
function rationalise-dot { 
    local MATCH # keep the regex match from leaking to the environment 
    if [[ $LBUFFER =~ '(^|/| |  |'$'\n''|\||;|&)\.\.$' ]]; then 
     LBUFFER+=/ 
     zle self-insert 
     zle self-insert 
    else 
     zle self-insert 
    fi 
} 
zle -N rationalise-dot 
bindkey . rationalise-dot 
# without this, typing a . aborts incremental history search 
bindkey -M isearch . self-insert 

尝试查找zsh缩写。它们允许您输入一个“缩写”,当您按下空格等魔法键时,该缩写会自动替换为其完整形式。所以你可以创建一个将...<SPACE>更改为../..

例如,这是您在您的个人资料需要什么:

typeset -A abbrevs 
abbrevs=(
     "..." "../.." 
     "...." "../../.."   
) 

#create aliases for the abbrevs too 
for abbr in ${(k)abbrevs}; do 
    alias -g $abbr="${abbrevs[$abbr]}" 
done 

my-expand-abbrev() { 
    local MATCH 
    LBUFFER=${LBUFFER%%(#m)[_a-zA-Z0-9]#} 
    LBUFFER+=${abbrevs[$MATCH]:-$MATCH} 
    zle self-insert 
} 

bindkey " " my-expand-abbrev 
+4

对于这个问题,你只需输入`...`,然后按下`Ctrl-X a`,只使用普通的`alias -g`别名。 – 2011-01-20 01:01:43

+0

@Dennis:可以``做* *做它的正常完成*和*`_expand_alias`(`Ctrl-X a`)?如果是这样,那么问题就不能解决问题了吗? – iconoclast 2011-09-22 19:59:31