2013/03/17


ちょっとだけ気になったので勝手に添削。
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><plug>(jsx-test)
endif
ここで nnoremap を使わず nmap になっているのには理由がある。nnoremap は normal no-remap を意味している。つまり、ノーマルモードで作用する、リマップ(別のマップへのマップ)を使用しないキーマップの設定となる。例えば t というキーに T を割り当てていた場合、通常のマップではリマップされるが、noremap だとされないという事になる。plug 修飾はマップの一部なので map を使って設定する必要があるという事になる。

Posted at by



2013/03/11


clever-f というプラグインをちょっと使ってみた。
clever-f.vimでf連打が便利すぎる件 | tekkoc'blog
http://tekkoc.tumblr.com/post/39831021177/clever-f-vim-f
clever-f.vim を魔改造した話 - 永遠に未完成
http://d.hatena.ne.jp/thinca/20130227/1361891993
rhysd/clever-f.vim - GitHub
https://github.com/rhysd/clever-f.vim
こういった用途が有用となるのは、殆どの場合誤操作や目的位置を判定する難しさのはず。
  • あの辺まで c したい。おっと足らなかった。
  • あそこの、一個手前まで c したい。
  • 目的位置まで何個 x があるか分からないよ。。。
こういケースに clever-f が役立つのかと思った。clever-f は vim らしさを保つ為に cfffff というキーを使うけど、もう少しユーザフレンドリな物はどうかと思って別アプローチな物を作ってみた。
mattn/wiseman-f-vim - GitHub
https://github.com/mattn/wiseman-f-vim
clever-f は fFtT を全てフックするけど、こちらのは omap だけ。なので使う場合は cf の代替くらいだと思う。ちょっと癖があって cf を上書きするのは困るだとうから、現状は ! に omap しています。なので cf の代替としては c! をタイプします。
wiseman-f
c! までタイプすると、wiseman モードに入ります。タイプしていく毎に前方検索します。/ も検索出来ます。$ や 0、^ は vim らしく動きます。<c-b> や <c-f>、カーソルキーでターゲットを動かせます。<c-g> で元の位置に戻せます。<c-c> や <esc> でモードをキャンセル出来ます。最後にエンターキーを押すと確定です。
cf だけでなく omap 出来る物であれば使えるはずです。
どんな風に動くかは、以下のスクリーンキャストをご覧下さい。
赤いマーカーがターゲットです。もちろん、! でなく f にマップする事も出来ます。
Posted at by



2013/02/21


一般的な Web Programmer ならば、HTTP Status code はすべて暗記していると聞きました。

しかし、僕は初心者なので、なかなか覚えきれていないので、HTTPのステータスコードをさがすのに便利なツールを用意しました。
httpstatus-vim です。インストール方法は bundle かなんかで以下を追加して下さい。
mattn/httpstatus-vim - GitHub
https://github.com/mattn/httpstatus-vim
使い方は以下のとおりです。 4xx なコードを列挙する。 :HttpStatus 4
400: Bad Request
401: Unauthorized
402: Payment Required
403: Forbidden
404: Not Found
405: Method Not Allowed
406: Not Acceptable
407: Proxy Authentication Required
408: Request Timeout
409: Conflict
410: Gone
411: Length Required
412: Precondition Failed
413: Request Entity Too Large
414: Request-URI Too Large
415: Unsupported Media Type
416: Request Range Not Satisfiable
417: Expectation Failed
418: I'm a teapot
422: Unprocessable Entity
423: Locked
424: Failed Dependency
425: No code
426: Upgrade Required
428: Precondition Required
429: Too Many Requests
431: Request Header Fields Too Large
449: Retry with
40x なコードを列挙する :HttpStatus 40
400: Bad Request
401: Unauthorized
402: Payment Required
403: Forbidden
404: Not Found
405: Method Not Allowed
406: Not Acceptable
407: Proxy Authentication Required
408: Request Timeout
409: Conflict
500 ってなんだっけ? :HttpStatus 500
500: Internal Server Error
403 ってなんだっけ? :HttpStatus 403
403: Forbidden
Bad なんとかってなんだっけ? :HttpStatus Bad
400: Bad Request
502: Bad Gateway
とりあえず全部みるか。 :HttpStatus
今日の参考資料
http://blog.64p.org/entry/2013/02/21/121830
Posted at by