私zshプラグインこれは vi エミュレーションモードの zsh の vim-easymotion ポートです。 zsh行エディタは複数行をサポートしているため、行移動(およびj
)のk
サポートを追加しました。プラグインはviオペレータの一時停止モード(削除モードなど)でも機能する必要があるため、zshMARK
とCURSOR
変数を使用してユーザーの選択を行全体に拡張しました。したがって、行の動作は常に行の一部ではなく行全体を削除または変更します。 )どちら)。これはvimユーザーが期待する動作です。ちなみに、変更/削除動作後、カーソル位置が間違っています。カーソルは次の行の最初の単語になければなりません。後ろに行ブロックが削除されました。代わりに、カーソルは最後の行の終わりにあります。今後行ブロック。カーソルの変更は選択したオペレーター領域の一部になるため、オペレーター一時停止モードの後にカーソルを変更する可能性はありません。
私の質問は:zshカスタムウィジェットでカーソルの位置を変更する方法を知っている人はいますか?後ろにvi演算子が実行されましたか?
修正する:
問題を理解しやすくするために、問題の最小限の例を作成しようとしています。
この小さなzshスクリプトのソースは次のとおりです。
function test-widget () {
MARK=3
CURSOR=6
}
zle -N test-widget
bindkey -M vicmd ' ' test-widget
zshのvicmd / normalモードにある場合(bindkey -v
viエミュレーションを有効にして<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
があるようです。gU
g~
それは次のとおりです。
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
$NUMERIC
1ではない場合は、どうすればよいかを心配する必要があります。