2011-01-19 14 views
5

È possibile configurare zsh per espandere alias globali durante il completamento della tabulazione? Ad esempio, ho gli alias comuni:espansione alias zsh

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

ma quando ho tipo, ad esempio, cd .../some<tab> esso non espandersi per cd .../something o cd ../../something. Di conseguenza, spesso non userò questi alias utili perché sono incompatibili con il completamento della tabulazione.

+2

Cerca in "man zshcompsys' e cerca" _expand_alias ". Scusa, non ho avuto la possibilità di imparare in profondità il completamento di zsh. Potresti anche provare a chiedere su unix.stackexchange.com. –

risposta

10

Sono un utente di Mikael Magnusson di rationalise-dot. Dal mio 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

Questo è molto interessante e risolve il caso di esempio, ma non risolve il caso generale. (Dico "un po '" perché non aspetta che tu prenda '' per espandere da '...' a '../ ..'.) – iconoclast

5

Prova a cercare abbreviazioni zsh. Ti permettono di inserire una "abbreviazione" che viene automaticamente sostituita con la sua forma completa quando premi una chiave magica come lo spazio. Quindi puoi crearne uno che modifichi ...<SPACE> in ../...

Ad esempio, questo è quello che vi serve nel tuo profilo:

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

Per questo, puoi semplicemente digitare '...' e premere 'Ctrl-X a' usando solo normali alias' alias -g'. –

+0

@Dennis: si può fare ' * * fa il suo normale completamento * e *' _expand_alias' ('Ctrl-X a')? In tal caso, non risolverebbe il problema come indicato nella domanda? – iconoclast

+3

@dogbane: questo mi dà "Nessun widget di questo tipo" my-expand-abbrev "" in zsh 4.3.10 – iconoclast