1

我更喜欢vi-style单词移动,例如vi-forward-word代替forward-word,以便光标也停在分隔符上。但是,我也想在这种情况下zsh表示尊重WORDCHARS,或者以某种方式定义我的分隔符。这有可能吗?似乎我可以zsh使用我的分隔符,或者使用vi-style它也停止在它们上的动作,但不能同时使用两者。

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

% 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
4

1 回答 1

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
于 2013-02-25T13:25:45.230 回答