2012-06-01 8 views
11

zsh forward-word si comporta in modo un po 'diverso da bash/emacs, e mi piacerebbe cambiarlo.Come rendere il comportamento di zsh forward-word come in bash/emacs

Invece di una descrizione di tutte le differenze, lascia che ti mostri il comportamento passo passo di bash. Ho contrassegnato il cursore come simbolo "^".

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 

Questo algoritmo è sia flessibile per muoversi attraverso parole, rimuovendo parti di loro per me. Inoltre è in emacs, quindi ci sono abituato. Mi piacerebbe vederlo anche in zsh. Grazie.

risposta

12

ho questo nel mio .zshrc esattamente per questo scopo:

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

Edit: Ah, mi ricordo quello che mancava per far funzionare tutto come volevo. Ho anche sovrascritto forward-word-match inserendo la seguente contenuto in $ZDOTDIR/functions/forward-word-match (supponendo che il directory $ZDOTDIR/functions è in $fpath, altrimenti metterlo in uno o modificare la matrice $fpath pure):

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

Grazie! Ma in realtà si comporta diversamente da bash (ho fatto qualcosa di sbagliato?). In questa situazione: "fo^ooo --bar", se premi "Mf", dovrebbe andare immediatamente alla fine di foooo, come questo: "foooo^--bar", ma ho abilitato come hai mostrato, sarà vai a questo: "foooo -^bar". In realtà sembra che questo plugin esporti solo WORDCHARS = ''. –

+0

La mia configurazione completa di zsh funziona come vuoi tu, quindi credo di aver fatto qualcosa di più di quello che ho affermato nella mia risposta. Il mio WORDCHARS contiene molti altri caratteri sebbene non riesca a capire dove è effettivamente impostato: ($ WORDCHARS è '*? _-. [] ~ =/&;! # $% ^() {} <>') –

+0

OK, ha ricordato che cosa lo ha fatto funzionare e ha aggiornato la mia risposta di conseguenza. –

Problemi correlati