有没有可能配置zsh在tab键补全时扩展全局别名?例如,我有以下常用别名:
alias -g '...'='../..'
alias -g '....'='../../..'
但是当我输入,例如cd .../some<tab>
时,它不会扩展为cd .../something
或cd ../../something
。因此,我经常不使用这些方便的别名,因为它们与制表符补全不兼容。
我使用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
<TAB>
键才将 ...
扩展为 ../..
。) - iconoclast...<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
alias -g
别名来输入 ...
并按下 Ctrl-X a
即可完成。请注意,在此过程中请勿更改原始意思。 - Dennis Williamson<TAB>
键可以同时完成正常的补全和_expand_alias
(Ctrl-X a
)吗?如果可以,那么这不就解决了问题吗? - iconoclastbindkey
前面添加 zle -N my-expand-abbrev
。 - Eric BoehsCtrl-X a
可以)。我现在使用的是zsh 5.0.2,如果有任何更改,请告诉我。 - iconoclast
man zshcompsys
并搜索"_expand_alias"。很抱歉,我还没有机会深入学习zsh自动补全。您也可以尝试在unix.stackexchange.com上发问。 - Dennis Williamson