2013-02-23 2 views
1

Я предпочитаю vi-style движения слов, такие как vi-forward-word вместо forward-word, так что курсор также останавливается на символах разделителя. Тем не менее, я также хотел бы сделать zsh уважением WORDCHARS в этом случае или каким-то образом определить мои разделительные символы. Возможно ли это как-то? Кажется, я могу либо сделать zsh использовать мои разделительные символы, либо использовать vi-style движения, где он также останавливается на них, но не оба.Как заставить команды zsh vi-style уважать 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

+0

Спасибо за подсказку - вот что я сделал. – ldx

ответ

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