расширение псевдонима zsh

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

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

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


person Bryan Ward    schedule 19.01.2011    source источник
comment
Посмотрите в man zshcompsys и найдите _expand_alias. Извините, у меня не было возможности подробно изучить завершение zsh. Вы также можете попробовать спросить на unix.stackexchange.com.   -  person Dennis Williamson    schedule 19.01.2011


Ответы (2)


Я пользователь 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
person fow    schedule 22.01.2011
comment
Это очень интересно и как бы решает случай примера, но не решает общий случай. (Я говорю вроде как, потому что он не ждет, пока вы нажмете <TAB>, чтобы расшириться от ... до ../...) - person iconoclast; 22.09.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 
person dogbane    schedule 19.01.2011
comment
Если на то пошло, вы можете просто ввести ... и нажать Ctrl-X a, используя только обычные псевдонимы alias -g. - person Dennis Williamson; 20.01.2011
comment
@Dennis: можно ли заставить <TAB> выполнять оба нормальное завершение и _expand_alias (Ctrl-X a)? Если да, то не решит ли это проблему, как указано в вопросе? - person iconoclast; 22.09.2011
comment
@dogbane: это дает мне Нет такого виджета `my-expand-abbrev' в zsh 4.3.10 - person iconoclast; 23.09.2011
comment
@iconoclast Похоже, вам нужно добавить zle -N my-expand-abbrev перед bindkey сейчас. - person Eric Boehs; 15.07.2015
comment
@EricBoehs: это предотвращает появление сообщения об ошибке, но не приводит к расширению. (Хотя Ctrl-X a да.) Я сейчас на zsh 5.0.2, если это что-то меняет. - person iconoclast; 16.07.2015
comment
Возможно, вы что-то упускаете. У меня есть полная рабочая настройка здесь: github.com/ericboehs/ dotfiles/blob/master/.zsh/. Вероятно, это расширенные шары. - person Eric Boehs; 17.07.2015