copy mode の挙動をよりvim っぽくする

emacs の用に vim だけで何でも完結させられないボクなので zsh や screen を酷使してます.
とはいえソフトウェア別に似たようなコマンドが全く異なるキーバインドにされるのは困ってしまうので,なるべく似たようなキーバインドに調整しています.
今回は screen の copy mode を vim の visual mode に近い挙動をするように調整してみました.

bind  ; eval colon 'bindkey -m y' 'bindkey -m V' 'bindkey -m ^v'

# y はデフォルトでは1行を自動で選択
# bind ^v eval 'bindkey -m -t y stuff Y' copy
# vim の矩形選択モード
# bindkey -m -t ^v eval 'stuff "c "'  'bindkey -m -t y stuff "C "'
# vim の行選択モード
# bindkey -m -t  V eval 'stuff "0 $"' 'bindkey -m -t y stuff "$ "'
bind ^v eval "bindkey -m -t y stuff Y" "bindkey -m -t ^v eval 'stuff \"c \"'  'bindkey -m -t y stuff \"C \"'" "bindkey -m -t  V eval 'stuff \"0 $\"' 'bindkey -m -t y stuff \"$ \"'" copy

追記
コマンドラインに入った後に ^V, V を再設定できていなかったので修正しました.すごく気持ち悪く….
追記おわり

ボクは screen のエスケープに ^G (と ssh 先の端末では ^T) を使用しています.vim では v, ^V, V で visual mode に入りますが,今回 screen では ^G ^v で copy mode に入るようにしています.一旦 ^G ^V で copy mode に入ってからさらに ^V をタイプすると矩形選択,V をタイプすると行選択になるようにしました.選択してからのコピーは y をタイプすれば各モードに応じたコピーの仕方をしてくれます.
ついでに copy mode に入った直後に y をタイプすると1行だけコピーするようになってます(これは yy を意識しました).

ポイントは bindkey の設定方法でしょうか. copy mode でのバインドを変更する場合は bindkey -m -t で設定するみたいです(-t がなんで必要なのかがちゃんと理解できてませんが).
ひとつのバインドに複数の挙動を割り当てるには eval でやります.screen ではよく使う手法ですかね.


まずは下の方から見ていきましょう.まず ^v の bind です.これで copy mode に入る事になりますが,先に y を Y にマップし直してます. Y は1行をコピー (vim では yy) するキーです.
次に bindkey でマップした ^v です.vim では矩形選択が始まりますが,screen では c で左端を決めて space でカーソル位置を選択開始という風になってます.ついでに y を右端を決める(C),選択範囲をコピー(space)とするようにマップし直します.
最後の V の bindkey も ^v と似た方法でやってます.V は vim では行単位で選択になってるので,screen では
0 で一番左端に移動,$ で一番右端に移動という風にやっています.

追記
というのを1行で書いてます.^G^V をタイプすると まず y, ^V, V の keybind をすべて登録し,その後に copy mode に入るようになってます.
追記おわり

これだけでとりあえずは copy mode は十分動いてくれるのですが, bindkey -m で設定すると "Edit mode key binding" として設定されるようです.副作用はコマンドライン入力中が Edit mode みたいなので,copy mode として bind したものが入力されてしまいます.これを解決するために,1行目の様な方法でコマンドラインに入った直後に bindkey を解除しています.


vim 見たいに cmap や vmap 等のように細かなモード別でマッピングできて欲しいですね.