備忘録です。
Vim上でCoffeeScriptで書かれたコードのコンパイル結果を手っ取り早く確認する方法
:w!coffee -bcs
概要
CoffeeScriptのコマンドを確認
CoffeeScriptのREPLをNode.jsでインストールする。
$ npm -v5.3.0
$ npm install -g coffeescript
$ coffee -v
CoffeeScript version 2.0.0
オプション 説明 -c, --compile .coffee を .js にコンパイル -s, --stdio 標準入力からcoffeeスクリプトを読んで、標準出力にJavaScriptを渡す。 -b, --bare トップレベル関数safety wrapper無しでコンパイル。
ざっと必要そうなものを取り出した。
結果は後述の実験を参照。
Vimのファイル出力の仕様
:help :w
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
(note the space in front of the '!'). {cmd} is
executed like with ":!{cmd}", any '!' is replaced with
the previous command |:!|.
以下雑な意訳
Vimは:w !{cmd}
と入力すると、
任意のコマンドの標準入力に現在開いているファイルの文字列を投げ込んで実行できる。
また、頭に[range]
という文字列があることから、
ビジュアルモードで選択した状態で:w !{cmd}
と入力すると、
選択状態を示す:'<,'>w !{cmd}
に自動保管され、選択部分を標準入力に渡すことも可能。
実験
以下のコードで実験を行う。
emit = (type, {msg}) ->unlesstypeis"verbose"thenreturnconsole.log"done"expect(msg).to.equal"not found ticket"
標準入力から実行したいので、まずは-s
オプションのみをつけて実行。
:'<,'>w!coffee -s
何も表示されず……
他のコードで試したところ、ReferenceError: hoge is not defined
等のエラーが表示された。
どうやら-s
オプションのみ利用した場合はJavaScriptに変換後、評価を行っているようだ。
実行結果が見たいだけなら-s
オプションのみで解決だが、
今回確認したいのはコンパイルされたJavaScriptなのでコンパイルを明示する-c
オプションを併用して実験を継続。
:'<,'>w!coffee -sc// Generated by CoffeeScript 2.0.0(function() {
var emit;
emit =function(type, {msg}) {if(type !=="verbose") {return;
}
console.log("done");return expect(msg).to.equal("not found ticket");
};
}).call(this);
見事コンパイルに成功し、JavaScriptのコードが表示された。
ただし、(function() {}).call(this);
が足されて読みづらいので、もっと読みやすくしたい。
そこで、更に-b
オプションを含めて実行する。
:'<,'>w!coffee -bcs// Generated by CoffeeScript 2.0.0
var emit;
emit =function(type, {msg}) {if(type !=="verbose") {return;
}
console.log("done");return expect(msg).to.equal("not found ticket");
};
コードが簡素になり読みやすくなった。
従ってVimで一部の箇所のコンパイル結果を確認したい場合は、
ビジュアルモードで選択して:w !coffee -bcs
とタイプすれば良い。