JSを編集してエディタで保存するとき、JSHint でコーディングバリデーションをかける
errormaker.vim を使って JS 保存時に末尾カンマチェックとかをやっていたのだけれど、今までチェックに使っていた Spidermonkey の最近のバージョンだと、strict モードにしても末尾カンマを warn しなくなって意味がなくなっていたので、JSHint でやるようにした。
setlocal makeprg=$HOME/.vim/vimparse.js\ %\ $* setlocal errorformat=%f:%l:%m
は今までのままにして、vimparse.js を以下のようにした。JSHint は JSLint よりはマイルドというか偏執さがないのだけど、まだ癖が強くて「実害のある」という警告と「単に好み」という警告がごっちゃになっていてうざいので、できるだけ自分でカスタマイズできるようにした。
node.js を実行環境にしているのは、node.js のインストールが特に依存もなく簡単だから (clone して make するだけでいいから) です。
#!/usr/bin/env node
var JSHINT = require("./jshint.js").JSHINT;
var fs = require("fs");
var argv = process.argv;
argv.shift();
argv.shift();
argv.forEach(function (filename) {
var source = fs.readFileSync(filename, 'utf-8');
var result = JSHINT(source, {
browser : true,
jquery : true,
evil : true,
passfail : false
});
if (!result) {
JSHINT.errors.forEach(function (error) {
if (!error) return;
if (error.reason.indexOf('Stopping, unable to continue.') != -1) return;
// 何これ?
if (error.reason.indexOf("Confusing use of '!'.") != -1) return;
// for (var i...) は何度も書きたい
if (error.reason.indexOf("'i' is already defined.") != -1) return;
if (error.reason.indexOf("'it' is already defined.") != -1) return;
// 可読性のために意図的にそうしているのでうざいし、そういう最適化は実行エンジンがすべきこと
if (error.reason.indexOf('is better written in dot notation') != -1) return;
// 根拠がわからないので保留
if (error.reason.indexOf("Don't make functions within a loop") != -1) return;
if (error.evidence) {
error.evidence = error.evidence.replace(/\t/g, ' ');
// 明示的に抑止されてるなら無視
if (error.evidence.indexOf('no warnings') != -1) return;
// やたら長い行は圧縮されたJSコードとみなす
if (error.evidence.length > 1000) return;
// 閉じブレース前のセミコロンは省略可能に
if (error.reason.indexOf('Missing semicolon') != -1 && error.evidence.substring(error.character).match(/^\s*\}/)) return;
}
console.log([filename, error.line, error.character].join(':') + "\t" + error.reason);
});
}
});
gerry++
gerry++
gerry++
gerry++
transit.yahoo.co.jp (Yahoo! ロコ) の路線検索結果を2クリックで Google Calendar にインポートできるようにする
↓ の「カレンダーに追加」は Yahoo! カレンダーへインポートするためのリンクなってるんですが、Google カレンダーにしてほしいのでそうする user.js を書きました (Chrome で動作確認済み)
↓ こんな感じに入ります。
もっとマシなのを書いてもらいました

