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


25

わかりましたので、最終的に大きな変更を加えました。.zshenvで、エディターを変更しました。

export EDITOR=vim

いくつかの質問があり、それらはあまり重要ではないので、個別の質問を始めたくありませんでした。どうぞ:

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

  2. vimのように動作させるにはどうすればよいですか?たとえば、デフォルトではコマンドモードにしたいので、1つのコマンドの後に終了しないようにします。


//、コマンドラインの編集で奇妙な動作をしていませんか?私はに実行してきた~私が押したときに挿入されたばかりの文字Deleteでキーをzsh。私はここでそれについての質問を:superuser.com/questions/997593/...
ネイサンBasanese

回答:


25

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

関数zle-line-init zle-keymap-select {
    RPS1 = "$ {$ {KEYMAP / vicmd /-NORMAL-} /(main | viins)/-INSERT-}"
    RPS2 = $ RPS1
    zleリセットプロンプト
}
zle -N zle-line-init
zle -N zle-keymap-select

どこで:

  • 「RPS」は「right prompt string」の略で、ターミナルの右側に表示されるプロンプトを定義します。$ {variable / pattern / replacement}構文は「parameter expansion」の構文です。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つのリンクのうち最初のリンクに触発されます。


22

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

それに対処する方法はzle-line-finishzle 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}'

これは、それに関する私のブログ投稿から直接です:


この答えは多くの票を得るはずです。このソリューションを見たのはこれが初めてであり、他のソリューションでは見られない場所でも機能します。私は1時間かけてzle-line-initウィジェットをいじくり回しましたが、役に立ちませんでした。Pawelが提供したものとビンゴに一致するように変更しました!
コリンR

ありがとう!それでも100%防弾ではありません-時々、以前の出力からいくつかの行が削除される状況が発生しますが、まれにしか発生しないため、無視するだけです。
パウェウゴイチッキ

1
RPROMPT2ステータスが継続行に表示されるように設定する必要もあります。また、これを使用する場合setopt transient_rprompt、以前に受け入れられた行のモードが表示されないようにすることができます。
qqx

まだ足りないものが1つあります。emacsモード(bindkey -e)に戻すと、まだ表示されます[INS]
ダニエル

1
:あなたはここで、このセットアップの私の現在のバージョンを確認することができ@cheflo github.com/pjg/dotfiles/blob/master/.zshrc#L518-L584を多分それはあなたを助ける-
パヴェルGościcki

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

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


動作しません、とにかくzshは挿入モードで起動します
ボールダー

0

以下は、変更されたカーソルと現在のモードを表示するプロンプトでセットアップされます。またはのDEFAULT_VI_MODEいずれviinsかに変更できます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)'

注:これは、Mac OS(10.12.6)とzsh(5.3.1)上のTerminal.app(2.7.3)でのみテストしました。また、追加したedit-command-line場合、モードも正しく設定されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.