【Emacs】skewer-modeを入れた話
skewer-modeを入れた話
- Vue.jsの勉強中、エディタ-ブラウザ間のマウス往復にウンザリして導入した
- webpackのHMR使えという話なのですが、入門書の進行上、そうもいかなかったのです
環境
- Win10
- GNU Emacs 25.2.0.0
skewer-modeってなに
- HTML,CSS,JSについて、emacs-lisp-modeと同じ使用感でバッファをevalできる
- リロードレスで変更反映・JS実行を行える
- JSのREPLも提供
- REPL:Read-Eval-Print Loop
- まんまブラウザのDevToolsのコンソールみたいな感じ
セットアップ
M-x package-install RET
- skewer-modeをインストール
つかう
アタッチ
- 例えば、
~/vue/chapter1/index.html
を編集し、リロードレスで反映したいとする M-x httpd-serve-directory ~/vue RET
M-x run-skewer RET
- ブラウザが立ち上がり、
http://localhost:8080/skewer/demo
が開く
(browse-url
に依存しているらしい)- すでに8080が使用されていたら8081が使われたりする
http://localhost:8080
には、先ほどhttpd-serve-directory
で設定した~/vue
がマッピングされている~/vue/chapter1/index.html
を編集したいので、
ブラウザのアドレスバーにhttp://localhost:8080/chapter1/index.html
を入力
リロードレス編集
- emacs上で、
~/vue/chapter1/index.html
のバッファに移動 M-x skewer-html-mode
で skewer-html-modeマイナーモードをenabledに- index.htmlに変更を加える
- ブラウザへの変更反映はタグ単位で行う。
反映したいタグにカーソルを移動し、C-M-x
(skewer-html-eval-tag)- 「body全体」は変更反映できないので注意
JS実行
skewer-repl
M-x skewer-repl RET
でJSのREPL(Read-Eval-Print Loop) のバッファが起動する
入力途中なのにEvalされたりしてイマイチ使い勝手が良くなかった
*scratch*
C-x b *scratch*
- もちろんちゃんとしたバッファを作ってもいい
M-x js2-mode RET
M-x skewer-mode RET
- JS書く
- 例えば、
location.reload();
- 例えば、
- 行末で
C-x C-e
(skewer-eval-last-expression) - いちいちマウスに手を伸ばさずにページをリロードできる
- 複数行実行したければ、ブロックで囲むとよさげ
{ console.log(1); console.log(2); console.log(3); }
原理
WebSocketではない
skewer.js
function skewer() { function callback(request) { var result = skewer.fn[request.type](request); if (result) { result = skewer.extend({ id: request.id, type: request.type, status: 'success', value: '' }, result); skewer.postJSON(skewer.host + "/skewer/post", result, callback); } else { skewer.getJSON(skewer.host + "/skewer/get", callback); // 5. } }; skewer.getJSON(skewer.host + "/skewer/get", callback); // 1. }
古き善きXHRを使ったポーリングですね
2018年12月13日追記
Cometっていうみたいですね
処理の流れ
- client (ブラウザ、skewer.js) は、server (Emacsのhttpサーバー)にGETリクエストを送る
- serverは、レスポンスを保留する (pending)
- Emacs上で下記のいずれかを行うと、serverはレスポンスを返す
- skewer系modeのバッファ上でevalする
- skewer-replになんか入力する
- RETせず、1文字単位で入力するだけでも
- clientは、serverからレスポンスが返ってきたら、これをevalする
- clientは、eval結果をserverにPOSTする
- serverはレスポンスを保留する(pending)
- 以下同様
どっかでタイムアウトか何かで切れたら、client側でskewer()
を呼び出して起こしてやる
所感
<button>
等の操作はマウスを触らざるを得ないが、
作業の大半をキーボードから手を離さずにできるようになったのはgood