2011-01-19 16 views
5

Czy można skonfigurować rozszerzenie zsh, aby rozwinąć aliasy globalne podczas uzupełniania karty? Na przykład, mam wspólne aliasy:alias zsh z rozszerzeniem

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

ale gdy wpisuję np cd .../some<tab> nie będzie rozwijać się cd .../something lub cd ../../something. W związku z tym często nie używam tych przydatnych aliasów, ponieważ są one niezgodne z zakończeniem tabulatora.

+2

Spójrz na 'man zshcompsys' i wyszukaj" _expand_alias ". Przykro mi, nie miałem okazji dogłębnego poznania ukończenia zsh. Możesz także spróbować zapytać o unix.stackexchange.com. –

Odpowiedz

10

Jestem użytkownikiem Mikael Magnusson na rationalise-dot. Z mojego 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

Jest to bardzo interesujące, a rodzaj rozwiązuje przykładowy przypadek, ale nie rozwiązuje ogólnego przypadku. (Mówię "coś w rodzaju", ponieważ nie czeka, dopóki nie trafisz '', aby rozwinąć z '...' do '../ ..'.) – iconoclast

5

Spróbuj wyszukać zsh skróty. Umożliwiają wprowadzenie "skrótu", który automatycznie zastępowany jest jego pełnym formularzem po naciśnięciu klawisza magicznego, takiego jak spacja. Możesz więc utworzyć taki, który zmienia ...<SPACE> na ../...

Na przykład, to jest to, czego potrzebujesz w swoim profilu:

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 
+4

Jeśli o to chodzi, możesz po prostu wpisać '...' i nacisnąć 'Ctrl-X a' używając tylko zwykłych aliasów -g. –

+0

@Dennis: can '' zrobić, aby * oba * czy jego normalne zakończenie * i * '_expand_alias' (' Ctrl-X a')? Jeśli tak, czy to nie rozwiązałoby problemu, jak to zostało powiedziane w pytaniu? – iconoclast

+3

@dogbane: To daje mi "Brak takiego widżetu' my-expand-abbrev '"w zsh 4.3.10 – iconoclast