2011-01-19 6 views
5

¿Es posible configurar zsh para expandir los alias globales durante la finalización de pestañas? Por ejemplo, tengo los alias comunes:zsh alias expansion

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

pero cuando escribo, por ejemplo, cd .../some<tab> que no se expandirá a cd .../something o cd ../../something. En consecuencia, con frecuencia no utilizaré estos prácticos alias porque son incompatibles con la finalización de pestañas.

+2

Busque en 'man zshcompsys' y busque" _expand_alias ". Lo siento, no he tenido la oportunidad de aprender a completar zsh en profundidad. También puede intentar preguntar en unix.stackexchange.com. –

Respuesta

10

Soy un usuario de Mikael Magnusson de rationalise-dot. Desde mi 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

Esto es muy interesante y resuelve el caso de ejemplo, pero no resuelve el caso general. (Digo "algo así" porque no espera hasta que toques '' para expandir de '...' a '../ ..'.) – iconoclast

5

Intenta buscar zsh abreviaturas. Te permiten ingresar una "abreviación" que automáticamente se reemplaza con su forma completa cuando presionas una tecla mágica como el espacio. Entonces puede crear uno que cambie ...<SPACE> a ../...

Por ejemplo, esto es lo que necesita en su perfil:

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

Para el caso, puede escribir '...' y presionar 'Ctrl-X a' usando solo alias' alias -g' normales. –

+0

@Dennis: ¿puede '' estar hecho para hacer * ambos * hacer su finalización normal * y * '_expand_alias' (' Ctrl-X a')? De ser así, ¿no resolvería eso el problema tal como se afirma en la pregunta? – iconoclast

+3

@dogbane: Esto me da "No such widget' my-expand-abbrev '"en zsh 4.3.10 – iconoclast