PHPの変数って記述が面倒ですよね。
こんなの
$x = $result['Data'][0][$type]['price'];
みたいな。
特に自分はシングルクォーテーションをブラインドで打つのによく失敗して&
とか(
とか打っちゃって、勢いに乗ってガシガシ打ち込んでる時に興ざめします。
というわけでこんな感じに簡易入力したPHPの変数記述
簡易入力
$result.data.0.$type.price
を展開するvim関数を作ってみました。まだプロトタイプのアルファ版の叩き台レベルですけど。
function! EasyPHP()
" 親変数の部分:「$result.data」の「$result.」まで
let s = '\(\$[[:alpha:]_]\)\(\([[:alnum:]_"''\[\]]\|->\)*\)\.'
" 単純な文字列「$result.data」の「data」
let s1 = s.'\([[:alpha:]_][[:alnum:]_]*\)'
" 変数指定もしくは配列の添え字「$result.$i」の「$i」とか「$result.0」の「0」
let s2 = s.'\(\d\+\|\$[[:alpha:]_][[:alnum:]_]*\)'
" 変数混在のパターン。先頭と末尾がダブルクォーテーション
let s3 = s.'"\([[:alpha:]_\$][[:alnum:]\$_{}]*\)"'
let pos = getpos('.')
call cursor(1, 1)
" いくつも繋がっていると1回の変換で全部展開できないので何度もループして変換
while search(s1, 'nW') || search(s2, 'nW') || search(s3, 'nW')
silent! execute '%s/'.s1.'/\1\2[''\4'']/g'
silent! execute '%s/'.s2.'/\1\2[\4]/g'
silent! execute '%s/'.s3.'/\1\2["\4"]/g'
call cursor(1, 1)
endwhile
call setpos('.', pos)
endfunction
command! -nargs=0 -range -complete=command EasyPHP call EasyPHP()
nnoremap <Leader>ep <ESC>:%EasyPHP<CR>
.vimrcなんかにこれを登録してノーマルモードの時に\
e
p
の順番に打つと、こんな感じに展開できます。
簡易入力を展開
$result.data.0.$type.price → $result['data'][0][$type]['price']
こんなのも展開
$user."data_$xxx".$i.point → $user["data_$xxx"][$i]['point']
vimで関数を書くのはほぼ初めてなのでかなりヘボショボな作りです。変数名も我ながらひどい。あと誤爆が怖いのであまり複雑な書き方には対応してないと思います。
現在のやり方はファイル全体に対して正規表現の置換を繰り返しているだけなので、Zen-Codingみたいに変数入力後にコマンド入力してそれだけ展開みたいな事ができると確認しながらできていいのかなーなんて思いますが、いかんせんvim-scriptはさっぱりなのでそこまでできませんでした。
もっとエレガントに改良してくれる方募集中です。あと、すでにこういった展開を行うスクリプトとかが存在していたら教えて頂きたいなーなんて。