ちょっとだけ気になったので勝手に添削。
Enhance jsx.vim to execute the current test method! - Islands in the byte stream
Enhance jsx.vim to execute the current test method! JSX compiler...
http://d.hatena.ne.jp/gfx/20121014/1350233031
vim script を紛らわしくしている物の一つに ftplugin と autoload がある。autoload は
この辺読んで貰えると分かる。
ftplugin は現在のバッファにファイルタイプが適用されたタイミングで
ftplugin/ファイルタイプ名.vim
もしくは
ftplugin/ファイルタイプ名/任意ファイル名.vim
が読み込まれ実行される。つまりファイルタイプ固有の設定をする為のもの。
上記の jsx.vim では、noremap 命令で t というキーに対して
call jsx#test_it()
という関数呼び出しをキーマップとして割り当てている。
ftplugin/jsx.vim
noremap t :call jsx#test_it()<CR>
inoremap や nnoremap の様に先頭に i や n といったモードが付けられていないので、このキー設定は
インサートモード意図しないシーケンスでも作用してしまう。(追記: noremap が作用するのは n/v/o で i は勘違いでした)
正しくやるなら nnoremap であろう。
次にこのマップにはバッファローカル指定が無い。つまり、
*.jsx
が読み込まれたタイミングで、グローバルのキー設定を行っている。行うべきは、現在開いている jsx ファイルのバッファに対してだけキーマップして欲しいので
nnoremap <buffer> t :call jsx#test_it()<cr>
となる。さらに、t というキーはとても短か過ぎる。固有ファイルタイプで、固有の機能を実行するキーマップにしては、識別として短か過ぎると言える。vimmer は良く使う機能を出来るだけ短いキーシーケンスで vimrc に設定している事が多い。なので t でランチャーぽい物を起動する設定をしている人であれば、キーがバッティングしてしまう事になる。
こういった場合、
<leader>
を使う事がある。これは mapleader という変数名で割り当てられたキープレフィックスを使ってマップする機能で、例えば
nnoremap <buffer> <leader>t :call jsx#test_it()<cr>
この様に設定すると、mapleader に対して何も設定していないのであれば
¥t
でマップが実行される。
さて、一般的にプラグイン作者はこの様なキーバッティングを極力避けようとする。しかしながら上記の書き方では、キーが上書きされ気付かない内に書き換えられてしまい、不運な事故を生んでしまう。
そこで、あえてエラーを発生させる為に unique 修飾を使う。
nnoremap <buffer> <unique> <leader>t :call jsx#test_it()<cr>
これで完璧と言いたいが、vimmer の中にはデフォルトのキー設定を嫌う人もいる。
そこで
if !get(g:, 'jsx_no_default_key_mappings', 0)
endif
こうしておけば、デフォルトのキー設定が嫌いな人は vimrc に
let g:jsx_no_default_key_mappings = 1
と書くことでキー設定が行われない様になる。
さてここまで書いた後でなんだが、vim には plug 修飾という物がある。
vim では「
キー」に対して「
処理」をマップするのが一般的だが、これだと全てのユーザがキー設定の際に「
処理」を書かないといけなくなる。これではプラグイン作者がインタフェースを気軽に変更出来なくなってしまう。そこで処理をインタフェースとして扱う為に生まれたのが plug 修飾だ。
まず test_it に対するインタフェースを公開する。
nnoremap <silent> <plug>(jsx-test) :<c-u>call jsx#test_it()<cr>
これにより、ユーザ側は
(jsx-test)
という
インタフェースに対してのキーマップだけを行えば良いことになる。
上記をそのまま使い、以下の様になる。
if !get(g:, 'jsx_no_default_key_mappings', 0)
nmap <unique> <buffer> <leader>t <plug>(jsx-test)
endif
ここで nnoremap を使わず nmap になっているのには理由がある。nnoremap は
normal
no-
remap を意味している。つまり、ノーマルモードで作用する、リマップ(別のマップへのマップ)を使用しないキーマップの設定となる。例えば t というキーに T を割り当てていた場合、通常のマップではリマップされるが、noremap だとされないという事になる。plug 修飾はマップの一部なので map を使って設定する必要があるという事になる。