расширение псевдонима zsh - PullRequest
5 голосов
/ 19 января 2011

Можно ли настроить zsh для расширения глобальных псевдонимов во время завершения вкладки? Например, у меня есть общие псевдонимы:

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

но когда я набираю, например, cd .../some<tab>, он не расширится до cd .../something или cd ../../something. Следовательно, я часто не буду использовать эти удобные псевдонимы, потому что они несовместимы с завершением табуляции.

Ответы [ 2 ]

10 голосов
/ 22 января 2011

Я пользователь 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
5 голосов
/ 20 января 2011

Попробуйте поискать Сокращения 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 
...