2011-01-19 37 views
5

Có thể định cấu hình zsh để mở rộng bí danh chung trong khi hoàn thành tab không? Ví dụ, tôi có bí danh chung:Mở rộng bí danh zsh

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

nhưng khi tôi gõ, ví dụ, cd .../some<tab> nó sẽ không mở rộng đến cd .../something hay cd ../../something. Do đó, tôi thường xuyên không sử dụng các bí danh tiện dụng này vì chúng không tương thích với hoàn thành tab.

+2

Tìm trong 'man zshcompsys' và tìm kiếm" _expand_alias ". Xin lỗi, tôi đã không có cơ hội để học hoàn thành zsh trong chiều sâu. Bạn cũng có thể thử yêu cầu trên unix.stackexchange.com. –

Trả lời

10

Tôi là một người sử dụng của Mikael Magnusson của rationalise-dot. Từ zshrc của tôi:

# 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

Điều này rất thú vị và loại giải quyết trường hợp mẫu, nhưng không giải quyết được trường hợp chung. (Tôi nói "loại" bởi vì nó không đợi cho đến khi bạn nhấn ' 'để mở rộng từ' ... 'sang' ../ .. '.) – iconoclast

5

Hãy thử tra cứu chữ viết tắt zsh. Chúng cho phép bạn nhập "chữ viết tắt" tự động được thay thế bằng biểu mẫu đầy đủ của nó khi bạn nhấn phím ảo chẳng hạn như dấu cách. Vì vậy, bạn có thể tạo một cái thay đổi ...<SPACE> thành ../...

Ví dụ, đây là những gì bạn cần trong hồ sơ của bạn:

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

Đối với vấn đề đó, bạn chỉ cần gõ '...' và nhấn 'Ctrl-X a' chỉ sử dụng bí danh 'alias -g' bình thường. –

+0

@Dennis: có thể '' được thực hiện để làm * cả hai * làm việc hoàn thành bình thường của nó * và * '_expand_alias' (' Ctrl-X a')? Nếu vậy, sẽ không phải là giải quyết vấn đề như nó được nêu trong câu hỏi? – iconoclast

+3

@dogbane: Điều này mang lại cho tôi "Không có tiện ích như vậy' my-expand-abbrev '"trong zsh 4.3.10 – iconoclast