Open haya14busa opened 10 years ago
こういうの1つ1つモジュールで実装しているとモジュールの量が大変なことになるので1度整理したいですね。 (その前にすべてのキーマッピングを実装するのであれば1度洗い出ししたいところ。
(その前にすべてのキーマッピングを実装するのであれば1度洗い出ししたいところ。
確かに.
c_CTRL-_
とか c_C-y
とか無理そげだったりそこまでするほどのことじゃないやつもある(主観)ので全部実装するひつようはないかなーと思います.
という認識でいうと残りの実装すべきっぽいマッピングを洗い出すべきっぽいですかね.
c_Ctrl-\e
はあったほうがよさそう(これも主観)かつ<C-r>=
を考えれば実装できるっぽいし使用するユースケースもあると思ったので割と考えずにイシュー開いちゃいました
とりあえず、一旦全部のキーマッピングの一覧を作成して、そこから実装するかしないかや優先順位を決めていた方がよさそうですね。
とりあえずで作ってみました #90
let s:V= vital#of("vital")
let s:cmdline = s:V.import("Over.Commandline")
let s:my = s:cmdline.make_standard()
call s:my.cnoremap("\<C-\>e", {
\ "key" : "'\<C-e>\<C-u>' . eval(input('='))",
\ "expr" : 1,
\})
call s:my.start()
とりあえず、細かいところは置いておいて動作はします。 以下問題点、。
input()
の仕様上、式の入力中に <Esc>
しても式が評価されてしまう
input()
が <CR>
か <Esc>
で終了したか判定できないため<C-\>e
に続くようなキーマッピングを行えない" この場合、<A-c> 時にコマンドラインを 3 で置き換えて欲しいが、1+2 という入力を <C-\>e で受け取ることができない
call s:my.cmap("\<A-c>", "\<C-\>e1+2\<CR>")
<C-\>
入力後の入力待ちが &timeoutlen
に依存する
<C-\>
入力後の入力待ち中の表示形式
^\
が表示される1番目は Vim 自体の仕様なので対処手段はなさそう。
やるとすれば Vim の input()
をつかわないで vital-over でオレオレ input() を作る必要がある。
2番目はキーマッピングではなくて input()
を使用しているキーマッピングを再マップしたい場合に結局問題になるので根本的な解決にはならない。
これも vital-over 側で専用の input()
を用意してアレする必要がある。
3、4番目はキーマッピングの設定に待ち時間や待ち文字なんかを指定できるようにすれば対応するのはそこまで難しくはなさそう。
ただ、複数のキーマッピングの待ちがあった場合にどうするのかという問題はある。
んー, やっぱり無理やりキーマッピングとして実装するより<C-r>=
と同様の方法で対処したほうがいいかなーと思いました。というか何でキーマップで出来ると嬉しいんでしたっけ? 手軽感はあるけどその他のメリットがイマイチ把握してないデス
ただ、キーマッピング中に input() を使用しているキーマッピングを再マップしたい場合に結局問題になるので根本的な解決にはならない。
全部 <C-r>=
形式にして キースタックがあればそれを使って, なければ input()
を使うとか...?
というか何でキーマップで出来ると嬉しいんでしたっけ?
実装がシンプルになればそれだけ拡張性や保守がやりやすくなるのがメリットだと思っています。
現状、
全部
=形式にして キースタックがあればそれを使って, なければ input()を使うとか...?
現状の <C-r>=
はそういう風に処理していますね。
微妙にこのissueに書くのは適切ジャナイ感もありますが getcmdline()
や getcmdtype()
対応の eval()
を考えてみました(かなり無理やりですが)ので一応貼っておきます
https://gist.github.com/haya14busa/095db3036d6553c4a591
<expr>
マッピング, <C-r>=
, <C-\>e
の対応にて使うとベンリできるという可能性があるしれないです
<CR>=
とほぼ同じでコマンドライン全体を書き換えればよいだけっぽいです. プルリクするかもしれませんがそもそもどこのモジュールに実装するべきですかねー...