6

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

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

但是,例如,当我键入时,cd .../some<tab>它不会扩展为cd .../somethingor cd ../../something。因此,我经常不会使用这些方便的别名,因为它们与制表符补全不兼容。

4

2 回答 2

10

我是 Mikael Magnusson 的用户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
于 2011-01-22T07:58:02.263 回答
6

尝试查找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 
于 2011-01-19T22:49:03.110 回答