初心者がRailsを勉強するブログ

Railsを0からお勉強するブログです。

vimでEmmetなCoffeeScriptとjavascriptのプレビューエディタを作ってみた

結構前に自分達で使うために弟と作ったものですが、せっかくなので公開します。
CoffeeScriptjavascriptの練習をするのによかったら使ってみてください。

js用のemeco

f:id:carmelokarimero:20140308092918p:plain


coffee用のemecoffee

f:id:carmelokarimero:20140308092850p:plain


エディタにはCodeMirrorを使用しています。

使用にあたって、注意点があります。

Macを前提に、CocoaとEmmetをガンガン使うことを想定して作りました
・エディタはvimです
・矩形ビジュアルモードがありません
・テキストオブジェクトの操作も全然充実していません

Emmetについては、チートシートと、CodeMirrorのEmmetを参照してください。

vimの操作方法がわからない方は、

$ vimtutor

とコマンドを打てば、vimの基本操作のチュートリアルが開きます。
emecoと契約してvimmerになってよ!

ソースコードここにあります。
cloneしたら、htmlをブラウザで開けてみてください。

画面左側がエディタで、右側が表示用ブラウザです。
画面を開いた時点でhtmlエディタにフォーカスがあたってます。

操作方法の説明はヘッダーのロゴの右側の「What is emeco?」をクリックしてください。
こんなんが出ます。

f:id:carmelokarimero:20140308095139p:plain

vimのemmet展開なのに、キーバインドが<C-y>,でない点に関しては目をつぶってくださいw

htmlとcssは、打鍵のたびに反映します。
jsとcoffeeは実行時に反映します。

Emecoのcss、js、coffeeのエディタに書いたソースは、htmlエディタにscriptタグやlinkタグを書かなくても右のブラウザ上で反映されるようになってます。
また、jQueryとbootstrap3が最初から動くようになっています。

エディタ上部のLoad fileは、ローカルのファイルを読み込んで開いているエディタに内容を書き出します。
Saveは<C-s>でも代用可能で、開いているエディタをローカルに保存します。
coffee、jsのときのみ表示されるRunは、<C-r>でも代用可能で、コードを実行します。

説明ばっかりじゃよくわからないと思うので、実際に使ってみましょう。
ここからはemmet初心者を対象に、emmetの入力まで書いていこうと思います。
説明が丁寧すぎてくどいので、慣れている方は戻る推奨です。

emecoffee.htmlを起動します。
起動時は、htmlエディタにフォーカスが当たっています。

f:id:carmelokarimero:20140308092850p:plain


iでインサートモードにして、html:5と入力してtabを押してください。
emmetが展開されて、こうなります。

f:id:carmelokarimero:20140308135816p:plain

head内のtitleにカーソルが当たっますが、とりあえずここはどうでもいいので、bodyの中を書き換えます。
vimmerがカーソル移動をnomalモードで行うことは世界の常識ですが、emecoを使うときは、<C-f>、<C-b>、<C-n>、<C-p>を使っての移動もオススメです。

bodyタグの中にカーソルを移動したら、ヘッダーを作ってみましょう。
左側にh2を置いてロゴ風に、右側にgoogleへのリンクでも貼って雰囲気を出します。
それでは、header>h2#logo+a[href="http://www.google.com"]と入力して、カーソルを行末に移動し、tabを押してください。
行末への移動も、<C-c&gtAと<C-e>どちらでもいいです。
こうなります。

f:id:carmelokarimero:20140308140921p:plain

タグの中身を適当に埋めます。
emmet展開した時点でh2の中にカーソルがあたっているので、emeco練習とでも入力して、Ctrlとoptionと右を同時押ししてください。aタグの中にカーソルが移動します。Ctrl-option-右左でタグ間を移動できます。
aタグの中にはgoogleとでも書いておきます。
こうなります。

f:id:carmelokarimero:20140308141515p:plain


htmlが反映されてます。

ヘッダーが用意出来たので、画面左側にサイドバーを置きましょう。
サイトバーにはとりあえず、amazonへのリンクでも入れておきます。
それだけでは寂しいので、pタグにサイドバーと書いておきます。
<C-c>でnomalモードに移行して、joと入力してください。ヘッダーの下から入力ができます。見やすくするため、1行開けます。enterを押しましょう。
そこに、div#sidebar>p+a[href="http://www.amazon.co.jp"]と入力し、カーソルを末尾に移動した後、tabを押してください。
こうなります。

f:id:carmelokarimero:20140308142243p:plain


pタグの中にサイドバー、aタグの中にamazonと書いておきます。

最後に、main領域を作って、canvasを置きます。
一行開けて、div#main>canvas#cv[width=500 height=500]と入力してemmetを展開して下さい。

htmlとプレビュー画面はこうなりました。

f:id:carmelokarimero:20140308142714p:plain


次は、cssを書きます。
htmlエディタにフォーカスがあたっている状態で<C-t>を押すと、cssエディタに移動します。
こんな感じ

f:id:carmelokarimero:20140308142859p:plain


最初にヘッダーをそれっぽくします。
header {}をこんな感じにして中にカーソルを合わせて、スペースを2回押してください。

