2012-06-01 13 views
11

zsh forward-word bash/emacs'den biraz farklı davranır ve bunu değiştirmek isterim.Bash/emacs ile aynı zsh forward-word davranışı nasıl yapılır?

Tüm farklılıkların açıklaması yerine, yalnızca bash'ın adım adım davranışını göstereyim. İmleç "^" sembolü olarak işaretledim.

foo bar --non-needed-param --needed-param^ 

M-b

foo bar --non-needed-param --needed-^param 

M-b

foo bar --non-needed-param --^needed-param 

M-b

foo bar --non-needed-^param --needed-param 

M-b

foo bar --non-^needed-param --needed-param 

M-b

foo bar --^non-needed-param --needed-param 

M-b

foo ^bar --non-needed-param --needed-param 

M-f

foo bar^ --non-needed-param --needed-param 

M-d

foo bar^-needed-param --needed-param 

M d

foo bar^-param --needed-param 

M-d

foo bar^ --needed-param 

Bu algoritma, kelimeler üzerinden hareket benim için bunların parçaları çıkarmak için esnek hem de. Ayrıca emacs içinde, bu yüzden alışkınım. Onu da zsh'da görmek isterim. Teşekkürler.

cevap

12

Tam bu amaçla benim .zshrc bu vardır:

# Bash-like navigation 
autoload -U select-word-style 
select-word-style bash 

Edit: Ah İstesem olarak her şey çalışma almak için ne eksikti hatırlıyorum.

emulate -L zsh 
setopt extendedglob 

autoload match-words-by-style 

local curcontext=":zle:$WIDGET" word 
local -a matched_words 
integer count=${NUMERIC:-1} 

if ((count < 0)); then 
    ((NUMERIC = -count)) 
    zle ${WIDGET/forward/backward} 
    return 
fi 

while ((count--)); do 

    match-words-by-style 

    # For some reason forward-word doesn't work like the other word 
    # commands; it skips whitespace only after any matched word 
    # characters. 

    if [[ -n $matched_words[4] ]]; then 
     # just skip the whitespace and the following word 
    word=$matched_words[4]$matched_words[5] 
    else 
     # skip the word but not the trailing whitespace 
    word=$matched_words[5] 
    fi 

    if [[ -n $word ]]; then 
    ((CURSOR += ${#word})) 
    else 
    return 1 
    fi 
done 

return 0 
+0

Teşekkür:; ben de (aksi biri koydu ya yanı $fpath diziyi değiştirmez sizin $ZDOTDIR/functions dizin $fpath olduğunu varsayarak) $ZDOTDIR/functions/forward-word-match içine Şu içeriğe koyarak forward-word-match overwrote! Ama aslında bash'tan farklı davranıyor (yanlış bir şey mi yaptım?). Bu durumda: "fo^ooo --bar", eğer "Mf" ye basarsan, hemen foooo'nun sonuna kadar gitmeli, şöyle ki: "foooo^--bar", ama ben sana gösterdiğin gibi Buna git: "foooo -^bar". Aslında bu eklenti sadece WORDCHARS = '' ihraç ediyor gibi görünüyor. –

+0

Tam zsh yapılandırması istediğiniz gibi çalışır - bu yüzden cevabımda belirttiğimden daha fazlasını yaptım. Benim WORDCHARS aslında biraz daha fazla chars içeriyor olsa da, aslında ayarlandığı yere gelemiyorum: ($ WORDCHARS is * *? _-. [] ~ =/&;! # $% ^() {} <> ') –

+0

Tamam, bunun ne işe yaradığını ve cevabımı buna göre güncellediğini hatırladı. –