web-dev-qa-db-ja.com

zshのvimモードをカスタマイズするにはどうすればよいですか?

わかりました、それで私は最終的に大きな変化をしました。私の.zshenvで、エディターを変更しました:

export EDITOR=vim

いくつかの質問があり、それらは非常に軽微で、個別の質問を開始したくありませんでした。はい、どうぞ:

  1. Vimのように、zshで挿入モードとコマンドモードを区別するにはどうすればよいですか?できれば、カーソルを下線からvimのようなブロックに変更しますが、下部にテキストを表示することもできます。

  2. Vimのように振る舞わせるにはどうすればよいですか?たとえば、私はむしろそれがデフォルトでコマンドモードになり、1つのコマンドの後にそれから出ないことを望みます。

25
Jason Baker

1。)( http://zshwiki.org/home/examples/zlewidgets および http: //pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-Prompt/ ):

 function zle-line-init zle-keymap-select {
 RPS1 = "$ {$ {KEYMAP/vicmd /-NORMAL-} /(main | viins)/-INSERT- -} "
 RPS2 = $ RPS1 
 zle reset-Prompt 
} 
 zle -N zle-line-init 
 zle -N zle- keymap-select 

どこ:

  • 「RPS」は「右のプロンプト文字列」を意味し、端末の右側に表示されるプロンプトを定義します。$ {variable/pattern/replacement}の構文は「パラメーターの展開」の構文です。次を参照してください: http ://mywiki.wooledge.org/BashSheet#Parameter_Operations

  • 'zle -N'は、ユーザー定義可能なウィジェット 'zle-line-init'および 'zle-keymap-select'が(同じ名前のシェル関数に)バインドされるようにし、ラインエディターが初期化されたときに呼び出されるようにします。キーマップはそれぞれ変更されます。 http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC125 を参照してください。

2。)これを行うには、別のzsh-widgetを作成する必要があると思われます。最初の問題の2つのリンクの最初に触発されます。

26
akira

akiraのソリューションには、複数行のプロンプトを使用するときに次の問題があります。insからcmdモードに移行すると、プロンプトの再描画により、前の出力から数行が削除されます(新しいプロンプトは数行上に表示されます)。行数は、プロンプト内の行数によって異なります。

これに対処する方法は、zle-line-finish、 使わずに zle reset-Prompt そこ。例:

# perform parameter expansion/command substitution in Prompt
setopt Prompt_SUBST

vim_ins_mode="[INS]"
vim_cmd_mode="[CMD]"
vim_mode=$vim_ins_mode

function zle-keymap-select {
  vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
  zle reset-Prompt
}
zle -N zle-keymap-select

function zle-line-finish {
  vim_mode=$vim_ins_mode
}
zle -N zle-line-finish

次に、それを右側のプロンプトに追加できます。次に例を示します。

RPROMPT='${vim_mode}'

これは私のブログ記事から直接です:

23
zle-line-init() { zle -K vicmd; }
zle -N zle-line-init

これらの2行は、コマンドモードで起動することを確認します

5
Tranquility

以下では、変更されたカーソルと現在のモードを表示するプロンプトが表示されます。DEFAULT_VI_MODEviinsまたはvicmdに変更できます。開始するには、以下を新しい.zshrcに貼り付けてください。

# Prefer vi shortcuts
bindkey -v
DEFAULT_VI_MODE=viins
KEYTIMEOUT=1

__set_cursor() {
    local style
    case $1 in
        reset) style=0;; # The terminal emulator's default
        blink-block) style=1;;
        block) style=2;;
        blink-underline) style=3;;
        underline) style=4;;
        blink-vertical-line) style=5;;
        vertical-line) style=6;;
    esac

    [ $style -ge 0 ] && print -n -- "\e[${style} q"
}

# Set your desired cursors here...
__set_vi_mode_cursor() {
    case $KEYMAP in
        vicmd)
          __set_cursor block
          ;;
        main|viins)
          __set_cursor vertical-line
          ;;
    esac
}

__get_vi_mode() {
    local mode
    case $KEYMAP in
        vicmd)
          mode=NORMAL
          ;;
        main|viins)
          mode=INSERT
          ;;
    esac
    print -n -- $mode
}

zle-keymap-select() {
    __set_vi_mode_cursor
    zle reset-Prompt
}

zle-line-init() {
    zle -K $DEFAULT_VI_MODE
}

zle -N zle-line-init
zle -N zle-keymap-select

# Optional: allows you to open the in-progress command inside of $EDITOR
autoload -Uz edit-command-line
bindkey -M vicmd 'v' edit-command-line
zle -N edit-command-line

# Prompt_SUBST enables functions and variables to re-run everytime the Prompt
# is rendered
setopt Prompt_SUBST

# Single quotes are important so that function is not run immediately and saved
# in the variable
RPROMPT='$(__get_vi_mode)'

注:これはzOS(5.3.1)を搭載したMacOS(10.12.6)のTerminal.app(2.7.3)でのみテストしました。また、edit-command-lineを追加すると、モードも正しく設定されます。

0
casr