f:id:carmelokarimero:20140308143311p:plain


準備ができたら、cssを書きましょう。
背景色を設定します。bgcと入力してtabを押してください。
bacground-color: #fff;になるので、#fffをdarkblueに書き換えます。
darkblueのeを入力した瞬間に色が変わると思います。

f:id:carmelokarimero:20140308143628p:plain

上の隙間がキモいです。ピッタリくっつけましょう。
<C-c&gtoで下の行から入力を開始して、po:aと入力してtabを押してください。
こうなります。

f:id:carmelokarimero:20140308143935p:plain

形が大変なことになりました。
画面の端まで伸ばしましょう。
下の行から入力を開始して、w:100%と入力してtabを押してください。
こうなります。

f:id:carmelokarimero:20140308145155p:plain


h2とaタグが縦に並んじゃってるので、横に並べましょう。
下の行に移動して、dと入力してtabを押した後、blockをflexに変更してください。
変更した瞬間にgoogleが横に行きます。
ついでに、googleを右端に持って行きましょう。
下の行に、justify-content: space-between;と入力します。emmetが見当たらなかったですw
これでgoogleが右端に行きました。
ブラウザにカーソルを乗せて、左にスワイプすると、ブラウザが移動します。

f:id:carmelokarimero:20140308174215p:plain


配置はこんなもんにして、文字の色を変えましょう。
下の行に、c<Tab>と入力して、#000をsnowにします。

次はh2をいい感じに配置します。

#logo {

}

の形を作り、中にml<Tab>1em、mt<Tab>0.3emと入力してください。
こうなります。

f:id:carmelokarimero:20140308175246p:plain


これでヘッダーは終わりにします。
次はサイドバーを配置します。
今までに入力したプロパティは入れちゃいます。

#sidebar {
  position: absolute;
  margin-top: 10em;
  margin-left: 1em;
}

次に、ボーダーを引きます。
bd<Tab>でborder: ;を入力して、5px solid lightgrayと入力してください。
こうなります。

f:id:carmelokarimero:20140308180751p:plain


このままじゃごついしバーっぽくないので、ボーダーの角を丸めて、長くします。
border-radius: 10px;と入力してください。
本物のvimではbdraで行けるんですが、emecoでは行けませんでしたw
そうしたら、h:30%<Tab>で長くしましょう。
サイドバーはこんな感じ。

f:id:carmelokarimero:20140308181300p:plain


cssの最後はキャンバスの配置です。
#mainをいじって配置したいところですが、先にキャンバスに色をつけてどこにあるかわかるようにします。

#cv {
  background-color: black;
}

こんなことになりました。

f:id:carmelokarimero:20140308181757p:plain


かぶらないように配置しましょう。
#cvの上に以下のコードを配置します。

#main {
  position: absolute;
  margin-top: 10em;
  margin-left: 15em;
}

最終的にこうなりました。

f:id:carmelokarimero:20140308182332p:plain


最後にCoffeeScriptでキャンバスをいじります。
キャンバスをクリックしたら左から右に丸が移動するコードを書いてみます。
CoffeeScriptはEmmetがないので、まとまった単位でコードを書きます。

まず、全てのDOMの読み込みが終了したら動くように、$.readyを書きます。

$ ->

次に、クリックするたびにDOMを取得するのもめんどくさいので、広いスコープでキャンバスを取っておきます。

  # キャンバスを取得
  cv = $('#cv')[0]
  ctx = cv.getContext '2d'

次に、丸を左から右に移動する関数を書きます。
関数を書く前に、話を簡単にするため、広いスコープに円のx座標とタイマーIDを取っておきます。

  # 円のx座標とタイマーID
  circleX = 0
  timerID = 0

それでは、関数本体を書きます。

  moveCircle = ->
    # キャンバスを初期化
    ctx.clearRect 0, 0, 500, 500

    # 円が画面外に移動したら終了
    if circleX > 500
      circleX = 0
      clearInterval timerID
      return null

    # 白い円を描画
    ctx.fillStyle = 'white'
    ctx.beginPath()
    ctx.arc circleX, 250, 10, 0, Math.PI * 2, false
    ctx.fill()
    
    # 円のx座標を足す
    circleX += 10

clearIntervalなどの関数は、入力の途中で<C-y>を押せば入力補助ができます。

そうしたら、クリックイベントにイベントハンドラをセットします。
繰り返し関数を呼ぶため、setIntervalを使います。

  # キャンバスにイベントハンドラをセット
  $(cv).on 'click', ->
    timerID = setInteval moveCircle, 10

入力が終わったら、<C-r>かRunボタンをクリックしてください。
CoffeeScriptが実行されます。

実行したら、キャンバスをクリックしてください。
左から右に円がスーッと移動します。

ひと通り完成したので、保存しましょう。
<C-s>を押してください。

こんな感じになります。

f:id:carmelokarimero:20140308193357p:plain

適当なファイル名を入力して、enterかOKを押してください。
拡張子は入れても入れなくてもいいです。
入れない場合、開いているエディタの演算子が補完されます。

こんな感じにクライアントサイドのプログラミングをするときにちゃちゃっと使っていただけると幸いです。