2013-02-23 29 views
1

我更喜歡vi-style字移動,如vi-forward-word而不是forward-word,以便光標也停止在分隔符上。不過,在這種情況下,我還希望zsh尊敬WORDCHARS或以某種方式定義我的分隔符字符。這可能以某種方式嗎?看起來我可以讓zsh使用我的分隔符,或者使用vi-style移動,它也停止在它們上面,但不能同時使用。如何讓zsh vi風格的命令尊重WORDCHARS?

因此,例如,如果我的行如下:

% ls -la /foo/bar/f-b/r 

那麼如果我開始用字前進的話,它會停在/foo/bar/f-b/r

相關線路從我.zshrc

WORDCHARS='*?_-.[]~=&;!#$%^(){}<>' # removed/

autoload select-word-style                                
select-word-style normal 

bindkey '^W'  vi-backward-kill-word 
bindkey '^f'  vi-forward-word 
bindkey '^b'  vi-backward-word 
+1

我知道'zsh'不夠好,建議你可以寫一個自定義' zle'小工具給你你想要的行爲,但還不足以建議如何去寫它。 – chepner 2013-02-24 18:54:06

+0

感謝您的提示 - 這就是我所做的。 – ldx 2013-02-25 13:26:12

回答

1

在我剛剛實現我自己的zle部件結束:

SEPCHARS='[/ ]' 

my-forward-word() { 
    if [[ "${BUFFER[CURSOR + 1]}" =~ "${SEPCHARS}" ]]; then 
     ((CURSOR += 1)) 
     return 
    fi 
    while [[ CURSOR -lt "${#BUFFER}" && ! "${BUFFER[CURSOR + 1]}" =~ "${SEPCHARS}" ]]; do 
     ((CURSOR += 1)) 
    done 
} 

zle -N my-forward-word 
bindkey '^f' my-forward-word 

my-backward-word() { 
    if [[ "${BUFFER[CURSOR]}" =~ "${SEPCHARS}" ]]; then 
     ((CURSOR -= 1)) 
     return 
    fi 
    while [[ CURSOR -gt 0 && ! "${BUFFER[CURSOR]}" =~ "${SEPCHARS}" ]]; do 
     ((CURSOR -= 1)) 
    done 
} 

zle -N my-backward-word 
bindkey '^b' my-backward-word 

my-backward-kill-word() { 
    if [[ "${LBUFFER[CURSOR]}" =~ "${SEPCHARS}" ]]; then 
     LBUFFER="${LBUFFER[1, CURSOR - 1]}" 
     return 
    fi 
    while [[ CURSOR -gt 0 && ! "${LBUFFER[CURSOR]}" =~ "${SEPCHARS}" ]]; do 
      LBUFFER="${LBUFFER[1, CURSOR - 1]}" 
    done 
} 

zle -N my-backward-kill-word 
bindkey '^W' my-backward-kill-word