カスタムウィジェットでviオペレータ一時停止モードの後に​​zshカーソルを移動する方法は?

カスタムウィジェットでviオペレータ一時停止モードの後に​​zshカーソルを移動する方法は?

zshプラグインこれは vi エミュレーションモードの zsh の vim-easymotion ポートです。 zsh行エディタは複数行をサポートしているため、行移動(およびj)のkサポートを追加しました。プラグインはviオペレータの一時停止モード(削除モードなど)でも機能する必要があるため、zshMARKCURSOR変数を使用してユーザーの選択を行全体に拡張しました。したがって、行の動作は常に行の一部ではなく行全体を削除または変更します。 )どちら)。これはvimユーザーが期待する動作です。ちなみに、変更/削除動作後、カーソル位置が間違っています。カーソルは次の行の最初の単語になければなりません。後ろに行ブロックが削除されました。代わりに、カーソルは最後の行の終わりにあります。今後行ブロック。カーソルの変更は選択したオペレーター領域の一部になるため、オペレーター一時停止モードの後に​​カーソルを変更する可能性はありません。

私の質問は:zshカスタムウィジェットでカーソルの位置を変更する方法を知っている人はいますか?後ろにvi演算子が実行されましたか?

修正する:

問題を理解しやすくするために、問題の最小限の例を作成しようとしています。

この小さなzshスクリプトのソースは次のとおりです。

function test-widget () {
    MARK=3
    CURSOR=6
}

zle -N test-widget

bindkey -M vicmd ' ' test-widget

zshのvicmd / normalモードにある場合(bindkey -vviエミュレーションを有効にして<esc>コマンドモードに入る)、キーを押してカーソルを<space>現在の編集バッファの6番目の文字に設定できるようになりました。 vi演算子(d後に)を入力すると、<space>3番目から6番目の文字まですべて削除されます(変数の設定によりMARK)。

削除例:編集バッファが次のようになっているとします(カーソル位置はでマークされています[])。

[a]bc def ghi

その後、ボタンを押すと次のようにd<space>なります。

abc[f] ghi

しかし、同じウィジェット呼び出しで削除操作後にカーソル位置を変更したいと思います。たとえば、次のようになります。

abcf [g]hi

CURSORすべての変更が削除されたテキストの範囲に影響するため、これがどのように可能かわかりません。

削除操作+カーソル位置決めを実装するには?

ベストアンサー1

d、、、、、、...にバインドされたcウィジェットyなど、操作を実行するウィジェットを再定義する必要guがあるようです。gUg~

それは次のとおりです。

test-widget () {
  MARK=3
  CURSOR=6
  MOVE_AFTER_MOTION=2
}
zle -N test-widget
bindkey -M vicmd ' ' test-widget

for widget in vi-{delete,change,yank,{down,oper-swap,up}-case}; do
  $widget () {
    local ret
    zle ".$WIDGET"; ret=$?
    if (($+MOVE_AFTER_MOTION)); then
      (( CURSOR += MOVE_AFTER_MOTION ))
      unset MOVE_AFTER_MOTION
    fi
    return "$ret"
  }
  zle -N $widget
done

$NUMERIC1ではない場合は、どうすればよいかを心配する必要があります。

おすすめ記事