ぼちぼち散歩

Vimのマッピングについて考え中

Vim使いから見てkey-chord.elがいかに役に立たないか - while (”im mirrored”);を見て.

Vimで自分用に新しくマッピングを定義するとき,これまで以下の順番で考えて,結局今のところはだいたい<Space>をプレフィックスにする方法をメインで使って,使えるところは<expr>使って柔軟な動作にする感じになっている.

  1. 自分の使わない既存のマッピングを殺して,それをプレフィックスにして定義する.
    (例)f使わない人
    nnoremap f <nop>
    nnoremap fa :some_command<CR>
    nnoremap fb :call some_func()<CR>
    ...
  2. 既存のマッピング殺すのが気持ち悪いので<Leader>をプレフィックスとして使う.
    nnoremap <Leader>a :some_command<CR>
    nnoremap <Leader>b :call some_func()<CR>
    ...
  3. Leaderだとプラグインとかぶったり,デフォルトだと押しにくい.let leader=","とかも既存のマッピング殺しているので気持ち悪い.そこで,<Space>とか<CR>とかをプレフィックスにする.
    nnoremap <Space>a :some_command<CR>
    nnoremap <Space>b :call some_func()<CR>
    ...
  4. 場合によっては<expr>使うと幸せ.
    folding を h,l で閉じたり開いたりするマッピング - ns9logとか,
    inoremap <silent> <expr> <CR> (pumvisible() ? "\<C-e>" : "") . "\"
    inoremap <silent> <expr> <Tab> pumvisible() ? "\<C-y>" : "\<Tab>"
    みたいなやつ

ところが,<Space>を使うマッピングは思ったほど押しやすくない,つまり親指→その他の指,というシーケンスがそんなに押しやすくない.そこで,たまたまkanaさんのarpeggio.vimを使ってみて,これはいいなと思った.例えば,

Arpeggionnoremap ra :some_command<CR>

とした場合,r→aと押したときはデフォルトの文字置換できて,a→rと押したときはデフォルトの文字挿入ができて,rとaをほぼ同時に押したときはsome_commandが発動する,といったようにデフォルトの動作を殺さないまま,かつ押しやすいところにマッピングを追加できる.

ところが,冒頭で挙げたkanaさんの記事では,arpeggio.vimは役に立たなくないとい結論で,自分は稀な人なのか,と思った.考えてみると,

自明なことだが、同時押しを採用する主な理由は割り当てたい機能に対してそれ以外に使えるキーシーケンスがないからだ(「使える」はタイプのし易さ等を含む)。モードレスな編集体系ならばそう余裕はないが、Vimはそうではない。

に関しては,デフォルトのマッピング殺すの気持ち悪いというどうでもいい理由で,使えるキーシーケンスをむやみに絞っている自分が悪い.次に,

key-chord.elが提供する機能を言い換えると、タイムアウトありの曖昧なキーバインド定義になる(space-chord.elは特にこれを意識したものになっている。当人にそういうつもりはないだろうけれど)。これはVimではデフォルトでできるし、ある程度以上Vimを使っていればその恩恵に預かっている。だからVim使いから見ればkey-chord.elは「タイミングを微調整して同時押しをエミュレートした」という点以外に真新しいものはないし、それを使わなくても普通にキーバインドを定義するだけで十分だ。

に関しては,自分にとっては,どんな場面でも通用する一定のtimeoutlenがない,またはこのへんの動作がよくわかってない.最後に,

(これは主観だが)同時押しにかかるコストはそう小さくはない。Vim使いのキーバインドは「いかにモディファイヤーを押さずに事を済ませるか」あるいは「いかにモディファイヤーを押しっぱなしで事を済ませられるか」となる傾向にあるので、上記の理由も合わせて、タイミングのシビアな同時押しを利用するよりも普通のキーバインドを定義した方が楽だ。

に関しては,デフォルトのマッピングを殺さない前提だと,個人的には<Space>プレフィックスよりarpeggio.vimによる同時押しの方がましだと思っているのでちょっと違う.

要するに,「デフォルトのマッピングを殺したくない」にこだわってみた結果,なんだかおかしなことになっているのだと思う.kanaさんの.vimrcとか見るとtとかqは殺されているので,自分も思いきって適当なキーを殺すとすっきりいくかも知れない.その他の案としては,デフォルトのマッピング殺すにしても影響少なそうなShiftキー押しながらに全部定義してしまう,どうにかしてtimeoutlenを動的に定義する,がある.前者は,

nnoremap F <nop>
nnoremap FA :some_command<CR>
nnoremap FB :call some_func()<CR>

とか.後者は突き詰めると結局arpeggio.vimになってしまうような気もするな.もう少し考えてみよう.

スポンサーサイト

2009/01/18 19:24 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

トップページへ