vim-users.jp

Hack #54: VimでSticky Shiftを実現する

Posted at 2009/08/09
このエントリーをはてなブックマークに追加

Vimを使いこなすためには、自分でキーバインドを変更するのが第一歩です。ここではキーバインドの応用として、Sticky ShiftをVim上で再現する方法について考えます。

Sticky Shiftとは

普通の人にとって、Sticky Shiftは聞き慣れない用語かもしれません。Sticky Shiftとは、シフトキーを他のキーとの組み合わせで代用することです。よく使われるパターンとしては、ホームポジション上にある;をシフトキーにして、;aでAを入力するようにします。こんな面倒なことをして、メリットがあるのが疑問をお持ちの方も多いことでしょう。メリットとしては、Hoge Piyoのように、シフトキーを時々入力するような場合に、シフトキーを押したり離したりする必要がないので、小指に優しいことです。特にかな漢字変換でShiftキーを多用するskkユーザーはSticky Shiftを設定していることが多いようです。エディタの使いすぎで小指が痛くなるのはEmacsユーザーだけだという偏見が多いですが、そんなことはありません。我々Vimmerは確かにCtrlキーを押すことは少ないですが、Shiftキーを押すことが多く、知らず知らずのうちにFPを消費しています。小指の負担を和らげるためにも、VimにSticky Shiftを設定してみましょう。Shiftキーを組み合わせたキーマッピングが空くので、キーマッピングを増やすことができるという思わぬ副作用もあります。

Sticky Shiftの設定法

基本的に、キーマッピングの.vimrcに設定をするだけです。一つずつ設定すると煩雑になるので、配列を使って評価するようにすると簡単でしょう。私は次のように設定し、Insert mode, Command-line mode, Select modeでSticky Shiftが有効になるようにしています。これは英語キーボード用の設定です。日本語キーボードを使用している場合、適時設定を変更してください。
inoremap <expr> ;  <SID>sticky_func()
cnoremap <expr> ;  <SID>sticky_func()
snoremap <expr> ;  <SID>sticky_func()

function! s:sticky_func()
    let l:sticky_table = {
                \',' : '<', '.' : '>', '/' : '?',
                \'1' : '!', '2' : '@', '3' : '#', '4' : '$', '5' : '%',
                \'6' : '^', '7' : '&', '8' : '*', '9' : '(', '0' : ')', '-' : '_', '=' : '+',
                \';' : ':', '[' : '{', ']' : '}', '`' : '~', "'" : "\"", '\' : '|',
                \}
    let l:special_table = {
                \"\<ESC>" : "\<ESC>", "\<Space>" : ';', "\<CR>" : ";\<CR>"
                \}

    let l:key = getchar()
    if nr2char(l:key) =~ '\l'
        return toupper(nr2char(l:key))
    elseif has_key(l:sticky_table, nr2char(l:key))
        return l:sticky_table[nr2char(l:key)]
    elseif has_key(l:special_table, nr2char(l:key))
        return l:special_table[nr2char(l:key)]
    else
        return ''
    endif
endfunction
私の場合、;をShiftのための修飾キーとして使い、;そのものを入力したいときは;<Space>を使用するようにしています。
追記:thincaさんのアイデアにより、<expr>を使うようにしました。マッピングも減って、すっきりしますね。
慣れるととても便利なSticky Shiftですが、デメリットもあります。なんといっても大きいのは、Sticky Shiftが設定されていないアプリケーションがほぼ使用不能になることです。特に普通のシェルが使いにくくなってしまいます。シェルでもSticky Shiftが使えると良いのですが、キーバインドを設定するのはなかなか大変です。プラグイン等を駆使して、Vimを使用する時間を増やすしかないでしょう。

Shougo

もどる
blog comments powered by Disqus