Command line 如何使zsh vi风格的命令尊重WORDCHARS?

Command line 如何使zsh vi风格的命令尊重WORDCHARS?,command-line,zsh,Command Line,Zsh,我更喜欢vi样式单词移动,例如vi向前单词,而不是向前单词,这样光标也会停在分隔符上。但是,在本例中,我还想使用zsh尊重WORDCHARS,或者以某种方式定义分隔符。这有可能吗?似乎我可以让zsh使用我的分隔符,或者使用vi样式移动,也可以在它们上面停止,但不能同时使用两者 例如,如果我的线路如下: % ls -la /foo/bar/f-b/r 然后,如果我开始逐字向前移动,它将停止在/,foo,/,栏,/,f-b,/,r my.zshrc中的相关行: WORDCHARS='*?_-.[]

我更喜欢
vi样式
单词移动,例如
vi向前单词
,而不是
向前单词
,这样光标也会停在分隔符上。但是,在本例中,我还想使用
zsh
尊重
WORDCHARS
,或者以某种方式定义分隔符。这有可能吗?似乎我可以让
zsh
使用我的分隔符,或者使用
vi样式
移动,也可以在它们上面停止,但不能同时使用两者

例如,如果我的线路如下:

% ls -la /foo/bar/f-b/r
然后,如果我开始逐字向前移动,它将停止在
/
foo
/
/
f-b
/
r

my
.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
WORDCHARS='*?-.[]~=&;!#$%^(){}#删除/
自动加载选择字样式
选择“文字样式正常”
bindkey“^W”vi反向终止字
bindkey“^f”vi转发字
bindkey“^b”vi反向单词

最后,我实现了自己的
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

最后,我实现了自己的
zle
widgets:

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

我非常了解
zsh
,建议您可以编写一个定制的
zle
小部件,为您提供所需的行为,但是还不足以建议如何编写它。谢谢你的提示-这就是我所做的。我知道
zsh
足以建议你可以编写一个自定义
zle
小部件来提供你想要的行为,但还不足以建议如何编写它。谢谢你的提示-这就是我所做的。