Hatena::Groupvim

bless {category => 'vim'}, shift

2010-01-06()の閉じ括弧などを自動的に閉じる このエントリーのブックマークコメント

ふとはてブこんなのを見つけました。

どうやら()を自動的に閉じる設定のようです。(多分)

ちょうどこの設定を色々弄ったりしてて、やっと自分なりの最適解に辿り着いたのでちょっとメモしてみます。


arpeggio.vim

といってもarpeggio.vimを導入しただけです。

このプラグインは簡単に言えばマッピングの「同時押し」をサポートするものです。

例えばこんな設定があったとします。

Arpeggio noremap! $( ()<Left>

こうするとインサートモードとコマンドラインモードで「$」と「(」を同時に押すと「()<Left>」が実行されることになります。

最初は

Arpeggio noremap! () ()<Left>

としてたのですが、右手の中指と薬指で同時に押すのが案外辛かったため最終的には上の設定にしました。

僕の場合「$」を押すのが(Perlの経験からか)そんなに辛くなく、上下の位置的にも「(」と同じ位置にあるため、両手で押しやすかったというのがこのマッピングにした理由でもあります。


同時押しの何がうれしいか

インサートモードやコマンドラインモードなどでは入力したキーがそのまま入力されるため、Escape, Alt, Ctrl, Shiftなどのメタキーと組み合わせないと副作用のあるマッピングができてしまいます。

そういうことを気にせずマッピングできるため、自分は随分とマッピングの選択肢が増えました。

また当然ノーマルモードなどでもマッピングが可能です。


設定を晒してみる

let g:arpeggio_timeoutlen = 70
call arpeggio#load()

Arpeggio noremap! $( ()<Left>
Arpeggio noremap! 4[ []<Left>
Arpeggio noremap! $< <><Left>
Arpeggio noremap! ${ {}<Left>

Arpeggio noremap! $) \(\)<Left><Left>
Arpeggio noremap! 4] \[\]<Left><Left>
Arpeggio noremap! $> \<\><Left><Left>
Arpeggio noremap! $} \{\}<Left><Left>

Arpeggio noremap! #( 「」<Left>
Arpeggio noremap! 3[ 『』<Left>
Arpeggio noremap! #< 【】<Left>
Arpeggio noremap! #{ 〔〕<Left>

Arpeggio inoremap gk     <C-o>O
Arpeggio inoremap gj     <C-o>o

silent Arpeggio nnoremap <silent> <Leader>1    :call ChangeEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>2    :call ChangeFileEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>3    :call ChangeNL()<CR>

" SKK like mappings (japanese arrows)
Arpeggio noremap! zk ↑
Arpeggio noremap! zl →
Arpeggio noremap! zj ↓
Arpeggio noremap! zh ←

まず

let g:arpeggio_timeoutlen = 70

はそれぞれのキーが何msの間に押されたら「同時押し」とするかの設定です。

自分はデフォルトの40msだとちょっと短すぎる気がしたので70msにしました。


そして次の

call arpeggio#load()

は:Arpeggioコマンドを.vimrcで使う場合に必要となるものです。

Vimの設定ファイルは.vimrc、その次に.vim/plugin/*.vimが読み込まれます。

が、arpeggio.vimは.vim/autoload/arpeggio.vim*1にほとんど書かれているので、順番はあまり関係ありません。

ただautoloadというのは関数のみなので、コマンドは定義することができません。

なので関数のみのインターフェースを使うならこの行は要りませんが、

可読性のため、:Arpeggioコマンドを定義するためにarpeggio#load()を実行しています。


そしていよいよマッピングの設定です。

Arpeggio noremap! $( ()<Left>
Arpeggio noremap! 4[ []<Left>
Arpeggio noremap! $< <><Left>
Arpeggio noremap! ${ {}<Left>

Arpeggio noremap! $) \(\)<Left><Left>
Arpeggio noremap! 4] \[\]<Left><Left>
Arpeggio noremap! $> \<\><Left><Left>
Arpeggio noremap! $} \{\}<Left><Left>

Arpeggio noremap! #( 「」<Left>
Arpeggio noremap! 3[ 『』<Left>
Arpeggio noremap! #< 【】<Left>
Arpeggio noremap! #{ 〔〕<Left>

自分はVimperatorの経験からか数字キーに手を伸ばすのも慣れてしまったため苦痛には感じませんが、遠い数字キーを使う必要はありません。

ただ覚えやすさからこういうマッピングにしたというだけです。


Arpeggio inoremap gk     <C-o>O
Arpeggio inoremap gj     <C-o>o

これはインサートモード中に次の行/前の行に改行する設定です。

行の途中などにいても改行(次/前の行にジャンプ)できるので便利です。

前は<C-CR>と<S-CR>に割り当てていたのですが、このマッピングgVimでないとマッピングできませんでした。

たまに端末版Vim(?)も使うのでこの設定にしました。


silent Arpeggio nnoremap <silent> <Leader>1    :call ChangeEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>2    :call ChangeFileEncoding()<CR>
silent Arpeggio nnoremap <silent> <Leader>3    :call ChangeNL()<CR>

これらの関数内ではprompt.vimを使っています。

prompt.vimに関してはいつか紹介します。

現在自分が開発しているプラグインで、プロンプト用のインターフェースを提供するものです。

興味があったらGithubのリポジトリを訪れてください。


" SKK like mappings (japanese arrows)
Arpeggio noremap! zk ↑
Arpeggio noremap! zl →
Arpeggio noremap! zj ↓
Arpeggio noremap! zh ←

あとこの設定は矢印(↑→↓←)をSKKみたく変換せずに入力できると便利かな、と一瞬思って設定したのですが結局使ってません。どうしてもこういうことがやりたかったらIMをSKKに変えるか、VimでのみSKKを使いたかったらskk.vimというものがあります。


おわり

       \ヽ, ,、
        `''|/ノ
         .|
     _    |
     \`ヽ、|
       \, V
         `L,,_
         |ヽ、)
         .|
        /                   ,、
   _,,....,,_  /                  ヽYノ
-''":::::::::::::`''.|                 r''ヽ、.|
ヽ:::::::::::::::::::::| :\                ー-ヽ|ヮ
 |::::::;ノ´ ̄ | :::::::\_,. -‐ァ     __   ___`|   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__   ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´
                                      ┼ヽ  -|r‐、. レ |
                                       d⌒) ./| _ノ  __ノ

締めの言葉が思いつきませんでした。

*1:autoloadに関しては:help autoload

トラックバック - http://vim.g.hatena.ne.jp/tyru/20100106