2012-06-01 2 views
11

zsh forward-word немного отличается от bash/emacs, и я бы хотел его изменить.Как сделать поведение jsh в прямом слове таким же, как в bash/emacs

Вместо описания всех различий позвольте мне просто показать вам шаг за шагом поведение bash. Я обозначил курсор как символ «^».

foo bar --non-needed-param --needed-param^ 

М-б

foo bar --non-needed-param --needed-^param 

М-б

foo bar --non-needed-param --^needed-param 

М-б

foo bar --non-needed-^param --needed-param 

М-б

foo bar --non-^needed-param --needed-param 

М-б

foo bar --^non-needed-param --needed-param 

М-б

foo ^bar --non-needed-param --needed-param 

М-й

foo bar^ --non-needed-param --needed-param 

М-д

foo bar^-needed-param --needed-param 

М-д

foo bar^-param --needed-param 

М-д

foo bar^ --needed-param 

Этот алгоритм является одновременно гибкой для перемещения с помощью слов, удаление части из них для меня. Также это в emacs, поэтому я привык к этому. Я бы тоже хотел увидеть это в zsh. Благодарю.

ответ

12

У меня есть это в моей .zshrc именно для этой цели:

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

Edit: Ах, я помню, что не хватало для того, чтобы все работало, как я хотел. Я также переписал forward-word-match, помещая следующее содержание в $ZDOTDIR/functions/forward-word-match (предполагается, что ваш каталог $ZDOTDIR/functions в $fpath, в противном случае поместить его в одну или изменить $fpath массив, а):

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

Спасибо! Но на самом деле он отличается от bash (я сделал что-то не так?). В этой ситуации: «fo^ooo --bar», если вы нажмете «Mf», он должен немедленно перейти к концу foooo, например: «foooo^--bar», но я включил, как вы показали, это будет перейдите к следующему: "foooo -^bar". На самом деле выглядит так, что этот плагин просто экспортирует WORDCHARS = ''. –

+0

Моя полная конфигурация zsh работает так, как вы этого хотите, поэтому я думаю, что я сделал что-то большее, чем я сказал в своем ответе. Мои WORDCHARS содержат еще несколько символов, хотя я не могу понять, где он на самом деле установлен: ($ WORDCHARS is '*? _-. [] ~ =/&;! # $% ^() {} <>') –

+0

Хорошо, вспомнил, что это заставило его работать и соответствующим образом обновил мой ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^