zsh别名扩展

6

有没有可能配置zsh在tab键补全时扩展全局别名?例如,我有以下常用别名:

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

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


2
请查看man zshcompsys并搜索"_expand_alias"。很抱歉,我还没有机会深入学习zsh自动补全。您也可以尝试在unix.stackexchange.com上发问。 - Dennis Williamson
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

1
这非常有趣,而且在某种程度上解决了示例案例,但并没有解决一般情况。(我说“在某种程度上”是因为它不会等到你按下 <TAB> 键才将 ... 扩展为 ../..。) - iconoclast

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 

5
关于这个问题,你只需要使用普通的 alias -g 别名来输入 ... 并按下 Ctrl-X a 即可完成。请注意,在此过程中请勿更改原始意思。 - Dennis Williamson
@Dennis:<TAB>键可以同时完成正常的补全和_expand_aliasCtrl-X a)吗?如果可以,那么这不就解决了问题吗? - iconoclast
3
这让我在 zsh 4.3.10 中出现了“没有名为'my-expand-abbrev'的小部件”的错误提示。 - iconoclast
1
@iconoclast 看起来你现在需要在 bindkey 前面添加 zle -N my-expand-abbrev - Eric Boehs
@EricBoehs:这可以防止错误消息,但它并不会使扩展发生。 (但是Ctrl-X a可以)。我现在使用的是zsh 5.0.2,如果有任何更改,请告诉我。 - iconoclast
2
也许你漏掉了什么。我在这里有完整的工作设置:https://github.com/ericboehs/dotfiles/blob/master/.zsh/abbreviations.zsh。这可能是扩展通配符。 - Eric Boehs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接