凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Vim からでも QML したい

はじめに

本記事は Vim Advent Calendar 2012 の 146 日目のエントリになります。
前回は、おしょーさん(id:osyo-manga)による Vim の map でコマンドを展開させた場合に任意の位置にカーソルを持ってくる - C++でゲームプログラミング でした。これはいいものだ...。
さて、そんなおしょーさんが 139 日目 のエントリにて qmake を使った Qt のビルドと実行について解説されていました。

同じように、Vim を使っていると突然 QML を実行したい!と思うこともあると思います。そこで Vim から qmlscene で QML を実行して GUI を表示する quickrun の設定を書いてみました。
Qt をやったことがない人でも、「あれ?エディタって全部 Vim で良いんじゃない?」と感じとって貰えればと思います。

設定

let g:quickrun_config['qml/qmlscene'] = {
\	'command' : 'qmlscene',
\	'exec'    : '%c %s:p',
\	'runner'  : 'vimproc',
\ }
let g:quickrun_config['qml'] = g:quickrun_config['qml/qmlscene']

qmlscene にファイル名を渡すだけなのでこれだけです。とても簡単ですね。

デモ


GUI を操作した際のデバッグメッセージも表示されて便利です。

エラー箇所を表示してみる

出力先である quickfix の errorformat を指定してあげる事で、コンパイル時にエラー箇所をハイライトさせることができます。ハイライトさせるためにはエラー出力の形式を指定して、何行目がエラーを起こしているのか特定してあげる必要があります。
例えば間違って「;」をブロックの直後に指定してしまった場合、以下の様なエラーが qmlscene によって出力されます。

file:///Users/hecomi/ProgramLocal/Qt/QtQuickTest/QtQuickTest.qml:15 Unexpected token `;'

エラーの形式を見ると、

file://(ファイルのパス):(行数) (エラーの内容)

となっていることが分かります。これを quickrun の設定に書いてあげます。

let g:quickrun_config['qml/qmlscene'] = {
\	'command' : 'qmlscene',
\	'exec'    : '%c %s:p',
\	'runner'  : 'vimproc',
\	'quickfix/errorformat' : 'file:\/\/%f:%l %m',
\ }

実行すると以下のようにエラーがハイライトされます。

その他の指定形式については、:h errorformat をご参照下さい。

watchdogs.vim でエラーをチェックする

watchdogs.vim は syntastic の様にファイルの保存時などにシンタックスチェックを行える plugin です。

syntastic と異なり、チェックを非同期で行なってくれるのでとても快適ですし、文法も quickrun と同一なので学習コストも低く済みます。
qmlscene には --quit という実行後すぐに終了してくれるオプションがあるので、コレを利用して文法チェックを行うことにします。

let g:quickrun_config['qml/watchdogs_checker'] = {
	\ 'type' : 'watchdogs_checker/qmlscene',
\ }

let g:quickrun_config['watchdogs_checker/qmlscene'] = {
	\ 'command'              : 'qmlscene',
	\ 'exec'                 : '%c %o %s:p',
	\ 'cmdopt'               : '--quit',
	\ 'quickfix/errorformat' : 'file:\/\/%f:%l %m',
\ }

call watchdogs#setup(g:quickrun_config)
let g:watchdogs_check_BufWritePost_enables = {
	\ "qml"        : 0,
\ }
nnoremap <Leader>R :WatchdogsRun<CR>

g:watchdogs_check_BufWritePost_enables['qml'] を 1 にすると保存時にシンタックスチェックが走るようになりますが、一瞬ウィンドウが開いてしまうので、明示的に :WatchdogsRun を呼ぶと実行されるようにしています。これで「\R」と入力すれば、シンタックスチェックのみ行えるようになりました。

(おまけ)QML のシンタックスハイライト

NeoBundleLazy 'peterhoeg/vim-qml', {
\	'autoload' : {
\		'filetypes' : ['qml'],
\	},
\ }

おわりに

quickrun を利用してあげれば、ターミナルから実行できることはひと通り実行できるので、色々な設定を書いてみて皆で共有して、Vim に満ちた世界が早く来て欲しいですね!